我正在使用牛顿拉夫森方法来查找 Java 中评估函数的根。我正在使用带有以下终止条件的 while 循环:
while(Math.abs(eval_x / deriv_x) > epsilon)
显然,如果差值大于 epsilon,可能会产生无限循环。我应该用更大的值替换 epsilon 还是应该包含一个在达到特定大值时打破 while 循环的计数器?
我想知道如何实现牛顿法的标准终止条件。
通常,对于牛顿法之类的方法,有许多终止标准:
迭代次数的上限。例程可能会“卡住”或发散,如果找不到根,则应该在一定的最大迭代次数后退出。
对
x
变化的容忍度。这可以是相对的,也可以是绝对的。如果算法产生的 x 变化低于某个值(例如 1e-6
)并且您尚未收敛,那么您可能会陷入静止点。 说到驻点,如果您的梯度(导数)低于一定的容差,您应该终止,因为您可能最终会到达驻点,并且如果您正在执行一维情况,则除以零。
函数绝对值的公差。这是您想要接近零的程度的最终衡量标准。
请记住,如果您将函数值容差设置得太紧,牛顿方法可能永远不会产生足够小的
x
值变化,使您处于该容差范围内。因此,为什么你应该在 dx
上停止——当然还有最大迭代次数。