【数值分析/计算方法】插值法及其余项MATLAB仿真实验

1、Lagrange插值法

方法:对给定的n个插值节点x1,x2,⋯,xn以及它们对应的函数值y1,y2,⋯,yn,利用构造的n-1次Lagrange插值多项式,可以通过下面式子求得插值区间内任意x的函数值。

 Matlab实现:

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=s+p*y0(k); %求和
    end 
    y(i)=s; 
end

2、Newton插值法

方法:通过选取特殊的基函数来实现

根据插值条件和差商定义,从而可以得到满足插值条件的n项插值多项式

Matlab实现:

function [A,y]= Newton(x0,y0,x)
%   Newton插值函数
%   x0为已知数据点的x坐标
%   y0为已知数据点的y坐标
%   x为插值点的x坐标
%   函数返回A差商表
%   y为各插值点函数值
n=length(x0); m=length(x);
for t=1:m
    z=x(t); A=zeros(n,n);A(:,1)=y0';
    s=0.0; y=0.0; 
    for  j=2:n
       for i=j:n
           A(i,j)=(A(i,j-1)- A(i-1,j-1))/(x0(i)-x0(i-j+1));
       end
    end
    for k=1:n
        p=1.0;
        for l=1:k-1
            p=p*(z-x0(l));
        end
        s=s+A(k,k)*p;        
    end
    ss(t)=s;
end
    y=ss;
    A=[x0',A];    
end

3、Hermite插值法

方法:在实际问题中,不但要求在节点上函数值相等,而且往往会要求导数值也相等,即:

 已知n个插值点x1,x2,⋯,xn及对应的函数值y1,y2,⋯,yn和一阶导数值y1′,y2′,⋯,yn′。则可以通过下面式子求得插值区间内任意x的函数值y

 Matlab实现:

function [y,Rn]=Hermite_Re(x0,x)

%这里只讨论n个插值节点及其对应的函数值和一阶导数都存在,
%则每个插值节点都是函数的"二重节点"

syms t;
f=log(t);
y0=subs(f,t,x0);

y1=subs(diff(f,t),t,x0);

n=length(x0);
m=length(x);
for k=1:m
    p=0.0;
    for i=1:n
        h=1.0;
        a=0.0;
        w=1.0;
        for j=1:n
            w=w*(x(k)-x0(j));
            if (j~=i)
                h=h*((x(k)-x0(j))/(x0(i)-x0(j)));
                a=a+1/(x0(i)-x0(j));
            end
        end
        p=p+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i));
    end
    y(k)=eval(p);
    Rn(k)=diff(f,t,(2*n))/factorial(2*n)*w^2;
end
end

4、分段低次插值

方法:通过插值点用折线或者低次的曲线连接起来逼近原曲线,规避Runge现象,可以通过调用Matlab内部函数interp1函数实现

一维数据插值指令,该指令可以对插值区间内的数据计算内插值,找出一元函数在插值点的数值

调用格式:vq=interp1(x,v,xq,'method')vq = interp1(x,v,xq,method,extrapolation)

其中x,v为已知的插值节点及其对应的函数值,xq为给定的插值点,vq为在插值点xq处的插值结果,extrapolation用于指定外插策略,来计算落在 x 域范围外的点。

‘method’表示采用的插值方法,Matlab内部提供了几种插值方法,常见的有:

  • ‘linear’表示线性插值

  • ‘nearest’表示邻近插值

  • 'pchip'表示三次Hermite插值

  • …………

当method缺省时,默认表示线性插值。

示例

x=0:0.12:1;
y=(x.^2-3*x+5).*exp(-5*x).*sin(x);
x1=0:0.05:1;
y0=(x1.^2-3*x1+5).*exp(-5*x1).*sin(x1);
y1=interp1(x,y,x1,'linear');%线性插值
y2=interp1(x,y,x1,'nearest');%最近点插值
y3=interp1(x,y,x1,'pchip');%三次Hermite插值
plot(x1,[y1',y2',y3'],x,y,'o',x1,y0);
legend('线性插值','邻近插值','三次Hermite插值','插值节点','原始函数图像')

5、样条插值

方法:插值出来的函数不仅要连续,还要光滑。

 

在Matlab中,可以通过调用内部函数spline来实现三次样条数据插值

调用格式:s = spline(x,y,xq)

返回与 xq 中的插值点对应的插值 s 的向量。s 的值由插值节点 x 及其对应 y 的三次样条插值确定。

示例

x=0:0.12:1;
y=(x.^2-3*x+5).*exp(-5*x).*sin(x);
xq=0:0.05:1;
s=spline(x,y,xq);
plot(x,y,'o',xq,s);

将三次样条插值与分段插值进行对比,可以看出,三次样条插值曲线更加贴近原始函数图形,插值效果最好。

 

 下一步,可以在这些已有程序的基础上,根据各种插值方法的余项估计公式,编写程序,以分析各类插值法的误差估计。有兴趣的小伙伴可以持续关注本频道。如果你觉得写的不错的话,还请点赞转发收藏。

  • 10
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

真的是小恐龙吗?

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

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

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

打赏作者

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

抵扣说明:

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

余额充值