我是 Python 新手。我正在编写一个脚本,它将使用 Runge-Kutta 方法对一组常微分方程进行数值积分。由于 Runge-Kutta 方法是一种有用的数学算法,因此我将它放在自己的 .py 文件 rk4.py 中。
def rk4(x,dt):
k1=diff(x)*dt
k2=diff(x+k1/2)*dt
k3=diff(x+k2/2)*dt
k4=diff(x+k3)*dt
return x+(k1+2*k2+2*k3+k4)/6
该方法需要知道用户正在使用的方程组才能执行算法,因此它调用一个函数,该函数diff(x)
将为 rk4 找到它需要工作的导数。由于方程会因使用而改变,我希望在运行特定问题的脚本中定义 diff()。在这种情况下,问题是水星的轨道,所以我写了mercury.py
. (这不是它最终的样子,但为了弄清楚我在做什么,我已经简化了它。)
from rk4 import rk4
import numpy as np
def diff(x):
return x
def mercury(u0,phi0,dphi):
x=np.array([u0,phi0])
dt=2
x=rk4(x,dt)
return x
mercury(1,1,2)
当我运行mercury.py 时,我得到一个错误:
File "PATH/mercury.py", line 10, in mercury
x=rk4(x,dt)
File "PATH/rk4.py", line 2, in rk4
k1=diff(x)*dt
NameError: global name 'diff' is not defined
我认为它diff()
不是全局函数,当 rk4 运行时,它对 diff 一无所知。显然 rk4 是一小段代码,我可以把它塞进我当时正在使用的任何脚本中,但我认为 Runge-Kutta 积分器是一个基本的数学工具,就像 NumPy 中定义的数组一样,所以它使它成为一个被调用的函数是有意义的,而不是在每个使用它的脚本中定义的函数(可能很多)。但我也不能告诉 rk4.py 从特定的 .py 文件导入特定的差异,因为这破坏了我首先想要的 rk4 的通用性。
有没有办法在像mercury.py这样的脚本中全局定义差异,以便在调用rk4时,它会知道差异?