Recall: Function handle and pseudo code
Matlab
解常微分方程的指令中, 最常用的有以下兩個:
ode45
: 解 non-stiff 微分方程ode15s
: 解 stiff 微分方程其基本指令就是
[TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0)
其中
ODEFUN
是個 function handle, 定義了要解的 ODETSPAN
= [T_0 T_FINAL], 定義另要解的時間範圍Y0
是初始值也就是說, 這是在解一階常微分方程的初始值問題.
要解一階常微分方程的初始值問題, 我們將方程寫成
其中
接著我們將它寫成 matlab
函數:
dydt = myODE(t, Y)
% Input: t - time, scalar
% Y - nx1 vector
% Output: dydt: nx1 vector
dydt = F(t, Y)
定義出這個函數之後, 就可以把它以 @
做成 function handle 輸入至 ode45
來解了.
舉例來說, 我們想要解這個二階常微分方程的初始值問題:
其中
我們引進
其初始值為
上面這個微分方程寫成函數就是以下這個樣子. (這是 matlab
內建的程式, 不需要另外存可以直接用, 其中
function dydt = vdp1(t,y)
%VDP1 Evaluate the van der Pol ODEs for mu = 1
%
dydt = [y(2); (1-y(1)^2)*y(2)-y(1)];
好了之後我想要以 ode45
來解, matlab
的 command window 輸入
[t,y]=ode45(@vdp1,[0 20],[2 0]'); % 解上列 van der pol ODEs
plot(t,y(:,1)); % 畫出解來
ode45(@vdp1,[0 20],[2 0]')
[t,y]=ode45(@vdp1,[0 20],[2 0]');
plot(y(:,1), y(:,2))
解以下的 Lorenz system
其中
並以如下指令畫出其在三維的 phase plane
plot3(y(:,1), y(:,2), y(:,3))
ode45
只能解常微分方程初始值問題, 因此, 若我們要解的問題是邊界值問題, 那就需要用其他方式來做.
比如說我們要解以下 Fisher-KPP equation
跟之前一樣我們引進
然後我們知道
假設我們令 ode45
來解這問題, 得到
也就是說, 給定
而原問題是要找
也就是說, 我們要找
也就是說, 這是個求根問題, 我們要找
以 shooting method 解以下的 two-point boundary value problem: