将 ode 与 scipy 集成时,ode 接受参数多于 t 和 y 的函数。例如:
def fun(t, y, param1, param2):
这些参数的值可以使用设置set_f_params
method.
然而,当同时使用set_solout
方法并尝试更新参数set_f_params
在此函数内,积分保持不变,就像参数没有被修改一样。
如何使用 sol_out 修改参数?我想从 dopri5 密集输出中受益,但我需要在每个时间步更新非齐次项。
下面显示了一个最小的示例。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import ode
def fun(t, x, param):
return x - param
def f_param(t):
return t
ode1 = ode(fun).set_integrator('dopri5').set_initial_value([10.0])
ode1.set_f_params(f_param(0))
results1 = ([], [])
ode2 = ode(fun).set_integrator('dopri5').set_initial_value([10.0])
ode2.set_f_params(f_param(0))
results2 = ([], [])
def callback1(t, x):
results1[0].append(t)
results1[1].append(x.copy())
def callback2(t, x):
results2[0].append(t)
results2[1].append(x.copy())
ode2.set_f_params(f_param(t))
ode1.set_solout(callback1)
ode2.set_solout(callback2)
ode1.integrate(3)
ode2.integrate(3)
plt.plot(results1[0], results1[1], 'o-', alpha=0.7, label='ode1')
plt.plot(results2[0], results2[1], '.--', label='ode2')
plt.legend()
结果如下所示: