通常如何以编程方式计算f(x)
的导数以确保最大的准确性?
我正在实现Newton-Raphson方法,它需要采用函数的派生形式。
最佳答案
我同意@erikkallen的观点,(f(x + h) - f(x - h)) / 2 * h
是数值逼近导数的常用方法。但是,获得正确的步长h有点微妙。
(f(x + h) - f(x - h)) / 2 * h
的近似误差随着h
的变小而减小,这表明您应该将h
尽可能小。但是随着h
的变小,由于分子需要减去几乎相等的数字,因此浮点减法的误差会增加。如果h
太小,您可以在减法上失去很多精度,因此在实践中,您必须选择一个不太小的h
值,以最小化近似误差和数值误差的组合。
根据经验,可以尝试使用h = SQRT(DBL_EPSILON)
,其中DBL_EPSILON
是最小的 double 数字e
,这样1 + e != 1
的机器精度就很高。 DBL_EPSILON
与10^-15
有关,因此您可以使用h = 10^-7
或10^-8
。
有关更多详细信息,请参见这些notes有关为微分方程选择步长的信息。
关于c++ - 在C/C++中实现派生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1559695/