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

标签 python function projectile

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

相关文章:

从 C 中的另一个函数调用 main 函数

java - 无法让子弹以正确的角度射击?

python - 在 Python 中轻松访问标准化残差、厨师值、帽子值(杠杆)等?

用于搜索 Pandas 数据框的 Python 函数

ios - 在单独的类中使用 func() 需要拥有该方法的类的实例

java - 为什么在处理大型/速度射弹时会出现不准确的情况,是由于欧拉积分吗?

swift - SpriteKit GameScene 函数被按钮调用后不会添加 SKSpriteNode

python - 如何使用 Python 从 Facebook 评论插件获取文本?

python - Selenium 找不到元素如何以其他方式单击元素

python - 为什么这个程序中索引会越界?