老师的详细说明很有用!
作用
数模比赛需要基于众所周知的函数点进行数据、模型的处理和分析,但现有的数据很少,可能不足以支撑分析的进行。 在那种情况下,有必要使用一些数学方法。 插值的作用是“模拟生成”新的但比较可靠的值来满足需求,另一个不常见的作用是短期预测。
一维插值问题
定义
方法分类
本文重点介绍了数学建模常用的两种方法:三次样条插值和三次Hermite插值
多项式
原理
拉格朗日插值法
方法主要有拉格朗日插值法,不具体介绍,为龙波现象(两端波动较大,产生明显振动)。
但是,我认为可以提出ACM的问题。
分段插值
多项式次数高精度不一定显着提高
插值多项式次数越多,摄取误差越有可能明显增大
如何提高插值精度
采用分段低阶插值是一种方法
概念
踏实的世界插值法
评价
与拉格朗日插值法相比,踏实的世界插值法计算过程具有继承性。 [踏实世界插值法每次插值只与前n项的值有关,这样每次只需给原函数增加新的项就能产生新的函数],但踏实世界插值也存在龙格现象的问题。
致命的缺点
上述两种插值只需要插值多项式在插值节点具有与被插值函数相等的函数值,这种插值多项式不能全面反映被插值函数的性态。
然而,许多实际问题要求插值函数和被插值函数不仅在所有节点上具有相同的函数值,而且在一个或所有节点上插值多项式和被插值函数具有相同的低阶或高阶导数。
在这些情况下,拉格朗日插值和踏实的世界插值都不令人满意
Hermite插值
概念
广播值曲线使节点有切线(光滑),使插值函数和被插值函数的密度和程度较好。
不仅要求节点上的函数值相等,相应的导数也相等,而且高阶导数也相等,满足这种要求的插值多项式就是Hermite插值多项式。
缺点和改善
直接使用Hermite插值得到的多项式阶数较高,也存在龙格现象,因此在实际应用中多采用Hermite插值多项式(PCHIP )分段。
Matlab有一个内置的函数。 (实现过程已经封装,可以调用。 (p=pchip(x ) x,y,new_x ) ) ) ) ) )。
x是已知采样点的横坐标,y是已知采样点的纵坐标。new_x是与插入点相对应的横坐标
三次样条插值
Matlab内置了一个名为p=spline(x,y,new_x )的函数
x是已知采样点的横坐标,y是已知采样点的纵坐标。new_x是与插入点相对应的横坐标
代码
%分段3次Hermite插值
x=-pi:pi; y=sin(x;
new_x=-pi:0.1:pi;
p=PChip(x,y,new_x );
figure(1; %在同一脚本文件中,要绘制多个图,必须对每个图进行编号。 否则,只会显示最后的图哦~
plot(x,y,' o ',new_x,p,' r-' )
使用% plot函数:
%plot(x1,y1,x2,y2 ) ) )。
(线方式(实线:虚线) .虚线) -波浪线
%点方式: 圆点正*星号x形o小圆
%颜色: y黄; r红; 绿色; 蓝色; 瓦怀特; k黑色; 米紫; c青
%三次样条插值与分段三次Hermite插值的比较
x=-pi:pi;
y=sin(x;
new_x=-pi:0.1:pi;
P1=PChip(x,y,new_x ); %分段3次Hermite插值
P2=spline(x,y,new_x ); %三次样条插值
figure(2;
plot(x,y,' o ',new_x,p1,' r-',new_x,p2,' b- ' )
legend ()采样点)、((Hermite插值)、((样条插值)、(位置、(SouthEast ) ) ) )标记显示在东南方向
%说明:
% legend (字符串1、字符串2、字符串3、…)
%分别为
字符串1、字符串2、字符串3……标注到图中,每个字符串对应的图标为画图时的图标。% ‘Location’用来指定标注显示的位置
% n维数据的插值
% p = interpn(x1,x2,...,xn, y, new_x1,newx_2,...,new_xn, method)
% x1,x2,...,xn是已知的样本点的横坐标 y是已知的样本点的纵坐标坐标
% new_x1,newx_2,...,new_xn是要插入点的横坐标 method是要插值的方法
%‘linear’:线性插值(默认算法);
%‘cubic’:三次插值;
%‘spline’: 三次样条插值法; ( 最为精准 )
%‘nearest:最邻近插值算法。
x = -pi:pi; y = sin(x);
new_x = -pi:0.1:pi;
p = interpn (x, y, new_x, 'spline');
% 等价于 p = spline(x, y, new_x);
figure(3);
plot(x, y, 'o', new_x, p, 'r-')
小技巧:短期预测
根据过去10年的中国人口数据,预测接下来三年的人口数据
% 人口预测(注意:一般我们很少使用插值算法来预测数据,随着课程的深入,后面的章节会有更适合预测的算法供大家选择,例如灰色预测、拟合预测等)
population=[133126,133770,134413,135069,135738,136427,137122,137866,138639, 139538];
year = 2009:2018;
p1 = pchip(year, population, 2019:2021) %分段三次埃尔米特插值预测
p2 = spline(year, population, 2019:2021) %三次样条插值预测
figure(4);
plot(year, population,'o',2019:2021,p1,'r*-',2019:2021,p2,'bx-')
legend('样本点','三次埃尔米特插值预测','三次样条插值预测','Location','SouthEast')
建模实例
MathorCup第六届A题淡水养殖池塘水华发生及池水净化处理
%插值预测中间周的水体评价指标
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,'-');%画出每次循环处理后的图像
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的第一行加上周数