ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ode15i

完全陰的微分方程式の求解: 可変次数法

構文

[T,Y] = ode15i(odefun,tspan,y0,yp0)
[T,Y] = ode15i(odefun,tspan,y0,yp0,options)
[T,Y,TE,YE,IE] = ode15i(odefun,tspan,y0,yp0,options...)
sol = ode15i(odefun,[t0 tfinal],y0,yp0,...)

引数

次の表に、関数 ode15i の入力引数を示します。

odefun

f(t,y,y') = 0 の形式の微分方程式の左辺を計算する関数ハンドル。

tspan

積分区間 [t0,tf] を指定するベクトル。特定の時間 (単調増加または単調減少) での解を得るには、tspan = [t0,t1,...,tf] を使用します。

y0, yp0

それぞれ y と y' に対する初期条件ベクトルです。

options

関数 odeset を使用して作成されるオプションの積分引数です。詳細は、関数 odeset を参照してください。

次の表に、関数 ode15i の出力引数を示します。

T

時点の列ベクトル。

Y

解の配列。y の各行は、t の対応する行に返される時点での解です。

説明

tspan = [t0 tf] をもつ [T,Y] = ode15i(odefun,tspan,y0,yp0) は、初期条件 y0 および yp0 で時間 t0 から tf までの微分方程式 f(t,y,y') = 0 のシステムを積分します。odefun は関数ハンドルです。関数 ode15i は、インデックス 1 の ODE と DAE を解きます。初期条件は一貫していなければなりません。すなわち、f(t0,y0,yp0) = 0 でなければなりません。関数 decic を使用すると、推定値に近く、矛盾のない初期条件を計算することができます。スカラー t、列ベクトル yyp の関数 odefun(t,y,yp) は、f(t,y,y') に対応する列ベクトルを返さなければなりません。解の配列 Y の各行は、列ベクトル T の時間に対応する解です。時間 t0,t1,...,tf (単調増加または単調減少) での解を求めるには、tspan = [t0,t1,...,tf] を使用してください。

「関数のパラメーター化」では、必要に応じて関数 odefun にパラメーターを追加する方法について説明しています。

[T,Y] = ode15i(odefun,tspan,y0,yp0,options) は、options に指定されたプロパティ値で既定の積分パラメーターを置き換えて、上記のように解きます。options は、関数 odeset で作成された引数です。一般的に使用されるオプションは、スカラーの相対許容誤差 RelTol (既定の設定は 1e-3) と、絶対許容誤差 AbsTol (既定の設定は、すべての成分で 1e-6) のベクトルを含みます。詳細は、odeset を参照してください。

[T,Y,TE,YE,IE] = ode15i(odefun,tspan,y0,yp0,options...) は、options'Events' プロパティを関数 events に設定して、呼び出されたイベント関数である (t,y,y') の関数がゼロになる位置を見つけながら、上記のように解きます。関数 events は、[value,isterminal,direction] = events(t,y,yp) and の形式になり、必要なイベント関数を含みます。各出力ベクトルの i 番目の要素が i 番目のイベントに対応するように、関数 events を記述します。eventsi 番目のイベント関数に対して、各出力引数は以下のようになります。

  • value(i) は、関数値です。

  • 積分が、このイベント関数の零点で終了する場合は、isterminal(i) = 1 に、その他の場合は、0 になります。

  • すべての零点が計算可能な場合 (既定の設定)、direction(i) = 0、イベント関数が増加する部分でのみゼロになる場合は +1、減少する部分でのみゼロになる場合は -1 になります。

出力 TE は、イベントが発生する時間の列ベクトルです。YE の行は解であり、発生したイベントを指定するベクトル IE のインデックスに対応します。詳細は、『MATLAB® 数学』ドキュメンテーションの「積分器のオプション」を参照してください。

sol = ode15i(odefun,[t0 tfinal],y0,yp0,...) は、区間 t0 および tfinal 上の任意の点で解を計算する関数 deval で使用できる構造体を返します。構造体 sol は、常に以下のフィールドを含みます。

sol.x

ソルバーにより選択されたステップ。Events オプションを指定し、終了イベントを検出した場合、sol.x(end) は、イベントが発生したステップの終了を含みます。

sol.y

各列 sol.y(:,i) は、sol.x(i) での解を含みます。

Events オプションを指定し、イベントが検出された場合、sol は以下のフィールドも含みます。

sol.xe

存在する場合、イベントが起こる点。sol.xe(end) は、終了イベントの正確な点を含みます。

sol.ye

sol.xe のイベントに対応する解。

sol.ie

Events オプションに指定された関数により返されるベクトルのインデックス。値は、どのイベントをソルバーが検出したかを示します。

オプション

関数 ode15i は、options に以下のパラメーターを受け入れます。詳細は、odeset と、『MATLAB 数学』ドキュメンテーションの「ODE 積分プロパティの変更」を参照してください。

誤差制御

RelTol, AbsTol, NormControl

ソルバー出力

OutputFcn, OutputSel, Refine, Stats

イベント位置

Events

ステップ サイズ

MaxStep, InitialStep

ヤコビ行列

Jacobian, JPattern, Vectorized

ソルバー出力

OutputFcn プロパティの値として出力関数を設定する場合、ソルバーは各タイム ステップの後で、計算された解と共に呼び出します。4 つの出力関数 odeplotodephas2odephas3odeprint が用意されています。ソルバーを出力引数を設定しないで呼び出すと、既定の関数 odeplot が呼び出され、解が計算されながらプロットされます。関数 odephas2 と関数 odephas3 はそれぞれ 2次元、3次元の位相平面プロットを作成します。関数 odeprint は、画面上に解の成分を表示します。既定の設定では、ODE ソルバーは、すべての解の成分を出力関数に渡します。OutputSel プロパティの値に、インデックスのベクトルを設定することにより、指定した成分のみを渡すこともできます。たとえば、出力引数を設定せずに、ソルバーを呼び出し、OutputSel の値を [1,3] に設定すると、ソルバーは解を計算しながら解の成分 1 と 3 をプロットします。

ヤコビ行列

ヤコビ行列 ∂f/∂y と ∂f/∂y' は、信頼性と効率性に影響します。これらの行列は以下のいずれかで与えることができます。

  • ヤコビ行列を計算する [dfdy,dfdyp] = FJAC(t,y,yp) 形式の関数。FJACdfdy または dfdyp のいずれかに、空行列 [] を返す場合、関数 ode15i はその行列を有限差分法で近似します。

  • 2 つの定数行列のセル配列 {dfdy,dfdyp}。いずれかが空行列でもかまいません。

関数またはセル配列に Jacobian オプションを設定するには、関数 odeset を使用します。Jacobian オプションを設定しない場合、関数 ode15i は両方のヤコビ行列を有限差分法で近似します。

関数 ode15i に対して、Vectorized は、2 要素のセル配列です。odefun(t,[y1,y2,...],yp)[odefun(t,y1,yp),odefun(t,y2,yp),...] を返す場合、最初の要素を 'on' に設定してください。odefun(t,y,[yp1,yp2,...])[odefun(t,y,yp1),odefun(t,y,yp2),...] を返す場合、2 番目の要素を 'on' に設定してください。Vectorized の既定値は、{'off','off'} です。

関数 ode15i に対して、JPattern は、2 要素のスパース行列のセル配列です。∂f/∂y または ∂f/∂y' がスパース行列の場合は、JPattern をスパース パターン{SPDY,SPDYP} に設定します。f(t,y,yp)i 成分が yj 成分に依存する場合、∂f/∂y のスパース パターンは、SPDY(i,j) = 1 のスパース行列 SPDY です。そうでない場合は、0 です。∂f/∂y が非スパース行列であることを示すには、SPDY = [] を使用します。∂f/∂y' と SPDYP に対しても、同様です。JPattern の既定値は、{[],[]} です。

例 1

この例では、y(t0) の初期値を固定するために、補助関数 decic を使用し、Weissinger 暗黙的 ODE の y′(t0) に矛盾のない初期値を計算します。関数 Weissinger は、陰的 ODE の残差を評価します。

t0 = 1;
y0 = sqrt(3/2);
yp0 = 0;
[y0,yp0] = decic(@weissinger,t0,y0,1,yp0,0);

この例は、ODE を解くために関数 ode15i を使用し、解析解と数値解をプロットします。

[t,y] = ode15i(@weissinger,[1 10],y0,yp0);
ytrue = sqrt(t.^2 + 0.5);
plot(t,y,t,ytrue,'o');

他の例

ihb1dae.m ファイルと iburgersode.m ファイルは、暗黙的 ODE の例です。

参考

| | | | | | | | | | |

この情報は役に立ちましたか?