Пусть функция f(x) задана таблицей
x x0 x1 … xn
y y0 y1 … yn
Интерполяционным многочленом Лагранжа называется многочлен
Объявляем функцию для организации вычислений по формуле интерполяционного многочлена Лагранжа
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.