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

时间:2013-02-25 00:23:55

标签: python function projectile

我需要在时间t绘制粒子的位置,给定以下公式:s(t) = -0.5*g(s)*t^2+v0*t,其中g(s) = G*M/(R+s(t))^2GM和{{1是常量,R是一个值,而不是函数s)。粒子被垂直射击,我想每秒打印它的当前位置,直到它撞到地面。但我无法弄清楚如何定义一个函数而不使用另一个函数定义之前。到目前为止,这是我的代码:

s(t)

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

2 个答案:

答案 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