2013-02-25 6 views
2

мне нужно построить положение частицы в момент времени Т, учитывая следующие формулы: s(t) = -0.5*g(s)*t^2+v0*t, где g(s) = G*M/(R+s(t))^2 (G, M и R константы, являющиеся s значение, а не функцию s(t)). Частица поднимается вертикально, и я хочу печатать ее текущее положение каждую секунду, пока она не ударит по земле. Но я не могу понять, как определить одну функцию, не используя другую до ее определения. Это мой код до сих пор:Как определить зависимые функции в Python?

G = 6.6742*10^(-11) 
M = 5.9736*10^24 
R = 6371000 
s0 = 0 
v0 = 300 
t = 0 
dt = 0.005 

def g(s): 
    def s(t): 
     s(t) = -0.5*g(s)*t^2+v0*t 
    g(s) = G*M/(R+s(t))^2 


def v(t): 
    v(t) = v(t-dt)-g(s(t-dt))*dt 


while s(t) >= 0: 
    s(t) = s(t-dt)+v(t)*dt 
    t = t+dt 

if t == int(t): 
    print s(t) 

Когда я запускаю функцию, он говорит, что он не может назначить вызов функции.

+0

Итак, 'g (s)' является функцией функции? Откуда берется «t»? – martineau

+2

Вы должны прочитать [учебник Python] (http://docs.python.org/tutorial/), чтобы понять основы написания функций в Python. – BrenBarn

ответ

6

ошибка означает, что вы не можете писать s(t) = x, потому что s(t) является функцией, и назначение на функции выполняется с def .... Вместо этого, вы хотите, чтобы вернуть значение, так что вы бы переписать его так:

def g(s): 
    def s(t): 
     return -0.5*g(s)*t^2+v0*t 
    return G*M/(R+s(t))^2 

Однако, есть и другие проблемы, связанные с, что хорошо. С вычислительной точки зрения, этот расчет никогда не закончится. Python не является системой алгебр и не может решить определенные значения. Если вы попытаетесь позвонить s(t) в пределах g(s) и g(s) в пределах s(t), вы никогда не закончите, если не задаете условие завершения. В противном случае они будут продолжать звонить друг другу, пока стек рекурсии не будет заполнен, а затем выдает ошибку.

Кроме того, поскольку вы определили s(t) в пределах g(s), вы не можете называть его извне, как вы делаете несколько раз дальше в своем коде.

Вы, кажется, смущены несколькими синтаксическими и семантическими особенностями Python. Если вы спросите нас, что именно вы хотели бы сделать, и предоставите нам математические формулы для этого, может быть проще сформулировать ответ, который может помочь вам лучше.

Edit:

Чтобы определить положение частицы в момент времени t, вы хотите, следующий код (переформатировать код с синтаксисом Python, использовать ** вместо ^ и return заявления):

G = 6.6742*10**(-11) 
M = 5.9736*10**24 
R = 6371000 
s0 = 0 
v0 = 300 
t = 0 
dt = 0.005 

sc = s0 # Current position of the particle, initially at s0 

def g(s): 
    return -G*M/(R+s)**2 

def s(t): 
    return 0.5*g(sc)*t**2 + v0*t + s0 

count = 0 
while s(t) >= 0: 
    if count % 200 == 0: 
     print(sc) 
    sc = s(t) 
    count += 1 
    t = dt*count 
+0

Другими словами, это безответно, как в настоящее время написано. – martineau

+0

Спасибо! Мне нужно напечатать положение s (t) частицы, выброшенной вертикально в воздух через каждые 1 секунду, пока она снова не ударит по земле. Мне были предоставлены функции, перечисленные выше. Моя главная проблема заключается в том, что вы ответили выше, с определением функций в терминах друг друга. –

+0

@BabyBlueLion Я внесла свой ответ, чтобы предоставить то, что вы ищете. Никаких гарантий для физики позади этого, это было несколько лет, но если вы хотите настроить формулы, вы должны быть в состоянии сделать это сейчас. –

2

Функции Python могут вызывать друг друга, но это не так, как функция возвращает значение. Для того, чтобы функция возвращает особое значение, используйте return, например,

def v(t): 
    return v(t - dt) - g(s(t - dt)) * dt 

Кроме того, я не очень понимаю, что вы пытаетесь сделать с этим, но вам, вероятно, нужно, чтобы выразить себя по-разному:

while s(t) >= 0: 
    s(t) = s(t-dt)+v(t)*dt 
    t = t+dt 
+1

Также 'v' бесконечно рекурсивно. И 't == int (t)', вероятно, никогда не произойдет. –

Смежные вопросы