MATLAB Function Reference |
解常微分等式(ODEs,ordinary differential equations)的初始值問題
Syntax
[T,Y] = solver(odefun,tspan,y0) [T,Y] = solver(odefun,tspan,y0,options) [T,Y] = solver(odefun,tspan,y0,options,p1,p2...) [T,Y,TE,YE,IE] = solver(odefun,tspan,y0,options)
其中 solver
是 ode45
、ode23
、ode113
、ode15s
、ode23s
、ode23t
或 ode23tb
的其中一個。
Arguments
|
求微分等式右邊函數值的函數。所有的解題器(solver)都以 的模式解題,當問題牽涉到矩陣時,以 的模式解題。ode23s 解題器只可以解包含常數矩陣的等式。ode15s 和 ode23t 可以解包含 singular 矩陣的問題,例如,differential-algebraic equations (DAEs)。 |
tspan |
定義積分範圍的向量,[t0 tf] 。要在特定時間得到答案(全部增加或全部減少),可以使用 tspan = [t0,t1,...,tf] 。 |
y0 |
初始狀態的向量。 |
|
由 odeset 函數產生的選擇性積分參數。詳細情形請看 odeset 。 |
p1,p2... |
傳到 odefun 的選擇性參數。 |
Description
[T,Y] =
而 solver
(odefun,tspan,y0)
tspan = [t0 tf]
求微分等式 系統的積分,時間從 t0
到 tf
,初始值是 y0
。函數 f = odefun(t,y)
,對一個純量 t
和一個直行向量 y
,必須回傳一個對應 的直行向量f
。解答陣列 Y
的每個橫列對應到一個回傳的時間直行向量 T
。使用 tspan = [t0,t1,...,tf]
,可以在特定時間 t0
,t1,...,tf
得到答案,(全部增加或全部減少)。
[T,Y] =
與之前一樣的解題,預設參數以定義在 solver
(odefun,tspan,y0,options)
odeset
函數產生 options
的 property values 取代。一般使用的屬性包含一個純量的對應錯誤容忍值(relative error tolerance) RelTol
(預設值是(1e-3
),還有一個絕對錯誤容忍值的向量 AbsTol
(所有元素的預設值都是 1e-6
)。詳細情形請看 odeset
。
[T,Y] =
與之前一樣的解題,當它被呼叫時,傳入額外的參數 solver
(odefun,tspan,y0,options,p1,p2...)
p1,p2...
到 odefun
函數。如果沒有設定 option,使用 options = []
。
[T,Y,TE,YE,IE] =
與之前一樣的解題,同時還尋找 ,事件函數(event function),哪裡是零。對於每個事件函數(event function),你可以定義零的時候積分是否停止,還有過零的方向是否有關係。這是經由設定 solver
(odefun,tspan,y0,options)
Events
屬性,@EVENTS
,還有產生一個函數[value
,isterminal
,direction
] = EVENTS
(t
,y
)達成的。對第 i
個事件函數:
value(i)
是函數值。isterminal(i)
= 1
如果積分在這個事件函數零的時候要停止,否則則設成 0
。direction(i) = 0
如果所有的零都要計算(預設),+1
如果只計算事件函數遞減時的零,-1
如果只計算事件函數遞減時的零。對應的輸入 TE
、YE
和 IE
分別傳回事件發生時間,事件當時的解,和事件函數消失時的索引值 i
。
如果你定義一個輸出函數 OutputFcn
屬性,解題器會在每個時間點後與算好的解一起呼叫它。提供四個輸出函數:odeplot
、odephas2
、odephas3
、odeprint
。當解題器被呼叫而沒有輸出參數,它會在計算時呼叫預設的 odeplot
來畫出解答。odephas2
和 odephas3
分別產生二維和三維的圖形。odeprint
在螢幕上顯示解答元素。預設的情形,所有解答的元素都會被傳到輸出函數。不過經由提供一個如同 OutputSel
屬性的索引值向量,你可以只傳特定的元素。例如,如果你呼叫解題器且沒有輸出元素,而把 OutputSel
的值設成 [1,3]
,解題器會畫出解答元素的 1 和 3 當它們被計算時。
於嚴謹的解題器 ode15s
、ode23s
、ode23t
和 ode23tb
,為了信賴度和效率,Jacobian matrix 是必需的。使用 odeset
來設 Jacobian
為 @FJAC
如果 FJAC(T,Y)
傳回 Jacobian ,或是設為矩陣 如果 Jacobian 是常數。如果沒有設定 Jacobian
屬性(用預設值), 是用有限的積分來逼近。如果 ODE 函數是程式寫好的,設定 Vectorized
屬性 'on
',如此 odefun
(T
,[Y1,Y2 ...
]) 傳回 [odefun
(T
,Y1
),odefun
(T
,Y2
) ...
]。如果 是一個稀疏矩陣(sparse matrix),設 JPattern
屬性為 的稀疏模式(sparsity pattern),i.e.,一個稀疏矩陣 S
其中 S(i,j)
= 1 如果 的第 i
個元素由 第 j
個元素決定,否則就是0。
ODE 系列的解題器經由 time- 和 state-dependent 的矩陣 可以解答 模式的問題。(ode23s
解題器只可以解常數矩陣的等式。)如果問題有一個矩陣,產生一個函數 M = MASS(t,y)
會傳回矩陣的值,使用 odeset
來設定 Mass
屬性為 @MASS
。如果矩陣是常數,則矩陣可以用來當作 Mass
屬性的值。關於 state-dependent 矩陣的問題比較困難:
MASS
被呼叫時只有一個輸入參數t
,設定 MStateDependence
屬性為 'none
'。 MStateDependence
為 'weak
' (預設值),否則設成 'strong
'。在其他的情形下,MASS
函數被呼叫時需有兩個參數(t
,y
)。 JPattern
屬性提供 的稀疏模式,或是使用 Jacobian
屬性提供稀疏矩陣 。MvPattern
為稀疏矩陣 S
其中 S(i,j) = 1
如果對於任何 k
, 的(i,k
)元素依賴 的 j
元素,否則設為 0
。 如果矩陣 是singular,則 是一個微分的代數問題。只有在 前後一致時,DAEs 會有解。就是說,如果有一個向量 其中
。
ode15s
和 ode23t
解題器可以解索引值 1 的 DAEs 保證 y0
會足夠乎近前後一致。如果有一個矩陣,你可以用odeset
來設定MassSingular
屬性為 'yes'
,'no'
,或是 'maybe'
。'maybe'
的預設值會讓解題器測是問題是否是 DAE。你可以提供 yp0
當作 InitialSlope
屬性的值。預設值是零向量。如果問題是 DAE,而 y0
和 yp0
不是一致的,解題器會把它們當作是猜測,試著計算與猜測值一致的值,然後繼續解題。當解 DAEs 時,將問題公式化是非常有益處的,如此, 是一個對角線矩陣(diagonal matrix)(a semi-explicit DAE)。
ODE 解題器使用的演算法依準確度 [6] 和它們設計要解的系統(嚴謹或不嚴謹)不同而有所不同。詳細情形請看 Algorithms。
Options
不同的解題器在選擇列表接受不同的參數。
更多的資訊在 odeset
和 MATLAB 文件 Mathematical Analysis 中的"微分等式"一節 Improving ODE Solver Performance
。
Examples
Example 1. 一個不嚴謹系統的範例,描述無外力硬式物體的運動。
function dy = rigid(t,y) dy = zeros(3,1); % a column vector dy(1) = y(2) * y(3); dy(2) = -y(1) * y(3); dy(3) = -0.51 * y(1) * y(2);
在這個範例中,我們用 odeset
命令改變錯誤容忍值,且在時間間隔 [0 12] 裡解題,在時間 0
時,初始狀態向量[0 1 1]。
options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]); [T,Y] = ode45(@rigid,[0 12],[0 1 1],options);
plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.')
Example 2. 一個嚴謹系統的範例,鬆弛震盪的 van der Pol 等式。週期的界限有部份的元素改變緩慢而這部份的問題相當嚴謹,交替著非常急劇的改變而這部份較不嚴謹。
function dy = vdp1000(t,y) dy = zeros(2,1); % a column vector dy(1) = y(2); dy(2) = 1000*(1 - y(1)^2)*y(2) - y(1);
對於這個問題,我們將會用預設的相對和絕對容忍值(分別是 1e-3
和 1e-6
),在時間間隔 [0 3000] 裡解題,在時間 0
時,初始狀況向量 [2 0]。
[T,Y] = ode15s(@vdp1000,[0 3000],[2 0]);
plot(T,Y(:,1),'-o')
:
Algorithms
ode45
是以 explicit Runge-Kutta (4,5) 公式為基礎,Dormand-Prince pair。這是一個 一步(one-step) 解題器 - 在計算 y(t
n
)
,它只需要前一個時間點的解答,y(t
n-1
)
。一般來說,對於大多數問題 ode45
是當作"第一次嘗試"的最好函數。[3]
ode23
是 explicit Runge-Kutta (2,3) pair of Bogacki and Shampine 的建構。在粗糙的容忍值和適度的嚴謹度時,它可能比 ode45
更有效率。像 ode45
,ode23
是一個一步(one-step)解題器。[2]
ode113
是一個 variable order Adams-Bashforth-Moulton PECE 解題器。在嚴厲的容忍值和當 ODE 檔案函數求取不易時,它可能比 ode45
更有效率。ode113
是一個 多步(multistep) 解題器 - 它通常需要多個之前時間點的解答來計算目前的答案。[7]
以上的演算法都是試圖解不嚴謹的系統。如果它們執行起來來過慢,試著使用以下其中一個嚴謹的解題器。
ode15s
是一個以numerical differentiation formulas(NDFs)為基礎的可變維度解題器。它選擇性地使用較無效率的 backward differentiation formulas (BDFs, 又稱為 Gear's method)。像 ode113
,ode15s
是一個多步(multistep)解題器。嘗試 ode15s
,當 ode45
失敗、或是非常沒有效率,而且你懷疑問題是嚴謹的時候,或是當解一個微分代數問題時。[9],[10]
ode23s
是以 modified Rosenbrock formula of order 2 為基礎。因為它是一個一步(one-step)解題器,在粗糙的容忍值時,它可能比 ode15s
更有效率。它可以解一些用 ode15s
計算沒有效率的嚴謹問題。[9]
ode23t
是用 trapezoidal rule using a "free" interpolant 建構的。用這個解題器 如果問題只是普通嚴謹且你需要一個沒有數值影響的解答。ode23t
可以解 DAEs。[10]
ode23tb
是用 TR-BDF2 建構的,implicit Runge-Kutta formula with a first stage that is a trapezoidal rule step and a second stage that is a backward differentiation formula of order two。在結構上來說,同樣的重複矩陣被用來計算兩個階段。像 ode23s
,在粗糙的容忍度時,這個解題器可能比 ode15s
更有效率。[8], [1]
See Also
@
(function_handle
), odeset
, odeget
References
[1] Bank, R. E., W. C. Coughran, Jr., W. Fichtner, E. Grosse, D. Rose, and R. Smith, "Transient Simulation of Silicon Devices and Circuits," IEEE Trans. CAD, 4 (1985), pp 436-451.
[2] Bogacki, P. and L. F. Shampine, "A 3(2) pair of Runge-Kutta formulas," Appl. Math. Letters, Vol. 2, 1989, pp 1-9.
[3] Dormand, J. R. and P. J. Prince, "A family of embedded Runge-Kutta formulae," J. Comp. Appl. Math., Vol. 6, 1980, pp 19-26.
[4] Forsythe, G. , M. Malcolm, and C. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, New Jersey, 1977.
[5] Kahaner, D. , C. Moler, and S. Nash, Numerical Methods and Software, Prentice-Hall, New Jersey, 1989.
[6] Shampine, L. F. , Numerical Solution of Ordinary Differential Equations, Chapman & Hall, New York, 1994.
[7] Shampine, L. F. and M. K. Gordon, Computer Solution of Ordinary Differential Equations: the Initial Value Problem, W. H. Freeman, San Francisco, 1975.
[8] Shampine, L. F. and M. E. Hosea, "Analysis and Implementation of TR-BDF2," Applied Numerical Mathematics 20, 1996.
[9] Shampine, L. F. and M. W. Reichelt, "The MATLAB ODE Suite," SIAM Journal on Scientific Computing, Vol. 18, 1997, pp 1-22.
[10] Shampine, L. F., M. W. Reichelt, and J.A. Kierzenka, "Solving Index-1 DAEs in MATLAB and Simulink," SIAM Review, Vol. 41, 1999, pp 538-552.
nzmax | odefile |