NDSolveのノルム
NDSolveでは,いつ解が許容誤差を満足するかを決定するために,誤差ノルムの推定値を使用する.ほとんどすべての場合,重み付きのノルム,あるいはスケールされたノルムは,許容誤差が満足されたら1より大きく,許容誤差が満足されなかったら1より小さくなる.スケールされたノルムの最大の利点は,許容誤差を明示的に参照せずに,指定されたメソッドを書くことができるという点である.指定されていない場合,許容誤差の満足度は,スケールされたノルムと1を比べる(つまりメソッド内で誤差推定をチェックするために必要なコードを簡約化する)と分かる.
がベクトルで, が重みを計算するのに使用する参照べクトルであるとする.通常 は近似解ベクトルである.このとき,ノルムが適用されるスケールされたべクトル は以下の要素を持つ.
ここで,絶対許容誤差 と相対許容誤差 は,それぞれAccuracyGoal->ag オプションから により,PrecisionGoal->pg オプションから により導かれる.
実際に使われるノルムは,NDSolveで指定するNormFunctionオプションの設定により決まる.
NDSolveのNormFunctionオプション
NormFunctionオプションの設定は,ベクトルの引数に対してスカラーを返し,ノルムの属性を満足する関数であれば何でもよい.ノルムに要求される属性を満足しない関数を指定すると,ほとんどの場合NDSolveで問題が起り,答を返すとしても誤ったものとなる.
デフォルト値のAutomaticとは,NDSolveが異なるメソッドに対して異なるノルムを使ってもよいということである.ほとんどのメソッドでは無限ノルムが使われるが,微分代数方程式のIDAメソッドでは.2ノルムが使われる.これは,剰余関数の根を見付けるメリット関数の滑らかさを維持するのに役に立つからである.Normは特定の の値で使うことを強くお勧めする.この理由で,NormFunction->(Norm[#,p]/Length[#]^(1/p)&)の代りに,その省略形のNormFunction->p を使うこともできるのである.,,に対して最もよく使われている実装は,特にスピードについて最適化されている.
が増加するに従って誤差が減少するのは,ノルムは( はベクトル長)で乗算することにより正規化されるからである.このことは,NDSolveでは重要である.というのは,多くの場合,関数の近似をチェックするための試みが行われており,そこでは点が多いほどよい近似を与えたり,誤差が少なかったりするからである.
スペースが一様格子 上で が成り立つときに, によって与えられる周期関数 の一階微分の有限差分近似を考えてみる.Wolfram言語では,ListCorrelateを使って簡単に計算できる.
ベクトルのノルムが同程度であるのは,ベクトルの要素数が増加したために,通常の線形代数ノルムが収束を適切に反映しないからである. で乗算して正規化すると,関数空間における収束を適切に反映する.
関数にオプション値を指定し,それを偏微分方程式あるいは関数の近似解に使うことを意図している場合は,関数に必ず適切な正規化が含まれていなければならない.
ScaledVectorNorm
誤差制御のあるメソッドでは,ステップが局所的な許容誤差を満足しているかどうかを判断する必要がある.これをチェックする過程を簡約化するために,効用関数ScaledVectorNormでスケーリング(1)を行い,ノルムを計算する.以下の表には,参照に対して の指定された値についての公式がリストされている.
ScaledVectorNorm[p,{tr,ta}][v,u] | 参照べクトル u,相対および絶対許容誤差がそれぞれ ta と tr であるスケール(1)を使って,べクトル v の正規化した p ノルムを計算する |
ScaledVectorNorm[fun,{tr,ta}][v,u] | 参照ベクトルが u,相対および絶対許容誤差がそれぞれ ta と tr,ノルム関数が fun であるスケール(1)を使ってべクトル v のノルムを計算する |
ScaledVectorNorm[2,{tr,ta}][v,u] | を計算する(n はべクトル v と u の長さ) |
ScaledVectorNorm[∞,{tr,ta}][v,u] | のときのを計算する(n はべクトル v と u の長さ) |
NDSolveのメソッドを設定するときに,NDSolve`StateDataオブジェクトの"Norm"メソッド関数を使って,使用する適切なScaledVectorNormオブジェクトを得ることができる.