我需要从调用odeint传递内部计算 . 我通常在完成集成后再次重新计算值,但我更愿意在odeint的被调用函数中进行所有计算 .
我的问题在计算上并不重,因此在ode求解器内进行计算时可以获得额外的性能损失是可以接受的 .
from scipy.integrate import odeint
import numpy as np
def eom(y, t):
internal_calc = y/(t+1)
xdot = y
return xdot, internal_calc
if __name__ == '__main__':
t = np.linspace(0, 5, 100)
y0 = 1.0 # the initial condition
output, internal_calc = odeint(eom, y0, t)
此代码无法运行,但希望能够显示我所追求的内容 . 我希望每次通过积分器时都能从eom函数中获取'internal_calc'值 .
我四处寻找选项,但我认识的最好的python程序员之一告诉我要编写自己的集成器,这样我就能做我想做的事 .
在我这样做之前,我想我会问其他人是否有一种方法可以从odeint求解器中获取值 .
1 回答
有可能,您无法使用
eom
函数的返回值 . 所以你需要一些其他方法从eom
走私数据 . 有很多种不同的方法可以做到这一点 . 最简单的可能就是使用全局变量:输出:
另请注意,我在上面的代码中使用了
solve_ivp
而不是odeint
. odeint docs说在编写新代码时,你现在应该使用solve_ivp
而不是旧的odeint
.如果它是我自己的代码,我可能通过将累加器对象传递给我的函数的部分版本来完成任务:
输出:
但是,如果您只是编写一个简短的脚本或其他东西,您应该只使用更简单的
global
方法 . 这是一个非常好的用例 .