NDSolveの"StiffnessSwitching"メソッド

はじめに

"StiffnessSwitching"メソッドの基本的な考えは,ノンスティッフなソルバとスティッフなソルバを自動的に切り換える手段を提供するものである.

"StiffnessTest"オプションと"NonstiffTest"オプション(「NDSolveのStiffnessTestメソッドオプション」で説明してある)は,いつ問題がスティッフであるかを検出する便利な方法を提供する.

"StiffnessSwitching"メソッドは,"StiffnessTest"が生成した失敗コードを捕え,別のソルバに切り換える."StiffnessSwitching"メソッドは"NonstiffTest"オプションで指定されているメソッドを使い,スティッフなメソッドからノンスティッフなメソッドに切り替える.

"Extrapolation"は動的な次数および刻み幅選択を使って,精度の高い解を計算するための強力な手法である(詳細は「NDSolveの外挿法」を参照のこと).これは"StiffnessSwitching"のデフォルト設定として使われている.

例題

便利なパッケージをロードする:
これはスティッフな問題を選び,NDSolveProblemで指定されているデフォルトよりも長い積分時間を指定する:
デフォルトの基本メソッド"Extrapolation"はスティッフな問題には適していないので,すぐに終了してしまう:
"StiffnessSwitching"メソッドは終了せずに,スティッフなソルバを使って積分を継続する:

"StiffnessSwitching"メソッドではデフォルトで1ペアの外挿法を使う.ノンスティッフなソルバは基本メソッド"ExplicitModifiedMidpoint"を,スティッフなソルバは基本メソッド"LinearlyImplicitEuler"を使う.

AccuracyGoalおよびPrecisionGoalの許容値が小さいときは,ノンスティッフなソルバに陽的ルンゲ・クッタ(Runge-Kutta)法を使った方がよい場合がある.

"ExplicitRungeKutta"メソッドは,問題がスティッフであることが分かると終了してしまう:
これは"ExplicitRungeKutta"法を"StiffnessSwitching"のサブメソッドとして設定する:
で起るスティッフなソルバへの切換え,および,使用される刻み幅のプロットにより,スティッフなソルバの方がずっと大きいステップを取ることが分かる:

オプションの要約

オプション名
デフォルト値
Method{Automatic,Automatic}ノンスティッフなソルバ,スティッフなソルバに使うメソッドをそれぞれ指定する
"NonstiffTest"Automaticノンスティッフなソルバに切り替えるかどうかを決定するために使用するメソッドを指定する

"StiffnessSwitching"メソッドのオプション