如何在Python中定义相互依赖的函数?
我需要根据以下公式绘制一个粒子在时间 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)
当我运行这个函数时,它提示说无法分配函数调用。
2 个回答
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
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 不是一个代数系统,不能求解某些值。如果你在 g(s)
中调用 s(t)
,而在 s(t)
中又调用 g(s)
,那么它们会一直互相调用,直到递归栈满了,然后就会报错,除非你定义一个终止条件。
另外,由于你在 g(s)
中定义了 s(t)
,所以你不能在外部调用它,就像你在代码后面的几处所做的那样。
你似乎对 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