Интерполяционный многочлен Лагранжа на C++

Пусть функция f(x) задана таблицей
x  x0   x1     xn
y  y0   y1     yn

Интерполяционным многочленом Лагранжа называется многочлен
Ln(x)=i=0nyi(x-x0)(x-xi-1)(x-xi+1)(x-xn)(xi-x0)(xi-xi-1)(xi-xi+1)(xi-xn).

Объявляем функцию для организации вычислений по формуле интерполяционного многочлена Лагранжа

double lagranz(double X[n], double Y[n], double t){
	double z,p1,p2; 
	z=0;
	for (int j=0; j<n; j++){
		p1=1; p2=1;
		for (int i=0; i<n; i++){
			if (i==j){
			    p1=p1*1;p2=p2*1;
			}
			else {
				p1=p1*(t-X[i]);
				p2=p2*(X[j]-X[i]);
		    }
		}
		z=z+Y[j]*p1/p2;
	}
	return z;
}


Пример. Написать программу для вычисления значений интерполяционного многочлена Лагранжа для функции, заданной таблицей
x     2 5  -6   7   4  3 8   9   1  -2
f(x) -1	77 -297 249 33 9 389 573 -3 -21

Решение

#include <iostream>;
using namespace std;
const int n=10;

double lagranz(double X[n], double Y[n], double t);

int main() {
    double X[n]={2,5,-6,7,4,3,8,9,1,-2};
    double Y[n]={-1,77,-297,249,33,9,389,573,-3,-21};
    cout << "Ln(5)=" << lagranz(X,Y,5) << " " << endl;
}

	return 0;
}

double lagranz(double X[n], double Y[n], double t){
	double z,p1,p2; 
	z=0;
	for (int j=0; j<n; j++){
		p1=1; p2=1;
		for (int i=0; i<n; i++){
			if (i==j){
			    p1=p1*1;p2=p2*1;
			}
			else {
				p1=p1*(t-X[i]);
				p2=p2*(X[j]-X[i]);
		    }
		}
		z=z+Y[j]*p1/p2;
	}
	return z;
}


Результат:
Ln(5)=77
  • avatar
  • 0

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.