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

Joh*_*Jay 2 python function projectile

我需要绘制颗粒的位置在时间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)
Run Code Online (Sandbox Code Playgroud)

当我运行该函数时,它表示它无法分配函数调用.

Stj*_*rac 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
Run Code Online (Sandbox Code Playgroud)

但是,还有其他问题.从计算的角度来看,这种计算永远不会终止.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
Run Code Online (Sandbox Code Playgroud)