gpt4 book ai didi

python - Scipy 整合 : is solve_ivp "always worse" than odeint?

转载 作者:行者123 更新时间:2023-12-05 07:08:05 28 4
gpt4 key购买 nike

示例 ODE 的解析解

我通过解决以下初始值问题来测试这些方法之间的差异:

y'=2*y-t

您可以通过考虑 y(t) 是齐次解 y_h(t)=c1*exp(2t) 和特定解 y_p(t)=t/2+1/4。常量 c1 是通过替换 y(t0)=y0 找到的。则解析解为:

y(t)=(y0-t0/2-1/4)*exp(2*(t-t0))+t/2+1/4

注意如果y0=0.25t0=0,这与y(t)=t/2+1/4。在这种情况下 y(1)=0.75


solve_ivpodeint的比较

首先 from scipy.integrate import solve_ivp, odeint

通过编写 odeint(lambda y,t: 2*y-t,[0.25],[0,1]) 我们得到了预期的结果 y(0)=0.25y(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.25y(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.25y(1)=0.82772876

如果您在更长的时间跨度内尝试这样做,对于这个特定示例,solve_ivp 的结果只会变得更糟。


我错过了什么吗?

最佳答案

我要 sleep 了......

根据odeint documentation ,该函数必须是 func(y, t) 类型(尽管它确实接受 f(t,y) 如果您指定它)。

并根据solve_ivp documentation ,函数必须是 func(t, y) 类型。

关于python - Scipy 整合 : is solve_ivp "always worse" than odeint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61947973/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com