Matlab ode45 与 ode23,不同的解决方案
Matlab ode45 vs. ode23, different solutions
我对一组非刚性微分方程使用了 ode45
和 ode23
。然而,这两种方法收敛到一个略有不同的解决方案。我怎样才能找出哪一个是正确的?请参阅附图,其中蓝色为 ode45
,红色为 ode23
。虚线是每个求解器的最终值。还有,ode15s
有点不一样(小于1m)...
Matlab 的 ODE 求解器是 adaptive so one specifies tolerances rather than a step size (see also this answer). Given the code in the PDF linked in the comments, if you specify a smaller value for the relative tolerance, the solutions from ode45
and ode23
will converge after the same amount of time. You can use odeset
to set 'RelTol'
:
...
opts = odeset('RelTol', 1e-12);
[t, oput] = ode23(@(t,y)secondode(t,y,C,g), tspan, IC, opts);
...
请注意,我还删除了链接代码中使用的全局变量(它们是 bad and inefficient)。您还需要将 secondode
的函数定义更改为:
function z = secondode(t, indata, C, g)
...
我对一组非刚性微分方程使用了 ode45
和 ode23
。然而,这两种方法收敛到一个略有不同的解决方案。我怎样才能找出哪一个是正确的?请参阅附图,其中蓝色为 ode45
,红色为 ode23
。虚线是每个求解器的最终值。还有,ode15s
有点不一样(小于1m)...
Matlab 的 ODE 求解器是 adaptive so one specifies tolerances rather than a step size (see also this answer). Given the code in the PDF linked in the comments, if you specify a smaller value for the relative tolerance, the solutions from ode45
and ode23
will converge after the same amount of time. You can use odeset
to set 'RelTol'
:
...
opts = odeset('RelTol', 1e-12);
[t, oput] = ode23(@(t,y)secondode(t,y,C,g), tspan, IC, opts);
...
请注意,我还删除了链接代码中使用的全局变量(它们是 bad and inefficient)。您还需要将 secondode
的函数定义更改为:
function z = secondode(t, indata, C, g)
...