【发布时间】: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=1 和 eps=0.1 开头,我会返回 Infinity。
但是如果我以x0=10 和eps=0.1 开头,例如我会创建一个无限循环。
我该如何处理或者这是牛顿算法的一般问题?!
是设置固定最大迭代次数的唯一方法吗?
该代码适用于至少有一个零点的多项式!
【问题讨论】:
-
您可以计算循环的次数,或者跟踪期望它们运行得更近的结果。
-
变量名使您的代码对于非德语 (?) 使用者来说非常难以阅读。
-
始终查看您的函数图以尝试深入了解它。对于这类问题,我经常使用 Wolfram Alpha。
标签: java algorithm math infinite-loop newtons-method