天天看点

Lagrange插值函数及其Matlab代码

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

在实际问题中,两个变量的关系y=f(x)经常要 靠实验和观测来获得,而在通常的情况下只能得到f(x)在有限个点上的值

Lagrange插值函数及其Matlab代码

=

Lagrange插值函数及其Matlab代码

(

Lagrange插值函数及其Matlab代码

),  i=0,1,2,...,n

人们希望找到f(x)的一个近似函数y=

Lagrange插值函数及其Matlab代码

(x),使得

Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码

,i=0,1,2,...,n                                   (0.1)

此时,

Lagrange插值函数及其Matlab代码

称为被插函数,点

Lagrange插值函数及其Matlab代码

称为插值结点,

Lagrange插值函数及其Matlab代码

称为插值函数,(0.1)称为插值条件。

在处理插值问题的时候,首先根据需要选择

Lagrange插值函数及其Matlab代码

是哪一类函数,如果选择

Lagrange插值函数及其Matlab代码

为代数多项式就产生了代数插值问题。类似地,有三角多项式插值,有理函数插值和样条函数插值等问题,本文主要考虑代数多项式插值问题。

二.Lagrange插值的定义

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

n次Lagrange插值多项式:

Lagrange插值函数及其Matlab代码

其中

Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码

Lagrange插值函数及其Matlab代码

次基函数               

Lagrange插值函数及其Matlab代码

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

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

抛物线插值问题

X
Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码
Y
Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码

直接带入公式可得:

Lagrange插值函数及其Matlab代码

                                                                                               (1)

                        其中     

Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码
Lagrange插值函数及其Matlab代码

Lagrange插值多项式不必死记硬背,其基函数

Lagrange插值函数及其Matlab代码

只有在x=

Lagrange插值函数及其Matlab代码

时,基函数才为1,在x等于其他点时,

Lagrange插值函数及其Matlab代码

=0.记住这个特性,基函数公式就特别简单推到了。

三.Lagrange插值多项式的应用

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

已知

Lagrange插值函数及其Matlab代码

,求

Lagrange插值函数及其Matlab代码

Lagrange插值函数及其Matlab代码

=100,

Lagrange插值函数及其Matlab代码

=10,

Lagrange插值函数及其Matlab代码

=121,

Lagrange插值函数及其Matlab代码

=11,

Lagrange插值函数及其Matlab代码

=144,

Lagrange插值函数及其Matlab代码

=12

代入(1)得                

Lagrange插值函数及其Matlab代码

将(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
           

继续阅读