ドキュメンテーション

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

odeset

ODE ソルバーの options 構造体を作成または変更

構文

  • options = odeset(Name,Value,...)
  • options = odeset(oldopts,Name,Value,...)
  • options = odeset(oldopts,newopts)
  • odeset

説明

options = odeset(Name,Value,...) は、ODE ソルバーの引数として渡す options 構造体を作成します。options 構造体には、指定したオプションの値が指定されます。指定されていないオプションはすべて、既定値をもちます。たとえば、options = odeset('RelTol',1e-3)RelTol1e-3 に設定された options 構造体を返します。

options = odeset(oldopts,Name,Value,...) は、新しく指定された名前と値のペアを使用して、既存の options 構造体 oldopts を変更します。これは指定されたオプションの古い値を上書きし、新しいオプションの値を構造体に追加します。

options = odeset(oldopts,newopts) は、新しい options 構造体 newopts と組み合わせることにより、既存の options 構造体 oldopts を変更します。[] と等しくない新しいオプションは、oldopts の対応するオプションを上書きします。

入力引数をもたない odeset は、使用できるすべてのオプション名とその値を表示します。該当する場合、既定値は {} 付きで表されます。

すべて折りたたむ

RelTolAbsTol の値を含む options 構造体を作成します。

options = odeset('RelTol',1e-8,'AbsTol',1e-10);

既存の options 構造体の AbsTol 値を更新します。

options = odeset(options,'AbsTol',1e-9)
options = 

              AbsTol: 1.0000e-09
                 BDF: []
              Events: []
         InitialStep: []
            Jacobian: []
           JConstant: []
            JPattern: []
                Mass: []
        MassSingular: []
            MaxOrder: []
             MaxStep: []
         NonNegative: []
         NormControl: []
           OutputFcn: []
           OutputSel: []
              Refine: []
              RelTol: 1.0000e-08
               Stats: []
          Vectorized: []
    MStateDependence: []
           MvPattern: []
        InitialSlope: []

2 つの options 構造体を作成します。

opts_1 = odeset('RelTol',1e-8,'AbsTol',1e-9,'OutputFcn',@odeplot,'Stats','on');
opts_2 = odeset('Mass',@(t) [t 0; 0 -t],'MStateDependence','none',...
    'MassSingular','no','OutputFcn',@odephas2);

opts_2 を優先して options 構造体を結合します。2 つの構造体には異なる OutputFcn 値が含まれているため、opts_2 の値が opts_1 の値を上書きします。

opts = odeset(opts_1,opts_2)
opts = 

              AbsTol: 1.0000e-09
                 BDF: []
              Events: []
         InitialStep: []
            Jacobian: []
           JConstant: []
            JPattern: []
                Mass: @(t)[t,0;0,-t]
        MassSingular: 'no'
            MaxOrder: []
             MaxStep: []
         NonNegative: []
         NormControl: []
           OutputFcn: @odephas2
           OutputSel: []
              Refine: []
              RelTol: 1.0000e-08
               Stats: 'on'
          Vectorized: []
    MStateDependence: 'none'
           MvPattern: []
        InitialSlope: []

入力引数

すべて折りたたむ

古い options 構造体。以前に odeset を使用して作成された構造体として指定します。

データ型: struct

新しい options 構造体。以前に odeset を使用して作成された構造体として指定します。

データ型: struct

名前/値のペアの引数

オプションの Name,Value の引数ペアをコンマ区切りで指定します。Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

例: options = odeset('AbsTol',1e-3,'Reltol',1e-2,'Jacobian',@J,'Mass',M) は、絶対許容誤差と相対許容誤差のしきい値、ヤコビ行列を返す関数、質量行列を指定します。

誤差制御

すべて折りたたむ

相対許容誤差。'RelTol' と正のスカラーで構成されるコンマ区切りのペアとして指定します。この許容誤差は、各解要素の絶対値を基準にした誤差です。おおまかに説明すると、解要素が絶対許容誤差 AbsTol より小さい場合を除いて、すべての解要素の正確な桁数を制御します。

