目的:用于缺失数据处理
定义:在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。(而拟合只求函数图像神似而不求穿过已知点)
输入的是一堆点,也就是一堆x和一堆y,想要得到一个函数,能完美通过这一堆x和这一堆y
分类:分段插值、多项式插值、三角插值
- 若f(x)是次数不超过n的代数多项式,就是多项式插值
- 若f(x)是分段多项式,就是分段插值
- 若f(x)为三角多项式,就是三角插值
高次插值会产生龙格现象,即在两端波动极大,产生明显的震荡
故,插值多项式次数高,精度未必显著提高,
所以需要采用分段插值来解决。
分段插值 :
将全部数据分割成若干部分,每个小部分用插值得到不同的函数,最后用很多不同的函数表达原来的序列
三次样条插值就是将原始序列分割成若干段,构造多个三次函数(x的三次方形式构造),使得分段的衔接处具有二阶导数连续的性质(也就是光滑衔接)
三次样条插值与三次埃尔米特插值
% 三次样条插值和分段三次埃尔米特插值的对比 x = -pi:pi; y = sin(x); new_x = -pi:0.1:pi; p1 = pchip(x,y,new_x); %分段三次埃尔米特插值 p2 = spline(x,y,new_x); %三次样条插值
%x是已知的样本点的横坐标;y是已知的样本点的纵坐标;new_x是要插入处对应的横坐标 figure(2); plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-') legend('样本点','三次埃尔米特插值','三次样条插值','Location','SouthEast') %标注显示在东南方向
例题:
原始数据:需要插值得到偶数周轮虫、溶氧等的值。
%插值预测中间周的水体评价指标 load Z.mat x=Z(1,:); %Z的第一行是星期Z: 1 3 5 7 9 11 13 15 [n,m]=size(Z);%n为Z的行数,m为Z的列数 % 注意Matlab的数组中不能保存字符串,如果要生成字符串数组,就需要使用元胞数组,其用大括号{}定义和引用 ylab={'周数','轮虫','溶氧','COD','水温','PH值','盐度','透明度','总碱度','氯离子','透明度','生物量'}; % 等会要画的图形的标签 disp(['共有' num2str(n-1) '个指标要进行插值。']) disp('正在对一号池三次埃尔米特插值,请等待')%一号池共有十一组要插值的数据,算上星期所在的第一行,共十二行 P=zeros(11,15);%对要储存数据的矩阵P赋予初值 for i=2:n%从第二行开始都是要进行插值的指标 y=Z(i,:);%将每一行依次赋值给y new_x=1:15;%要进行插值的x p1=pchip(x,y,new_x);%调用三次埃尔米特插值函数 subplot(4,3,i-1);%将所有图依次变现在4*3的一幅大图上 plot(x,y,'ro',new_x,p1,'g-');%画出每次循环处理后的图像 axis([0 15,-inf,inf]) %设置坐标轴的范围,这里设置横坐标轴0-15,纵坐标不变化 % xlabel('星期')%x轴标题 ylabel(ylab{i})%y轴标题 这里是直接引用元胞数组中的字符串哦 P(i-1,:)=p1;%将每次插值之后的结果保存在P矩阵中 end legend('原始数据','三次埃尔米特插值数据','Location','SouthEast')%加上标注,注意要手动在图中拖动标注到图片右下角哦 P = [1:15; P] %把P的第一行加上周数