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