Метод Ньютона-Рафсона в С++

Для решения алгебраических уравнений используем метод Ньютона (его еще называют итерационным методом Ньютона-Рафсона). Предположим, необходимо найти корень уравнения \(f\left(x \right)=0\) в окрестности точки \(x=x_{0}\). Последовательный поиск приближений для корня уравне­ния выполняется по следующей схеме: в точке текущего приближения для корня уравнения проводится касательная к графику функции \(f\left(x \right)\), точка пересечения этой касательной с осью абсцисс является новым приближени­ем для корня. Такая последовательность действий сводится к рекуррентной формуле:
$$x_{n+1}=x_{n}-f\left(x_{n} \right)/f'\left(x_{n} \right)$$
Здесь расмотрим случай, когда исходная функция представляет собой полином. На входе задаются только коэффициенты этого полинома, набор которых можно представить в виде элементов массива.
$$f\left(x \right)=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+a_{4}x^{4}+...$$
Кроме того пользователем вводится и начальное приближение корня. Это означат, что надо иметь представление о том, где приблизительно находится корень. Другими словами его надо отделить некоторым интервалом.
#include 
#include 
using namespace std;
int main(){
//Порядок полинома:
const int N=3;
//Индексные переменные и число итераций:
int i,k,n=10;
//Аргумент, функция и производная:
double x,f,df;
//Массив коэффициентов полинома-функции:
double a[N+1];
//Массив коэффициентов полинома-производной:
double b[N];
//Ввод коэффициентов функции-полинома:
cout << "Function: ";
cin >> a[0];
for(i=1; i < N+1 ;i++){
 cin >> a[i];
 //Вычисление коэффициентов для производной:
 b[i-1]=i*a[i];
}
//Начальное приближение:
cout << "Enter x0 = ";
cin >> x;
//Последовательные итерации:
for(k=1; k <= n; k++){
 f=a[0];
 df=0;
 for(i=1; i < N+1; i++){
 f+=a[i]*pow(x,i);
 df+=b[i-1]*pow(x,i-1);
 }
 x-=f/df;
}
//Результат:
cout << "x = " << x << endl;
cout << "f(" << x << ") = " << f << endl;
return 0;
}
Онлайн всего: 2
Гостей: 2
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте