Java нахождение нулевых точек с помощью бесконечного цикла алгоритма Ньютона - PullRequest
0 голосов
/ 02 декабря 2018

У меня проблема с методом, который принимает полином типа 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, я создаю бесконечныйпетля.

Как с этим справиться или это общая проблема с алгоритмом Ньютона?!
Является ли единственный способ установить фиксированный максимум итераций?Код работает для полиномов, которые имеют хотя бы одну нулевую точку!

1 Ответ

0 голосов
/ 02 декабря 2018

Метод Ньютона-Рафсона требует наличия реального корня 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) ненулевой коэффициент нечетен, тогда будет реальный ноль.

Или расширьте свой алгоритм так, чтобы он ранее пытался найти некоторые действительные a и b такое, что f(a)f(b) <= 0 (тогда между a и b есть корень).

...