Lagrange插值函数及其Matlab代码

一.为什么要引进插值函数

在实际问题中,两个变量的关系y=f(x)经常要 靠实验和观测来获得,而在通常的情况下只能得到f(x)在有限个点上的值
                                                                   y_i=f(x_i),  i=0,1,2,...,n
人们希望找到f(x)的一个近似函数y=\phi(x),使得

                                                                   \phi(x_i)=y_i,i=0,1,2,...,n                                   (0.1)

此时,f(x)称为被插函数,点x_0,x_1,...,x_n称为插值结点,\phi(x)称为插值函数,(0.1)称为插值条件。

在处理插值问题的时候,首先根据需要选择\phi(x)是哪一类函数,如果选择\phi(x)为代数多项式就产生了代数插值问题。类似地,有三角多项式插值,有理函数插值和样条函数插值等问题,本文主要考虑代数多项式插值问题。

二.Lagrange插值的定义

由于大家都学过推到过程,我就不一一推导了,直接上公式:

n次Lagrange插值多项式:

其中l_i(x)i次基函数               

 

这里着重讲一下一次Lagrange插值和二次Lagrange插值,又分别称为线性Lagrange插值和抛物线性Lagrange插值。

例如我们通过实验或观测已知如下表所示的数据,要求构造一个抛物线插值函数。

抛物线插值问题
X x_0 x_1 x_2
Y y_0 y_1 y_2

 

 

 

 

直接带入公式可得:L_2(x)=l_0(x)y_0+l_1(x)y_1+l_2(x)y2                                                                                               (1)

                        其中     l_0(x)=\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}

                                     l_1(x)=\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}

                                     l_2(x)=\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)}

Lagrange插值多项式不必死记硬背,其基函数l_i(x)只有在x=x_i时,基函数才为1,在x等于其他点时,l_i(x)=0.记住这个特性,基函数公式就特别简单推到了。

三.Lagrange插值多项式的应用

光说不练都是假把戏,接题:

已知\sqrt{100}=10,\sqrt{121}=11,\sqrt{144}=12,求y=\sqrt{115}

x_0=100,y_0=10,x_1=121,y_1=11,x_2=144,y_2=12

代入(1)得                L_2(x)=\frac{(x-121)(x-144)}{(100-121)(100-144)}*10+\frac{(x-100)(x-144)}{(121-100)(121-144)}*11+ \frac{(x-100)(x-121)}{(144-100)(144-121)}*12..........................................................(2)

将(2)整理下,然后将x=115代入得y=10.7228,可以验证同精度比较,该结果具有4位有效数字。

四.Lagrange插值多项式的Matlab程序

function s=LagrangeInter(x,y,x0)
%% LagrangeInter:求拉格朗日插值多项式函数
% x为节点X坐标向量
% y为节点Y坐标向量
% x0为待计算点的x坐标

syms p;
n=length(x);             %读取x向量维数                             
s=0;
for i=1:n
    Li=y(i); 
%构造基函数
    for j=1:i-1
        Li=Li*(p-x(j))/(x(i)-x(j));      
    end
    for j=i+1:n
        Li=Li*(p-x(j))/(x(i)-x(j));    
    end
    s=s+Li;                        
    simplify(s);                       
end
%对输入参数个数做判断,如果只有两个参数直接给出插值多项式
%如果三个参数  则给出插值点的插值结果,第三个参数可以为向量
if(nargin==2)
  s=subs(s,'p','x');  
  s=collect(s);        %展开多项式
%  s=vpa(s,4);          %把系数取到6位精度表达         
else
    s = subs(s,'p',x0);
    %   m=length(x0);     %读取t长度
%分别对t的每一个分量插值 
%   for i=1:m
%      temp(i)=subs(s,'p',x0(i)); 
%   end  
%     s=temp;
end

 

 

你可能感兴趣的:(Lagrange插值函数及其Matlab代码)