【发布时间】:2010-12-30 21:54:58
【问题描述】:
我正在阅读布伦特寻根算法的标准(数字食谱和GSL C版本相同)implementation,无法理解变量“e”的含义。用法表明“e”应该是括号之间的先前距离。但是,当我们使用二分法时,为什么它设置为“xm”(距离的一半)?
【问题讨论】:
标签: c algorithm implementation fortran numerical
我正在阅读布伦特寻根算法的标准(数字食谱和GSL C版本相同)implementation,无法理解变量“e”的含义。用法表明“e”应该是括号之间的先前距离。但是,当我们使用二分法时,为什么它设置为“xm”(距离的一半)?
【问题讨论】:
标签: c algorithm implementation fortran numerical
我不熟悉算法。但是,我可以比较 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||p/q| ≥1/2|e|则进行二等分,否则我们将进行二等分或插值,就像在 Dekker 算法中一样。因此|e|每第二步至少减少两倍,当|e|e = m 用于下一步。)
所以添加e 是布伦特对德克尔算法的“主要修改”。
【讨论】:
E 是“epsilon”变量,它基本上是衡量足够接近的程度。您的特定应用程序可能不需要 20 位精度,因此 epsilon 可让您平衡它需要多少次迭代(即运行多长时间)与您需要的精度。
对于浮点数,您可能无法精确,因此 epsilon 应该是一些小的非零数。实际值取决于您的应用程序...它基本上是可接受的最大误差。
【讨论】:
在二等分步骤中,间隔正好减半。因此,保持区间当前宽度的 e 也减半。
【讨论】: