NDSolveの"ImplicitRungeKutta"メソッド

はじめに

陰的ルンゲ・クッタ(RungeKutta)メソッドには,多くの望ましい特性がある.

例えば,ガウス・ルジャンドル(GaussLegendre)の公式は自己共役である.これは,時間内に前進あるいは後退の積分を行うと,同じ解になるということである.

以下で例題と効用関数を定義するパッケージをロードする:

係数

陰的ルンゲクッタ法の汎用フレームワークが実装されている.ここまでの焦点は,興味深い幾何属性を持つメソッドであり,現在以下のスキームをカバーしている.

係数の生成

例題

例題をロードする:
この問題には,一定を維持しなければならない2つの不変量がある.数値法では,これらの不変量が保存できない可能性がある:
陰的ルンゲ・クッタのガウス法を使ってこの系を解く.スキームの次数は,"DifferenceOrder"メソッドオプションを使って選ばれる:
不変量の誤差のプロットにより,積分が進むに従って誤差が増大することが分かる:

"ImplicitRungeKutta""ImplicitSolver"メソッドには,非線形方程式系を解く際に目標とする絶対誤差,相対誤差を指定するオプションAccuracyGoalPrecisionGoalがある.

これらのオプションは,NDSolveでこれに相当するオプションと同じデフォルト値を持つ.非線形方程式系は,メソッドの局所誤差よりも格段に高い精度に解く意味がないからである.

しかし,問題の種類によっては,非線形方程式系を作業精度まで解くと役に立つことがある:

最初の不変量は系のハミルトニアンで,誤差は有界となった.陰的ルンゲ・クッタのガウス法はシンプレクティック積分法なので,そうでなければならない.

陰的ルンゲ・クッタのガウス法は二次不変量を保存するので,2番目の不変量は正確に(丸めまで)保存される:

以下は,陰的中点公式を一段の二次陰的ルンゲ・クッタとして定義する.

この問題では,ニュートン反復ではなく定点反復法を使って非線形系を解いた方が効率的である:

現在,陰的ルンゲ・クッタのフレームワークは非線形系を脱共役するためのまとまったニュートン法は使わない.

オプションの要約

"ImplicitRungeKutta"のオプション

オプション名
デフォルト値
"Coefficients""ImplicitRungeKuttaGaussCoefficients"陰的ルンゲ・クッタ法で使う係数を指定する
"DifferenceOrder"Automaticメソッドの局所確度の次数を指定する
"ImplicitSolver""Newton"非線形系に使うソルバを指定する.有効な設定はFixedPoint"Newton"
"StepSizeControlParameters"Automaticステップ制御パラメータを指定する
"StepSizeRatioBounds"{,4}新しい刻み幅での相対変化の限界を指定する
"StepSizeSafetyFactors"Automatic刻み幅推定で使用する安全率を指定する

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

オプション"StepSizeSafetyFactors"のデフォルト設定Automaticでは,値{9/10,9/10}が使われる.

"ImplicitSolver"のオプション

オプション名
デフォルト値
AccuracyGoalAutomatic非線形系を解くのに使う絶対許容誤差を指定する
"IterationSafetyFactor"非線形系を解くのに使う安全率を指定する
MaxIterationsAutomatic非線形系を解くのに使う最大反復回数を指定する
PrecisionGoalAutomatic非線形系を解くのに使う相対許容誤差を指定する

"ImplicitSolver"の一般的なオプション

オプション名
デフォルト値
"JacobianEvaluationParameter"ニュートン反復でいつヤコビ行列を再計算するかを指定する
"LinearSolveMethod"Automaticニュートン反復で使用する線形ソルバを指定する
"LUDecompositionEvaluationParameter"ニュートン反復のいつLU分解を計算するかを指定する

"ImplicitSolver""Newton"メソッド特定のオプション