如果你上过研究生的数值分析课程的话,对这个算法应该不会很陌生。从这节开始,我们将逐一回顾各种插值和拟合方法以及使用Matlab来实现这些算法:
1.拉格朗日插值
1.1插值多项式
用多项式作为研究插值的工具,称为代数插值。其基本问题是:已知函数在区间
上
个不同点
处的函数值
,求一个至多
次多项式:
使其在给定点处与同值,即满足插值条件:
称为插值多项式,
称为插值节点,简称节点,
称为插值区间。从几何上看,
次多项式插值就是过
个点
,作一条多项式曲线
近似曲线
。
次多项式(1)有
个待定系数,由插值条件(2)恰好给出
个方程:
记此方程组的系数矩阵为,则:
称为范德蒙特行列式。当互不相同时,此行列式值不为零。因此方程组(3)有唯一解。这表明,只要
个节点互不相同,满足插值要求(2)的
插值多项式(1)是唯一的。
插值多项式与被插函数之间的差:
称为截断误差,又称为插值余项。当充分光滑时,
其中,
1.2.拉格朗日插值多项式
实际上比较方便的作法不是解方程(3)求待定系数,而是先构造一组基函数:
是
次多项式,满足:
令:
上式称为次
插值多项式,由方程(3)解的唯一性,
个节点的
次
插值多项式存在唯一。
1.3.用Matlab作Lagrange插值
Matlab中没有现成的插值函数,必须编写一个M文件实现
插值。
设个节点数据以数组
输入(注意 Matlab 的数组下标从 1 开始),
个插值点以数组
输入,输出数组
为
个插值。编写一个名为lagrange.m的M文件:
function y=lagrange(x0,y0,x);
n=length(x0);m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
p=1.0;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end