用MATLAB求解非線性微分方程

總結一下MATLAB中求解微分方程的思路和步驟。固然,網上很多關於此類的技術型文章,但往往一看下來發現,文章中的友情鏈接比文章字數還多,要了解這一篇文章,你要先了解那個;要了解那個,你又要了解那個那個;以此類推。瞭解完了,花都謝了。我在這裏要寫的是娛樂型文章,即試圖用最少的字數陳述出MATLAB的求解微分方程方法,看完後可以記得清楚且不亦樂乎。其實個人十分推薦MATLAB中的幫助文件,內容實在是特別給力,簡明的不能再簡明瞭。可惜了是英文寫的,即使是天天要面對英語的我,也頗爲頭疼。那麼以下我將結合我對MATLAB中幫助文檔的理解,提出我對求解最簡單微分方程的方法的總結。以求解一個經典的非線性方程爲例。

         做一個最基本的假設:你們都看過高數。

 

一。老溼發話了:童鞋們,求解一下這個方程,判斷她是否穩定。要是穩定,那麼她是否存在極限環:

一看明白了,這不就是傳說中的範德普方程。地球人都知道她穩定並有極限環。現在我們就看看如何用MATLAB求解她的軌跡。

 

二。一般的計算機求解方程的方法無外乎是這樣:首先把該方程改寫成一個規範的形式,一般使用狀態空間表示法;而後調用已有的算法進行求解;最後對得出的結果進行處理,比如畫圖之類的。接下來就對這三大步分別作出解釋。

 

三。輸入待求解的方程。

         首先我們知道,狀態空間的標準形式(自由系統)是:

這裏X是列向量,F是作用於列向量的函數,可以是線性也可以是非線性。範德普方程可以改寫成這樣的標準形式:

MATLAB中關於輸入輸入待解方程的語句特別簡單。需要先定義一個普通函數,函數名任意,姑且叫做myFcn,格式如下

function xdot = myFcn (t, x)  

 

需要注意的是,函數必須含有t, x兩個參數,名稱可以自己任意定。xdot是這個函數本身的返回值,只出現在這個函數內部,因此也可以任意定。

定義中的x被視爲是一個列向量,x(i)表示列向量中的第i個分量。那麼F函數的每一個分量即簡單地用表達時給出即可。其中的自變量可以引用x(i)。以範德普方程爲例:

 

xdot = [x(2) ; u(1-x(1)^2)*x(2)-x(1)]  

 

於是,這兩句話便構成了待解函數。

 

 

四。調用MATLAB函數進行求解

         通常人工求解微分方程需要知道初始值,計算機求解也不例外。另外,由於非線性方程一般只有數值解,故計算精度也可以調整。這些都是可以自己調整的參數。

         調用MATLAB計算求解常微分方程的模式很簡單,格式爲:

 

[t, x] = ode45(@myFcn, [開始時間 結束時間], [初始值列向量], options)

 

注意到求解出來的結果是[t, x]即一堆數,所以需要我們進行後處理比如畫圖之類的。

ode45表示了MATLAB中的一種內置計算微分方程的算法,最爲常用,出於娛樂目的,就先用這個。

@表示待求解的方程,如myFcn

[開始時間 結束時間]表示求解的時間段,不必定義間隔。

[初始值列向量]就不用多說了。通常在求解之前定義一個變量x0列向量表示初始值,然後輸入起來就方便多了。

options本身是一個變量。注意,她的名稱不固定,但是他是一個以結構體爲類型的變量。options很重要,稍後討論。

 

五。進行後處理。在得到[t, x]後可以自己用plot神馬的進行畫圖。不過我一般不這樣,各位看官不必驚慌。

 

六。options的用法。

         optionsMATLAB幫助中是這樣定義格式的:

         options = odeset (“Name”, Value, “Name”, Value, …)

         意思是,options這個變量要用到odeset這個函數來對他進行賦值。而odeset這個函數的參數必須是成對出現的:一個名稱對應一個數值。

         我們要用到的是這樣的:

 

         options= odeset(“OutputFcn”, @odephas2, “reltol”, 1e-5);

 

注意,odeset中的參數名稱不可任意定,因爲都是預定義好的。”OutputFcn”使用預定義的函數進行輸出,而與定義的函數有好幾種,使用@進行選擇,我們選odephas2即畫相平面圖(phase portrait)。之後的那個參數表示相對誤差的最大允許值,不說也明白。

         有一個問題,用odephas2畫出的圖圖不好看,因爲上面打了好多圈圈。解決辦法是找到該文件,修改其中所有的plot語句即可,把那個”-o”去掉就行了。

 

七。就是這個樣了。總結一下,求解範德普方程可以用如下語句:

 

首先是函數定義:

function xdot = myFcn (t, x)

xdot = [x(2) ; u(1-x(1)^2)*x(2)-x(1)]

 

其次是主程序:

% Solving options predetermined

options=odeset('OutputFcn',@odephas2,'reltol',1e-5);

% Solving vdp equation withdifferent ini conditions

for a = -3 : 0.1 : 3   

   b1=sqrt(25-a^2);

   b2=-sqrt(25-a^2);

   % Solve the problem

   [t,y]=ode45(@myFcn, [0 20], [a b1], options);

   hold on

   [t,y]=ode45(@myFcn, [0 20] ,[a b2], options);

   hold on    

end

grid on

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