欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三次样条插值和拉格朗日插值算法对比——RUNGE现象

程序员文章站 2024-03-17 20:51:58
...

三次样条插值和拉格朗日插值算法对比——RUNGE现象

数值分析课后上机作业:
原始数据:
x0=[0.9 1.3 1.9 2.1 2.6 3.0 3.9 4.4 4.7 5.0 6.0 7.0 8.0 9.2 10.5 11.3 11.6 12.0 12.6 13.0 13.3];
y0=[1.3 1.5 1.85 2.1 2.6 2.7 2.4 2.15 2.05 2.1 2.25 2.3 2.25 1.95 1.4 0.9 0.7 0.6 0.5 0.4 0.25];
分别绘出三次样条插值多项式图像以及二十次拉格朗日插值多项式图像。

// 以下为MATLAB代码,可直接运行
clc;
clear;
%% 初始化数据
x0=[0.9 1.3 1.9 2.1 2.6 3.0 3.9 4.4 4.7 5.0 6.0 7.0 8.0 9.2 10.5 11.3 11.6 12.0 12.6 13.0 13.3];
y0=[1.3 1.5 1.85 2.1 2.6 2.7 2.4 2.15 2.05 2.1 2.25 2.3 2.25 1.95 1.4 0.9 0.7 0.6 0.5 0.4 0.25];
%% 三次样条插值算法
x=[0.9:0.01:13.3];
y1=interp1(x0,y0,x,'spline');
pp=csape(x0,y0,'variational');
plot(x0,y0,'ok')
hold on;
plot(x,y1,'-b');
hold on;
%% Lagrange插值算法
n=length(x0);
m=length(x);
for i=1:m
    z=x(i);
    L=0.0;
    for j=1:n;
        T=1.0;
        for k=1:n;
            if k~=j;
                T=T*(z-x0(k))/(x0(j)-x0(k));%求基函数
            end
        end
        L=T*y0(j)+L;
    end
    y(i)=L;
end
plot(x,y,'r');
C=polyfit(x,y,n-1);
ppp=poly2sym(C);
title('两种插值方法函数曲线对比');
legend('                   节点','       三次样条插值函数曲线','20次Lagrange插值多项式曲线');
%% 输出三次样条插值的20段函数表达式以及Lagrange插值的20次函数表达式
for j=1:20
fprintf('第%d段:%d <=x<=%d',j,pp.breaks(j),pp.breaks(j+1));
Sx=poly2sym(pp.coefs(j,1:4)) %输出三次样条插值的20段函数表达式
end
fprintf('20次Lagrange插值多项式为:\n');
fprintf('L20x=%s',vpa(ppp))% Lagrange插值的20次函数表达式

结果图如下:
三次样条插值和拉格朗日插值算法对比——RUNGE现象