odeset 的示例

首先,我们初始化我们想要解决的初始值问题。

odefun = @(t,y) cos(y).^2*sin(t);
tspan = [0 16*pi];
y0=1;

然后我们使用 ode45 函数而没有任何指定的选项来解决这个问题。为了比较它,我们绘制轨迹。

[t,y] = ode45(odefun, tspan, y0);
plot(t,y,'-o');

我们现在为我们的问题设定了一个狭窄的相对宽度和一个狭窄的绝对极限。

options = odeset('RelTol',1e-2,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');

我们设置了相对狭窄的绝对极限。

options = odeset('RelTol',1e-7,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');

我们设置了狭义的相对和严格的绝对极限。如前面的公差范围窄,可以看出轨迹与第一个图完全不同,没有任何特定选项。

options = odeset('RelTol',1e-2,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');

我们设置了严格的相对和严格的绝对极限。将结果与其他绘图进行比较将强调使用窄容差限制计算的错误。

options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');

以下内容应说明精度和运行时间之间的权衡。

tic;
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
time1 = toc;
plot(t,y,'-o');

为了比较,我们收紧了绝对和相对误差的容差极限。我们现在可以看到,如果没有大的精度增益,解决我们的初始值问题将花费更长的时间。

tic;
options = odeset('RelTol',1e-13,'AbsTol',1e-13);
[t,y] = ode45(odefun, tspan, y0, options);
time2 = toc;
plot(t,y,'-o');