问题描述
我正在尝试使用 SciPy 解决一组 ODE。给我的任务要求我解决 500 个时间步长的微分方程。如何使用 SciPy 实现这一目标?
到目前为止,我已尝试使用 scipy.integrate.solve_ivp
,它为我提供了正确的解决方案,但我无法控制它运行的时间步数。 t_span
参数让我可以配置 t
的初始值和最终值是什么,但我实际上对此并不感兴趣——我只对我集成的次数感兴趣。 (例如,当我使用 t_span = (0,500)
运行方程时,求解器积分 907 次。)
以下是我的代码的简化示例:
from scipy.integrate import solve_ivp
def simple_diff(t,z) :
x,y = z
return [1 - 2*x*y,2*x - y]
t_range = (0,500)
xy_init = [0,0]
sol = solve_ivp(simple_diff,t_range,xy_init)
我也可以使用 SciPy 以外的其他东西,但使用 SciPy 的解决方案更可取。
解决方法
您可以使用 solve_ivp 的 t_eval
参数在特定时间点进行评估:
import numpy as np
t_eval = np.arange(501)
sol = solve_ivp(simple_diff,t_range,xy_init,t_eval=t_eval)
但是,请注意,这不会导致求解器限制积分步骤的数量 - 这是由误差指标决定的。
如果您绝对必须对函数求值 500 次才能获得 500 个积分步骤,那么您描述的是欧拉积分,这将不如 solve_ivp
使用的算法准确。
查看方程的解,感觉您可能只想对 t=5 进行积分。
以下是与上述设置集成时的结果:
这是结果
t_eval = np.linspace(0,5)
t_range = (0,5)
sol = solve_ivp(simple_diff,t_eval=t_eval)