牛顿拉夫森无解

Newton Raphson no solution

我正在使用 Newton Raphson 方法在 Java 中找到评估函数的根。我正在使用具有以下终止条件的 while 循环:

while(Math.abs(eval_x / deriv_x) > epsilon)

显然,如果差异大于 epsilon,则可能会产生无限循环。我应该用更大的值替换 epsilon 还是应该包含一个在达到特定的大值时打破 while 循环的计数器?

我想知道如何实现牛顿法的标准终止条件。

通常,对于像牛顿法这样的方法,有许多终止条件:

  1. 迭代次数的上限。例程可能会得到 "stuck" 或发散,如果您没有找到根,则应该在一定的最大迭代后退出。

  2. x 变化的容忍度。这可以是相对的也可以是绝对的。如果算法在 x 中产生的变化低于某个值(例如 1e-6)并且您尚未收敛,那么您可能会停留在固定点。

  3. 说到固定点,如果你的梯度(导数)低于一定的公差你应该终止,因为你可能会在一个固定点结束,如果你正在做一维的情况,除零。

  4. 函数绝对值的公差。这是您希望离零有多近的最终衡量标准。

请记住,如果您将函数值公差设置得过紧,牛顿法可能永远不会产生足够小的 x 值变化以让您处于公差范围内。因此,为什么你应该在 dx 上停下来——当然还有最大迭代次数。