常微分方程數值求解的一般概念
常微分方程數值求解的一般概念
-
求解微分方程概念
求解常微分方程初值問題就是尋找函數y(t)使之滿足如下方程:
y’=f(t,y),t0≤t≤b ,y(t0)=y0
所謂其數值解法,就是求y(t)在離散結點tn處的函數近似值yn的方法,yn≈y(xn)。 這些近似值稱爲常微分方程初值問題的數值解。相鄰兩個結點之間的距離稱爲步長。 -
兩種方法:
- 單步法:在計算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)
- t和y分別給出時間向量和相應的數值解。
- solver爲求常微分方程數值解 的函數(即下面表格中的函數)。
- filename是定義f(t,y)的函數名,該函數必須返回一個列向量。
- tspan形式爲[t0,tf],表示求解區間。
- y0是初始狀態向量。
- Option是可選參數, 用於設置求解屬性,常用的屬性包括相對誤差值RelTol(默認值是10-3)和絕對誤 差值AbsTol(默認值是10-6)。
- 常微分方程數值求解函數的統一命名格式:
odennxx
- ode是Ordinary Differential Equation的縮寫,是常微分方程的意思。
- nn是數字,代表所用方法的階數。
例如,ode23採用2階龍格-庫塔(Runge-Kutta)算法,用3階公式做誤差估計來調節步長,具有低等精度。
ode45採用4階龍格-庫塔算法,用5階公式做誤差估計來調節步長,具有中
等精度。 - 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