概念:数模比赛中,常常需要根据有已知的函数点进行数、模型处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生“一些新的但又比较靠谱的值来满足需求,这就是插值的作用。
一维插值问题:
通过已有的点和对应的值,构造函数将其要插入的横坐标但如得到插入点(纵坐标)
插值法的定义:
插值法的分类:
插值法原理:
拉格朗日插值法与牛顿插值法:
(这两种方法只做了解,为的是引出龙格现象和后续我们mtalab中真正常用到两种方法,所以下面只放一些相关的ppt)
龙格现象:
(直白点就是插入的次数越多不已经数据就越精确,反而会产生龙格现象:即放插入值多是图像更加偏离)
(所以我们在不熟悉曲线运动的趋势时少用多次插值)
如何解决龙格现象
分段插值即:在要插入点x(横坐标)左右各找一点,将其对应的值连接成一个线段,x在线段上对应的值y即是我们要插入的点。这样故好的那束次数过多,导致数据不精确
如何使得插值法更加精确呢?
A.埃尔米特(Hermite)插值
在matlab中用pchip函数来表示分段三次埃尔米特插值法,pchip(x,y,new_x)中x和y可以是一个n列一行的矩阵,new_x的长度是插入后的长度。
Plot是绘图函数,plot(x,y,‘线段或点的形状’),
Eg:
三次样条插值:
Matlab中三次样条插值和分段三次埃尔比特插值法相只是函数名字不同,传参和返回值都是一样的
分段三次埃尔米特插值法和三次样条插值法绘图后的比较(我么用的是用这两个插值函数购构建sinx函数图像):
不难看出三次样条插值法更光滑
插值法解决生活实例的例题Mtalab代码的实现与讲解:
本题是给出我们1 3 5 7 9 11 13 15周的数据让我们利用插值法将1-15周的数据补全,且用matlab构建每个指标的图像。(只需要补全一号池的数据即可)
其中所用到的函数的讲解:
figure(num)函数:在同一个脚本文件里面,需要给每个图像编号,否则只会显示最后一个图像。(如果我们每个图像在单独的一个面板且展示的时候需要都展示出来,因此我们需要使用到figure函数。)
eg:
legend函数:标注图像中的线段/点对应的插值方法和显示的位置等。
Legend(‘名字’,‘location(坐标一般写位置是需要先写这个)’,‘方向(eg:SouthEast东南)’)
Eg:
代码实现及其注释讲解:
clear;clc
load data.mat;
x=Z(1,:);
[n,m]=size(Z)%求出x的行(数据个数)和列(周数)
data_name={'周数','轮虫','溶氧','COD','水温','PH值','盐度','透明度','总碱度','氯离子','透明度','生物量'};
disp(['共有' num2str(n-1) '个指标进行插值']);
disp('正在进行一号池三次样条插值,请等待:');
%设置一个矩阵P,保存插入好的数据
%1.开辟一个矩阵(大小为n-1行和15列)
P=zeros(n-1,15);
for i=2:n
new_x=1:15;%插入后的总列数
y=Z(i,:);
%将每次插入好的数据保存下来
pi=spline(x,y,new_x);
%绘图
%a.设置图形的大小
%subpolt(x,y,i)的作用:
%我们一共要绘制11个图,为了方面观看需要将这11个图放在同一个面板上观察,而subpolt的作用就是绘制这样一个面板的函数
%前两个参数x,y表示这个面版最多能方4*3个图,一共四行,每行最多方3个,i则代表了位置,从左->右,上->下依次排序1-x*y
subplot(4,3,i-1);
%b.传入数据构建图形
plot(x,y,'ro',new_x,pi,'-');
%c.设置横坐标的长度(1-15),纵坐标不进行改变
%axis函数设置图形的横纵坐标范围
axis([0 15 -inf inf])
%d.设置图形的名称(每个图形标记好相对应的指标名称)
%ylable为图像设置名称
ylabel(data_name{i})
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%将每次保存的插入好的输入依次保存到一个大的矩阵当中
P(i-1,:)=pi;
end
%为每组图中的线段和点标记好所用的插入方法:
legend('原始数据','三次样条插值数据','Location','SouthEast')
%周数插入到P矩阵的上方
P=[1:15;P];
最后的插值数据完整后的结果和利用matlab构建的图像:
博主主要跟着清风数学建模的课程学习,其中里面的一些图片都来源于上课视频的截图。