【发布时间】:2020-05-22 04:38:27
【问题描述】:
示例 ODE 的解析解
我正在通过解决以下初始值问题来测试这些方法之间的差异:
y'=2*y-t
您可以通过考虑y(t) 是齐次解y_h(t)=c1*exp(2t) 和特解y_p(t)=t/2+1/4 的线性组合来分析解决这个问题。通过替换y(t0)=y0 可以找到常量c1。那么解析解是:
y(t)=(y0-t0/2-1/4)*exp(2*(t-t0))+t/2+1/4
注意,如果y0=0.25 和t0=0,这与y(t)=t/2+1/4 相同。在这种情况下y(1)=0.75。
solve_ivp 和 odeint 之间的比较
第一个from scipy.integrate import solve_ivp, odeint。
通过写odeint(lambda y,t: 2*y-t,[0.25],[0,1]),我们得到了预期的结果y(0)=0.25和y(1)=0.75。
但是,通过编写solve_ivp(lambda y,t: 2*y-t,t_span=[0,1],y0=[0.25],t_eval=[0,1]),我们得到y(0)=0.25 和y(1)=0.82775742 的结果。
如this question 中所述,solve_ivp 应该具有“LSODA”方法并调整其容差,以便与odeint 进行公平比较。通过阅读scipy odeint documentation,我们看到公差在1.49e-8 左右。
但是solve_ivp(lambda y,t: 2*y-t,t_span=[0,1],y0=[0.25],t_eval=[0,1],method='LSODA',atol=1.49e-8,rtol=1.49e-8) 仍然产生y(0)=0.25
和y(1)=0.82772876。
如果你尝试这个更长的时间跨度,结果只会变得更糟solve_ivp,对于这个特定的例子。
我错过了什么吗?
【问题讨论】:
-
我被困在不同系统的同一个问题上。
solve_ivp也给我比odeint更差的结果,即使我在solve_ivp中使用了kwargsmethod='LSODA',atol=1.49e-8,rtol=1.49e-8并且即使我使用了正确的y 和t 顺序。在此过程中,您是否发现了其他任何见解?
标签: python scipy odeint integrate