odeset
ODE ソルバーおよび PDE ソルバーのオプション構造体を作成または変更
構文
説明
は、ODE ソルバーおよび PDE ソルバーに引数として渡すことができるオプション構造体を作成します。options = odeset(Name=Value)options 構造体には、指定したオプションの値が指定されます。指定されていないオプションはすべて、既定値をもちます。たとえば、options = odeset(RelTol=1e-3) は RelTol が 1e-3 に設定されたオプション構造体を返します。
は、新しく指定された名前と値の引数を使用して、既存のオプション構造体 options = odeset(oldopts,Name=Value)oldopts を変更します。これは指定されたオプションの古い値を上書きし、新しいオプションの値を構造体に追加します。
入力引数をもたない odeset は、使用できるすべてのオプション名とその値を表示します。該当する場合、既定値は {} 付きで表されます。
例
RelTol と AbsTol の値を含むオプション構造体を作成します。
options = odeset(RelTol=1e-8,AbsTol=1e-10);
既存のオプション構造体の AbsTol 値を更新します。
options = odeset(options,AbsTol=1e-9)
options = struct with fields:
AbsTol: 1.0000e-09
BDF: []
Events: []
InitialStep: []
Jacobian: []
JConstant: []
JPattern: []
Mass: []
MassSingular: []
MaxOrder: []
MaxStep: []
MinStep: []
NonNegative: []
NormControl: []
OutputFcn: []
OutputSel: []
Refine: []
RelTol: 1.0000e-08
Stats: []
Vectorized: []
MStateDependence: []
MvPattern: []
InitialSlope: []
2 つのオプション構造体を作成します。
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 を優先してオプション構造体を結合します。両方の構造体には異なる OutputFcn 値が含まれているため、opts_2 の値が opts_1 の値をオーバーライドします。
opts = odeset(opts_1,opts_2)
opts = struct with fields:
AbsTol: 1.0000e-09
BDF: []
Events: []
InitialStep: []
Jacobian: []
JConstant: []
JPattern: []
Mass: @(t)[t,0;0,-t]
MassSingular: 'no'
MaxOrder: []
MaxStep: []
MinStep: []
NonNegative: []
NormControl: []
OutputFcn: @odephas2
OutputSel: []
Refine: []
RelTol: 1.0000e-08
Stats: 'on'
Vectorized: []
MStateDependence: 'none'
MvPattern: []
InitialSlope: []
入力引数
古いオプション構造体。以前に odeset を使用して作成された構造体として指定します。
データ型: struct
新しいオプション構造体。以前に odeset を使用して作成された構造体として指定します。
データ型: struct
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。
例: options = odeset(AbsTol=1e-3,Reltol=1e-2,Jacobian=@J,Mass=M) は、絶対許容誤差と相対許容誤差のしきい値、ヤコビ行列を返す関数、数値の質量行列を指定します。
誤差制御
相対許容誤差。正のスカラーとして指定します。この許容誤差は、各解要素の絶対値を基準にした誤差です。おおまかに説明すると、解要素が絶対許容誤差 AbsTol より小さい場合を除いて、すべての解要素の正確な桁数を制御します。
ODE ソルバーは、各ステップで解の i 番目の要素の局所誤差 e を推定します。ステップが成功するには、そのステップの誤差が、相対許容誤差および絶対許容誤差の両方によって決まる条件を満たさなければなりません。
|e(i)| <= max(RelTol*abs(y(i)),AbsTol(i))
例: opts = odeset(RelTol=1e-5,AbsTol=1e-7)
データ型: single | double
絶対許容誤差。正のスカラーまたはベクトルとして指定します。許容誤差はしきい値であり、解の値がこれを下回ると重要でなくなります。解 |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
解のノルムを基準にした誤差の制御。"on" または "off" として指定します。NormControl が "on" の場合、ソルバーは解の絶対値ではなくノルムを使用して誤差 e を各ステップで制御します。
norm(e(i)) <= max(RelTol*norm(y(i)),AbsTol(i))
例: opts = odeset(NormControl="on")
データ型: char | string
ソルバー出力
非負の解要素。スカラーまたはベクトルとして指定します。スカラーまたはベクトルは、非負でなければならない解要素を選択します。
メモ
NonNegative は ode23s または ode15i で使用できません。さらに、ode15s、ode23t および ode23tb では、質量行列がある問題に使用できません。
例: opts = odeset(NonNegative=1) は 1 番目の解要素が非負でなければならないことを指定します。
データ型: single | double
出力関数。関数ハンドルとして指定します。ODE ソルバーは各タイム ステップの成功後に出力関数を呼び出します。ODE ソルバーを出力なしで呼び出した場合、出力関数は既定の @odeplot になります。これはすべての解要素を計算しながらプロットします。そうでない場合、既定値は [] です。
OutputFcn と使用できる組み込み出力関数は以下のとおりです。
| 関数名 | 説明 |
|---|---|
odeplot | すべての解要素を時間に対してプロットする |
odephas2 | 最初の 2 つの解要素からなる 2 次元位相面プロット |
odephas3 | 最初の 3 つの解要素からなる 3 次元位相面プロット |
odeprint | 解とタイム ステップを表示する |
カスタム出力関数を作成する場合、次の形式でなければなりません。
status = myOutputFcn(t,y,flag)
出力関数はまた、次のフラグに適切に応答しなければなりません。
| フラグ | 説明 |
|---|---|
"init" | ソルバーは積分の開始前に |
[] | ソルバーは、出力が要求される各積分ステップの後に
|
"done" | 積分が完了すると、ソルバーは |
データ型: function_handle
出力関数の要素選択。インデックスのベクトルとして指定します。このベクトルは、出力関数に渡す解の要素を指定します。
例: opts = odeset(OutputFcn=@myFcn,OutputSel=[1 3]) は、解の 1 番目と 3 番目の要素を出力関数に渡します。
解の調整係数。スカラーとして指定します。このスカラーは、各ステップでの出力点数の増加係数を指定します。
Refine の既定値は、ほとんどのソルバーでは 1 ですが、ode45 では既定値 4、ode78 および ode89 では既定値 8 を使用します。これらのソルバーには大きいステップを取る傾向があるため、それを補正するために使用する既定値が大きくなっています。
調整係数が
1の場合、ソルバーは各ステップの終わりでのみ解を返します。調整係数が
n > 1の場合、ソルバーは各ステップをn個の小さい区間に分割し、各点で解を返します。
調整係数により生成された追加の値は、連続的な拡張式の手法で計算されます。大幅に計算時間を増加せずに、計算タイム ステップ間の正確な解を得るために、ODE は特殊な式を使用します。
メモ
Refine は length(tspan) > 2 の場合や ODE ソルバーが解を構造体として返す場合には適用されません。
例: opts = odeset(Refine=5) は係数 5 で出力点数を増加します。
ソルバー統計。"on" または "off" として指定します。"on" の場合、ソルバーは求解の完了後に次の情報を表示します。
成功したステップの数
失敗した実行試行回数
を評価するために ODE 関数が呼び出された回数
陰的ソルバーは、次の解の追加情報を表示します。
偏導関数行列 が作成された回数
LU 分解の回数
線形方程式の解の数
例: opts = odeset(Stats="on")
データ型: char | string
ステップ サイズ
提案する初期ステップ サイズ。正のスカラーとして指定します。InitialStep は、ソルバーが使用しようとする 1 番目のステップ サイズの大きさに上限を設定します。
初期ステップ サイズを設定しない場合、ソルバーは、初期時点 tspan(1) における解の傾きに基づく初期ステップ サイズを使用します。すべての解要素の傾きがゼロの場合、ソルバーが大きすぎるステップ サイズを試行する場合があります。これが発生していることが明らかな場合や、積分の開始点での重要な挙動をソルバーで確実に解決する場合は、InitialStep を使用して適切な初期ステップ サイズを指定します。
例: opts = odeset(InitialStep=1e-3) は、初期ステップ サイズの上限 1e-3 を設定します。
最大ステップ サイズ。正のスカラーとして指定します。MaxStep はソルバーがとるすべてのステップ サイズに上限を設定します。たとえば、方程式の動作が周期的である場合、MaxStep をその周期の数分の 1 に設定すると、着目する領域全体が 1 つのステップに含まれるほどにソルバーがステップを大きくすることが確実に防がれます。
MaxStepを使用すると積分が著しく遅くなるため、単に取得する出力点を増加させる目的には使用しないでください。代わりに、Refineオプションを使用して低い計算コストで追加の点を計算します。解の精度を上げる目的で
MaxStepを使用しないでください。解の精度が十分でない場合は、RelTolの値を減少し、その解を使用してAbsTolの適切な値を決定します。積分区間で 1 回のみ発生する動作の全体をソルバーが 1 ステップで処理しないようにするために
MaxStepを使用することは避けてください。その動作の発生時点が既知である場合は、区間を 2 つに分割し、ソルバーを 2 回呼び出します。その変化の発生時点が未知である場合は、RelTolとAbsTolを減らしてみます。この場合、MaxStepは最後の手段としてのみ使用します。
例: opts = odeset(MaxStep=1e-2)
R2024b 以降
最小ステップ サイズ。正のスカラーとして指定します。MinStep はソルバーがとるすべてのステップ サイズに下限を設定します。MinStep は、MaxStep より小さくなければなりません。
ソルバーのステップは、MinStep の値に関係なく、浮動小数点精度によって制限されます。
例: opts = odeset(MinStep=1e-10)
イベント検出
イベント関数。@myEventsFcn などの関数ハンドルとして指定します。
関数シグネチャ
ODE の場合: 関数ハンドルで指定されるイベント関数は、次の一般的な形式でなければなりません。
[value,isterminal,direction] = myEventsFcn(t,y)
PDE の場合: 関数ハンドルで指定されるイベント関数は、次の一般的な形式でなければなりません。
[value,isterminal,direction] = myEventsFcn(m,t,xmesh,umesh)
どちらの場合も、value、isterminal および direction はベクトルであり、i 番目の要素が i 番目のイベント関数に対応します。
value(i)は、i番目のイベント関数の値です。このイベント関数の零点で積分を終了する場合、
isterminal(i) = 1です。そうでない場合は、0です。すべての零点を検出する場合、
direction(i) = 0です (既定の設定)。+1ではイベント関数が増加している零点のみが検出され、-1ではイベント関数が減少している零点のみが検出されます。
イベント関数に追加の入力を渡す方法については、関数のパラメーター化を参照してください。
イベント出力
イベント関数を指定する場合、次のように 3 つの追加の出力引数を指定してソルバーを呼び出すことができます。
[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)
このソルバーで返される 3 つの追加出力は、次のように検出イベントに対応します。
teは、イベントが発生した時刻の列ベクトルです。yeはteのイベント時点に対応する解の値です。ieはイベント関数によって返されるベクトルのインデックスです。値は、どのイベントをソルバーが検出したかを示します。
別の方法として、次のように出力を 1 つのみ指定してソルバーを呼び出すこともできます。
sol = odeXY(odefun,tspan,y0,options)
この場合、イベント情報は sol.te、sol.ye および sol.ie として構造体に保存されます。
診断
ODE ソルバーおよび PDE ソルバーで採用されている根を求めるメカニズムとイベント関数を組み合わせる場合、次の制限があります。
積分の最初のステップで終了イベントが発生した場合、ソルバーはこのイベントを非終了イベントとして記録して、積分を続行します。
最初のステップで複数の終了イベントが発生した場合、最初のイベントのみが記録され、ソルバーは積分を続行します。
零点はステップ間で符号が切り替わることにより判別されます。したがって、ステップ間で偶数回切り替わる零点は検出されないことがあります。
ソルバーのステップでイベントが検出されない場合は、精度を高めるために RelTol および AbsTol の値を小さくしてみてください。あるいは、MaxStep を設定して、ステップ サイズの上限を指定します。tspan を調整しても、ソルバーが取るステップは変わりません。
例
ボールのバウンドや天体の軌道を検出する ODE イベント関数の例については、ODE のイベント検出を参照してください。
振動解のゼロクロッシングを検出する PDE イベント関数の例については、イベント ログを使用した振動 PDE の求解を参照してください。
データ型: function_handle
ヤコビ行列
ヤコビ行列。行列、cell 配列、またはヤコビ行列を評価する関数として指定します。ヤコビ行列は、微分方程式を定義する関数の偏導関数の行列です。
ヤコビ行列は、 の計算値をもつ定数行列として、あるいは行列要素を計算し次の一般的な形式をもつ関数として指定できます。
dfdy = Fjac(t,y)
スティッフ ODE ソルバー (ode15s、ode23s、ode23t、ode23tb、ode15i) の場合、ヤコビ行列に関する情報を指定することが、信頼性と効率を確保する上で重要です。ヤコビ行列を指定しない場合、ODE ソルバーは有限差分を使用してヤコビ行列を数値的に近似します。
ode15i "のみ": Jacobian オプションは と の両方について行列を指定しなければなりません。これらの行列は 2 つの定数行列の cell 配列 として、あるいは行列を計算し次の一般的な形式をもつ関数として指定できます。
[dfdy, dfdp] = Fjac(t,y,yp)
方程式が非常に大規模なために解析ヤコビ行列全体を指定することができない場合、JPattern プロパティを使用してヤコビ行列のスパース パターンを渡します。ソルバーはこのスパース パターンを使用してスパースのヤコビ行列を計算します。
例: opts = odeset(Jacobian=@Fjac) は、ヤコビ行列を計算する関数 Fjac を指定します。
例: opts = odeset(Jacobian=[0 1; -2 1]) は、定数ヤコビ行列を指定します。
例: opts = odeset(Jacobian={A,Ap}) は、ode15i で使用する 2 つの定数ヤコビ行列を指定します。
データ型: single | double | cell | function_handle
ヤコビ スパース パターン。スパース行列として指定します。スパース行列にはヤコビ行列に非ゼロ要素がある可能性を示す 1 が含まれています。ODE ソルバーは、このスパース パターンを使用して、スパース ヤコビ行列を数値的に生成します。連立 ODE が大きいために解析ヤコビ行列を指定できない場合は、このオプションを使用して実行速度を向上します。
ode15i "のみ": 2 つのスパース行列 ( および のスパース パターン) を含む cell 配列 {dfdyPattern, dfdypPattern} を使用して、JPattern オプションを設定します。
メモ
Jacobian を使用してヤコビ行列を指定した場合、ソルバーは JPattern のすべての設定を無視します。
例: opts = odeset(JPattern=S) は、スパース行列 S を使用してヤコビ スパース パターンを指定します。
例: opts = odeset(JPattern={dFdy, dFdyp}) は、ode15i で使用する 2 つの定数ヤコビ スパース パターンを指定します。
データ型: single | double | cell
ベクトル化関数のトグル。"off" または "on" として指定します。このオプションを使用して、2 番目の引数では、ベクトルを受け入れてベクトルを返すように関数がコード化されていることを ODE ソルバーに通知します。つまり、f(t,[y1 y2 y3...]) は [f(t,y1) f(t,y2) f(t,y3) ...] を返します。値を 1 つずつ評価する場合と比較して、このベクトル化では、ソルバーでヤコビ行列のすべての列の計算に必要な関数評価回数を減らすことができ、計算時間を大幅に短縮できる可能性があります。ベクトル化をサポートする要素単位の演算子については、配列と行列の演算を参照してください。
ode15i "のみ": 2 要素 cell 配列を使用して 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"}) は、関数が y と yp に関してベクトル化されていることを指定し、ode15i で使用するヤコビ スパース パターンを設定します。
データ型: char | cell | string
質量行列と DAE (ode15i は適用外)
質量行列。行列または関数ハンドルとして指定します。ODE ソルバーは の形式の質量行列を含む問題を解くことができます。ここで は完全またはスパースの質量行列です (ode23s ソルバーは定数質量行列をもつ方程式のみの求解が可能)。
質量行列が特異でない場合、方程式は に単純化され、ODE はあらゆる初期値に対する解をもちます。しかし、多くの場合、 を使用して質量行列の項でモデルを直接表現する方が便利かつ自然です。また、逆行列の計算を避けることで、問題を解くために必要なストレージと実行時間を削減できます。
が特異行列である場合、その問題は連立微分代数方程式 (DAE) です。DAE は
y0に矛盾がないとき、つまり、M(t0,y0)yp0 = f(t0,y0)となる初期傾きyp0が存在するときにのみ解をもちます。ここでyp0はInitialSlopeオプションを使用して指定します。DAE の特徴となるのは、微分インデックス、つまりその方程式を等価の連立 ODE に単純化するために必要な導関数の数です。インデックス 1 の DAE では、矛盾しない初期条件で初期値問題を解くことは、ODE を解くことによく似ています。ソルバー関数ode15sとode23tは、インデックス 1 の DAE を解くことができます。DAE を解くときに、質量行列が対角行列になるように問題を定式化すると便利です (半陽的 DAE)。
質量行列が時間または状態に依存する (定数ではなく) すべての場合で、追加オプションを使用する必要があります。
の形式の問題では、
MStateDependenceオプションを"none"に設定します。これにより、ソルバーはtの入力引数を 1 つもつ質量行列関数を確実に呼び出します。質量行列が
yに依存する場合は、MStateDependenceを"weak"(既定) または"strong"に設定します。いずれの場合でも、ソルバーは 2 つの入力(t,y)をもつ質量行列関数を呼び出しますが、"weak"オプションを設定すると陰的ソルバーは代数方程式を解くときに近似を使用します。状態依存の強い質量行列 をもつ式が方程式に多く含まれる場合は、
MvPatternをスパース行列Sに設定してスパース パターンを指定します。
例: 例のファイル fem2ode および batonode では質量行列のさまざまな使用方法を説明しています。
データ型: single | double | function_handle
質量行列の状態依存。"weak"、"strong"、または "none" として指定します。
の形式の問題では、
MStateDependenceオプションを"none"に設定します。これにより、ソルバーはtの入力引数を 1 つもつ質量行列関数を確実に呼び出します。質量行列が
yに依存する場合は、MStateDependenceを"weak"(既定) または"strong"に設定します。いずれの場合でも、ソルバーは 2 つの入力(t,y)をもつ質量行列関数を呼び出しますが、"weak"オプションを設定すると陰的ソルバーは代数方程式を解くときに近似を使用します。
例: opts = odeset(Mass=@M,MStateDependence="none") は質量行列 M が t のみに依存することを指定します。
データ型: char | string
質量行列のスパース パターン。スパース行列として指定します。このオプションを使用して、行列 のスパース パターンを指定します。任意の k について の (i,k) 要素が y の要素 j に依存する場合、スパース行列 S は S(i,j) = 1 をもちます。
メモ
MvPattern は、MStateDependence が "strong" の場合に ode15s、ode23t、ode23tb で使用されます。
例: opts = odeset(MStateDependence="strong",MvPattern=S)
データ型: single | double
特異質量行列のトグル。"maybe"、"yes"、または "no" として指定します。既定値 "maybe" の場合、ソルバーは質量行列が特異であるかどうかをテストすることにより、問題が DAE であるかどうかをテストします。方程式が DAE であることが既知の場合は "yes"、DAE でないことが既知の場合は "no" を指定して、このチェックを避けます。
データ型: char | string
矛盾しない初期傾き。ベクトルとして指定します。ode15s ソルバーおよび ode23t ソルバーで DAE を解くときにこのオプションを使用します。指定されたベクトルは となる初期傾き です。指定された初期条件が矛盾する場合、ソルバーはこれらを推定値として扱い、推定値に近く矛盾しない値の計算を試行して、問題の求解を続行します。
データ型: single | double
ode15s および ode15i 専用
式の最大次数。1 から 5 までの整数として指定します。このオプションを使用して、可変次数ソルバー ode15s および ode15i で使用される数値微分式 (NDF) または後退微分公式 (BDF) で使用される最大次数を指定します。
ode15s で後退微分公式 (BDF) を使用するためのトグル。"off" または "on" として指定します。通常、既定の数値微分式 (NDF) の方が BDF よりも効率的ですが、両者は密接に関係しています。
例: opts = odeset(BDF="on",MaxOrder=4) は ode15s による BDF (最大次数 4) の使用を有効にします。
データ型: char | string
出力引数
オプション構造体。options は ode45、ode23、ode113、ode15s、ode23s、ode23t、ode23tb または ode15i の 4 番目の入力引数として使用できます。
ヒント
さまざまなオプションの使用方法を説明する ODE の例のリストについては、ODE の例とファイルの概要を参照してください。
拡張機能
使用上の注意および制限:
すべての入力は定数でなければなりません。
スレッドベースの環境
MATLAB® の backgroundPool を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool を使用してコードを高速化します。
バージョン履歴
R2006a より前に導入ヤコビ行列および質量行列のスパース パターン JPattern と MvPattern は、単精度のスパース行列として指定できます。OutputFcn など、関数ハンドルを受け入れる引数について、指定した関数で単精度の出力を返せるようになりました。
名前と値の引数 MinStep を使用して、ソルバー オプションとして最小ステップ サイズを指定できます。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)