插值法


目的:用于缺失数据处理

定义:在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。(而拟合只求函数图像神似而不求穿过已知点

   输入的是一堆点,也就是一堆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的第一行加上周数


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM