Main Content

ODE の一般的な問題のトラブルシューティング

このトピックでは、ソルバー関数 (ode45ode15s など) を使用して ODE を解くときに発生することがある一般的な問題について説明します。

許容誤差

質問または問題回答

誤差のしきい値 RelTol および AbsTol はどのように選択すればよいですか。

RelTol は相対的な精度誤差であり、計算解の正しい桁数を制御します。AbsTol は絶対許容誤差であり、計算解と真の解との差を制御します。各タイム ステップで、解の i 番目の要素の誤差 e は、次の条件を満たす必要があります。

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

大まかに言うと、これは、しきい値 AbsTol(i) より小さいものを除いて、すべての解の要素には RelTol の正しい桁数が必要なことを意味します。要素 y(i) が小さい場合は重要でなくても、より重要な要素を正確に計算できるようにするには、AbsTol(i) に指定する小さい値は、y(i) で正しい桁数を得られる程度にしなければならないことがあります。

コンピューターの計算精度と同等の解を求めたいのですが、単に RelToleps に設定できないのはなぜですか。

マシンの精度に近い値を得ることはできますが、ぎりぎりまで近づけることはできません。ソルバーは連続関数を近似しようとするため、eps に近い値を RelTol として使用できません。許容誤差を eps に近い値にすると、マシンの計算は、すべての関数が不連続であるとみなすことになります。

ある解要素に対しては正確な解が必要ないことをソルバーに設定するには、どのようにすればよいでしょうか。

その解要素に対する絶対許容誤差 AbsTol を大きくすることができます。許容誤差を解要素よりも大きくすると、この要素内では桁数が正しくなくてもよいと指定することになります。ソルバーでは、他の要素を正確に計算するために、この要素でも正しい桁数を得なければならないことがありますが、一般的に、このような処理は自動的に行われます。

問題のスケール

質問または問題回答

ODE suite で、どの程度のサイズの問題を解くことができますか。

基本的な制限要因は、メモリ サイズとシミュレーション時間です。ステップごとにシステムの方程式の数を n で表すとすると、ノンスティッフな問題に対するソルバーは、長さ n のベクトルを代入します。スティッフな問題に対するソルバーは、n のベクトルを割り当てますが、nn 列のヤコビ行列も割り当てます。これらのソルバーでは、odesetJPattern オプションを使用して、ヤコビ スパース パターンを指定すると効果的な場合があります。

問題がノンスティッフな場合や JPattern オプションを使用した場合、数千の未知数を含む問題が解けることもあります。しかし、この場合も結果を維持する保存スペースが問題になります。ソルバーで特定の点のみで解を計算するように設定するか、または出力引数なしでソルバーを呼び出して出力関数を使用して解を観測してください。

非常に大きな系の解を求めますが、必要な要素は y のほんのいくつかのみです。不要な要素を保存しない方法はありますか。

はい。この目的のために特別に設計された OutputFcn オプションがあります。ソルバーの読み込みに出力引数を設定しなかった場合、ソルバーは、すべての要素の履歴保存用に領域を割り当てません。その代わりに、ソルバーは OutputFcn(t,y,flag) をタイム ステップごとに呼び出します。特定の要素の履歴を保持するには、対象となる要素だけを保存するか、プロットする出力関数を記述します。

積分計算の立ち上がり部分でどのくらいの CPU 時間がかかりますか。またその時間を減らす方法とは?

立ち上がりで最も時間がかかるのは、ソルバーが問題のスケールに合ったステップ サイズを見つけようとする部分です。適切なステップ サイズがわかっている場合は、InitialStep オプションを使用してください。たとえば、イベント検出ループ内で積分器を繰り返し呼び出す場合、イベントの前の最後のステップ サイズは、おそらく次の積分にとっても適切なスケールであると考えられます。例を参照するには、「edit ballode」と入力してください。

積分計算で使われる最初のステップ サイズが大きすぎて、重要な動作を検出できません。

InitialStep オプションを使用すると、最初のステップ サイズを設定できます。積分器はこのステップ サイズを試してから、必要に応じてサイズをさらに小さくします。

解要素

質問または問題回答

解が想定とは異なっています。

想定が正しい場合は、許容誤差を既定値よりも小さくしてください。積分する時間区間が "長すぎる" 問題や多少不安定な問題の解を正確に計算するには、相対許容誤差を小さくする必要があります。

いずれかの時点において、解の要素がその絶対許容誤差よりも小さいままのものがあるかをチェックしてください。その場合は、これらの要素では桁数が正しくなるように設定されていないことになります。これらの要素については特に問題がなくても、正確に計算できないと、これらに依存する他の要素の精度が落ちてしまうこともあります。

