这篇记录一下我对拉格朗日插值的理解以及代码的实现。
线性插值:
如图
给出了两个点(x0,y0),(x1,y1),假定x1>x0,
现在要估计某个给定x的函数值,其中x∈(x0,x1)。
线性插值的方式即是以为斜率,过(x0,y0)的直线来估计x对应的y的值。
故而当x∈(x0,x1),用来估计。
抛物插值:
同理和线性插值类似,用经过(x0,y0)、(x1,y1)和(x2,y2)三个点确定的抛物线来估计函数值。
#include<iostream>
#define maxsize 100
using namespace std;
double L_interpolitation(int n,double x[maxsize],double y[maxsize],double vx,double result)
{//拉格朗日插值法
double temp;
for(int k=0;k<=n;k++)L
{
temp=1;
for(int i=0;i<=n;i++)
{
if(i!=k)
{
temp*=(vx-x[i])/(x[k]-x[i]);
}
}
result+=y[k]*temp;
}
return result;
}
int main()
{
int n;
double x[maxsize],y[maxsize],result=0,vx,temp;
cin>>n>>vx;
for(int i=0;i<=n;i++)
{
cin >> x[i] >> y[i];
}
result=L_interpolitation(n,x,y,vx,result);
cout<<result<<endl;
return 0;
}
测试样例:
参考:
x | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 |
1.1052 | 1.2214 | 1.3499 | 1.4918 | 1.6487 |
分别用线性插值和抛物插值求的值
线性插值:
1
0.285
0.2 1.2214
0.3 1.3499
抛物插值:
2
0.285
0.2 1.2214
0.3 1.3499
0.4 1.4918