ODE ソルバーは、各ステップで解の i 番目の要素の局所誤差 e を推定します。ステップが成功するには、そのステップの誤差が、相対許容誤差および絶対許容誤差の両方によって決まる条件を満たさなければなりません。

|e(i)| <= max(RelTol*abs(y(i)),AbsTol(i))

例: opts = odeset('RelTol',1e-5,'AbsTol',1e-7)

データ型: single | double

絶対許容誤差。'AbsTol' と、正のスカラーまたはベクトルで構成されるコンマ区切りのペアとして指定します。許容誤差はしきい値であり、解の値がこれを下回ると重要でなくなります。解 |y|AbsTol より小さい場合、ソルバーが |y| の正しい桁数を取得する必要はありません。このため、AbsTol の値には、解要素のスケールを考慮しなければなりません。

AbsTol がベクトルの場合、解と同じ長さでなければなりません。AbsTol がスカラーの場合、この値はすべての解要素に適用されます。

ODE ソルバーは、各ステップで解の i 番目の要素の局所誤差 e を推定します。ステップが成功するには、そのステップの誤差が、相対許容誤差および絶対許容誤差の両方によって決まる条件を満たさなければなりません。

|e(i)| <= max(RelTol*abs(y(i)),AbsTol(i))

例: opts = odeset('RelTol',1e-5,'AbsTol',1e-7)

データ型: single | double

ノルムを基準にした誤差の制御。'NormControl' と、'on' または 'off' で構成されるコンマ区切りのペアとして指定します。NormControl'on' の場合、ソルバーは解の絶対値ではなくノルムを使用して誤差 e を各ステップで制御します。

norm(e(i)) <= max(RelTol*norm(y(i)),AbsTol(i))

例: opts = odeset('NormControl','on')

ソルバー出力

すべて折りたたむ

非負の解要素。'NonNegative' と、スカラーまたはベクトルで構成されるコンマ区切りのペアとして指定します。スカラーまたはベクトルは、非負でなければならない解要素を選択します。

    メモ:   NonNegativeode23s または ode15i で使用できません。さらに、ode15sode23t および ode23tb では、質量行列がある問題に使用できません。

例: opts = odeset('NonNegative',1) は 1 番目の解要素が非負でなければならないことを指定します。

データ型: single | double

出力関数。'OutputFcn' と関数ハンドルで構成されるコンマ区切りのペアとして指定します。ODE ソルバーは各タイム ステップの成功後に出力関数を呼び出します。ODE ソルバーを出力なしで呼び出した場合、出力関数は既定の @odeplot になります。これはすべての解要素を計算しながらプロットします。そうでない場合、既定値は [] です。

OutputFcn と使用できる組み込み出力関数は以下のとおりです。

関数名説明
odeplotすべての解要素を時間に対してプロットする
odephas2最初の 2 つの解要素からなる 2 次元位相面プロット
odephas3最初の 3 つの解要素からなる 3 次元位相面プロット
odeprint解とタイム ステップを表示する

カスタム出力関数を作成する場合、次の形式でなければなりません。

status = myOutputFcn(t,y,flag)

出力関数は次のフラグに適切に応答しなければなりません。

フラグ説明
'init'

ソルバーは積分の開始前に myOutputFcn(tspan,y0,'init') を呼び出して、出力関数が初期化を実行できるようにします。tspany0 は、ODE ソルバーへの入力引数です。

[]

ソルバーは、出力が要求される各積分ステップの後に status = myOutputFcn(t,y,[]) を呼び出します。t は、ステップで生成された出力の点を含み、yt 内の点の数値解です。t がベクトルの場合、yi 列目は ti 番目の要素に対応します。

  • length(tspan) > 2 の場合、出力は tspan の各点で生成されます。

  • length(tspan) = 2 の場合、出力は Refine オプションに従って生成されます。

myOutputFcn0 または 1 のステータスを返さなければなりません。status = 1 の場合、ソルバーは積分を停止します。このメカニズムは、たとえば、[Stop] ボタンの実装に使用できます。

'done'

積分が完了すると、ソルバーは myOutputFcn([],[],'done') を呼び出して出力関数がクリーンアップ タスクを実行できるようにします。

データ型: function_handle

