Hermite插值、拉格朗日插值法、牛顿插值法比较

1 Hermite插值

        Hermite插值的基本思想是通过一个多项式函数来逼近已知的数据点,同时满足这些点的函数值和导数值。这样即可以在给定的数据范围内获得更准确的拟合结果。与其他插值方法相比,Hermite插值具有更高的精度和光滑性。通过给定的数据点和其导数值,建立一个n次多项式函数(n是数据点的数量)。然后,使用已知的数据点和导数值,确定多项式函数的系数。最后,使用计算得到的多项式函数,可以在给定范围内估计其他位置上的函数值。

2 拉格朗日插值

        拉格朗日插值法的基本思想就是使用多个取值点确定拉格朗日插值基,也就是所谓的插值系数,其插值基函数如下:

通过插值基来确定函数对应点的关系,去插值未知点的值。

3 牛顿插值法

        牛顿插值法是拉格朗日插值法的改进方法,克服了拉格朗日插值法中存在的“增加一个节点时整个计算工作重新开始”的问题,且可以节省乘除法运算次数, 同时在Newton插值多项式中用到差分与差商等概念,又与数值计算的其他方面有密切的关系。其插值公式如下:

实现三种插值方法的代码如下: 

function []=hechazhi()
clear;
x = [1  1.2  1.4  1.6  1.8 2.0 ];
y = [1 1.0954 1.5 1.2649 1.3416 1.45 ];
y_1 = [0.5000 0.4564 0.826 0.3953 0.3727 0.389];
disp('显示Hermite插值多项式')
f = Hermite(x,y,y_1);
disp('显示Hermite在插值点的值')
xx=1:0.01:2.0
for i=1:1:length(xx)
  yy(i) = Hermite(x,y,y_1,xx(i));
end
yy1=lagrange(x,y,xx)
[d yy2]=newtonzi(x,y,xx)
plot(x,y,'o',xx,yy,'r-',xx,yy1,'kx',xx,yy2,'bo')
title("三种不同插值方法的效果比较")
legend({'原始数据','Hermit插值','拉格朗日','牛顿插值'}, ...
    'Location','northwest')
end
function f = Hermite( x,y,y_1,x0 )
%Hermite插值函数
%   x为已知数据点的x坐标
%   y为已知数据点的y坐标
%   y_1为数据点y值导数
%   x0为插值点的x坐标
syms t;
f = 0.0;
if(length(x) == length(y))
    if(length(x) == length(y_1))
        n = length(x);
    else
        disp('y和y的导数维数不相等');
        renturn;
    end
else
    disp('x和y的维数不相等');
    return;
end
%以上为输入判断和确定“n”的值
for i = 1:n
    h =  1.0;
    a =  0.0;
    for j = 1:n
        if(j ~= i)
            h = h*(t-x(j))^2/((x(i)-x(j))^2);%求得值为(li(x))^2
            a = a + 1/(x(i)-x(j));   %求得ai(x)表达式之中的累加部分
        end
    end
    f = f + h*((x(i)-t)*(2*a*y(i)-y_1(i))+y(i));
    if(i == n)
        if(nargin == 4)
            f = subs(f, 't' , x0);  %输出结果
        else
            f = vpa(f,6);  %输出精度为有效数字为6位的函数表达式
        end
    end
end
end
function y=lagrange(x0,y0,x)
%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
end
function [A,y]= newtonzi(X,Y,x)
%   Newton插值函数
%   X为已知数据点的x坐标
%   Y为已知数据点的y坐标
%   x为插值点的x坐标
%   函数返回A差商表
%   y为各插值点函数值
n=length(X); m=length(x);
for t=1:m
    z=x(t); A=zeros(n,n);A(:,1)=Y';
    s=0.0; y=0.0; c1=1.0;
    for  j=2:n
       for i=j:n
           A(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1));
       end
    end
    C=A(n,n);
    for k=1:n
        p=1.0;
        for j=1:k-1
            p=p*(z-X(j));
        end
        s=s+A(k,k)*p;        
    end
    ss(t)=s;
end
    y=ss;
    A=[X',A];    
end

 运行结果如下:

Hermite插值、拉格朗日插值法、牛顿插值法比较_第1张图片

Hermite插值、拉格朗日插值法、牛顿插值法比较_第2张图片

结果分析:可以看出来对于这组数据,拉格朗日插值法和牛顿插值法插值出来的曲线一致,这两种插值方法只根据数值进行插值,不考虑方向,插值的曲线方向变化单一。Hermite插值法插值的曲线既受数值点的影响,又根据导数确定了曲线的变化方向,曲线的波动变化更多。 

你可能感兴趣的:(数值分析,经验分享,算法,数据分析)