WOLFRAM言語チュートリアル

NDSolveの"ImplicitRungeKutta"メソッド

はじめに

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

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

以下で例題と効用関数を定義するパッケージをロードする.
In[1]:=
Click for copyable input

係数

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

    メソッド係数の導出は,任意次数,任意精度まで実行できる.

係数の生成

  • 段の係数の横座標を定義する多項式の定義から始める.例えば,ガウス・ルジャンドル公式の横座標は,と定義される.
  • 1変数多項式の因数分解により,多項式の根を定義する,内在する既約多項式が求められる.
  • Rootオブジェクトが構築され,解を表す(数値近似のために一意的な根の分離とジェンキンス・トラウブ(JenkinsTraub)アルゴリズムが使われる).
  • 次に精度係数のRootオブジェクトが数値的に近似される.
  • 係数を構成するヴァンデルモンド(Vandermonde)型の条件推定値が,数値的に根を近似するときに使う精度を算出する.
  • その後,係数の方程式を解くために,非融合のヴァンデルモンド型に特化されたソルバが使われる([GVL96]を参照のこと).
    • 近似解を微調整し,要求された精度の係数が得られることをチェックするために,1ステップの反復調整が使われる.
    以下は,二段階四次のガウス・ルジャンドル法の50桁精度の係数を生成する.
    In[3]:=
    Click for copyable input
    Out[3]=

    係数はという形式である.

    二段階四次のガウス・ルジャンドル法の係数を正確に計算する.高次のメソッドでは,係数を正確に計算するのに非常に長時間かかることが多い.
    In[4]:=
    Click for copyable input
    Out[4]=
    六段階十次のRaduaIA陰的ルンゲ・クッタ法の係数を20桁精度まで生成する.
    In[5]:=
    Click for copyable input
    Out[5]=

例題

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

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

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

しかし,問題の種類によっては,非線形方程式系を作業精度まで解くと役に立つことがある.
In[11]:=
Click for copyable input
Out[11]=

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

陰的ルンゲ・クッタのガウス法は二次不変量を保存するので,2番目の不変量は正確に(丸めまで)保存される.
In[12]:=
Click for copyable input
Out[12]=

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

この問題では,ニュートン反復ではなく定点反復法を使って非線形系を解いた方が効率的である.
In[13]:=
Click for copyable input
In[14]:=
Click for copyable input
Out[14]=

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

オプションの要約

"ImplicitRungeKutta"のオプション

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

メソッドのオプション

オプションのデフォルト設定Automaticでは,値が使われる.

"ImplicitSolver"のオプション

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

の一般的なオプション

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

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