matlab6——數值微分和方程求解(四) 常微分方程數值求解

常微分方程數值求解的一般概念

常微分方程數值求解的一般概念

  1. 求解微分方程概念
    求解常微分方程初值問題就是尋找函數y(t)使之滿足如下方程:
    y’=f(t,y),t0≤t≤b ,y(t0)=y0
    所謂其數值解法,就是求y(t)在離散結點tn處的函數近似值yn的方法,yn≈y(xn)。 這些近似值稱爲常微分方程初值問題的數值解。相鄰兩個結點之間的距離稱爲步長。

  2. 兩種方法:

  • 單步法:在計算yn+1時只用到前一步的yn,因此在有了初值之後就可以逐步往下計算, 其代表是龍格-庫塔(Runge-Kutta)法。
  • 多步法:在計算yn+1時,除了用到前一步的值yn之外,還要用到yn-p(p=1,2,…,k, k>0)的值,即前面的k步。其代表就是亞當斯(Adams)法。

常微分方程數值求解函數

常微分方程數值求解函數

  • 調用格式
    [t,y]=solver(filename,tspan,y0,option)
  1. t和y分別給出時間向量和相應的數值解。
  2. solver爲求常微分方程數值解 的函數(即下面表格中的函數)。
  3. filename是定義f(t,y)的函數名,該函數必須返回一個列向量。
  4. tspan形式爲[t0,tf],表示求解區間。
  5. y0是初始狀態向量。
  6. Option是可選參數, 用於設置求解屬性,常用的屬性包括相對誤差值RelTol(默認值是10-3)和絕對誤 差值AbsTol(默認值是10-6)。
  • 常微分方程數值求解函數的統一命名格式:
    odennxx
  1. ode是Ordinary Differential Equation的縮寫,是常微分方程的意思。
  2. nn是數字,代表所用方法的階數。
    例如,ode23採用2階龍格-庫塔(Runge-Kutta)算法,用3階公式做誤差估計來調節步長,具有低等精度。
    ode45採用4階龍格-庫塔算法,用5階公式做誤差估計來調節步長,具有中
    等精度。
  3. xx是字母,用於標註方法的專門特徵。例如,ode15s、ode23s中的“s”
    代表(Stiff),表示函數適用於剛性方程。

求常微分方程數值解的函數

在這裏插入圖片描述

舉幾個個栗子

例一

在這裏插入圖片描述

f=@(t,y) (y^2-t-2)/4/(t+1);
[t,y]=ode23(f,[0,10],2);
y1=sqrt(t+1)+1;%精確計算
plot(t,y,'b:',t,y1,'r');%繪圖比較一下精確計算與數值求解的結果,從圖形可以看出擬合較好

在這裏插入圖片描述

例二

在這裏插入圖片描述

f=@(t,x) [-2,0;0,1]*[x(2);x(1)]; 
[t,x]=ode45(f,[0,20],[1,0]); %四個未知數
subplot(2,2,1);plot(t,x(:,2));
subplot(2,2,2);plot(x(:,2),x(:,1));

在這裏插入圖片描述

剛性問題

有一類常微分方程,其解的分量有的變化很快,有的變化很慢,且相差懸殊,這就是所謂的剛性問題(Stiff)。
對於剛性問題,數值解算法必須取很小步長才能獲得滿意的結果,導致計算
量會大大增加。解決剛性問題需要有專門方法。非剛性算法可以求解剛性問
題,只不過需要很長的計算時間。

舉個例子

假如點燃一個火柴,火焰球迅速增大直至某個臨界體積,然後,維持這一體積不變,原因是火焰球內部燃燒耗費的氧氣和從球表面所獲氧氣達到平衡。其簡化模型如下:
在這裏插入圖片描述
其中,y(t)代表火焰球半徑,初始半徑是λ,它很小。分析λ的大小對方程求解過程的影響。
這裏列出兩個方法,通過對比時間長短體會剛性問題的特殊解法。

lamada較大采用非剛性解法
lamda=0.01; %lamada較大
f=@(t,y) y^2-y^3;
tic;%記錄開始時間
[t,y]=ode45(f,[0,2/lamda],lamda);%非剛性解法
toc ;%記錄結束時間
disp(['ode45計算的點數' num2str(length(t))]);
結果:
時間已過 0.061455 秒。%時間較短,說明此時沒有較明顯的剛性
ode45計算的點數157
lamada較小,兩種方法對比
非剛性解法:
lamda=1e-5; %lamda特別小
f=@(t,y) y^2-y^3; 
tic;
[t,y]=ode45(f,[0,2/lamda],lamda);
toc;
disp(['ode45計算的點數' num2str(length(t))]);
結果:
時間已過 0.230707 秒。
ode45計算的點數120565%時間長,點數多表明明顯的鋼性特徵

剛性解法:
lamda=1e-5;
f=@(t,y) y^2-y^3; 
tic;
[t,y]=ode15s(f,[0,2/lamda],lamda);
toc 
disp(['ode15s計算的點數' num2str(length(t))])
結果:
時間已過 0.044472 秒。
ode15s計算的點數98
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章