微分方程式の数値解法のためのユーティリティパッケージ
InterpolatingFunctionAnatomy
NDSolveは,解をInterpolatingFunctionオブジェクトとして返す.ほとんどの場合,このオブジェクトを単に関数として使うことで用は足りるが,NDSolveがステップを取るときに計算した実際の値および点を含む内部のデータにアクセスすると便利なことがある.InterpolatingFunctionオブジェクトの正確な構造は,データ保存を効率的にし,指定された点での評価を迅速に行う配列となっている.この構造は Mathematica のバージョンによって異なることがあるので,InterpolatingFunctionオブジェクトの一部にアクセスするという意味で書かれたコードは,Mathematica の新バージョンでは動作しない可能性がある.
パッケージは,Mathematica の将来のバージョンのために維持されるInterpolatingFunctionオブジェクトのデータのインターフェースを提供する.
InterpolatingFunctionオブジェクトの構造
パッケージは,NDSolveでは指定した値の全範囲に渡る解が計算できないときに,計算された解のすべてをプロットしてどこで不具合が起ったのかをよく理解しようする場合に常に有用である.
指定された終端点まで計算できない微分方程式の例である.
| Out[2]= |  |
| Out[3]= |  |
一旦領域がリストに戻されたら,
Partを使って希望の終端点を得てプロットを作成するのは簡単である.
| Out[5]= |  |
プロットを見ると,特異点が1つ形成され,それ以上系を積分するのが不可能であることがはっきりと分かる.
NDSolveがステップを取った場所を見ると役に立つことがある.このためには,座標を調べるのがよい.
以下は
NDSolveが各ステップで計算した値である.これにより,特異点を解決しようとして,ほとんどすべてのステップが使われたことが明確である.
| Out[7]= |  |
このパッケージは,計算されたPDEの解を解析するのに特に便利である.
以下の初期条件を使うと,バーガーズ(Burgers)方程式は急勾配面を形成する.
| Out[9]= |  |
| Out[10]= |  |
急勾配面を解決できないということが,数値的な不安定性として表れている.
| Out[11]= |  |
時間積分の終端点における空間グリッド点で計算された値である.
| Out[14]= |  |
上の点プロットから,急勾配面が解決されたことが分かる.
空間グリッドの各点について,時間がどのように進化するかを3Dプロットで示すようにする.初期条件は赤で示されている.
| Out[15]= |  |
InterpolatingFunctionオブジェクトの導関数が取られると,任意の点で評価されたときに,要求された導関数を与える新しいInterpolatingFunctionオブジェクトが返される.
は,どの導関数を評価するかを決定する方法である.
| Out[16]= |  |
| Out[17]= |  |
NDSolveUtilities
さまざまなNDSolveメソッドの研究および比較を簡単にするために,多数のユーティリティルーチンが書かれている.これは
パッケージに集めてある.
| 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 で取られる刻み幅のプロットを返す |
パッケージで提供されている関数
ルンゲ・クッタ法を解析するための便利な手法として,スカラー線形テスト問題(FunctionApproximations.mパッケージを参照)に適用したときにどのように動作するかを調べるというものがある.
これは,二段四次の陰的ルンゲ・クッタ法の係数(厳密精度あるいは無限精度)を割り当てる.
| Out[19]= |  |
原点において指数関数の(2,2)パデ近似に対応する,線形安定関数を計算する.
| Out[20]= |  |
関数
,
,
,
の例題は「NDSolveの"ExplicitRungeKutta"法」に記載されている.
関数
の例題は,「NDSolveの"Projection"法」に記載されている.
InvariantErrorPlotオプション
関数
には,結果の形式を制御するのに使用できるオプションが多数含まれている.
| | |
| InvariantDimensions | Automatic | 不変式の次元を指定する |
| InvariantErrorFunction | Abs[Subtract[#1,#2]]& | 誤差の比較に使用する関数を指定する |
| InvariantErrorSampleRate | Automatic | 誤差がサンプルされる頻度を指定する |
関数のオプション
はデフォルトでは,入力Dimensions[invts]の構造の次元を決定する.
のデフォルト値は,絶対誤差を計算する関数である.
はデフォルトでは,ステップ数が1000未満の場合にはすべての点をサンプルする.1000を超えると,対数のサンプルレートが使われる.