【问题标题】:How to define codependent functions in Python?如何在 Python 中定义相互依赖的函数?
【发布时间】:2013-02-25 00:23:55
【问题描述】:

我需要绘制一个粒子在时间 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)

当我运行函数时,它说它不能分配函数调用。

【问题讨论】:

  • 那么g(s)是函数的函数吗?它使用的t 来自哪里?
  • 您应该阅读the Python tutorial 以了解如何在 Python 中编写函数的基础知识。

标签: python function projectile


【解决方案1】:

这个错误意味着你不能写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

【讨论】:

  • 换句话说,按照目前的说法,它是无法回答的。
  • 谢谢!我需要每 1 秒打印一次垂直抛向空中的粒子的位置 s(t),直到它再次撞击地面。我已经获得了上面列出的功能。我主要关心的是您在上面回答的问题,即根据彼此定义功能。
  • @BabyBlueLion 我修改了我的答案以提供您正在寻找的内容。不能保证背后的物理原理,已经有几年了,但如果你想调整公式,你现在应该可以做到。
  • @StjepanBakrac 非常感谢!还有一个问题:我将如何考虑变化的速度?我有 v(t) = v(t-dt) - g(s2(t-dt))*dt。到目前为止,我已经在代码中添加了:def v(t): return v(t-dt) - g(sc)*dt 但这会导致无限循环。
  • @BabyBlueLion 就像我说的那样,不能保证物理学,但在这个计算中根本不需要速度。初始速度在v0 项中,当前速度在s(t) 组件的1/2*g*t^2 中(如v(t) = ds(t)/dt)。如果您确实想包含它,它就不能无休止地递归。或者将上一步的值存储在一个额外的变量vc 中,那么下一个时间步的速度的正确语法是def v(t): return vc + g(sc)*dt(应该将返回放在下一行)。
【解决方案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

【讨论】:

  • 另外v 是无限递归的。而t == int(t) 可能永远不会发生。
猜你喜欢
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2011-09-18
  • 2021-08-25
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多