MATHEMATICAチュートリアル

NDSolveフレームワークの設計

機能

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

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

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

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

  • 一様な設計とインターフェース
  • コードの再利用(共通コードベース)
  • オブジェクト指向型(メソッドのプロパティの指定と伝達)
  • データ隠蔽
  • メソッドの初期化段階とランタイム計算の分離
  • 階層的でリエントラントの数値メソッド
  • 丸め誤差の一様な扱い([HLW02],[SS03]およびその中の参考文献を参照のこと)
  • 最適化されたインプレース演算を使ってBLASモデル[LAPACK99]を一般化したものに基づいたベクトル化したフレームワーク
  • 同族のメソッドによる実装の共有を可能にするテンソルフレームワーク
  • すべてのメソッドにおける動的なタイプと精度
  • ユーザによる拡張とプロトタイプ化を可能にするプラグイン機能
  • 特化したデータ機構

一般的な時間ステップ

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

  • 数値積分における刻み幅の値は硬い系を解く場合に小さくなりすぎることがあるが,これが小さくなりすぎない.
  • ユーザのプログラミングエラーのために刻み幅が不意に記号を変更しないようにする.
  • ステップが棄却された後で刻み幅を大きくしない.
  • 積分の最後の方で刻み幅を劇的に小さくしない.
  • 指定された(あるいは検出された)特異性は積分を再実行する形で扱う.
  • 陰的メソッドにおける積分の発散(例:固定された大きな刻み幅を使う)
  • 回復不可能な積分誤差(例:数値的な例外)
  • 丸め誤差のフィードバック(compensated summation)は高階メソッド,すなわち数値積分中に特定の量を保存するメソッドで特に有益である.

データの埋込み

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

アルゴリズムの階層

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

初期設計

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

NDSolve

NDSolve

改訂 1

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

NDSolve

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

NDSolve

改訂 2

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

NDSolve

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

現行

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

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

NDSolve

ユーザによる拡張

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

アルゴリズムのクラス

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

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

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

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

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

In[1]:=
Click for copyable input
Out[1]=

MethodMonitor

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

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

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

共有機能

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

  • 関数の評価はIEEE浮動小数点のオーバーフローやアンダーフロー等の際に必要に応じてタイプを動的に変更するを用いて行われる.また,これは必要に応じて Mathematica のコンパイラであるCompileを効率化のために呼び出す.
  • ヤコビアンの評価には自動あるいはユーザ定義のスパース検索を含む記号微分や有限差分近似が使われる.
  • 密な線形代数はLAPACKに基づいており,疎な線形代数はUMFPACKのような特殊用途のパッケージを使う.
  • 微分系を表す関数の数値評価における一般的な部分式は反復作業を避けるために検出・収集される.

    この系は,数値積分の間に必要に応じて自動的に再コンパイルし,実数型から複素数型へと動的に切り替える.

    In[2]:=
    Click for copyable input
    Out[2]=

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

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

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

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

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

New to Mathematica? Find your learning path »
Have a question? Ask support »