出力関数の要素選択。'OutputSel' とインデックスのベクトルで構成されるコンマ区切りのペアとして指定します。このベクトルは、出力関数に渡す解の要素を指定します。

例: opts = odeset('OutputFcn',@myFcn,'OutputSel',[1 3]) は、解の 1 番目と 3 番目の要素を出力関数に渡します。

解の調整係数。'Refine' とスカラーで構成されるコンマ区切りのペアとして指定します。このスカラーは、各ステップでの出力点数の増加係数を指定します。

  • 調整係数が 1 の場合、ソルバーは各ステップの終わりでのみ解を返します。

  • 調整係数が n>1 の場合、ソルバーは各ステップを n 個の小さい区間に分割し、各点で解を返します。

ほとんどのソルバーの既定値は 1 ですが、ode45 では大きいステップサイズを補正するために、既定値 4 を使用します。

調整係数により生成された追加の値は、連続的な拡張式の手法で計算されます。大幅に計算時間を増加せずに、計算タイム ステップ間の正確な解を得るために、ODE は特殊な式を使用します。

    メモ:   Refinelength(tspan) > 2 の場合や ODE ソルバーが解を構造体として返す場合には適用されません。

例: opts = odeset('Refine',5) は係数 5 で出力点数を増加します。

ソルバー統計。'Stats' と、'on' または 'off' で構成されるコンマ区切りのペアとして指定します。'on' の場合、ソルバーは求解の完了後に次の情報を表示します。

  • 成功したステップの数

  • 失敗した実行試行回数

  • f(t,y) を評価するために ODE 関数が呼び出された回数

陰的ソルバーは、次の解の追加情報を表示します。

  • 偏導関数行列 f/y が作成された回数

  • LU 分解の回数

  • 線形系の解の数

例: opts = odeset('Stats','on')

ステップ サイズ

すべて折りたたむ

提案する初期ステップ サイズ。'InitialStep' と正のスカラーで構成されるコンマ区切りのペアとして指定します。InitialStep は、ODE ソルバーが使用しようとする 1 番目のステップ サイズの大きさに上限を設定します。

初期ステップ サイズを設定しない場合、ソルバーは、初期時点 tspan(1) における解の勾配に基づく初期ステップ サイズを使用します。すべての解要素の勾配がゼロの場合、ソルバーが大きすぎるステップ サイズを試行する場合があります。これが発生していることが明らかな場合や、積分の開始点での重要な挙動をソルバーで確実に解決する場合は、InitialStep を使用して適切な初期ステップ サイズを指定します。

例: opts = odeset('InitialStep',1e-3) は、初期ステップ サイズの上限 1e-3 を設定します。

最大ステップ サイズ。'MaxStep' と正のスカラーで構成されるコンマ区切りのペアとして指定します。MaxStep はソルバーがとるすべてのステップ サイズに上限を設定します。たとえば、ODE の動作が周期的である場合、MaxStep をその周期の数分の 1 に設定すると、着目する領域全体が 1 つのステップに含まれるほどにソルバーがステップを大きくすることが確実に防がれます。

  • MaxStep を使用すると積分が著しく遅くなるため、単に取得する出力点を増加させる目的には使用しないでください。代わりに、Refine オプションを使用して低い計算コストで追加の点を計算します。

  • 解の精度を上げる目的で MaxStep を使用しないでください。解の精度が十分でない場合は、RelTol の値を減少し、その解を使用して AbsTol の適切な値を決定します。

  • 積分区間で 1 回のみ発生する動作の全体をソルバーが 1 ステップで処理しないようにするために MaxStep を使用することは避けてください。その動作の発生時点が既知である場合は、区間を 2 つに分割し、ソルバーを 2 回呼び出します。その変化の発生時点が未知である場合は、RelTolAbsTol を減らしてみます。この場合、MaxStep は最後の手段としてのみ使用します。

例: opts = odeset('MaxStep',1e-2)

イベント検出

すべて折りたたむ

イベント関数。'Events' と関数ハンドル (@myEventsFcn など) で構成されるコンマ区切りのペアとして指定します。関数ハンドルで指定されるイベント関数は、次の一般的な形式でなければなりません。

