拉格朗日插值法
对拟合函数有很大的作用
如果是离散函数,也可以根据这个算法大致拟合出一个曲线L(x)从而求积分
积分的方法推荐龙贝格积分,下一篇博文介绍
龙贝格积分的推导也是由拉格朗日插值->牛顿科特斯公式->龙贝格积分这样推理而来,故这是一个很重要的数学方法
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
#define PI acos(-1.0)
struct Point{
double x;
double y;
};
// 拉格朗日插值法
// 给我未知函数几个点坐标,横坐标范围(a,b),就能大致估算(a,b)内x对应的f(x)
double Lagrange(Point pt_list[],int pt_num,double x)
{
int i,j;
double ret=0;
for(i=0;i<pt_num;++i)
{
double tmp=1.0;
for(j=0;j<pt_num;++j)
{
if(i!=j)
{
tmp=tmp*(x-pt_list[j].x)/(pt_list[i].x-pt_list[j].x);
}
}
ret=ret+pt_list[i].y*tmp;
}
return ret;
}
int main()
{
Point pt_list[100];
int pt_num,i,q_num;
while(scanf("%d",&pt_num)!=EOF)
{
for(i=0;i<pt_num;++i)
scanf("%lf%lf",&pt_list[i].x,&pt_list[i].y);
scanf("%d",&q_num);
while(q_num--)
{
double x;
scanf("%lf",&x);
printf("%lf\n",Lagrange(pt_list,pt_num,x));
}
}
system("pause");
return 0;
}
/*
5
200 4
220 4.5
250 4.7
270 4.8
280 5.2
1
240
*/