如何在Python中定义相互依赖的函数?

2 投票
2 回答
1193 浏览
提问于 2025-04-17 16:59

我需要根据以下公式绘制一个粒子在时间 t 时的位置:s(t) = -0.5*g(s)*t^2+v0*t,其中g(s) = G*M/(R+s(t))^2GMR是常量,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

撰写回答