NDSolveのノルム

NDSolveでは,いつ解が許容誤差を満足するかを決定するために,誤差ノルムの推定値を使用する.ほとんどすべての場合,重み付きのノルム,あるいはスケールされたノルムは,許容誤差が満足されたら1より大きく,許容誤差が満足されなかったら1より小さくなる.スケールされたノルムの最大の利点は,許容誤差を明示的に参照せずに,指定されたメソッドを書くことができるという点である.指定されていない場合,許容誤差の満足度は,スケールされたノルムと1を比べる(つまりメソッド内で誤差推定をチェックするために必要なコードを簡約化する)と分かる.

がベクトルで, が重みを計算するのに使用する参照べクトルであるとする.通常 は近似解ベクトルである.このとき,ノルムが適用されるスケールされたべクトル は以下の要素を持つ.

ここで,絶対許容誤差 と相対許容誤差 は,それぞれAccuracyGoal->ag オプションから により,PrecisionGoal->pg オプションから により導かれる.

実際に使われるノルムは,NDSolveで指定するNormFunctionオプションの設定により決まる.

オプション名
デフォルト値
NormFunctionAutomaticNDSolveの誤差ノルムの推定値を計算するために使う関数

NDSolveNormFunctionオプション

NormFunctionオプションの設定は,ベクトルの引数に対してスカラーを返し,ノルムの属性を満足する関数であれば何でもよい.ノルムに要求される属性を満足しない関数を指定すると,ほとんどの場合NDSolveで問題が起り,答を返すとしても誤ったものとなる.

デフォルト値のAutomaticとは,NDSolveが異なるメソッドに対して異なるノルムを使ってもよいということである.ほとんどのメソッドでは無限ノルムが使われるが,微分代数方程式のIDAメソッドでは.2ノルムが使われる.これは,剰余関数の根を見付けるメリット関数の滑らかさを維持するのに役に立つからである.Normは特定の の値で使うことを強くお勧めする.この理由で,NormFunction->(Norm[#,p]/Length[#]^(1/p)&)の代りに,その省略形のNormFunction->p を使うこともできるのである.に対して最もよく使われている実装は,特にスピードについて最適化されている.

これは,100サイクルを超える簡単な調和振動子の解を計算するための全体的な誤差と,指定された別のノルムとを比較する:

が増加するに従って誤差が減少するのは,ノルムは はベクトル長)で乗算することにより正規化されるからである.このことは,NDSolveでは重要である.というのは,多くの場合,関数の近似をチェックするための試みが行われており,そこでは点が多いほどよい近似を与えたり,誤差が少なかったりするからである.

スペースが一様格子 上で が成り立つときに, によって与えられる周期関数 の一階微分の有限差分近似を考えてみる.Wolfram言語では,ListCorrelateを使って簡単に計算できる.

16の点が区間をカバーしている格子上の余弦関数に対する一階微分の近似の誤差を計算する:
32の点が区間をカバーしている格子上の余弦関数に対する一階微分の近似の誤差を計算する:

点の数が多くなると,明らかに点毎の誤差は顕著に減っている.

ベクトルの2つのノルムは,大きさと同じ次数である:

ベクトルのノルムが同程度であるのは,ベクトルの要素数が増加したために,通常の線形代数ノルムが収束を適切に反映しないからである. で乗算して正規化すると,関数空間における収束を適切に反映する.

正規化されたベクトルの2つのノルムは,実際の関数への収束を反映する.近似は一階なので,格子点の数を倍にすると,誤差はほぼ半分になる:

関数にオプション値を指定し,それを偏微分方程式あるいは関数の近似解に使うことを意図している場合は,関数に必ず適切な正規化が含まれていなければならない.

ScaledVectorNorm

誤差制御のあるメソッドでは,ステップが局所的な許容誤差を満足しているかどうかを判断する必要がある.これをチェックする過程を簡約化するために,効用関数ScaledVectorNormでスケーリング(1)を行い,ノルムを計算する.以下の表には,参照に対して の指定された値についての公式がリストされている.

ScaledVectorNorm[p,{tr,ta}][v,u]参照べクトル u,相対および絶対許容誤差がそれぞれ tatr であるスケール(1)を使って,べクトル v の正規化した p ノルムを計算する
ScaledVectorNorm[fun,{tr,ta}][v,u]参照ベクトルが u,相対および絶対許容誤差がそれぞれ tatr,ノルム関数が fun であるスケール(1)を使ってべクトル v のノルムを計算する
ScaledVectorNorm[2,{tr,ta}][v,u]を計算する(n はべクトル vu の長さ)
ScaledVectorNorm[,{tr,ta}][v,u] のときのを計算する(n はべクトル vu の長さ)

ScaledVectorNorm

NDSolveで使われるデフォルトの機械精度の許容誤差でスケールされたべクトルノルムオブジェクトを設定する:
サンプル誤差と解の参照ベクトルを,スケールされたノルムオブジェクトに適用する:
絶対許容誤差のため,参照解の要素のうちのいくつかが0であっても,値は妥当なものになる:

NDSolveのメソッドを設定するときに,NDSolve`StateDataオブジェクトの"Norm"メソッド関数を使って,使用する適切なScaledVectorNormオブジェクトを得ることができる.

NDSolve`StateDataオブジェクトである:
状態データから,使用するのに適切にスケールされたノルムを得る:
初期条件を参照ベクトルとして使って,サンプルの誤差ベクトルに適用する: