NDSolveの"Composition"法と"Splitting"法
はじめに
微分方程式系を部分系に分割し,それぞれを適切な積分法を用いて解くと便利なことがある.それぞれの解を合成することで,体積等の動的特性を保存することができることがある.分割と合成に関する詳細は[MQ02, HLW02]に,NDSolveに関連する特定の問題は[SS05, SS06]に記載されている.
定義
"Composition"
外挿で使われるエイトケン–ネビル(Aitken–Neville)アルゴリズムとは対照的に,合成ではシンプレクティック法等の基礎的な積分法の幾何的特性を保存することができる.
を,指定された実数 を持ち,刻み幅 を取る基本的積分法とする.
"Splitting"
段階の分割法は,加法的に分割された の合成法の一般化である.
大切なのは, ではなく を含む問題を解く際に,計算上の利点がある場合が多いということである.
これでそれぞれの基本的積分法が,問題の一部だけを解くようになったが,適切な合成により有利な特性を持つ数値スキームが生まれる可能性がまだある.
べクトル場 が積分可能ならば,厳密解もしくは流れ を数値積分法の代りに使うことができる.
その例にLie–Trotterの分割[T59]がある.
実装
分割法と合成法を実装するために,新しいNDSolveフレームワークにいくつかの変更を加えることが必要であった.
ネストされたメソッド
以下の例では"Composition"を使って,低次の分割法から高次の分割法を構築する.
簡略化
上記の例で,流れの集合特性を使い,"Splitting"メソッドを直接呼び出すと,より効率的な積分法を得ることができる.
例題
次の例題は,ストラング(Strang)の分割[S68],[M68]として知られる二次の対称分割を使う.分割係数は,方程式の構造から自動的に決定される.
シンプレクティック分割
シンプレクティックリープフロッグ
"SymplecticPartitionedRungeKutta"は長期力学を使った,分離可能なハミルトン系 を解くための効率的なメソッドである.
"Splitting"の方が汎用のメソッドであるが,分割されたシンプレクティック法を構築するために使うことができる(しかし,"SymplecticPartitionedRungeKutta"よりもやや効率性に劣る).
"ExplicitEuler"メソッドは1度しか指定できなかった.2回目と3回目は循環的に埋められるからである.
シンプレクティックリープフロッグの合成
複合メソッド
閉形式の解はべクトル場全体に存在しないことがよくあるが,ベクトル場の一部について微分方程式系を解析的に解くことが可能な場合がある.
DSolveで解が見付かる場合は,局所的に解を求めるのに直接数値評価を使うことができる.
この考えはメソッド"LocallyExact"に実装されている.
調和振動テスト例題
数値・記号複合分割法(ABC flow)
体積保存積分法を直接適用すると,一般に対称性は保存しない.陰的中点公式等の対称保存積分法では,体積を保存しない.
Y2の系はDSolveで厳密に解くことができるので,"LocallyExact"メソッドを使うことができる.
しかし,Y1は解けないので,分割法の目標の属性を得るためには,適切な数値積分法を使う必要がある.
ロトカ・ヴォルテラ(Lotka–Volterra)方程式
この系のさまざまな数値積分法が「ロトカ・ヴォルテラ方程式の数値解法」の中で比較してある.
オイラー方程式
オイラー方程式のさまざまな数値積分法が,「剛体ソルバ」の中で比較してある.
非自律系のべクトル場
オプションの要約
"Composition"のデフォルトの係数オプションは,Methodオプションを使って指定するメソッドの特性によって,"SymmetricCompositionCoefficients"と"SymmetricCompositionSymmetricMethodCoefficients"のどちらかを自動的に選ぶことを試みる.
オプション名
|
デフォルト値
| |
"Coefficients" | Automatic | 合成法で使用する係数を指定する |
"DifferenceOrder" | Automatic | メソッドの局所的な精度の次数を指定する |
Method | None | 数値積分で使用する基礎メソッドを指定する |
オプション名
|
デフォルト値
| |
"Coefficients" | {} | 分割法で使用する係数を指定する |
"DifferenceOrder" | Automatic | メソッドの局所的な精度の次数を指定する |
"Equations" | {} | 方程式を分割する方法を指定する |
Method | None | 数値積分で使用する基礎メソッドを指定する |