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');