我需要在时间t绘制粒子的位置,给定以下公式:s(t) = -0.5*g(s)*t^2+v0*t
,其中g(s) = G*M/(R+s(t))^2
(G
,M
和{{1是常量,R
是一个值,而不是函数s
)。粒子被垂直射击,我想每秒打印它的当前位置,直到它撞到地面。但我无法弄清楚如何定义一个函数而不使用另一个函数定义之前。到目前为止,这是我的代码:
s(t)
当我运行该函数时,它表示它无法分配函数调用。
答案 0 :(得分: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的几种语法和语义细节感到困惑。如果你问我们你想做什么,并为我们提供数学公式,那么可能更容易制定一个可以帮助你更好的答案。
编辑:
要确定粒子在t
的位置,您需要以下代码(将代码重新格式化为Python语法,使用**
代替^
和{{1语句):
return
答案 1 :(得分: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