数模比赛中,常常需要根据已知的函数点进行数据,模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些新的但又比较靠谱的值来满足需求,这就是插值的作用。
主要概念:
- 插值函数
- 插值
- 插值法
插值法:
设函数y=f(x)在区间[a,b]上有定义,
且已知在点a上的值分别为:
若存在一简单函数P(x),使
则称P(x)为f(x)的插值函数,点称为插值节点,包含插值节点的区间[a,b]称为插值区间
求插值函数P(x)的方法称为插值法。
三种方法(分段插值法最为常用):
若P(x)是次数不超过n的代数多项式,即:,称为插值多项式。
若P(x)为分段多项式,就称为分段插值。
若P(x)为三角多项式,就称为三角插值。(一般要用到傅里叶变换等复杂的数学工具)
插值法原理:
注:
只要n+1个节点互异,满足上述插值条件的多项式是唯一存在的。
如果不限制多项式的次数,插值多项式并不唯一。
一维数据的插值(掌握)
多项式插值——1.拉格朗日插值法:
在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫∙路易斯∙拉格朗日命名的一种多项式插值方法。在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。
两个点:
三个点:
四个点:
数学语言描述:
存在的问题:龙格现象(Runge phenomenon)
高次插值会产生龙格现象,即在两端处波动极大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值。
缺点:插值多项式次数高精度未必显著提高;插值多项式次数越高摄入误差可能显著越大。
2.分段线性插值(分段二(三)次插值法):
提高插值精度可用分段低次插值。
3.牛顿插值法
拉格朗日插值法和牛顿插值法的对比:
与拉格朗日插值法(计算过程较为麻烦)相比,牛顿插值法的计算过程具有继承性。(牛顿插值法每次插值只和前n项
的值有关,这样每次只要在原来的函数上添加新的项,就能够产生新的函数)
但是牛顿插值也存在龙格现象的问题。
上面讲的两种插值仅仅要求插值多项式在插值节点处与被插函数有相等的函数值,而这种插值多项式却 不能全面反映被插值函数的性态。
然而在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值,它也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值。
对于这些情况,拉格朗日插值和牛顿插值都不能满足。
注:实际建模过程中不能使用这两种插值法,一般使用分段插值法。
(重要)4.分段三次埃尔米特插值
直接使用Hermite插值(保证函数和导数值相等)得到的多项式次数较高,也存在着龙格现象,
因此在实际应用中,往往使用分段三次 Hermite 插值多项式 (PCHIP)。
Matlab有内置的函数:(实现过程已经帮我们封装好了,会调用就行了)
解释:
1. x = ‐pi:pi x的取值是从-pi开始,公差为1,到pi结束的7个数(-3.1416 -2.1416 -1.1416 -0.1416 0.8584 1.8584 2.8584 )
2.‐pi:0.1:pi 插值的点以精度0.1来插值
3.p = pchip(x,y,new_x) x,y:初始点的横纵坐标;new_x:想要插值的点的横坐标;p:插值后对应的纵坐标
4.plot(x, y, 'o', new_x, p, 'r‐') x,y用散点画;new_x, p用实线画
plot函数用法(画图函数):
plot(x1,y1,x2,y2)
'r‐',线方式: - 实线 :点线 -. 虚点线 - - 波折线
'o',点方式(散点图): . 圆点 +加号 * 星号 x x形 o 小圆
颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青
(重要)5.三次样条插值
Matlab有内置的函数:
说明:
画图后可用legend函数加注释;
legend(string1,string2,string3, …)函数:
分别将字符串1、字符串2、字符串3……标注到图中,每个字符串对应的图标为画图时的图标。
‘Location’函数用来指定标注显示的位置。
注意:
在做图前要加 figure(1) 函数
在同一个脚本文件里面,要想画多个图,需要给每个图编号,否则只会显示最后一个图。
n维数据的插值(了解)
p = interpn(x1,x2,...,xn, y, new_x1,new_x2,...,new_xn, method)
x = ‐pi:pi; y = sin(x);
new_x = ‐pi:0.1:pi;
p = spline(x, y, new_x);
等价于 p = interpn (x, y, new_x, ’spline’);
plot(x, y, 'o', new_x, p, 'r‐')
解释:
x1,x2,...,xn是已知的样本点的横坐标
y是已知的样本点的纵坐标坐标
new_x1,new_x2,...,new_xn是要插入点的横坐标
method是要插值的方法(四种):
‘linear’:线性插值(默认算法);
‘cubic’:三次插值;
‘ spline’ :三次样条插值法; ( 最为精准 )
‘nearest’:最邻近插值算法。
应用:插值算法可用于短期预测(人口预测)
根据过去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) %三次样条插值预测
plot(year, population,'o',2019:2021,p1,'r*‐',2019:2021,p2,'bx‐')
legend(‘样本点’,‘三次埃尔米特插值预测’,‘三次样条插值预测','Location','SouthEast')
注意:实际建模过程中,大家尽量不要用插值算法来预测,上面只是举的一个小例子;
如果要预测,可以选择下一讲要学的拟合算法,也可以使用之后要学的专门用于预测的算法。
插值算法预测要比灰色预测更准确一些(小声)
感谢观看!