您的解決方案是「單面」,您比較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)
這比單側逼近更接近真實值(兩個數量級)。
歡迎CS.SE!一般來說,代碼在這裏是無關緊要的,任何特定於Python的代碼都是無關緊要的。編碼問題通常可以在Stack Overflow上提出;如果您希望在那裏移動您的問題,請點擊「標誌」將此標記爲主持人注意力,並要求模塊遷移它。或者,如果這不是特定於Python的,請將代碼替換爲數學或僞代碼,即使不懂Python的人也可以理解。 (例如:我知道一些Python,但我不知道'x [ix]'在這種情況下意味着什麼。) –
請注意,第一個版本提供更好的準確性的說法通常並非如此。在某些情況下,單側逼近在數學上是有利的(即,獨立於計算機的浮點運算)。參見,例如,[迎風計劃](https://en.wikipedia.org/wiki/Upwind_scheme)。爲了解釋爲什麼第一個版本更準確*大多數時間*,請讓自己熟悉[有限差異](https://en.wikipedia.org/wiki/Finite_difference)的*順序*。 – Phillip