У меня проблема с методом, который принимает полином типа 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()
вычисляет значение y для данной функции для данного значения x.
Моя проблема в том, еслиФункция не имеет нулевой точки, как x²+1
, и я начинаю с x0=1
и eps=0.1
, я получаю бесконечность.
Но если я, например, начинаю с x0=10
и eps=0.1
, я создаю бесконечныйпетля.
Как с этим справиться или это общая проблема с алгоритмом Ньютона?!
Является ли единственный способ установить фиксированный максимум итераций?Код работает для полиномов, которые имеют хотя бы одну нулевую точку!