2

给定以下公式,我需要绘制粒子在时间 t 的位置:s(t) = -0.5*g(s)*t^2+v0*t,其中g(s) = G*M/(R+s(t))^2GM, 和R是常数,s是一个值,而不是函数s(t))。粒子被垂直发射,我想每秒打印一次它的当前位置,直到它撞到地面。但是我无法弄清楚如何在定义一个函数之前不使用另一个函数来定义它。到目前为止,这是我的代码:

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)

当我运行该函数时,它说它无法分配函数调用。

4

2 回答 2

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)withing(s)g(s)within s(t),您将永远不会终止,除非您定义终止条件。否则他们会一直互相调用,直到递归堆栈被填满然后抛出错误。

此外,由于您s(t)在内部定义g(s),因此您不能从外部调用它,就像您在代码中多次执行的那样。

您似乎对 Python 的几种语法和语义细节感到困惑。如果您问我们您到底想做什么,并为我们提供数学公式,那么制定一个可以更好地帮助您的答案可能会更容易。

编辑:

要确定粒子在 time 的位置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
于 2013-02-25T00:34:56.837 回答
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
于 2013-02-25T00:27:03.493 回答