过 n + 1 个插值节点的n次拉格朗日插值函数的一般形式为:
其中:
式中,i = 0,1,2,... ,n。
算法程序:
#include <stdio.h>
const int maxn = 50;
double Lagrange(int n, double *x, double *y, double _x){
double _y = 0.0, t;
for(int i = 0; i < n; i++){
t = 1;
for(int j = 0; j < n; j++)
if( j != i) t *= (_x - x[j])/(x[i] - x[j]);
_y += t * y[i];
}
return _y;
}
int main(){
double x[maxn], y[maxn], _x, _y;
int n;
printf("请输入插值结点的个数:");
scanf("%d",&n);
for(int i = 0; i < n; i++){
printf("请输入插值结点x%d,y%d:",i,i);
scanf("%lf %lf",x+i,y+i);
}
printf("请输入_x:");
scanf("%lf",&_x);
printf("P(%lf)的近似值:%lf",_x,Lagrange(n,x,y,_x));
return 0;
}
测试用例:
2
10 1
20 1.3010
12
精确解:1.0792
测试结果: