ODE ソルバーの選択
常微分方程式
"常微分方程式" (ODE) には、1 つの独立変数 t に対する従属変数 y の導関数が 1 つ以上含まれます。t は通常、時間を表します。y の t に対す導関数を表すためにここで使用される表記法は、1 次導関数は 、2 次導関数は などのようになります。ODE の "次数" は方程式における y の最高次の導関数に等しくなります。
たとえば、これは 2 次 ODE です。
"初期値問題" で ODE の解を求めるには初期状態から開始します。初期条件 および解の取得対象期間 を使用して、解を反復的に求めます。各ステップで、ソルバーは前のステップの結果に対して特定のアルゴリズムを適用します。このような最初のステップでは、積分を進めるために必要な情報が初期状態によって提供されます。最終的な結果として、ODE ソルバーはタイム ステップのベクトル と、各ステップでの対応する解 を返します。
ODE のタイプ
MATLAB® の ODE ソルバーでは次のタイプの 1 次 ODE の解を求めます。
形式の陽的 ODE。
形式の線形陰的な ODE。ここで、 は正則な質量行列です。この質量行列は時間または状態に依存するか、定数行列になります。線形陰的な ODE では、y の 1 次導関数の線形結合が使用されます。これらは質量行列にエンコードされます。
線形陰的な ODE は陽的な形式 に常に変換できます。ただし、ODE ソルバーに対して質量行列を直接指定すると、不便で計算量の多いこの変換を回避できます。
の一部の要素が欠けている場合、この方程式は "微分代数方程式" (DAE) と呼ばれます。DAE 系には "代数変数" がいくつか含まれます。代数変数は従属変数で、方程式にはその導関数がありません。DAE 系を等価な 1 次 ODE 系として書き換えるには、この方程式を微分して代数変数を除外します。DAE を ODE として書き換えるために必要な導関数の数は微分指数と呼ばれます。
ode15s
ソルバーとode23t
ソルバーでは指数が 1 の DAE の解を求めることができます。形式の完全陰的な ODE。完全陰的な ODE は陽的な形式に書き換えることができません。また、代数変数がいくつか含まれることがあります。
ode15i
ソルバーは完全陰的な問題を対象に設計されています。指数が 1 の DAE もその対象に含まれます。
ODE 系
解を求める連立 ODE の方程式の数はいくつでも指定できます。原則として、方程式の数は利用できるコンピューター メモリのみによって制限を受けます。方程式系に n 個の方程式があるとします。
この場合、方程式をエンコードする関数は n 個の要素をもつベクトルを返し、それは の値に対応します。たとえば、次の 2 つを含む方程式系について考えます。
これらの方程式をエンコードする関数は次のようになります。
function dy = myODE(t,y) dy(1) = y(2); dy(2) = y(1)*y(2)-2; end
高次 ODE
MATLAB ODE ソルバーでは 1 次方程式の解のみを求めることができます。高次 ODE は汎用の置き換え方法を使用して等価な 1 次の方程式系に書き換えなければなりません。
これらの置き換えの結果は、次のような n 個の 1 次方程式系になります。
たとえば、次のような 3 次 ODE について考えます。
次のような置き換えを使用します。
この結果、等価な 1 次方程式系は次のようになります。
この方程式系のコードは次のようになります。
function dydt = f(t,y) dydt(1) = y(2); dydt(2) = y(3); dydt(3) = y(1)*y(3)-1; end
複素数 ODE
次の複素数 ODE 方程式について考えます。
ここで です。この解を求めるには、実数部と虚数部を別々の解の要素に分けてから、最後にその結果を再結合します。概念的には次のようになります。
たとえば、ODE が の場合、関数ファイルを使用してこの方程式を表すことができます。
function f = complexf(t,y) f = y.*t + 2*i; end
この場合、実数部と虚数部を分けるコードは次のようになります。
function fv = imaginaryODE(t,yv) % Construct y from the real and imaginary components y = yv(1) + i*yv(2); % Evaluate the function yp = complexf(t,y); % Return real and imaginary in separate components fv = [real(yp); imag(yp)]; end
解を取得するためのソルバーを実行すると、初期条件 y0
も実数部と虚数部に分けられ、解の要素それぞれに対して初期条件が提供されます。
y0 = 1+i; yv0 = [real(y0); imag(y0)]; tspan = [0 2]; [t,yv] = ode45(@imaginaryODE, tspan, yv0);
解を取得したら、実数部と虚数部の両方の要素を結合して最終結果を得ます。
y = yv(:,1) + i*yv(:,2);
基本的なソルバー選択
ODE のほとんどの問題には ode45
の実行が適しているため、通常はまずこのソルバーを選択してください。ただし、精度に関する要件が緩い場合または厳しい場合は、ode23
、ode78
、ode89
、および ode113
が ode45
よりも効率的なことがあります。
ODE の一部の問題では、"スティッフ性" が見られる場合、つまり、評価が困難な場合があります。スティッフとは明確な定義が難しい用語ですが、一般的には、問題中のいずれかの部分でスケールに差があるときにスティッフになります。たとえば、時間スケールに大幅な違いがあると変化する解の要素が ODE に 2 つある場合、その方程式はスティッフな可能性があります。ノンスティッフ ソルバー (ode45
など) で問題の解を求められない場合や極端に処理が遅い場合は、その問題はスティッフであると判定できます。ノンスティッフ ソルバーの処理が非常に遅いことがわかった場合は、代わりに ode15s
などのスティッフ ソルバーを使用してみてください。スティッフ ソルバーを使用する場合、ヤコビ行列やそのスパース パターンを渡すことによって信頼性と効率性を高めることができます。
ode
オブジェクトを使用して、問題のプロパティに基づいてソルバーの選択を自動化できます。どのソルバーを使用すればよいかわからない場合のために、下表に各ソルバーをどのような場合に使用すればよいかについての一般的なガイドラインを示します。
ソルバー | 問題のタイプ | 精度 | 使用時 |
---|---|---|---|
ode45 | ノンスティッフ | 中 | ほとんどの場合に使用します。まず |
ode23 | 低 | 粗い許容誤差が設定された問題や中程度のスティッフがある問題では、 | |
ode113 | 低から高 | 厳しい許容誤差が設定された問題や ODE 関数の計算に時間がかかるような問題では、 | |
ode78 | 高 | 精度に関する要件が高い滑らかな解の問題では、 | |
ode89 | 高 | 積分の時間間隔が長い場合や許容誤差が特に厳しい場合など、非常に滑らかな問題では、 | |
ode15s | スティッフ | 低から中 |
|
ode23s | 低 | 粗い許容誤差が設定された問題では、
質量行列がある場合、これは定数でなければなりません。 | |
ode23t | 低 |
| |
ode23tb | 低 |
| |
ode15i | 完全陰的 | 低 | 完全陰的な問題 f(t,y,y’) = 0 の場合や指数 1 の微分代数方程式 (DAE) の場合は、 |
各ソルバーをどのような場合に使用すればよいかの詳細と追加推奨事項については、[5]を参照してください。
ODE の例とファイルの概要
ODE のほとんどの問題に対して開始点として効果的に使用できるサンプル ファイルがいくつかあります。[微分方程式の例] アプリでは例を簡単に参照したり実行したりできます。このアプリを実行するには、次のように入力します。
odeexamples
個々のサンプル ファイルを編集用に開くには、次のように入力します。
edit exampleFileName.m
例を実行するには、次のように入力します。
exampleFileName
次の表に、利用可能な ODE および DAE のサンプル ファイルと、それらで使用されているソルバーおよびオプションのリストを示します。例のサブセットがドキュメンテーションでも直接公開されている場合は、リンクを記載しています。
サンプル ファイル | 使用されているソルバー | オプション指定 | 説明 | ドキュメンテーション リンク |
---|---|---|---|---|
amp1dae | ode23t |
| スティッフな DAE — 定数の特異質量行列を使用した電気回路 | トランジスタのスティッフな微分代数方程式の求解 |
ballode | ode23 |
| 簡単なイベント検出問題 — 跳ねるボール | ODE のイベント検出 |
batonode | ode45 |
| 時間と状態に依存した質量行列をもつ ODE — バトンの運動 | 空中に投げられたバトンの動きを表す方程式の求解 |
brussode | ode15s |
| スティッフな大規模問題 — 化学反応の拡散作用 (Brusselator) | スティッフ ODE の求解 |
burgersode | ode15s |
| 状態量に強く依存した質量行列をもつ ODE — 移動メッシュ法を使って Burger の方程式を解く | 状態依存の強い質量行列による ODE の求解 |
fem1ode | ode15s |
| 時変の質量行列をもつスティッフな問題 — 有限要素法 | — |
fem2ode | ode23s |
| 定質量行列をもつスティッフな問題 — 有限要素法 | — |
hb1ode | ode15s | — | 非常に長い区間で解くスティッフな ODE 問題 — Robertson 化学反応 | — |
hb1dae | ode15s |
| 保存則下でのスティッフで線形陰的な DAE — Robertson 化学反応 | Robertson 問題を半陽的な微分代数方程式 (DAE) として求解 |
ihb1dae | ode15i |
| スティッフで完全陰的な DAE — Robertson 化学反応 | ロバートソンの問題を陰的微分代数方程式 (DAE) として求解 |
iburgersode | ode15i |
| 陰的 ODE 系 — Burger の方程式 | — |
kneeode | ode15s |
| 非負の制約をもつ "Knee 問題" | 非負の ODE の解 |
orbitode | ode45 |
| 高度なイベント検出問題 — 制約付きの 3 体問題 | ODE のイベント検出 |
rigidode | ode45 | — | ノンスティッフな問題 — 外力のない剛体のオイラー方程式 | ノンスティッフ ODE の求解 |
vdpode | ode15s |
| パラメーター化したファン デル ポールの方程式 (μ が大きいときスティッフ) | スティッフ ODE の求解 |
参照
[1] Shampine, L. F. and M. K. Gordon, Computer Solution of Ordinary Differential Equations: the Initial Value Problem, W. H. Freeman, San Francisco, 1975.
[2] Forsythe, G., M. Malcolm, and C. Moler, Computer Methods for Mathematical Computations, Prentice-Hall, New Jersey, 1977.
[3] Kahaner, D., C. Moler, and S. Nash, Numerical Methods and Software, Prentice-Hall, New Jersey, 1989.
[4] Shampine, L. F., Numerical Solution of Ordinary Differential Equations, Chapman & Hall, New York, 1994.
[5] Shampine, L. F. and M. W. Reichelt, “The MATLAB ODE Suite,” SIAM Journal on Scientific Computing, Vol. 18, 1997, pp. 1–22.
[6] Shampine, L. F., Gladwell, I. and S. Thompson, Solving ODEs with MATLAB, Cambridge University Press, Cambridge UK, 2003.