解決策は「片面」です。f(x+h) - f(x)
を比較し、一般的な解決策は「両面」f(x+h) - f(x-h)
です。
何
It has shown version one gives a better accuracy
手段を知って良いでしょう。それはあまりにも一般的なので。両面結果が期待値に近いことを
def double_sided_derivative(f, x, h):
x_l, x_h = x - h, x + h
return (f(x_h) - f(x_l))/2/h
def one_sided_derivative(f, x, h):
x_h = x + h
return (f(x_h) - f(x))/h
h = 1e-8
def f(x):
return 1e-6 * x
# difference to real derivate:
double_sided_derivative(f, 10, h) - 1e-6, one_sided_derivative(f, 10, h) - 1e-6
# (6.715496481486314e-14, 1.5185825954029317e-13)
注:
は、しかし、私は、私がここに適切かもしれない例があると思います。これにより、catastrophic cancellationにつながることさえあります。その後、浮動小数点ノイズによって主に制御される結果に終わることがあります。値が実際に小さい数で除算されるため、この効果はさらに強化されます。
両面を使用すると、差異が大きくなり、キャンセルが発生する可能性が高くなります(機能によって異なります)。しかし、私の意見では、最大の利点は、あなたが両方の面で斜面を考慮に入れることです(それを幾分平均して)。たとえば、次のようになります。
h = 1e-6
def f(x):
return 4 + x + 5 * x**2
def fdx(x):
return 1 + 10 * x
x = 10
double_sided_derivative(f, x, h) - fdx(x), one_sided_derivative(f, x, h) - fdx(x)
# (-2.7626811061054468e-08, 4.974594048690051e-06)
これは、片側近似よりも真の値(2桁の大きさ)に非常に近い値です。
はCS.SEへようこそ!一般的に言えば、コードはここでは話題にはならず、Python固有のものはここでは話題にはなりません。スタックオーバーフローについては、コーディングに関する質問がしばしば尋ねられます。そこに質問を移動したい場合は、「フラグ」をクリックして司会者の注意を喚起し、改造者に移動を依頼してください。あるいは、これがPython固有でない場合は、Pythonを知らない人でも理解できる数学または擬似コードでコードを置き換えてください。 (例えば:私はいくつかのPythonを知っていますが、この文脈で 'x [ix]'が何を意味するのか分かりません) –
最初のバージョンがより良い精度を与えるという文は一般的に真実ではありません。片面近似が*数学的に有利な(つまり、コンピュータの浮動小数点演算とは独立している)状況があります。たとえば、[upwind schemes](https://en.wikipedia.org/wiki/Upwind_scheme)を参照してください。なぜ最初のバージョンがより正確であるのか*ほとんどの時間*、[有限差分](* https://en.wikipedia.org/wiki/Finite_difference)の* order *に精通してください。 – Phillip