1. 程式人生 > >matlab解微分方程

matlab解微分方程

1.dsolve函式

這是最簡單的一種求解微分方程的一種方法-符號解法。一般來說,在matlab中解常微分方程有兩種方法,一種是符號解法,另一種是數值解法。在本科階段的微分數學題,基本上可以通過符號解法解決。

用matlab解決常微分問題的符號解法的關鍵命令是dslove命令。該命令中可以用D表示微分符號,其中D2表示二階微分,D3表示三階微分,以此類推。值得注意的是該微分預設是對自變數t求導,也可以很容易在命令中改為對其他變數求導。

①求解析解

y’‘= a*y+ bx;

s = dsolve('D2y=a*y+b*x','x');

D2y用以表示y的二階導數,預設是以t為自變數的,所以最好指明自變數為x.

②初值問題

y’ = y – 2*t / y , y(0) = 1;

s = dsolve('Dy == y - 2*t / y','y(0) ==1');

③邊值問題

x*y’’ – 3*y’ = x^2 , y(1) = 0 , y(5) = 0;

s = dsolve('x*D2y - 3*Dy ==x^2','y(1)=0','y(5) == 0','x');

函式最後一個引數指明自變數為x.

④高階方程

求解y’’ = cos(2x) – y , y(0) = 1 , y’(0) = 0;

s=dsolve('D2y == cos(2*x) - y','y(0) =1','Dy(0) = 0','x');

simplify(s);

⑤方程組問題

f’ = f + g , g’ = -f + g,f(0) = 1, g(0) =2;

[f,g]= dsolve('Df == f + g','Dg = -f + g','f(0)==1','g(0) == 2','x');

另外,對於常係數線性微分方程,尤其是高階線性常係數微分方程可用特徵根法求得相應齊次微分方程的基本解,再用常數變易法求特解。

如:

求x'' + 0.2x' +3.92x = 0的通解

解: 特徵方程為:x^2 + 0.2x + 3.92 = 0

roots( [ 1 0.2 3.92 ] )  
然後求出來繼續做就好啦。

2.ode45

常用格式 [ t , y ] = ode45( odefun , tspan , y0 )

odefun 用以表示f(t,y)的函式控制代碼或inline函式i,t是標量,y是標量或向量
tspan 若是二維向量[t0,tf],表示自變數初值t0和終值tf;若是高維向量[t0,t1,...,tn],則表示輸出結點列向量
y0 初值向量y0
t 表示結點列向量(t0,t1,...,tn)^T
y 數值解矩陣,每一列對應y的一個分量

ode是最常用的求解微分方程的指令,它採用變步長四、五階Runge-Kutta-Felhberg法適合高精度問題,ode23與ode45類似,只是精度低一些。

如:


1. 建立一個函式檔案eq2.m,在函式檔案中描述這個解的微分方程組:

%eq2.m檔案
%描述微分方程組

function dy=eq2(t,y) 
 %說明微分變數是二維的,令y(1)=x,y(2)=y
dy=zeros(2,1); 
%微分方程組
dy(1)=5*(1-y(1))/sqrt((1-y(1))^2+(t-y(2))^2);
dy(2)=5*(1-y(2))/sqrt((1-y(1))^2+(t-y(2))^2);
end
2.外部呼叫ode45函式求解微分方程組:
[t,y]=ode45(@eq2,[0,2],[0,0]);

ode45函式說明:第一個引數是方程的名稱,第二個引數是指求解時t的範圍,第三組引數是指y中每個元素的初值。

[t,y]=ode45(@eq2,[t1,t2],[y1(0),y2(0)]);

這部分來自於http://blog.csdn.net/qq_28093585/article/details/70276454。