Программа Visual Studio зависает на методе Ньютона, программа останавливается - PullRequest
0 голосов
/ 03 мая 2020

Я делаю программу, которая использует метод Ньютона для численных расчетов. Он не сообщает о каких-либо ошибках, код работает нормально (по крайней мере, это так). Теперь я использую ту же самую функцию exast только с разными входными значениями, а второе значение заставляет программу зависать.

Я хорошо знаю, что метод Ньютона состоит из нескольких строк кода, но я должен чтобы сделать это с заданными c условиями сходимости, поэтому я в основном делаю программу для поиска корней для заданной c функции и заданных c начальных точек. По этой причине я включаю только проблемную c часть кода, так как полный код имеет длину около 200 строк, и было бы утомительно переводить большую часть кода, поскольку он изначально не был в Engli sh.

Итак, метод Ньютона, рассчитанный по формуле Xn + 1 = Xn - (f (Xn) / f '(Xn))

И формула остановки итерации (поскольку я не могу использовать эпсилон) | X * - Xn | <= M2 / (2 * m1) * (Xn - Xn-1) * (Xn - Xn-1), <br>, где X * - это x, для которого f (x *) = 0, M2 - максимальное абсолютное значение f (x) на интервале (a, b) (который я указываю), а m1 - минимальное абсолютное значение f (x) на интервале (a, b) (также указано)

В коде , polinomPprim является производной от многочлена.

Многочлен, с которым я работаю, в этой части проблемы равен x * x - 4 * x + 3.9999, а заданные начальные точки x0 = 2.1, x0 = 1,9 и х0 = 2,0. Этот точный код работает нормально с первой и третьей отправной точкой, возвращая x = 2.01 для первой и возвращая nan для третьей (что ожидается, поскольку функция имеет максимум для x = 2, и поэтому метод Ньютона не может сработать вне). Таким образом, это работает для нормальной и одной хитрой отправной точки, но не будет работать для этой?

В любом случае, вот код:

void newtonMethod(double x, double minimum, double maksimum)
{   
    double xN, xNminus1, xNplus1;
    xN = x;
    xNminus1 = x;

    xNplus1 = xN - (polinomP(xN) / polinomPprim(xN));      // x1 - x0

    xN = xNplus1;                                        // xNminus1 = x0; xN = x1 ; xNplus1
    xNplus1 = xN - (polinomP(xN) / polinomPprim(xN));

    while (fabs(xNplus1 - xN) <= maksimum / (2 * minimum) * (xN - xNminus1) * (xN - xNminus1))
    {
        xNminus1 = xN;
        xN = xNplus1;
        xNplus1 = xN - (polinomP(xN) / polinomPprim(xN));
    }
    std::cout << "Root is : " << xNplus1 << std::endl << std::endl;
    std::cout << "=============================================" << std::endl << std::endl;
}

Вот как выглядит окно вывода (игнорировать текст не на английском языке sh):

Любая идея, в чем может быть проблема здесь?

...