プロットの滑らかさが十分ではありません。

Refine の値を既定値よりも大きくしてください。既定値は、ode454ode78ode898、その他のソルバーは 1 です。Refine の値を大きくするほど、ソルバーが生成する出力点数が多くなります。Refine の値を既定値よりも大きくしても、計算速度にはほとんど影響しません。

計算しながらプロットすると途中までは問題ないのですが、あるところで計算が止まってしまいます。

まず、計算が停止する点の近くで ODE の解が滑らかであるかを確認してください。そうでない場合は、それを解決するための小さいステップをソルバーに設定しなければなりません。ODE 関数の滑らかな部分で積分区間を分割すると、これを解決できる場合があります。

関数が滑らかであり、計算が非常に小さなステップ幅で進んでいる場合は、スティッフな問題には対応していないソルバーを使用して、そのような問題の解を求めようとしている可能性があります。スティッフ ソルバー ode15sode23sode23tode23tb のいずれかを使用するように切り替えてください。

最終値はわかっていても、初期値がわからない場合はどうしたらよいですか。

ODE suite のすべてのソルバーでは、時間を戻したり進めたりしながら解を求めることができます。ソルバーの構文は [t,y] = ode45(odefun,[t0 tf],y0); となり、t0 > tf を受け入れます。

非常に多くのタイム ステップを使うので、積分計算が非常に遅くなります。

はじめに、tspan が長すぎないかどうかをチェックしてください。ソルバーは、滑らかな計算結果を出力するのに必要な数のタイム ステップで計算します。ODE 関数が tspan に比べて非常に短い時間スケールで変化する場合、ソルバーは多くのタイム ステップを使用します。問題は積分計算が長いほど、解くことが難しくなります。tspan を小さく分割して計算してみてください。

tspan の上で、ODE 関数の解が目立って変化していないようであれば、その問題がスティッフであることが考えられます。スティッフ ソルバー ode15sode23sode23tode23tb のいずれかを使用してみてください。

最後に、ODE が効率よく記述されているかを確かめてください。ソルバーは ODE の導関数を何回も計算します。数値積分に要する時間は、ODE の計算に大きく依存します。複雑な定数パラメーターを評価ごとに計算し直すのではなく、これらをグローバル変数に保存するか、または一度に計算して入れ子関数に渡してください。

t0 <= t <= tf の場合に時間 t では解が急激に変化することがわかっていますが、積分器のステップでそれが "見逃されて" います。

時間 t で急激に変化することがわかっている場合は、区間 tspan[t0 t][t tf] の 2 つに分けてみて、積分器を 2 回呼び出すか、または odextend を使用して積分を続けてください。

微分方程式の係数または解に周期性がある場合、最大ステップ サイズを周期長に制限して、ソルバーでステップが周期長より大きくならないことを確認してください。

問題のタイプ

ライン手法で離散化した PDE (偏微分方程式) を扱うことができますか。

PDE を離散化すると ODE 方程式が生成されるので可能です。離散化の結果によっては、質量行列を含んだ形式になる場合がありますが、それには ODE ソルバーを使用できます。多くの場合、このシステムはスティッフになります。これは、PDE が放物型である場合や、流体内での化学反応のような非常に異なる時間スケールで生じる現象の場合に予想されます。このような場合、ソルバー ode15sode23sode23tode23tb の 4 つのうちのいずれかを使用してください。

方程式が多い場合は、JPattern オプションを使用して、ヤコビ スパース パターンを指定してください。これによって計算に時間がかかりすぎなくなるため、成功するか失敗するかに影響することがあります。JPattern の使用例を参照するには、「edit burgersode」と入力してください。

系がスティッフでない場合やそれほどスティッフではない場合は、スティッフ ソルバー ode15sode23sode23tode23tb よりも、ode23 および ode45 の方が効率的です。

1 次元放物-楕円型偏微分方程式の解は、MATLAB® PDE ソルバー pdepe で直接求めることができます。

サンプリングされたデータによるシステムを積分できますか。

直接的には無理です。代わりに、内挿やその他のデータ近似の手法を使用し、データを関数として表してください。この関数については、滑らかさが重要です。スプラインのような区分的多項式で置き換えた場合、一見滑らかにみえますが、ソルバーにとっては不連続になっています。微分値が不連続になる点で、ソルバーは非常に細かいステップを使用します。滑らかな関数を使用してデータを表すか、または滑らかさの影響はあまり受けない低次のソルバー (ode23ode23sode23tode23tb) のいずれかを使用してください。例については、時間依存の項をもつ ODEを参照してください。

参考

| | |

関連するトピック