[value,isterminal,direction] = myEventsFcn(t,y)

valueisterminal および direction はベクトルであり、i 番目の要素が i 番目のイベント関数に対応します。

  • value(i) は、i 番目のイベント関数の値です。

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

  • すべての零点を検出する場合、direction(i) = 0 です (既定の設定)。+1 ではイベント関数が増加している零点のみが検出され、-1 ではイベント関数が減少している零点のみが検出されます。

イベント関数に追加の入力を渡す方法については、「関数のパラメーター化」を参照してください。

イベント関数を指定する場合、次のように 3 つの追加の出力引数を指定して ODE ソルバーを呼び出すことができます。

[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)

このソルバーで返される 3 つの追加出力は、次のように検出イベントに対応します。

  • te は、イベントが発生した時刻の列ベクトルです。

  • yete のイベント時点に対応する解の値です。

  • ie はイベント関数によって返されるベクトルのインデックスです。値は、どのイベントをソルバーが検出したかを示します。

別の方法として、次のように出力を 1 つのみ指定してソルバーを呼び出すこともできます。

sol = odeXY(odefun,tspan,y0,options)

この場合、イベント情報は sol.tesol.ye および sol.ie として構造体に保存されます。

ODE ソルバーで採用されている根を求めるメカニズムとイベント関数を組み合わせる場合、次の制限があります。

  • 積分の最初のステップで終了イベントが発生した場合、ソルバーはこのイベントを非終了イベントとして記録して、積分を続行します。

  • 最初のステップで複数の終了イベントが発生した場合、最初のイベントのみが記録され、ソルバーは積分を続行します。

  • 零点はステップ間で符号が切り替わることにより判別されます。したがって、ステップ間で偶数回切り替わる零点は検出されないことがあります。

ソルバーのステップでイベントが検出されない場合は、精度を高めるために RelTol および AbsTol の値を小さくしてみてください。あるいは、MaxStep を設定して、ステップ サイズの上限を指定します。tspan を調整しても、ソルバーが取るステップは変わりません。

例: サンプル ファイル ballode には、ボールのバウンドを検出するイベント関数が含まれています。

例: サンプル ファイル orbitode には、宇宙船の軌道上の着目する点を検出するイベント関数が含まれています。

データ型: function_handle

ヤコビ行列

すべて折りたたむ

ヤコビ行列。'Jacobian' と、行列またはヤコビ行列を評価する関数で構成されるコンマ区切りのペアとして指定します。ヤコビ行列は、微分方程式を定義する関数の偏導関数の行列です。

J=fy=[f1y1f1y2f2y1f2y2]

スティッフ ODE ソルバー (ode15sode23sode23tode23tbode15i) の場合、ヤコビ行列に関する情報を指定するすることが、信頼性と効率を確保する上で重要です。ヤコビ行列を指定しない場合、ODE ソルバーは有限差分を使用してヤコビ行列を数値的に近似します。

ode15i "のみ": Jacobian オプションは fyfy' の両方の行列を指定しなければなりません。これらの行列は 2 つの定数行列のセル配列 {fy,fy'} として、あるいは次の一般的な形式で行列を計算する関数として指定できます。

[dfdy, dfdp] = Fjac(t,y,yp)

系が非常に大規模なために解析ヤコビ行列全体を指定することができない場合、JPattern プロパティを使用してヤコビ行列のスパース パターンを渡します。ソルバーはこのスパース パターンを使用してスパースのヤコビ行列を計算します。

例: opts = odeset('Jacobian',@J) は、ヤコビ行列を計算する関数 J を指定します。

例: opts = odeset('Jacobian',[0 1; -2 1]) は、定数ヤコビ行列を指定します。

例: opts = odeset('Jacobian',{A,Ap}) は、ode15i で使用する 2 つの定数ヤコビ行列を指定します。

データ型: single | double | cell | function_handle

ヤコビ スパース パターン。'JPattern' とスパース行列で構成されるコンマ区切りのペアとして指定します。スパース行列にはヤコビ行列に非ゼロ要素がある可能性を示す 1 が含まれています。ODE ソルバーは、このスパース パターンを使用して、スパース ヤコビ行列を数値的に生成します。ODE 系が大きいために解析ヤコビ行列を指定できない場合は、このオプションを使用して実行速度を向上します。

