Matlab學習——求解微分方程(組)


介紹:

1.在 Matlab 中,用大寫字母 D 表示導數,Dy 表示 y 關於自變量的一階導數,D2y 表示 y 關於自變量的二階導數,依此類推.函數 dsolve 用來解決常微分方程(組)的求解問題,調用格式為

          X=dsolve(‘eqn1’,’eqn2’,…)

如果沒有初始條件,則求出通解,如果有初始條件,則求出特解

系統缺省的自變量為 t。

 

2.函數 dsolve 求解的是常微分方程的精確解法,也稱為常微分方程的符號解.但是,有大量的常微分方程雖然從理論上講,其解是存在的,但我們卻無法求出其解析解,此時,我們需要尋求方程的數值解,在求常微分方程數值解方面,MATLAB 具有豐富的函數,將其統稱為 solver,其一般格式為:

           [T,Y]=solver(odefun,tspan,y0)

說明:(1)solver 為命令 ode45、ode23、ode113、ode15s、ode23s、ode23t、ode23tb、ode15i 之一.

(2)odefun 是顯示微分方程 y '  = f (t , y) 在積分區間 tspan = [t 0 , t f ] 上從 t0 到 t f  用初始條件 y0 求解.

(3)如果要獲得微分方程問題在其他指定時間點 t 0 , t1 , t 2 , , t f  上的解,則令tspan = [t 0 , t1 , t 2 , t f ] (要求是單調的).

 (4)因為沒有一種算法可以有效的解決所有的 ODE 問題,為此,Matlab 提供了多種求解器 solver,對於不同的 ODE 問題,采用不同的 solver

 

3.在 matlab 命令窗口、程序或函數中創建局部函數時,可用內聯函數 inline,inline 函數形式相當於編寫 M 函數文件,但不需編寫 M-文件就可以描述出某種數學關系.調用 inline 函數,只能由一個 matlab 表達式組成,並且只能返回一個變量,不允許[u,v]這種向量形式.因而,任何要求邏輯運算或乘法運算以求得最終結果的場合,都不能應用 inline 函數,inline 函數的一般形式為:

       FunctionName=inline(‘函數內容’, ‘所有自變量列表’) 

 

例如:(求解 F(x)=x^2*cos(a*x)-b ,a,b 是標量;x 是向量 )在命令窗口輸入:

Fofx=inline('x.^2.*cos(a.*x)-b','x','a','b');g = Fofx([pi/3 pi/3.5],4,1)

 

 

 

系統輸出為:g=-1.5483 -1.7259注意:由於使用內聯對象函數 inline 不需要另外建立 m 文件,所有使用比較方便,另外在使用 ode45 函數的時候,定義函數往往需要編輯一個 m 文件來單獨定義,這樣不便於管理文件,這里可以使用 inline 來定義函數。

例子:

一、ex(求精確解):

1. 求解微分方程 y ' + 2xy = xe-x2

syms x y; y=dsolve('Dy+2*x*y=x*exp(-x^2)','x')

 

運行結果:

2. 求微分方程 xy ' + y - e x  = 0 在初始條件 y (1) = 2e 下的特解並畫出解函數的圖形.

syms x y; y=dsolve('x*Dy+y-exp(1)=0','y(1)=2*exp(1)','x');ezplot(y)

 

運行結果:

 

3. 求解微分方程組在初始條件x |= 0 = 1, y |=0 = 0 下的特解,並畫出解函數的圖像。

syms x y t;

[x,y]=dsolve('Dx+5*x+y=exp(t)','Dy-x-3*y=0','x(0)=1','y(0)=0','t');

simplify(x);

simplify(y);

ezplot(x,y,[0,1.3]);axis auto

 

 

其中,simplify函數可以對符號表達式進行簡化。以下是運行結果:

 

二、ex(近似解):

1. 求解微分方程初值問題的數值解,求解范圍為區間 [0,0.5] 。

fun=inline('-2*y+2*x^2+2*x','x','y');
[x,y]=ode23(fun,[0,0.5],1);
plot(x,y,'o-')

 

 

 

 

2.求解微分方程,y(0) = 1,y(0) = 0 的解,並畫出解的圖像。

通過變換,將二階方程化為一階方程組求解.令,則

          

編寫 vdp.m 文件:

function fy=vdp(t,x)

fy=[x(2);7*(1-x(1)^2)*x(2)-x(1)];

end

 

 

命令行輸入:

y0=[1;0]
[t,x]=ode45('vdp',[0,40],y0);
y=x(:,1);dy=x(:,2);
plot(t,y,t,dy)

 

 

在使用ode45函數的時候,定義函數往往需要編輯一個 .m文件來單獨定義,這樣不便於管理文件,因此編寫 inline 函數:

fy=inline('[x(2);7*(1-x(1)^2)*x(2)-x(1)]','t','x')

 

 

運行:

結果一致!

 

三、ex(用 Euler 折線法求解):

Euler 折線法求解的基本思想是將微分方程初值問題

               

化成一個代數(差分)方程,主要步驟是用差商替代微商,於是

           

,從而,於是

         

1. 用 Euler 折線法求解微分方程初值問題

               

的數值解(步長h取 0.4),求解范圍為區間[0,2]

本題的差分方程為:

   

clear;
f=sym('y+2*x/y^2');a=0;b=2;
h=0.4;
n=(b-a)/h+1;
x=0;
y=1;
szj=[x,y];%數值解
for i=1:n-1
y=y+h*subs(f,{'x','y'},{x,y});%subs,替換函數
x=x+h;
szj=[szj;x,y];
end;
szj;
plot(szj(:,1),szj(:,2))

 

 

說明:替換函數 subs 例如:輸入 subs(a+b,a,4) 意思就是把 a 用 4 替換掉,返回 4+b,也可以替換多個變量,例如:subs(cos(a)+sin(b),{a,b},[sym('alpha'),2])分別用字符 alpha 替換 a 和 2 替換 b,返回 cos(alpha)+sin(2)。

 

偏微分方程解法

 

Matlab 提供了兩種方法解決 PDE 問題,一是使用 pdepe 函數,它可以求解一般的 PDEs,具有較大的通用性,但只支持命令形式調用;二是使用 PDE 工具箱,可以求解特殊 PDE 問題,PDEtoll 有較大的局限性,比如只能求解二階 PDE問題,並且不能解決片微分方程組,但是它提供了 GUI 界面,從復雜的編程中解脫出來,同時還可以通過 File—>Save As 直接生成 M 代碼.

實例:

求解一個正方形區域上的特征值問題:

      

 

正方形區域為:

 

(1)使用 PDE 工具箱打開 GUI 求解方程

(2)進入 Draw 模式,繪制一個矩形,然后雙擊矩形,在彈出的對話框中設置Left=-1,Bottom=-1,Width=2,Height=2,確認並關閉對話框

(3)進入 Boundary 模式,邊界條件采用 Dirichlet 條件的默認值

(4)進入 PDE 模式,單擊工具欄 PDE 按鈕,在彈出的對話框中方程類型選擇Eigenmodes,參數設置 c=1,a=-1/2,d=1,確認后關閉對話框

(5)單擊工具欄的 D 按鈕,對正方形區域進行初始網格剖分,然后再對網格進一步細化剖分一次

(6)點開 solve 菜單,單擊 Parameters 選項,在彈出的對話框中設置特征值區域為[-20,20]

(7)單擊 Plot 菜單的 Parameters 項,在彈出的對話框中選中 Color、Height(3-D plot)和 show mesh 項,然后單擊 Done 確認

(8)單擊工具欄的“=”按鈕,開始求解

得到結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM