NDSolveフレームワークの設計

機能

微分方程式の数値積分メソッドを多数サポートするのは大変なことである.

コードの維持や複製の手間を省くため,メソッド間では一般的な要素が共有されている.

このようなアプローチを取っているので,中央の2,3のルーチンでコードの最適化ができるようにもなっている.

NDSolveの枠組の主要な特徴は次の通りである.

一般的な時間ステップ

すべてのワンステップのメソッドには一般的な時間ステップメカニズムが用いられている.このルーチンにより,以下を含む数多くの異なった基準が扱われる.

データの埋込み

各メソッドにはメソッドの呼出しに必要な情報を持った独自のデータオブジェクトがある.これには係数,作業領域,刻み幅を管理するパラメータ.刻み幅の受容/拒否のための情報,ヤコビ行列等が含まれるが必ずしもこれに限られない.これはLSODA ([H83], [P83])のようなコードで使われているアイディアを一般化したものである.

アルゴリズムの階層

メソッドはリエントラントで階層的になっている,つまり,ひとつのメソッドで他のメソッドを呼び出すことができる.これはC++で実装されている一般的なODEの解法システムGodess([O95],[O98]およびそれらに含まれる参考文献を参照のこと)で使われているアイディアを一般化したものである.

初期設計

当初のアルゴリズムのフレームワーク設計では,1つのソルバから数多くのアルゴリズムを呼び出すことができた.

NDSolve "ExplicitRungeKutta"

NDSolve "ImplicitRungeKutta"

改訂 1

初期設計は後に,任意レベルのネスト構造を持つ連続的形式で,アルゴリズムから別のアルゴリズムが呼び出せるように拡張された.

NDSolve "Extrapolation" "ExplicitMidpoint"

複合的な積分方法は,幾何学的な数値積分で特に有用である.

NDSolve "Projection" "ExplicitRungeKutta"

改訂 2

合成メソッドを実装するために,さらに一般的な木構造の呼出しプロセスが必要となった.

NDSolve

これは随伴式によって構成されたメソッドの例である.

現行

木構造の呼出しプロセスが拡張され,各メソッドを使って,ベクトル場全体ではなく部分体を解くことができるようになった.

この例は「NDSolveの合成・分割法」のサブセクションである「ABCフロー」に出てくる.

NDSolve

ユーザによる拡張

組込みのアルゴリズムを使って特殊目的の(合成)積分器のための有効なコンストラクト用のブロックを構築することができる.ユーザ定義のアルゴリズムを追加することもできる.

アルゴリズムのクラス

"ExplicitRungeKutta"のようなアルゴリズムは異なった次数のさまざまなスキームを含んでいる. また,ユーザがこれに代る係数を選択することもできる.これはRKSUITE [BGS93]に見られる考えを一般化したものである.

自動選択とユーザ側の操作性

このフレームワークは自動刻み幅選択とメソッド順選択を提供する.ユーザはメソッドオプションを使ってメソッドの設定が変更できる.

例えばユーザが"ExplicitRungeKutta"メソッドのクラスを選択したとする.するとコードが問題にとっての「最適な」順序,相対および絶対的な局所誤差の許容値,それに推定される初期刻み幅を自動的に確かめようとする.

以下は"ExplicitRungeKutta"の妥当なオプションのリストである.

MethodMonitor

硬さ切換えや,ランタイム時に起る次数変動等,あるメソッドの低レベルの動作を例示するため,新しい"MethodMonitor"が加わった.

これは"StepMonitor"の比較的大雑把な結果と,"EvaluationMonitor"の緻密な結果の間に位置する.

この機能は公には文書化されておらず,将来のバージョンでは機能に変更があるかもしれない.

共有機能

これらの機能は他の数値メソッドにも使えるもので,NDSolveに限られたものではない.

いくつかの基本的なメソッド

次数
メソッド
1前進オイラー法
2陽的中点公式
1後退オイラー法(1段RadauIIA)
2陰的中点公式(1段ガウス)
2台形公式(2段Lobatto IIIA)
1陰的線形オイラー法
2陰的線形中点法

実装されている1ステップメソッドのいくつか

ここでが成り立ち, は単位行列を, はヤコビ行列 をそれぞれ意味する.

陰的中点法は独立したメソッドとしては実装されていないが,"ImplicitRungeKutta"メソッドの一段ガウス(Gauss)スキームで使用することができる.