570 likes | 923 Views
使用 MatLab 解微分方程. 使用 MatLab 解微分方程式的基本流程與相關基本知識. 首先撰寫描述該微分方程式的 M 檔案。 M 檔案就像是一個小程式,裡面可以是欲執行的命令、函數、運算式或程式語句。 將該 M 檔案與初始條件值,載入 ode 求解函數中,透過求解器求出微分方程的解。 最後經過 ode 求解函數運算後,將傳回指定的時間區間內的解,以一個 行向量 儲存。 行向量是一個 列數恆為 1 的矩陣,矩陣在 MatLab 中表示為 ( 行 , 列 ) , 例如 : (1,1) 、 (2,1) …
E N D
使用 MatLab 解微分方程式的基本流程與相關基本知識 • 首先撰寫描述該微分方程式的M檔案。M檔案就像是一個小程式,裡面可以是欲執行的命令、函數、運算式或程式語句。 • 將該M檔案與初始條件值,載入ode求解函數中,透過求解器求出微分方程的解。 • 最後經過ode求解函數運算後,將傳回指定的時間區間內的解,以一個行向量儲存。 • 行向量是一個列數恆為1的矩陣,矩陣在MatLab中表示為(行,列) , 例如:(1,1)、(2,1) … (1,1)代表”1 x 1”的矩陣,可以儲存一個變數值; (2,1)代表”2 x 1”的矩陣,可以儲存兩個變數值;以此類推。 5. 因此要解微分方程時,我們必須先撰寫好兩個M檔案,一個是用來描述該微分方程式,一個則是用來進行初始條件值的設定。
Part I: M檔案的撰寫(以一級反應為例) 一級反應的微分式為: d[A]/dt = -k*[A] • Step 1:開啟MatLab程式 點擊桌面上的MatLab圖示,執行MatLab。 (MatLab剛開啟時較慢,請耐心等候。) • Step 2:待紅色圈圈處的>>及Ready出現,即為開啟完成。
Step 3:開啟 Editor視窗 點選左上角 File→New →Function,會出現一個 Editor視窗。
Step 4:編輯描寫微分方程的M檔案 在Editor視窗中輸入以下指令: function da=firstorder(t,a,k) da=zeros(1,1); da(1)=-k*a(1); end [這些指令下一頁會進行詳細的說明]
function da=firstorder(t,a,k) da=zeros(1,1); da(1)=-k*a(1); end 一級反應的微分式為: d[A]/dt=-k*[A] • 檔案的內容中,第一行必須遵循以下格式: function d輸出參數=函數名稱(輸入參數) function da = firstorder (t,a,k) 這裡 a 是輸出參數。 而其中函數名稱可自訂,但不可與變數名稱相同,且第一個 字元必須為字母,字母間不可空格。 這裡 輸入參數共有三個,分別為 t, a & k 。
function da=firstorder(t,a,k) da=zeros(1,1); da(1)=-k*a(1); end 一級反應的微分式為: d[A]/dt=-k*[A] • 第二行是將輸出參數“da“透過“zeros(1,1)”將其設定為一個1x1其值為零的矩陣。這個1x1的矩陣是要用來存放[A]值。所以a(1)所代表的就是[A]。 • 第三行則就用來描述一級反應的微分式, “*”號代表數學上的乘號。 • 第四行的end跟第一行開頭的function是互相對應的,代表該函數運算的結束,但不能漏掉。 ※在MatLab中,於程式行末尾加上分號,會使該行程式執行結果不顯示。
※檔名第一個字元必須是字母,字母間不可留空格。※檔名第一個字元必須是字母,字母間不可留空格。 • Step 5:將M檔案存檔 點選左上角 File→Save As,儲存檔案,檔名與上一步的函數名稱相同即可。
Step 6:編輯設定初始條件的M檔案 依Step 3再開啟一個新的M檔案,輸入紅色圈圈內的指令。 下一頁會進行詳細說明
functionsetvalue global a0 k timeup; a0=input('請輸入反應物初始濃度:'); k=input('請輸入k值:'); timeup=input('請輸入時間區間上限:'); end 第一行的部分不必像描述微分方程的M檔案那樣,只需要有函數名稱即可,函數名稱可自訂,但不可與變數名稱相同,且第一個字元必須為字母,字母間不可空格。 第二行則是要將a0, k, timeup宣告為全域變數(global),全域變數就是要讓這些變數在各種檔案或模式中是互通共用的,因此這一步驟是非常重要的。 第三到五行則是利用input這個內建函數,讓使用者可以自行輸入a0, k, timeup這些變數的值;紫色文字的部分會顯示給使用者看,用來提醒使用者目前是要輸入哪個變數,紫色文字的部分可自行更改。 第四行的end跟第一行開頭的function是互相對應的, 代表該函數運算的結束,不能漏掉。
※檔名第一個字元必須是字母,字母間不可留空格。※檔名第一個字元必須是字母,字母間不可留空格。 • Step 7:將M檔案存檔 點選左上角 File → Save As,儲存檔案,檔名與上一步的函數名稱相同即可。 描述方程式及設定初始條件值的M檔案編輯完成後,就可以進行MatLab內建的求解器函數進行計算及作圖了。
Part II:命令視窗的計算與作圖(以一級反應為例) • Step 1:移至命令視窗 有>>出現的視窗即為命令視窗,命令視窗是供使用者輸入函數、命令、運算式與程式語句的介面。
Step 2:將變數宣告為全域變數 在命令視窗中輸入:global a0 k timeup; 在命令視窗與M檔案中的變數原本是互相獨立的,如果我們要使變數互通共用的話,我們必須在M檔案以及命令視窗中都將a0,k,timeup宣告為全域變數,若有一邊無宣告的話,則變數依然會是獨立的,造成錯誤。
Step 3:初始條件設定 執行Part I所編輯好的setvalue.m,進行初始條件的設定。 直接在命令視窗中輸入第二個M檔案的檔名即可執行。 執行setvalue後,會請user輸入參數值。這裡的值可自行更改。
這裡要空格 • Step 4:進行計算 輸入以下指令: [T,A]=ode45(@(t,a) firstorder(t,a,k),[0:0.1:timeup],a0); 下頁進行該指令詳細說明
[T,A]=ode45(@(t,a) firstorder(t,a,k),[0:0.1:timeup],a0); T和A這兩個變數是用來儲存計算後的結果,後面作圖也是利用這兩個變數。 ode45是MatLab 內建的求解器,本次實驗使用的都是這個求解器。 @(t,a)是要告訴求解器:我們所要求的未知數只有 t和 a。 這裡就是先前M檔案中的函數名稱(輸入參數),必須跟M檔案中一致。 這個部分是要設定計算的時間範圍,[開始時間:時間間隔:結束時間]。 這個部分則是要設定初始條件,因為在這裡我們只求反應物的變化,所以在這裡只要給定一個初始條件值 a0即可,意思也就是[A]0=a0;若要給定多個初始條件值時,這裡則必須用以下的表示法:[a0 b0 c0],每個初始條件以空格區隔開即可。
Step 5:作圖 輸入plot(T,A)後,出現的Figure1就是一級反應time對濃度所作的圖。 plot(X,Y)是作圖的函數, 第一個值為圖的X軸(Time),第二個值為圖的Y軸([A])。 這裡也可以直接輸入運算式 Ex: plot(T,A/a0) 產生的圖 X軸就是Time Y軸就是[A]/[A]0
Step 6:圖形設定 在Figure 1上選取Edit →Axes Properties,會出現紅色圈圈的部分。
Step 7:進行軸與圖形參數的微調,並且設定X軸Y軸以及Title。
Step 8:點選軸上的文字,可更改字型、大小、顏色等。 點選軸上文字或標題 可更改字體大小及字型
Step 9:將圖形存檔 圖形參數設定完之後,點選左上角File→Save As,儲存檔案。 存檔類型若為*.fig,只有MatLab能開啟。 若要一般圖檔則選取*.jpg。
Step 10:抓取計算的Data 存完圖檔後,點選紅色圈圈處的Workspace,Workspace中會存放著目前所有變數的值。 這裡會顯示變數的值或是矩陣大小,像A和T都是101X1的行向量。 這裡的A和T矩陣大小一定要相同,若不同,則可能是先前變數未清除完全,此時則必須先在命令視窗中輸入 clear all(此指令會消除所有變數) 接著再重複執行Part II。
Step 11:點選所要瀏覽的變數後,會出現下面的視窗,我們便可以看到這個變數所有的值了。
Step 12:選取所有數據,點滑鼠右鍵Copy,再開啟Excel,將數據貼上,重複步驟將T和A的數據複製至Excel,也可利用Excel作圖。
Part III:M檔案的撰寫(以二級反應為例) 二級反應的微分式為: d[A]/dt=-k*[A]^2 • Step 1:開啟Editor視窗(可參考第4頁) 點選左上角File→New →Function,會出現一個Editor視窗。 二級反應Part III的部分,與一級反應Part I的部分大同小異,僅有編輯描寫微分方程的M檔案(第26頁)的地方有些微不同;若已熟悉Part I 的同學,這裡可自行加快速度,若還不熟悉,可參考詳細步驟再練習一次。
Step 2:編輯描寫微分方程的M檔案 在Editor視窗中輸入以下指令: function da=secondorder(t,a,k) da=zeros(1,1); da(1)=-k*a(1)^2; end [這些指令下一頁會進行詳細的說明]
function da=secondorder(t,a,k) da=zeros(1,1); da(1)=-k*a(1)^2; end 二級反應的微分式為: d[A]/dt=-k*[A]^2 • 檔案的內容中,第一行必須遵循以下格式: function d輸出參數=函數名稱(輸入參數) function da = secondorder (t,a,k) 這裡 a 是輸出參數。 而其中函數名稱可自訂,但不可與變數名稱相同,且第一個 字元必須為字母,字母間不可空格。 這裡 輸入參數共有三個,分別為 t, a & k 。
function da=secondorder(t,a,k) da=zeros(1,1); da(1)=-k*a(1)^2; end 二級反應的微分式為: d[A]/dt=-k*[A]^2 • 第二行是將輸出參數“da“透過“zeros(1,1)”將其設定為一個1x1其值為零的矩陣。這個1x1的矩陣是要用來存放[A]值。所以a(1)所代表的就是[A]。 • 第三行則就用來描述二級反應的微分式, “*”號代表數學上的乘號, “^”代表數學上的次方。 • 第四行的end跟第一行開頭的function是互相對應的,代表該函數運算的結束,但不能漏掉。 ※在MatLab中,於程式行末尾加上分號,會使該行程式執行結果不顯示。
Step 3:將M檔案存檔(可參考第8頁) • Step 4:編輯設定初始條件的M檔案(可參考第9、10頁) 二級反應使用的條件設定M檔案與一級反應的相同,不熟悉的同學可再練習一次。
Part IV:命令視窗的計算與作圖(以二級反應為例) 二級反應Part IV的部分,與一級反應Part II的部分大同小異,僅有進行計算時的指令(第31頁)有些微不同;若已熟悉Part II的同學,這裡可自行加快速度,若還不熟悉,可參考詳細步驟再練習一次。 • Step 1:將變數宣告為全域變數(可參考第13頁) 在命令視窗中輸入:global a0 k timeup; • Step 2:初始條件設定(可參考第14頁) 執行Part I所編輯好的setvalue.m,進行初始條件的設定。
這裡要空格 • Step 3:進行計算 輸入以下指令: [T,A]=ode45(@(t,a) secondorder(t,a,k),[0:0.1:timeup],a0); 下頁進行說明
[T,A]=ode45(@(t,a) secondorder(t,a,k),[0:0.1:timeup],a0); T和A這兩個變數是用來儲存計算後的結果,後面作圖也是利用這兩個變數。 ode45是MatLab內建的求解器,本次實驗使用的都是這個求解器。 @(t,a)是要告訴求解器:我們所要求的未知數只有t和a。 這裡就是先前M檔案中的函數名稱(輸入參數),必須跟M檔案中一致。 這個部分是要設定計算的時間範圍,[開始時間:時間間隔:結束時間]。 這個部分則是要設定初始條件,因為在這裡我們只求反應物的變化,所以在這裡只要給定一個初始條件值a0即可,意思也就是[A]0=a0;若要給定多個初始條件值時,這裡則必須用以下的表示法:[a0 b0 c0],每個初始條件以空格區隔開即可。
Step 4:作圖 (可參考第17頁) 輸入plot(T,A)後,出現的Figure1就是二級反應time對濃度 所作的圖。 • Step 5:圖形設定(可參考第18頁) 在Figure 1上選取Edit →Axes Properties。 • Step 6:進行軸與圖形參數的微調,並且設定X軸Y軸以及Title。(可參考第19頁)
Step 7:點選軸上的文字,可更改字型、大小、顏色等 (可參考第20頁) • Step 8:將圖形存檔(可參考第21頁) 圖形參數設定完之後,點選左上角File→Save As,儲存檔案。 • Step 9~11:抓取計算的Data (可參考第22~24頁) 存完圖檔後,將Workspace中T和A變數的值複製到Excel 並利用Excel作圖。
Part V:M檔案的撰寫(以平行一級反應為例) 平行一級反應Part V的部分,與一級反應Part I的部分大同小異,僅有編輯描寫微分方程的M檔案(第36頁)和編輯設定初始條件的M檔案(第39頁)的地方有明顯不同;若已熟悉Part I 的同學,其他步驟可自行加快速度,若還不熟悉,可參考詳細步驟再練習一次。 • Step 1:開啟Editor視窗(可參考第4頁) 點選左上角File→New →Function,會出現一個Editor視窗。 平行一級反應的微分式為: d[A]/dt=-k1*[A]-k2*[A] d[B]=k1*[A] d[C]=k2*[A] A B 反應速率常數= k1 A C 反應速率常數= k2
平行一級反應的微分式為: d[A]/dt=-k1*[A]-k2*[A] d[B]=k1*[A] d[C]=k2*[A] • Step 2:編輯描寫微分方程的M檔案 在Editor視窗中輸入以下指令: function da=parallel(t,a,k1,k2) da=zeros(3,1); da(1)=-k1*a(1)-k2*a(1); da(2)=k1*a(1); da(3)=k2*a(1); end [這些指令下一頁會進行詳細的說明]
function da=parallel(t,a,k1,k2) da=zeros(3,1); %a(1)=[A] a(2)=[B] a(3)=[C] da(1)=-k1*a(1)-k2*a(1); da(2)=k1*a(1); da(3)=k2*a(1); end 平行一級反應的微分式為: d[A]/dt=-k1*[A]-k2*[A] d[B]=k1*[A] d[C]=k2*[A] ※在MatLab中,%是程式的註解符號,%後的指令文字皆不執行。 • 檔案的內容中,第一行必須遵循以下格式: function d輸出參數=函數名稱(輸入參數) function da = parallel (t,a,k) 這裡 a 是輸出參數。 而其中函數名稱可自訂,但不可與變數名稱相同,且第一個 字元必須為字母,字母間不可空格。 這裡 輸入參數共有三個,分別為 t, a & k 。
function da=parallel(t,a,k1,k2) da=zeros(3,1); %a(1)=[A] a(2)=[B] a(3)=[C] da(1)=-k1*a(1)-k2*a(1); da(2)=k1*a(1); da(3)=k2*a(1); end 平行一級反應的微分式為: d[A]/dt=-k1*[A]-k2*[A] d[B]=k1*[A] d[C]=k2*[A] ※在MatLab中,%是程式的註解符號,%後的指令文字皆不執行。 • 第二行的部分,因為計算後的值是利用行向量儲存的,而這裡我們有[A],[B], [C]三個物種濃度,所以我們這裡要將da設成(3,1)的矩陣。 • 第三到第五行是用來描述平行一級反應的微分式, “*”號代表數學上的乘號。 • 第六行的end跟第一行開頭的function是互相對應的,代表該函數運算的結束,但不能漏掉。 ※在MatLab中,於程式行末尾加上分號,會使該行程式執行結果不顯示。
Step 3:將M檔案存檔(可參考第8頁) 點選左上角File→Save As,儲存檔案,檔名與上一步的函數名稱相同即可。 • Step 4:編輯設定初始條件的M檔案 再開啟一個新的M檔案,輸入紅色圈圈內的指令。 下一頁會進行詳細說明
functionsetparallel global a0 b0 c0 k1 k2 timeup; a0=input(‘請輸入反應物的初始濃度:'); b0=input('請輸入產物B的初始濃度:'); c0=input('請輸入產物C的初始濃度:'); k1=input('請輸入k1值:'); k2=input('請輸入k2值:'); timeup=input('請輸入時間區間上限:'); end 第一行的部分不必像描述微分方程的M檔案那樣,只需要有函數名稱即可,函數名稱可自訂,但不可與變數名稱相同,且第一個字元必須為字母,字母間不可能空格。 第二行的部分,因為平行反應所要設定的條件較多,因此必須將這些變數都宣告為全域變數(global)。 第三到八行則是利用input這個內建函數,讓使用者可以自行輸入這些變數的值;紫色文字的部分會顯示給使用者看,用來提醒使用者目前是要輸入哪個變數,紫色文字的部分可自行更改。 第九行的end跟第一行開頭的function是互相對應的,不能漏掉。 ※在MatLab中,於程式行末尾加上分號,會使該行程式執行結果不顯示。
Step 5:將M檔案存檔(可參考第11頁) 點選左上角File→Save As,儲存檔案,檔名與上一步的函數名稱相同即可。 ※檔名第一個字元必須是字母,字母間不可留空格。 描述方程式及設定初始條件值的M檔案編輯完成後,就可以進行MatLab內建的求解器函數進行計算及作圖了。
Part VI:命令視窗的計算與作圖(以平行一級反應為例) • Step 1:將變數宣告為全域變數(可參考第13頁) 在命令視窗中輸入:globala0b0 c0 k1 k2 timeup; 平行一級反應Part VI的部分,與一級反應Part II的部分大同小異,僅有進行計算時的指令(第46頁)有些微不同;若已熟悉Part I 的同學,其他步驟可自行加快速度,若還不熟悉,可參考詳細步驟再練習一次。
Step 2:初始條件設定 執行Part V所編輯好的setparallel.m,進行初始條件的設定。 直接在命令視窗中輸入M檔案的檔名即可執行。 執行setvalue後,會請user輸入參數值。這裡的值可自行更改。
這裡要空格 • Step 3:進行計算 輸入以下指令: [T,A]=ode45(@(t,a) parallel(t,a,k1,k2),[0:0.1:timeup],[a0 b0 c0]); 下頁進行說明
[T,A]=ode45(@(t,a) parallel(t,a,k1,k2),[0:0.1:timeup],[a0 b0 c0]); T和A這兩個變數是用來儲存計算後的結果,後面作圖也是利用這兩個變數。 ode45是MatLab內建的求解器,本次實驗使用的都是這個求解器。 @(t,a)是要告訴求解器:我們所要求的未知數只有t和a。 這裡就是先前M檔案中的函數名稱(輸入參數),必須跟M檔案中一致。 這個部分是要設定計算的時間範圍,[開始時間:時間間隔:結束時間]。 這個部分則是要設定初始條件,因為我們要求反應物A及產物B、產物C三個物種的濃度變化,所以在這裡必須要給定三個初始條件[A]0=a0 [B]0=b0 [C]0=c0。
Step 4:作圖 (可參考第17頁) 輸入plot(T,A)後,出現的Figure1就是平行一級反應time對 濃度所作的圖。 • Step 5:圖形設定(可參考第18頁) 在Figure 1上選取Edit →Axes Properties。 • Step 6:進行軸與圖形參數的微調,並且設定X軸Y軸以及Title。(可參考第19頁) • Step 7:點選軸上的文字,可更改字型、大小、顏色等 (可參考第20頁)
Step 8:點選Insert →Legend後,會出現紅色圈圈的部分。
在 • Step 9:上按右鍵可更改設定,在圖上的字上點 選滑鼠兩下,可以更改文字。 完成時如右圖:
Step 10:將圖形存檔 圖形參數設定完之後,點選左上角File→Save As,儲存檔案。 存檔類型若為*.fig,只有MatLab能開啟。 若要一般圖檔則選取*.jpg。
Step 11:抓取計算的Data 存完圖檔後,點選紅色圈圈處的Workspace,Workspace中會存放著目前所有變數的值。 這裡會顯示變數的值或是矩陣大小,這裡A的矩陣大小是101X3的原因是:裡面一次存放了3個濃度([A][B][C])的值,但是行的部分一樣是101,這代表[A][B][C]都分別有101個數據,與T吻合。