如何使用 Python (SciPy) 为一组时间步长求解 ODE?

问题描述

我正在尝试使用 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 进行积分。

以下是与上述设置集成时的结果:

enter image description here

这是结果

t_eval = np.linspace(0,5)
t_range = (0,5)
sol = solve_ivp(simple_diff,t_eval=t_eval)

enter image description here