我需要通过调用 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 求解器中获取值的方法。
最佳答案
有可能,只是您不能使用 eom
函数的返回值。因此,您需要一些其他方式从 eom
走私数据。有很多很多不同的方法可以做到这一点。最简单的可能是只使用全局变量:
import scipy.integrate as spi
count = 0
def pend(t, y):
global count
theta, omega = y
dydt = [omega, -.25*omega - 5*np.sin(theta)]
count += 1
return dydt
sol = spi.solve_ivp(pend, [0, 10], [np.pi - 0.1, 0.0])
print(count)
输出:
182
另外,请注意,我在上面的代码中使用了 solve_ivp
而不是 odeint
。 odeint
docs假设在编写新代码时,您现在应该使用 solve_ivp
而不是旧的 odeint
。
如果是我自己的代码,我可能会通过将累加器对象传递到我的函数的部分版本中来完成任务:
class Acc:
def __init__(self):
self.x = 0
def __str__(self):
return str(self.x)
def pend_partial(acc):
def pend(t, y):
theta, omega = y
dydt = [omega, -.25*omega - 5*np.sin(theta)]
acc.x += 1
return dydt
return pend
count = Acc()
sol = spi.solve_ivp(pend_partial(count), [0, 10], [np.pi - 0.1, 0.0])
print(count)
输出:
182
但是,如果您只是编写一个简短的脚本或其他内容,您可能应该使用更简单的global
方法。这是一个非常好的用例。
关于python - scipy.integrate.odeint 是否可以输出内部计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698969/