ND
詳細とオプション
- NDを使うためには,まず数値計算パッケージをロードしなくてはならない.それにはNeeds["NumericalCalculus`"]を実行する必要がある.
- 式 expr は,その引数 x が数値である場合は,数値でなければならない.
- ND[expr,x,x0]はND[expr,{x,1},x0]と等価である.
- NDは実際にはゼロとなるような小さい数を識別することができない.このような誤りの残余を排除するためにChopを使う必要があることがある.
- 次のオプションを与えることができる:
-
Method EulerSum 使用するメソッド Scale 1 変動が想定される大きさ Terms 7 使用される項の数 WorkingPrecision MachinePrecision 内部計算で使用する精度 - Methodに可能な設定は以下の通りである:
-
EulerSum 極限にリチャードソン(Richardson)補外を使う NIntegrate コーシー(Cauchy)の積分公式を使う - Method->EulerSumでは,NDは x0で expr を評価する必要がある.
- expr が x0 の近傍で解析的でないなら,デフォルトメソッドのEulerSumを使わなければならない.
- Method->EulerSumを使う場合,変動の尺度を得るためにオプションScale->s が使われる.
- 導関数の値が方向に依存する場合,デフォルトは右方向である.他の方向はオプションScale->s(方向が s)で選ぶことができる.
- オプションTerms->n は,Method->EulerSumを使う場合に外挿に使用する項の数を与える.
- Method->NIntegrateでは,式 expr は点 x0の近傍で解析的でなければならない.
- オプションScale->r はMethod->NIntegrateで使用する積分曲線の半径を指定する.
例題
すべて開く すべて閉じる例 (1)
Needs["NumericalCalculus`"]ND[Exp[x], x, 1]ND[Cos[x]^3, {x, 2}, 0]スコープ (1)
一般化と拡張 (1)
Needs["NumericalCalculus`"]NDは要素単位で縫い込まれる:
ND[{Exp[x], Sin[x]}, x, 1]オプション (7)
Method (2)
Needs["NumericalCalculus`"]expr が x0の近傍で解析的でない場合,デフォルトのMethod->EulerSumが使われる:
ND[Re[Cos[I y]], y, 1]D[ComplexExpand[Re[Cos[I y]]], y] /. y -> 1//NMethod->NIntegrateでは誤った解が得られる:
ND[Re[Cos[I y]], y, 1, Method -> NIntegrate]Needs["NumericalCalculus`"]ND[Exp[x^2], {x, 3}, 1]D[Exp[x^2], {x, 3}] /. x -> 1.この場合,式は解析的なので,Method->NIntegrateはうまく動作する:
ND[Exp[x^2], {x, 3}, 1, Method -> NIntegrate]Scale (3)
Needs["NumericalCalculus`"]変動の領域を得るためにはScale->s を使う:
ND[Sin[100x], x, 0]ND[Sin[100x], x, 0, Scale -> .01]大きすぎるScale->s の値は,項の数を増やすことで補正される:
ND[Sin[100x], x, 0, Terms -> 11]Needs["NumericalCalculus`"]有向導関数の指定にはScaleを使う.非解析的関数
の左および右の導関数:
ND[Abs[x], {x, 1}, 0]ND[Abs[x], {x, 1}, 0, Scale -> -1]Plot[Abs[x], {x, -1, 1}]ND[Abs[x], {x, 1}, 0, Scale -> 1 + I]Limit[(Abs[(1 + I)h] - Abs[0]/(1 + I)h), h -> 0]//NNeeds["NumericalCalculus`"]オプションScaleを使うと,使用されるメソッドがNIntegrateの場合に,非解析性のある領域を避けることができる:
ND[Exp[(1/1 - x)], x, .5, Method -> NIntegrate]ND[Exp[(1/1 - x)], x, .5, Method -> NIntegrate, Scale -> .1]D[Exp[(1/1 - x)], x] /. x -> .5Terms (1)
Needs["NumericalCalculus`"]項の数を増やすと,確度が向上することがある.次はいく分不正確な近似である:
ND[Sin[x^2], {x, 3}, 1]D[Sin[x^2], {x, 3}] /. x -> 1`30ND[Sin[x^2], {x, 3}, 1, Terms -> 10]//FullFormさらに項の数を増やすと,数値的不安定性により無意味な結果となることがある:
ND[Sin[x^2], {x, 3}, 1, Terms -> 20]項の数を増やすとともに作業精度を上げると,誤差が減少することが多い:
ND[Sin[x^2], {x, 3}, 1, Terms -> 20, WorkingPrecision -> 40]WorkingPrecision (1)
Needs["NumericalCalculus`"]Method->EulerSumの高次の導関数では,明らかな減法約分が起る:
ND[Exp[x], {x, 10}, 0]ND[Exp[x], {x, 10}, 0, WorkingPrecision -> 40, Terms -> 10]次の問題では,Method->NIntegrateをデフォルトオプションで使うと正確な解が求められる:
ND[Exp[x], {x, 10}, 0, Method -> NIntegrate]ND[Exp[x], {x, 20}, 0, Method -> NIntegrate]WorkingPrecisionを増やすと,確度が向上する:
ND[Exp[x], {x, 20}, 0, Method -> NIntegrate, WorkingPrecision -> 30]ND[Exp[x], {x, 20}, 0, Method -> NIntegrate, Scale -> 5]アプリケーション (1)
Needs["NumericalCalculus`"]NDは数値的にのみ定義される関数を微分するときに便利である.次はそのような関数である:
f[a_ ? NumericQ, b_ ? NumericQ] := f[a, b] = Module[{t}, y /. NDSolve[{y'[t] == a - b y[t]^3, y[0] == 1}, y, {t, 0, 1}][[1]]]下は{a,b,t}={1,2,1}で評価された b についての f[a,b][t]の導関数である:
ND[f[1, b][1], {b, 1}, 2]NDは導関数を見付けるためのよりロバストな関数を開発およびテストするためのツールとして使うことができる:
fb[a_ ? NumericQ, b_ ? NumericQ] := fb[a, b] = Module[{t}, yb /. NDSolve[{y'[t] == a - b y[t]^3, yb'[t] == -y[t]^3 - 3b y[t]^2yb[t], y[0] == 1, yb[0] == 0}, {y, yb}, {t, 0, 1}][[1]]]fb[1, 2][1]特性と関係 (3)
Needs["NumericalCalculus`"]オプションMethod->NIntegrateでは導関数の計算にコーシーの積分公式が使われる:
ND[Exp[x^2], {x, 4}, 0, Method -> NIntegrate]NResidueを使っても同様の計算が実行できる:
4!NResidue[(Exp[x^2]/x^4 + 1), {x, 0}]Needs["NumericalCalculus`"]Wolfram言語には数値関数の導関数を計算するためのコードが組み込まれている:
f[t_ ? NumericQ] := 0.001 + 0.002Sin[50t]組込みの数値導関数コードを使うことができる.しかし,高速の振動を得ることはできない:
f'[.1]D[.001 + .002Sin[50t], t] /. t -> .1適切なオプションでNDを使うと,正確な導関数が計算できる:
ND[f[t], t, .1, Scale -> .1]ND[f[t], t, .1, Method -> NIntegrate, Scale -> (1/2)]Needs["NumericalCalculus`"]Method->EulerSumでは,NDは点 x0において expr が評価できなければならない:
f[x_ ? NumericQ] := (Tanh[π x]/1 + x^2)ND[f[x], x, I]f に別の定義を加えることにより,NDは導関数が計算できるようになる:
f[I//N] = Limit[(Tanh[π x]/1 + x^2), x -> I]ND[f[x], x, I]Limit[D[(Tanh[π x]/1 + x^2), x], x -> I]//Nこの場合,Method->NIntegrateでより正確な解が得られる:
ND[f[x], x, I, Method -> NIntegrate, Scale -> (1/10)]