数模算法:插值算法
程序员文章站
2022-05-22 14:13:03
...
引入:
实际中有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,根据已知的函数点进行数据、模型的处理和 分析,“模拟产生”一些新的但又比较靠谱的值来满足需求
常用方法:
分段三次埃尔米特插值
直接使用Hermite插值得到的多项式次数较高,也存在着龙格现象(次数越高两端出现震荡现象), 因此在实际应用中,往往使用分段三次Hermite插值多项式(PCHIP)。
Matlab有内置的函数,配合plot函数画图
p = pchip(x,y,new_x)
x是已知的样本点的横坐标;y是已知的样本点的纵坐标;new_x是要插入处对应的横坐标
例如
x=-pi:pi;
y=cos(x);
new_x=-pi:0.1:pi;%要插值的点
p=pchip(x,y,new_x);
figure(1)%为图片编号
plot(x,y,'o',new_x,p,'b-')
结果
三次样条插值
Matlab有内置的函数:
p = spline(x,y,new_x); 等价于 p = interpn(x, y, new_x, ’spline’);
x是已知的样本点的横坐标;y是已知的样本点的纵坐标;new_x是要插入处对应的横坐标
例如
x=-pi:pi;
y=cos(x);
new_x=-pi:0.1:pi;%要插值的点
p1=pchip(x,y,new_x);%分段三次埃尔米特插值
p2=spline(x,y,new_x);%三次样条插值
figure(1)%为图片编号
plot(x,y,'o',new_x,p1,'b-',new_x,p2,'r-')
%标注显示在东南方向
legend('样本点','分段三次埃尔米特插值','三次样条插值','Location','SouthEast')
结果对比
插值算法也可用于预测
实例:预测接下来三年的人口数据
matlab代码
%数据存在X,Y变量中
P=X;
year=Y;
p1=pchip(year,P,2019:2021);
p2=spline(year,P,2019:2021);
figure(1);
plot(year,P,'o',2019:2021,p1,'b*-',2019:2021,p2,'r*-')
legend('样本点','分段三次埃尔米特插值','三次样条插值','Location','SouthEast')
结果
建模应用实例:
MathorCup第六届A题淡水养殖池塘水华发生及池水净化处理,插值预测中间周的水体评价指标
对1号池给出数据的指标插值得到其他数据
matlab代码
%导入数据
load Data.mat
[n,m]=size(Data);
%星期数
W=Data(1,:);
disp(['共需要对' num2str(n-1) '个指标插值']);
%要插值的指标
targetname={'周数','轮虫','溶氧','COD','水温','PH值','盐度','透明度','总碱度','氯离子','透明度','生物量'};
P=zeros(11,15);
for i=2:n
y=Data(i,:);%取出原有的每行数据
new_x=1:15;%要插值的x
p1=pchip(W,y,new_x);%三次埃尔米特插值
p2=spline(W,y,new_x);%三次样条插值
figure(1);
subplot(4,3,i-1);%将所有图放在4*3大图上
plot(W,y,'o',new_x,p1,'r*-');
axis([0 15,-inf,inf])%设置横坐标轴范围,星期数,纵坐标不变
ylabel(targetname{i});%y坐标标题
figure(2);
subplot(4,3,i-1);%将所有图放在4*3大图上
plot(W,y,'o',new_x,p2,'b*-');
axis([0 15,-inf,inf])%设置横坐标轴范围,星期数,纵坐标不变
ylabel(targetname{i});%y坐标标题
P(i-1,:)=p1;%结果保存
end
legend('原始数据','插值后数据','Location','SouthEast')
P=[1:15;P]%星期数加回第一行
三次埃尔米特插值结果
三次样条插值结果
最终数据
上一篇: 数模算法:灰色关联分析
下一篇: 数模算法:主成分分析