实验四

实验内容

1、线性插值——使用数据 (75, 2.768), (76, 2.833) 做线性插值多项式, 并求 75.5 处在插值结果下的值。
2、二次插值——计算函数 y = ex + sin(x) + x − 1 在离散点 x =0.1, 0.4, 0.6 处的 y 值, 并利用在离散点处的二次插值结果计算函数在 x = 0.45 处的函数值。
3、三次插值——函数y = F(x) 的数据为 y = [1, 4, 7, 10], x = 0 : 1 : length(y)-1. 用三次插值求出 x1 = 5 : 0.2 : 5.5 点所对应函数值的程序代码段。
4、根据表中给出的数据, 给出四次插值和牛顿插值结果。
x13043.5
y2618105
5、样条插值——写出样条插值的原理,并用M语言举例说明用法。

实验综述

本实验均基于 MATLAB 2019b 版本

安装MATLAB 2019b 点击查看

实验过程

线性插值——使用数据 (75, 2.768), (76, 2.833) 做线性插值多项式, 并求 75.5 处在插值结果下的值

实验代码
clc,close,clear;
x0 = 75;
x1 = 76;
y0 = 2.768;
y1 = 2.833;
y = @(x) (1/(x1-x0))*(y0*(x1-x)+y1*(x-x0));
y(75.5)
实验效果

二次插值——计算函数 y = ex + sin(x) + x − 1 在离散点 x =0.1, 0.4, 0.6 处的 y 值, 并利用在离散点处的二次插值结果计算函数在 x = 0.45 处的函数值

实验代码
%二次插值——计算函数 y = exp(x) + sin(x) + x ? 1 在离散点 x =0.1, 0.4, 0.6 处的 y 值,
%并利用在离散点处的二次插值结果计算函数在 x = 0.45 处的函数值.
clc,close,clear;
x0 = 0.1;
x1 = 0.4;
x2 = 0.6;
fx = @(x) exp(x) + sin(x) + x - 1;
% 计算x0,x1,x2对应的y0,y1,y2
y0 = fx(x0);
y1 = fx(x1);
y2 = fx(x2);
ux = @(x) ((x-x1)*(x-x2))/((x0-x1)*(x0-x2))*y0+((x-x2)*(x-x0))/((x1-x2)*(x1-x0))*y1+((x-x0)*(x-x1))/((x2-x0)*(x2-x1))*y2;
ux(0.45)
实验效果

三次插值——函数y = F(x) 的数据为 y = [1, 4, 7, 10], x = 0 : 1 : length(y)-1. 用三次插值求出 x1 = 5 : 0.2 : 5.5 点所对应函数值的程序代码段

实验代码
%三次插值——函数y = F(x) 的数据为 y = [1, 4, 7, 10], x = 0 : 1 : length(y).
%用三次插值求出 x1 = 5 : 0.2 : 5.5 点所对应函数值的程序代码段.
clc,close,clear;
y = [1, 4, 7, 10];
x = 0 : 1 : length(y)-1;
x1 = 5 : 0.2 : 5.5;
y1 = interp1(x,y,x1,'pchip');
y1
实验效果

根据表中给出的数据, 给出四次插值和牛顿插值结果。
x13043.5
y2618105

实验代码
clc,close,clear;
x = [1 3 0 4 3.5];
y = [2 6 18 10 5];
x1 = -1:1:5;
y1 = interp1(x,y,x1,'pchip');
y2 = newton(x,y,x1,1);
plot(x,y,'*',x1,y1,'r',x1,y2,'-.'),grid,
legend('样本点','四次插值','牛顿插值')

%newton.m
%求牛顿插值多项式、差商、插值及其误差估计的MATLAB主程序
%输入的量:X是n+1个节点(x_i,y_i)(i = 1,2, ... , n+1)横坐标向量,Y是纵坐标向量,
%x是以向量形式输入的m个插值点,M在[a,b]上满足|f~(n+1)(x)|≤M
%注:f~(n+1)(x)表示f(x)的n+1阶导数
%输出的量:向量y是向量x处的插值,误差限R,n次牛顿插值多项式L及其系数向量C,
%差商的矩阵A
function[y,R,A,C,L] = newton(X,Y,x,M)
n = length(X);
m = length(x);
for t = 1 : m
    z = x(t);
    A = zeros(n,n);
    A(:,1) = Y';
    s = 0.0; p = 1.0; q1 = 1.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
            q1 = abs(q1*(z-X(j-1)));
            c1 = c1 * j;
        end
        C = A(n, n); q1 = abs(q1*(z-X(n)));
        for k = (n-1):-1:1
            C = conv(C, poly(X(k)));
            d = length(C);
            C(d) = C(d) + A(k,k);%在最后一维,也就是常数项加上新的差商
        end
        y(t) = polyval(C,z);
        R(t) = M * q1 / c1;
end
L = poly2sym(C);
end
实验效果

样条插值——写出样条插值的原理,并用M语言举例说明用法

实验代码
% 三次样条插值是一种分段插值方法
% 假设函数F(x)在区间[a,b]上的(n+1)个顺序节点xi及其对应的函数值F(xi) = yi(i = 0,1,2,...,n)均为已知
% 构造定义在[a,b]上的S(x)满足:
% (1)S(xi) = yi,i = 0,1,2,...,n,既满足插值原理(2);
% (2)S(x)在每个小区间[xi,xi+1](i = 1,2,...,n-1)上都是一个三次多项式:
%                            S(xi) = ai0 + ai1*x + ai2*x^2 +ai3*x^3
% (3)S(x)、S'(x)和S''(x)在[a,b]上连续。
% 称S(x)为三次样条插值

x = [0 1 2.5 3.6 5 7 8.1 10 11 12.4 13.8 14.3 15];
y = cos(x);
xx = 0:.25:15;
yy = spline(x,y,xx);
plot(x,y,'o',xx,yy)
实验效果