如何解决如何使用 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 进行积分。
以下是与上述设置集成时的结果:
这是结果
t_eval = np.linspace(0,5)
t_range = (0,5)
sol = solve_ivp(simple_diff,t_eval=t_eval)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。