8

如果有人能夠幫助解決以下問題,我將不勝感激。 我有以下ODE:與分析解決方案相比,ODE45和Runge-Kutta方法的絕對誤差

dr/dt = 4*exp(0.8*t) - 0.5*r ,r(0)=2, t[0,1]  (1) 

我在兩種不同的方式解決(1)。 通過Runge-Kutta方法(4階),並通過ode45在Matlab中。我比較與分析解決方案,它由下式給出了兩個結果:

r(t) = 4/1.3 (exp(0.8*t) - exp(-0.5*t)) + 2*exp(-0.5*t) 

當我對於繪製每種方法的絕對誤差的精確解,我得到如下:

對於RK - 方法,我的代碼是:

h=1/50;            
x = 0:h:1;           
y = zeros(1,length(x)); 
y(1) = 2;  
F_xy = @(t,r) 4.*exp(0.8*t) - 0.5*r;     
for i=1:(length(x)-1)        
    k_1 = F_xy(x(i),y(i)); 
    k_2 = F_xy(x(i)+0.5*h,y(i)+0.5*h*k_1); 
    k_3 = F_xy((x(i)+0.5*h),(y(i)+0.5*h*k_2)); 
    k_4 = F_xy((x(i)+h),(y(i)+k_3*h)); 
    y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h; % main equation 
end 

enter image description here

而對於ode45

tspan = 0:1/50:1; 
x0 = 2; 
f = @(t,r) 4.*exp(0.8*t) - 0.5*r; 
[tid, y_ode45] = ode45(f,tspan,x0); 

enter image description here

我的問題是,爲什麼我有振盪,當我使用ode45? (我指的是絕對錯誤)。兩種解決方案都是準確的(1e-9),但在這種情況下ode45會發生什麼?

當我計算RK方法的絕對誤差時,它爲什麼看起來更好?

回答

21

您的RK4功能採取的固定步驟比ode45正在採取的步驟要小得多。你真正看到的是由於polynomial interpolation導致的錯誤,用於產生ode45所需的真正步驟之間的點。這通常被稱爲「密集輸出」(見Hairer & Ostermann 1990)。

當您指定具有兩個以上元素的TSPAN矢量時,Matlab's ODE suite solvers會生成固定步長輸出。這並不意味着他們實際上使用了固定的步長,或者他們使用了TSPAN中指定的步長。你可以看到實際使用的步長,仍然具有ode45輸出的結構和使用deval得到你想要的定步長輸出:

sol = ode45(f,tspan,x0); 
diff(sol.x) % Actual step sizes used 
y_ode45 = deval(sol,tspan); 

你會看到,0.02初始步驟之後,因爲你是ODE簡單它收斂到0.1爲後續步驟。默認公差與默認最大步長限制(積分間隔的十分之一)相結合確定了這一點。我們繪製的誤差在真實的步伐:

exactsol = @(t)(4/1.3)*(exp(0.8*t)-exp(-0.5*t))+2*exp(-0.5*t); 
abs_err_ode45 = abs(exactsol(tspan)-y_ode45); 
abs_err_ode45_true = abs(exactsol(sol.x)-sol.y); 
abs_err_rk4 = abs(exactsol(tspan)-y); 
figure; 
plot(tspan,abs_err_ode45,'b',sol.x,abs_err_ode45_true,'k.',tspan,abs_err_rk4,'r--') 
legend('ODE45','ODE45 (True Steps)','RK4',2) 

Errors plot

正如你所看到的,在真實的步伐誤差比錯誤RK4更多生長緩慢(ode45是有力的RK4高階方法所以你會期待這一點)。由於插值,積分點之間的誤差增大。如果你想限制這個,那麼你應該通過odeset來調整公差或其他選項。

如果你想強制ode45使用的1/50一個步驟中,您可以做到這一點(的作品,因爲你的ODE很簡單):

opts = odeset('MaxStep',1/50,'InitialStep',1/50); 
sol = ode45(f,tspan,x0,opts); 
diff(sol.x) 
y_ode45 = deval(sol,tspan); 

對於另一項實驗中,儘量擴大積分間隔來進行整合,t = 10也許。你會在錯誤中看到很多有趣的行爲(繪製相對錯誤在這裏很有用)。你能解釋一下嗎?你能用ode45odeset來產生表現良好的結果嗎?使用自適應步驟方法將指數函數在大的時間間隔內集成具有挑戰性,並且不一定是該工作的最佳工具。然而,有alternatives,但他們可能需要一些編程。

+1

嗨@horchler。遺憾的是,我不能給你答案一分。在這個時刻,我不確定我所處的環境是什麼:你的編程技巧或數學理解。 –

+0

我不知道從** ode45 **實際步驟從哪裏點下面。如果是這種情況,我100%同意你的觀點,**代表**更準確。你可以採取'tic toc'這兩種方法嗎?我經歷過** RK-方法**使用0.018秒,而** ode45 **使用0.5秒。我能否得出結論:** ode45 **更精確但速度更慢?而且,我相信** ode45 **的自適應步長控制器**非常好(?) –

+0

我還沒有試圖擴大積分間隔,​​但我對輸出非常好奇。與此同時,它讓我對你的評論感興趣,我可以期待如何取得良好的效果,而不僅僅是** ode45 **和** odeset **。我會盡我所能地嘗試這個兒子!感謝分享! –

0

ode45連接rk4-rk5。我個人認爲ODE45錯誤更好。注意它保持有界。當誤差幅度變得太大時,ode4被糾正,每個週期的最小誤差約爲1e-10。 rk4「跑掉」,沒有任何東西阻止它。

+2

這不是錯誤情節實際顯示的內容。在這種情況下,「ode45」通過第二步收斂到一個恆定的步長。情節並沒有顯示錯誤是「界限」,它只是像你期望的那樣增長緩慢。 – horchler

+1

你是對的,我對你的答案給出了一個積極的分數。一種更準確的方式,我應該用它來描述的是「跑得更快」和「錯誤率保持更有界」。 – EngrStudent