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

本文介绍了Hermite插值、拉格朗日插值和牛顿插值的原理,展示了它们如何通过多项式逼近数据点并考虑导数值以提高精度。实验结果显示,Hermite插值提供了更丰富的曲线变化,而拉格朗日和牛顿插值在不考虑方向的情况下给出一致的插值结果。
摘要由CSDN通过智能技术生成

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只会飞的猪️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值