我需要根据以下公式绘制粒子在时间 t 的位置:s(t) = -0.5*g(s)*t^2+v0*t
,其中g(s) = G*M/(R+s(t))^2
(G
、M
和 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)
当我运行该函数时,它说它无法分配函数调用。
最佳答案
错误的意思是不能写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 语法,使用 **
而不是 ^
和 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
关于python - 如何在 Python 中定义相互依赖的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058379/