微分方程式の数値解法のためのユーティリティパッケージ

InterpolatingFunctionAnatomy

NDSolveは,解をInterpolatingFunctionオブジェクトとして返す.ほとんどの場合,このオブジェクトを単に関数として使うことで用は足りるが,NDSolveがステップを取るときに計算した実際の値および点を含む内部のデータにアクセスすると便利なことがある.InterpolatingFunctionオブジェクトの正確な構造は,データ保存を効率的にし,指定された点での評価を迅速に行う配列となっている.この構造はWolfram言語のバージョンによって異なることがあるので,InterpolatingFunctionオブジェクトの一部にアクセスするという意味で書かれたコードは,Wolfram言語の新バージョンでは動作しない可能性がある.DifferentialEquations`InterpolatingFunctionAnatomy`パッケージは,Wolfram言語の将来のバージョンのために維持されるInterpolatingFunctionオブジェクトのデータのインターフェースを提供する.

InterpolatingFunctionDomain[ifun]InterpolatingFunctionオブジェクト ifun の各次元に対して,定義の領域を含むリストを返す
InterpolatingFunctionCoordinates[ifun]InterpolatingFunctionオブジェクト ifun の各次元で指定されているデータの座標を含むリストを返す
InterpolatingFunctionGrid[ifun]InterpolatingFunctionオブジェクト ifun に対して指定されているデータのグリッド点を返す
InterpolatingFunctionValuesOnGrid[ifun]グリッドの点のそれぞれでInterpolatingFunctionオブジェクト ifun を評価することにより返される値を返す
InterpolatingFunctionInterpolationOrder[ifun]InterpolatingFunctionオブジェクト ifun の各次元で使用される補間次数を返す
InterpolatingFunctionDerivativeOrder[ifun]基底関数の導関数の次数を返す.基底関数の値は,InterpolatingFunctionオブジェクト ifun を評価するときに指定される

InterpolatingFunctionオブジェクトの構造

パッケージをロードする:

InterpolatingFunctionAnatomyパッケージは,NDSolveでは指定した値の全範囲に渡る解が計算できないときに,計算された解のすべてをプロットしてどこで不具合が起ったのかをよく理解しようする場合に常に有用である.

指定された終端点まで計算できない微分方程式の例である:
領域を得る:
一旦領域がリストに戻されたら,Partを使って希望の終端点を得てプロットを作成するのは簡単である:

プロットを見ると,特異点が1つ形成され,それ以上系を積分するのが不可能であることがはっきりと分かる.

NDSolveがステップを取った場所を見ると役に立つことがある.このためには,座標を調べるのがよい.

以下はNDSolveが各ステップで計算した値である.これにより,特異点を解決しようとして,ほとんどすべてのステップが使われたことが明確である:

このパッケージは,計算されたPDEの解を解析するのに特に便利である.

以下の初期条件を使うと,バーガーズ(Burgers)方程式は急勾配面を形成する:
以下は各次元で使われる点の数である:
これは各次元で使われる補間の次数である:
急勾配面を解決できないということが,数値的な不安定性として表れている:
時間積分の終端点における空間グリッド点で計算された値である:

上の点プロットから,急勾配面が解決されたことが分かる.

空間グリッドの各点について,時間がどのように進化するかを3Dプロットで示すようにする.初期条件は赤で示されている:

InterpolatingFunctionオブジェクトの導関数が取られると,任意の点で評価されたときに,要求された導関数を与える新しいInterpolatingFunctionオブジェクトが返される.InterpolatingFunctionDerivativeOrderは,どの導関数を評価するかを決定する方法である.

この導関数は新しいInterpolatingFunctionオブジェクトを返す:
導関数が評価されることを示す:

NDSolveUtilities

さまざまなNDSolveメソッドの研究および比較を簡単にするために,多数のユーティリティルーチンが書かれている.これはDifferentialEquations`NDSolveUtilities`パッケージに集めてある.

CompareMethods[sys,refsol,methods,opts]sys に適用されたさまざまなメソッドの統計を返す
FinalSolutions[sys,sols]sys に対応するさまざまな解 sols についての数値積分の最後で解の値を返す
InvariantErrorPlot[invts,dvars,ivar,sol,opts]sol に対する不変式 invts の誤差をプロットする
RungeKuttaLinearStabilityFunction[amat,bvec,var]ルンゲ・クッタ法の線形安定関数を返す.この関数の係数行列は amat,重みべクトル bvec には変数 var を使用する
StepDataPlot[sols,opts]sols で取られる刻み幅のプロットを返す

NDSolveUtilitiesパッケージで提供されている関数

パッケージをロードする:

ルンゲ・クッタ法を解析するための便利な手法として,スカラー線形テスト問題(FunctionApproximations.mパッケージを参照)に適用したときにどのように動作するかを調べるというものがある.

これは,二段四次の陰的ルンゲ・クッタ法の係数(厳密精度あるいは無限精度)を割り当てる:
原点において指数関数の(2,2)パデ近似に対応する,線形安定関数を計算する:

関数CompareMethodsFinalSolutionsRungeKuttaLinearStabilityFunctionStepDataPlotの例題は「NDSolveの"ExplicitRungeKutta"法」に記載されている.

関数InvariantErrorPlotの例題は,「NDSolveの"Projection"法」に記載されている.

InvariantErrorPlotオプション

関数InvariantErrorPlotには,結果の形式を制御するのに使用できるオプションが多数含まれている.

オプション名
デフォルト値
InvariantDimensionsAutomatic不変式の次元を指定する
InvariantErrorFunctionAbs[Subtract[#1,#2]]&誤差の比較に使用する関数を指定する
InvariantErrorSampleRateAutomatic誤差がサンプルされる頻度を指定する

InvariantErrorPlot関数のオプション

InvariantDimensionsはデフォルトでは,入力Dimensions[invts]の構造の次元を決定する.

InvariantErrorFunctionのデフォルト値は,絶対誤差を計算する関数である.

InvariantErrorSampleRateはデフォルトでは,ステップ数が1000未満の場合にはすべての点をサンプルする.1000を超えると,対数のサンプルレートが使われる.