常微分方程的數值求解

常微分方程

首先理解一下什麼是常微分方程,簡單的說就是隻有一個未知數的微分方程,具體定義如下:
凡含有參數,未知函數和未知函數導數 (或微分) 的方程,稱爲微分方程,有時簡稱爲方程,未知函數是一元函數的微分方程稱作常微分方程,未知函數是多元函數的微分方程稱作偏微分方程。
一階常微分方程的初值問題是:

{y=f(x,y),y(x0)=y0,

其中y=y(x) 是未知函數,y(x0)=y0 是初值條件,而f(x,y) 是給定的二元函數


簡單的數值方法和歐拉公式

簡單的數值方法就是用差商代替導數,公式如下:

yn+1=yn+hf(xn,yn)(n=0,1,2,)

其中h 是步長;
改進的歐拉方法:
{y¯n+1=yn+hf(xn,yn)預測yn+1=yn+h2[f(xn,yn)+f(xn+1,y¯n+1)]校正

龍格-庫塔(Runge-Kutta)方法

歐拉方法是龍格-庫塔方法的一個特例,其局部截斷誤差爲一階泰勒餘項O(h2) ,爲了使誤差更小,我們可以做更高階的誤差截斷,這也就是我們Runge-Kutta方法的基本原理,具體推導可參考《數值分析》的第八章.其公式如下:

{yn+1=yn+hi=1rciKi,K1=f(xn,yn),Ki=f(xn+λih,yn+hj=1i1uijKj)(i=2,3,,r),

當r=1時就是歐拉方法,當r=2時,就是改進的歐拉方法,這裏我們不做具體推導,而是看一下matlab中封裝好的4階Runge-Kutta方法的函數實現ode45函數.

ode45

先看一個簡單的例子:dydx=y+3xx2 ,初值y(0)=2 ,求解區間爲[14] ,代碼如下:

odefun=@(x,y) (y+3*x)/x^2;
tspan=[1 4];
y0=-2;
[x y]=ode45(odefun,tspan,y0)
plot(x,y)

這裏寫圖片描述

但是我們再看另外一個例子:

{y=yx2y20<x<3y(0)=0

我們編寫如下代碼:
odefun=@(x,y) y/x-2*y^2;
tspan=[0 3];
y0=0;
[x y]=ode45(odefun,tspan,y0)
plot(x,y)
disp(y)

發現沒有數值解
這裏寫圖片描述
於是我們把代碼進行了如下修改:

odefun=@(x,y) fun(x,y);
tspan=[0 3];
y0=0;
[x y]=ode45(odefun,tspan,y0);
plot(x,y)

function dy = fun(x,y)
if(x==0)
    dy=1-2*y^2
else
    dy = y/x-2*y^2
end
end

這裏寫圖片描述
這裏需要強調一點的是,Runge-Kutta法針對的是連續的函數f ,由於在例子中,函數在x=0 處是不連續的,所以在這個地方是需要單獨處理的,在這裏,yxx=0 處的導數爲1(洛必達法則,即00=1 )

發佈了44 篇原創文章 · 獲贊 65 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章