ode15i "のみ": 2 つのスパース行列 (fy およびfy' のスパース パターン) を含むセル配列 {dfdyPattern, dfdypPattern} を使用して、JPattern オプションを設定します。

    メモ:   Jacobian を使用してヤコビ行列を指定した場合、ソルバーは JPattern のすべての設定を無視します。

例: opts = odeset('JPattern',S) は、スパース行列 S を使用してヤコビ スパース パターンを指定します。

例: opts = odeset('JPattern',{dFdy, dFdyp}) は、ode15i で使用する 2 つの定数ヤコビ スパース パターンを指定します。

データ型: double | cell

ベクトル化関数のトグル。'Vectorized' と、'off' または 'on' で構成されるコンマ区切りのペアとして指定します。このオプションを使用して、2 番目の引数では、ベクトルを受け入れてベクトルを返すように関数がコード化されていることを ODE ソルバーに通知します。つまり、f(t,[y1 y2 y3...])[f(t,y1) f(t,y2) f(t,y3) ...] を返します。値を 1 つずつ評価する場合と比較して、このベクトル化では、ソルバーでヤコビ行列のすべての列の計算に必要な関数評価回数を減らすことができ、計算時間を大幅に短縮できる可能性があります。ベクトル化をサポートする要素単位の演算子については、「配列と行列の演算」を参照してください。

ode15i "のみ": 2 要素セル配列を使用して Vectorized オプションを設定します。f(t,[y1,y2,...],yp)[f(t,y1,yp), f(t,y2,yp), ...] を返す場合は、最初の要素を 'on' に設定します。f(t,y,[yp1,yp2,...])[f(t,y,yp1), f(t,y,yp2), ...] を返す場合は、2 番目の要素を 'on' に設定します。この場合、Vectorized の既定値は {'off','off'} です。

    メモ:   Jacobian を使用してヤコビ行列を指定した場合、ソルバーは Vectorized'on' の設定を無視します。

例: opts = odeset('JPattern',S,'Vectorized','on') は、関数がベクトル化されていることを指定し、ヤコビ スパース パターンを設定します。

例: opts = odeset('JPattern',{dy,dyp},'Vectorized',{'on','on'}) は、関数が yyp に関してベクトル化されていることを指定し、ode15i で使用するヤコビ スパース パターンを設定します。

質量行列と DAE (ode15i は適用外)

すべて折りたたむ

質量行列。'Mass' と、行列または関数ハンドルで構成されるコンマ区切りのペアとして指定します。ODE ソルバーは M(t,y)y'=f(t,y) の形式の質量行列を含む問題を解くことができます。ここで M(t,y) は非スパースまたはスパースの質量行列です (ode23s ソルバーは定数質量行列をもつ方程式のみの求解が可能)。

  • 質量行列が特異でない場合、方程式は y'=M1f(t,y) に単純化され、ODE はあらゆる初期値に対する解をもちます。しかし、多くの場合、M(t,y)y'=f(t,y) を使用して質量行列の項でモデルを直接表現する方が便利で、自然です。また、逆行列の計算を避けることで、問題を解くために必要なストレージと実行時間を削減できます。

  • M(t,y) が特異行列である場合、その問題は微分代数方程式系 (DAE) です。DAE は y0 に矛盾がないとき、つまり、M(t0,y0)yp0 = f(t0,y0) となる初期勾配 yp0 が存在するときにのみ解をもちます。ここで yp0InitialSlope オプションを使用して指定します。DAE の特徴となるのは、微分インデックス、つまりその系を等価の ODE 系に単純化するために必要な導関数の数です。インデックス 1 の DAE では、矛盾しない初期条件で初期値問題を解くことは、ODE を解くことによく似ています。ソルバー関数 ode15sode23t は、インデックス 1 の DAE を解くことができます。DAE を解くときに、質量行列が対角行列になるように問題を定式化すると便利です (半陽的 DAE)。

質量行列が時間または状態に依存する (定数ではなく) すべての場合で、追加オプションを使用する必要があります。

  • M(t)y'=f(t,y) の形式の問題では、MStateDependence オプションを 'none' に設定します。これにより、ソルバーは t の入力引数を 1 つもつ質量行列関数を確実に呼び出します。

  • 質量行列が y に依存する場合は、MStateDependence'weak' (既定) または 'strong' に設定します。いずれの場合でも、ソルバーは 2 つの引数 (t,y) をもつ質量行列関数を呼び出しますが、'weak' オプションを設定すると陰的ソルバーは代数方程式を解くときに近似を使用します。

  • 状態依存の強い質量行列 M(t,y) をもつ方程式が系に多く含まれる場合は、MvPattern をスパース行列 S に設定してスパース パターンを設定します。

例: 例のファイル fem2ode および batonode では質量行列のさまざまな使用方法を説明しています。

データ型: single | double | function_handle

質量行列の状態依存。'MStateDependence と、'weak''strong' または 'none' で構成されるコンマ区切りのペアとして指定します。

  • M(t)y'=f(t,y) の形式の問題では、MStateDependence オプションを 'none' に設定します。これにより、ソルバーは t の入力引数を 1 つもつ質量行列関数を確実に呼び出します。

  • 質量行列が y に依存する場合は、MStateDependence'weak' (既定) または 'strong' に設定します。いずれの場合でも、ソルバーは 2 つの引数 (t,y) をもつ質量行列関数を呼び出しますが、'weak' オプションを設定すると陰的ソルバーは代数方程式を解くときに近似を使用します。

例: opts = odeset('Mass',@M,'MStateDependence','none') は質量行列 Mt のみに依存することを指定します。

質量行列のスパース パターン。'MvPattern' とスパース行列で構成されるコンマ区切りのペアとして指定します。このオプションを使用して、行列 y[M(t,y)v] のスパース パターンを指定します。任意の k について M(t,y)(i,k) 要素が y の要素 j に依存する場合、スパース行列 SS(i,j) = 1 をもちます。

    メモ:   MvPatternMStateDependence'strong' の場合に ode15sode23t および ode23tb で使用されます。

例: opts = odeset('MStateDependence','strong','MvPattern',S)

特異質量行列のトグル。'MassSingular' と、'maybe''yes' または 'no' で構成されるコンマ区切りのペアとして指定します。既定値 'maybe' の場合、ソルバーは質量行列が特異であるかどうかをテストすることにより、問題が DAE であるかどうかをテストします。系が DAE であることが既知の場合は 'yes'、DAE でないことが既知の場合は 'no' を指定して、このチェックを避けます。

矛盾しない初期勾配。'InitialSlope' とベクトルとで構成されるコンマ区切りのペアとして指定します。ode15s ソルバーおよび ode23t ソルバーで DAE を解くときにこのオプションを使用します。指定されたベクトルは M(t0,y0)y'0=f(t0,y0) となる初期勾配 y'0 です。指定された初期条件が矛盾する場合、ソルバーはこれらを推定値として扱い、推定値に近く矛盾しない値の計算を試行して、問題の求解を続行します。

データ型: single | double

ode15s および ode15i 専用

すべて折りたたむ

式の最大次数。'MaxOrder' と、1 から 5 までの整数で構成されるコンマ区切りのペアとして指定します。このオプションを使用して、可変次数ソルバー ode15s および ode15i で使用される数値微分式 (NDF) または後退差分式 (BDF) で使用される最大次数を指定します。

ode15s で後退差分式 (BDF) を使用するためのトグル。'BDF' と、'off' または 'on' で構成されるコンマ区切りのペアとして指定します。通常、既定の数値微分式 (NDF) の方が BDF よりも効率的ですが、両者は密接に関係しています。

例: opts = odeset('BDF','on','MaxOrder',4)ode15s による BDF (最大次数 4) の使用を有効にします。

出力引数

すべて折りたたむ

options 構造体。optionsode45ode23ode113ode15sode23sode23tode23tb または ode15i の 4 番目の入力引数として使用できます。

参考

| |

R2006a より前に導入

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