Зацикливание в поиске корня методом касательных (ньютона)

Рейтинг: 0Ответов: 1Опубликовано: 17.09.2014

Я написала код, но происходит зацикливание. Объясните, где и почему.

#include <math.h>
#include <iostream>

using namespace std;

double f(double z)
{
    return pow(z,3) + pow(z,2) - 9*z  + 9; // функция
}

double f1 (double z)
{
    return 3*pow(z,2) + 2*z - 9; // производная
}
double e=0.001;
double x;

// Метод Ньютона

int main()
{   
    int n=0;
    double a, b;
    cout<<"enter the beginning of the segment ";
    cin>> a;
    cout<<"enter the end of the segment ";
    cin>> b;    
    if (f(a)*f1(a)<0)
    {
        x = a;
    }
    else
    {
        x = b;
    }
    while  (fabs(f1(x)) > e)
    {
        x = x - (f(x) / f1(x));
        n += 1;
    }
    cout <<"f( "<<x  << ") = " << f(x) << endl; 
    cout <<"f1( "<<x  << ") = " << f1(x) << endl;
    cout<< x<< endl;
    system("pause");
    return 0;
}

Ответы

▲ 2Принят

B if зацикливание проиcходить не может, т.к. там нет собственно цикла. У вас неправильное условие остановки в цикле while. Вместо того, чтобы проверять на малость значение функции f в точке x (что логично, ведь вы ищите решение уравнения f(x) = 0), вы проверяете на малость значение производной функции f.