Метод Ньютона-Рафсона - пока l oop не отменяется - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь запрограммировать алгоритм Ньютона-Рафсона, чтобы найти root функции. Чтобы иметь достаточную точность, я ввожу интервал «eps», так что root будет выдан только после того, как ошибка будет меньше, чем «eps». Исходная начальная точка x установлена ​​мной на 1,5.

double func(double x) {

    return x * x * x - 4 * x + 1;
}

double funcprime(double x) {

    return 3 * x * x - 4;
}

int main()
{
    double x_start = 1.5;
    double x0= x_start - ((func(x_start)) / (funcprime(x_start)));
    double eps = abs(x_start - x0);


    while (eps > 0.000001) {

        x0 = x_start - ((func(x_start)) / (funcprime(x_start)));

        double eps = abs(x_start - x0);

        //Following line is there to analyze the problem
        cout << "x0= " << x0 <<" " << "x_start= " << x_start << " "<< "eps= " << eps << endl;

        x_start = x0;                       
    }

    cout << x0;

    return 0;

}

Проблема, с которой я столкнулся, заключается в том, что l oop. Хотя после примерно 4 итераций eps уже меньше 0,000001 и даже показан мне как eps = 0, в то время как l oop не отменяется и продолжается вечно. Я надеюсь, что кто-то может помочь мне с этим.

1 Ответ

0 голосов
/ 25 апреля 2020

Вы повторно инициализируете eps (как двойной) в то время как l oop. Поэтому удалите double перед eps = abs (x_start - x0) внутри while l oop.

Исправленный код:

double func(double x) {

    return x * x * x - 4 * x + 1;
}

double funcprime(double x) {

    return 3 * x * x - 4;
}

int main()
{
    double x_start = 1.5;
    double x0= x_start - ((func(x_start)) / (funcprime(x_start)));
    double eps = abs(x_start - x0);


    while (eps > 0.000001) {

        x0 = x_start - ((func(x_start)) / (funcprime(x_start)));

        eps = abs(x_start - x0);  // double removed here

        //Following line is there to analyze the problem
        cout << "x0= " << x0 <<" " << "x_start= " << x_start << " "<< "eps= " << eps << endl;

        x_start = x0;                       
    }

    cout << x0;

    return 0;


}
...