gpt4 book ai didi

c++ - 在有限差分法中使用的最佳 epsilon/dx 值是多少?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:23 25 4
gpt4 key购买 nike

double MyClass::dx = ?????;

double MyClass::f(double x)
{
return 3.0*x*x*x - 2.0*x*x + x - 5.0;
}

double MyClass::fp(double x) // derivative of f(x), that is f'(x)
{
return (f(x + dx) - f(x)) / dx;
}

当使用有限差分法进行推导时,选择一个最佳的dx值是很关键的。从数学上讲,dx 必须尽可能小。但是,我不确定选择最小正 double (即 2.2250738585072014 x 10−308)是否正确。

是否有一个最佳的数值区间或精确值来选择一个dx使计算误差尽可能小?

(我使用的是 64 位编译器。我将在 Intel i5 处理器上运行我的程序。)

最佳答案

选择尽可能小的值几乎肯定是错误的:如果 dx 是那个最小的数字,那么 f(x + dx)恰好 由于四舍五入,等于 f(x)

因此您需要权衡:将 dx 选择得太小,并且您会因舍入误差而失去精度。选择太大,由于 x 变化时导数的变化,您的结果将不精确。

要判断数值错误,请从数学上考虑 (f(x + dx) - f(x))/f(x)1。分子表示您要计算的差异,但分母表示您正在处理的数字的大小。如果该分数大约为 2k,那么您的结果可以达到大约 k 位的精度。

如果您知道您的函数,您可以计算出如果选择太大的 dx 会导致什么错误。然后您可以平衡事物,因此由此产生的误差与舍入产生的误差大致相同。但是,如果您知道该函数,那么通过提供一个直接计算导数的函数可能会更好,就像在您使用多边形 f 的示例中一样。

Wikipedia section那个pogorskiy pointed out建议值为 sqrt(ε)x,或大约 1.5e-8 * x。在没有关于函数的任何更详细的知识的情况下,这样的经验法则将提供合理的默认值。另请注意,同一部分建议不要除以 dx,而是除以 (x + dx) - x,因为这需要计算 x + 时产生的舍入误差dx 考虑在内。但我想整篇文章都充满了您可能会用到的建议。


1 这个公式确实应该除以 f(x),而不是 dx,尽管以前的编辑有不同的想法。我试图比较除法后剩余的有效位数,而不是切线的斜率。

关于c++ - 在有限差分法中使用的最佳 epsilon/dx 值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com