1.1插值多项式
用多项式作为研究插值的工具,称为代数插值。其基本问题是:已知函数在区间
上
个不同点
处的函数值
,求一个至多
次多项式:
使其在给定点处与同值,即满足插值条件:
称为插值多项式,
称为插值节点,简称节点,
称为插值区间。从几何上看,
次多项式插值就是过
个点,作一条多项式曲线
近似曲线
。
次多项式(1)有
个待定系数,由插值条件(2)恰好给出
个方程:
记此方程组的系数矩阵为,则:
称为范德蒙特行列式。当互不相同时,此行列式值不为零。因此方程组(3)有唯一解。这表明,只要
个节点互不相同,满足插值要求(2)的
插值多项式(1)是唯一的。
插值多项式与被插函数之间的差:
称为截断误差,又称为插值余项。当充分光滑时,
其中,
1.2.拉格朗日插值多项式
实际上比较方便的作法不是解方程(3)求待定系数,而是先构造一组基函数:是
次多项式,满足:
令:
上式称为次
插值多项式,由方程(3)解的唯一性,
个节点的
次
插值多项式存在唯一。
伪代码如下
LagrangeInterpolationPolynomia(ele, n, x[], y[])
//ele是需要预测的元素值,n是提供的值的数量,x[]与y[]分别存储着已知的x值与所对应的y值
sum <- 0
k <- 0
while k < n do
t <- 1
j <- 0
while j < n do
if j != k
t <- ((ele - x[j])/(x[k] - x[j]))*t
sum <- t * y[k] + sum
end
j <- j + 1
end
k <- k + 1
end
return sum
c++实现
#include <iostream>
using namespace std;
float LagrangeInterpolationPolynomia(float x,int n,float a[],float b[]);
int main ()
{
float x,y,t,a[100],b[100];
int i,j,k,n;
cout << "输入n的值"<<endl;
cin >> n;
cout << "输入x的值"<<endl;
cin >> x;
y = 0;
for (i=0;i<n;i++)
{
cout<< "输入x"<<i<<"的数据:";
cin >> a[i];
cout<< "输入y"<<i<<"的数据:";
cin >> b[i];
}
cout << "y="<<LagrangeInterpolationPolynomia(x,n,a,b)<<endl;
return 0;
}
float LagrangeInterpolationPolynomia(float x,int n,float a[],float b[])
{
int k;
float t,y=0;
int j;
for (k = 0;k < n;k++)
{
t = 1;
for (j = 0;j < n;j++)
{
if (j != k)
t = ((x - a[j])/(a[k]-a[j]))*t;
}
y = t * b[k]+y;
cout << y << endl;
}
return y;
}