Пусть функция 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.