【问题标题】:Java finding Zero Points with Newton Algorithm endless loopJava用牛顿算法无限循环寻找零点
【发布时间】:2019-05-03 19:21:15
【问题描述】:

我的方法有问题,该方法采用 f(x)=x²+1 之类的多项式并使用牛顿算法计算可能的零点。
我已经给出了对特定变量的要求,所以即使命名不好或不需要变量,我也必须使用它们:/
我给我的方法作为参数的多项式是一个双数组:对于 f(x)=x²+1,它将是 {1.0,0.0,1.0} 所以它的构造类似于1.0*x^0 + 0.0*x^1+1.0*x^2

对于我的代码:
x0 是牛顿算法的起始值,eps 是计算的准确性

我按照我给定的说明操作并得到了以下代码:

public static double newton(double[] a, double x0, double eps) { 
    double z;
    double xn; 
    double xa = x0; 
    double zaehler;
    double nenner;

    do {
        zaehler = horner(a, xa);
        nenner = horner(ableit(a), xa);
        if(nenner == 0) {
            return Double.POSITIVE_INFINITY;
        }
        xn = xa - (zaehler/nenner);
        xa = xn;
    } while((Math.abs(horner(a, xn))) >= eps);
    z = xn;
    return 0;
}

horner() 方法针对给定 x 值计算给定函数的 y 值。

我的问题是,如果函数没有像 x²+1 这样的零点并且我以 x0=1eps=0.1 开头,我会返回 Infinity。
但是如果我以x0=10eps=0.1 开头,例如我会创建一个无限循环。

我该如何处理或者这是牛顿算法的一般问题?!
是设置固定最大迭代次数的唯一方法吗? 该代码适用于至少有一个零点的多项式!

【问题讨论】:

  • 您可以计算循环的次数,或者跟踪期望它们运行得更近的结果。
  • 变量名使您的代码对于非德语 (?) 使用者来说非常难以阅读。
  • 始终查看您的函数图以尝试深入了解它。对于这类问题,我经常使用 Wolfram Alpha。

标签: java algorithm math infinite-loop newtons-method


【解决方案1】:

Newton–Raphson 方法需要存在一个真正的x,这样f(x)=0。您使用的函数x^2+1 没有真正的根,因此您的算法在这种情况下不起作用(在其他没有根的情况下也不起作用)。

由于x^2+1 >= 1 是所有真实的x 这意味着horner(a, xn) >= 1,所以循环

while((Math.abs(horner(a, xn))) >= eps)

不会因eps < 1 而终止。

也许在开始迭代之前,您应该检查是否存在零。 例如。如果最高(根据x 的幂)非零系数是奇数,那么将有一个真正的零。

或扩展您的算法,使其先前尝试找到一些真实的ab,这样f(a)f(b) <= 0(然后在ab之间有一个根)。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 2013-10-17
    • 2011-05-04
    • 2012-06-24
    • 2016-09-12
    • 2015-01-18
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多