【问题标题】:What is "e" variable in popular implementations of Brent root finding algorithm?布伦特寻根算法的流行实现中的“e”变量是什么?
【发布时间】:2010-12-30 21:54:58
【问题描述】:

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

【问题讨论】:

    标签: c algorithm implementation fortran numerical


    【解决方案1】:

    我不熟悉算法。但是,我可以比较 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”与循环条件有关,因为它是在“if”语句中读取的......重点是,“b”和“a”在Wikipedia 条件语句是当前最佳猜测和相反点(函数具有不同符号),而在 GSL 和 Netlib 代码中,“b”是最佳猜测,“a”是先前的最佳猜测,“c”是对面。
    • 谢谢。我本可以考虑通过 Google 图书搜索原始论文...
    • 这是一个意外:P。我想了解更多有关该算法的信息。当搜索“algol 60 procedure zero given in richard brent, algorithms”(来自 Fortran 源代码中的一个 cmets)时,原书恰好是第一个结果。
    【解决方案2】:

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

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

    【讨论】:

    • 我不这么认为,因为“e”是a)一个变量,它在迭代之间发生变化,b)仅在决定是否进行逆二次插值或回退到二等分时才检查, c)已经有一个“弹性”公差变量“tol”,它负责您声称“e”所做的事情。没有 cookie。
    • 我认为他基本上是对的,他并不是说它是指定所需精度的常数,而是说它是您与指定所需精度的常数进行比较的值。与另一个答案很好地匹配。它还可以用于根据收敛特性确定使用哪种算法(逆二次与二分法)?
    • e 不是 epsilon 变量,该变量是 tol1。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 2022-08-18
      • 2015-03-30
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      相关资源
      最近更新 更多