什么是Brent根寻找算法的流行实现中的“e”变量?

时间:2009-12-29 20:34:01

标签: c algorithm implementation fortran numerical

我正在阅读Brent根寻找算法的标准(Numerical Recipes和GSL C版本相同)implementation,并且无法理解变量“e”的含义。用法表明“e”应该是括号之间的先前距离。但是,当我们使用二分时,为什么它设置为“xm”(距离的一半)?

3 个答案:

答案 0 :(得分:4)

我不熟悉算法。但是,我可以比较C源和算法的Wikipedia description。该算法似乎是直截了当的(如果您熟悉查找根的方法),但C实现看起来像是fortran的直接端口,所以它很难阅读。

我最好的猜测是e与循环条件有关。

维基百科说(算法的第8行): repeat until f(b or s) = 0 or |b − a| is small enough (convergence)

C来源说:  e = b - a,然后是if (fabs(e) <= tol ...

我希望在书中清楚地描述变量的目的,但显然不是:)


好的,你走了。我找到了原始实现(在algol 60中)here。除了对算法的一个很好的描述外,它说(从第50页开始):

  

e成为最后一步之前的p/q的值。如果|e|&lt; δ或|p/q|1/2|e|然后进行二分,否则我们就像在Dekker算法中那样进行二分或插值。因此|e|每隔一步减少至少两倍,并且当|e| <必须进行二分法。 (在一分为二之后,我们将e = m用于下一步。)

因此添加e是布伦特对Dekker算法的“主要修改”。

答案 1 :(得分:0)

E是“epsilon”变量,它基本上是近距离接近的度量。您的特定应用程序可能不需要20位精度,因此epsilon可让您平衡所需的迭代次数(即运行的时间长短)与您需要的精确度。

对于浮点数,您可能无法准确,因此epsilon应该是一些小的非零数字。实际值取决于您的应用......它基本上是可接受的最大误差。

答案 2 :(得分:-1)

在二分步骤中,间隔恰好减半。因此,保持间隔的当前宽度的e也减半。