matlab实现Newton、Lagrange、分段线性插值多项式

例题

 Newton插值

clc
% 实验数据 x y 初始赋值,画出原始数据折线图
%%Newton插值、分段线性插值步长
fi=@(i) i.*0.2-1;
fx=@(x) 1./(1+9*x.^2);
i=0:1:10;            %设置i点
x=fi(i);             %插值节点
y=fx(x);             %各插值点函数值
x1=-1:0.01:1;
y1=fx(x1);
scatter(x,y,'k');   %插值节点图
hold on
plot(x1,y1,'r')     %被插函数图
hold on

%%Newton插值
syms t;             %系统变量
n=length(x);        %x长度
A=zeros(n,n);       %差商表
A(:,1)=y(:);        %初始化第一列y
    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
y0=A(1,1);                 %插值结果初始化
    for k=2:n
        p=1.0;
        for j=1:k-1
            p=p*(t-x(j));  %计算插值基函数
        end
        y0=y0+A(k,k)*p;    %加入新的基函数   
    end
y0 = collect(y0);               %合并同类项
y0 = vpa(y0,6);                 %截断表达
disp("Newton插值多项式结果:");  
disp(y0);                               %打印最后的Newton插值多项式

% 画图
f0 = subs(y0,'t',x1);
plot(x1,f0,'b');                 %画图
hold on

 Lagrange插值

clear
clc
%%Lagrange插值
fi=@(i) cos(((i.*2+1)*pi)/22);    %求插值节点
fx=@(x) 1./(1+9*x.^2);            %求插值节点对应的y值
i=0:1:10;              %设置i点
x=fi(i);               %插值节点
y=fx(x);
x1=-1:0.01:1;
y1=fx(x1);
scatter(x,y,'k');   %画出插值节点图
hold on
plot(x1,y1,'r')     %被插函数图
hold on

%% lagrange插值过程
syms t;                               %系统变量
n = length(x);                        %x长度
f = 0.0;                              %lagrange插值多项式初始化
for i = 1:n                           %循环计算基函数
    l = y(i);
    for j = 1:i-1                     %计算基函数某个项前面一截,i之前的
        l = l*(t-x(j))/(x(i)-x(j));
    end
    for j = i+1:n                     %计算基函数某个项后面一截,i之后的
        l = l*(t-x(j))/(x(i)-x(j));
    end
    f = f + l;                        %得出最后的lagrange插值多项式
    simplify(f);                      %化简多项式
    if(i==n)
        f = collect(f);               %合并同类项
        f = vpa(f,6);                 %截断表达
    end
end
disp("lagrange插值多项式结果:");  
disp(f);                               %打印最后的lagrange插值多项式

%% 画图
f0 = subs(f,'t',x1);
plot(x1,f0,'b');                       %画图
hold on
legend("插值节点","被插函数","lagrange插值");
title("lagrange插值插值结果图")%标题

分段线性插值 

%%分段线性插值
syms t;             %系统变量
x2=0.1+x;
n=length(x);        %x长度
  disp("分段线性插值多项式结果:"); 
    for i=1:n-1            %输出分段函数表达式
        if x(i)<x2(i) && x2(i)<x(i+1)
            L1=(t-x(i+1))/(x(i)-x(i+1));
            L2=(t-x(i))/(x(i+1)-x(i));
            y1=L1*y(i)+L2*y(i+1);
            y1 = collect(y1);               %合并同类项
            y1 = vpa(y1,6);                 %截断表达
            fprintf('在区间[%.1f,%.1f],多项式为: ',x(i),x(i+1))
            disp(y1);
        elseif x(i)==x1
             y1=y(i);      
        end
    end
y2= interp1(x,y,x1,'linear');
plot(x1,y2,'g');                 %画图
hold on
legend("插值节点","被插函数","Newton插值","分段线性插值");
title("Newton插值、分段线性插值结果图")%标题

计算结果如下

(使用matlab软件进行计算,详细代码见附录3)

Newton插值多项式结果:

lagrange插值多项式结果:

分段线性插值多项式结果:

 结果图像对比

 结果对比分析

从图上看到,在 x = ±1 附近, Newton插值多项式计算结果和实际结果偏离很远,lagrange插值多项式比Newton插值多项式好一些,这说明用高次插值多项式近似效果并不好。

随着n的增加,R(x_{n-1/2})的绝对值几乎成倍增加,这说明当n \to\infty时,lagrange插值多项式和Newton插值多项式在[-1,1]上是不收敛的。

对于分段线性插值,当原函数在步长区间内有较大起伏时,误差可能很大,但当n \to\infty时,分段线性插值在[-1,1]上是收敛的,能较好拟合原函数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值