数学建模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,模拟产生一些新的但又比较靠谱的值来满足需求,这就是插值的作用。

一维插值问题

问题如下:已经有n+1个节点(xi,yi)(i=0,1,…n)其中xi互不相同,不妨假设a=x0<x1<…<xn=b,求任一插值点x*(!=xi)处的插值y*

插值法java 蒸汽计算公式 插值法举例计算_多项式


插值法的定义:

插值法java 蒸汽计算公式 插值法举例计算_插值法java 蒸汽计算公式_02


插值方法主要有三种:分段插值,插值多项式、三角插值。

分段插值:

每几个点之间构造一个多项式,然后可以构造多个多项式,那么这样就可以产生多个多项式。这就是分段插值。

插值法原理:

插值法java 蒸汽计算公式 插值法举例计算_插值法_03


我们有n+1个点,这n+1个点满足n+1个多项式,那么就可以产生n+1个方程,构造一个方程组。然后将这些方程的参数提取出来组成一个矩阵。

插值法java 蒸汽计算公式 插值法举例计算_插值法java 蒸汽计算公式_04


若A可逆,则A不等于0,则方程式有唯一解。

拉格朗日插值法:

在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。

两个点构成的拉格朗日多项式为:

插值法java 蒸汽计算公式 插值法举例计算_插值法_05


三个点的拉格朗日多项式为:

插值法java 蒸汽计算公式 插值法举例计算_插值法_06


四个点的拉格朗日多项式为:

插值法java 蒸汽计算公式 插值法举例计算_插值法java 蒸汽计算公式_07


插值法java 蒸汽计算公式 插值法举例计算_插值_08


拉格朗日多项式的问题:

龙格现象:插值多项式次数越高误差越小吗?

插值法java 蒸汽计算公式 插值法举例计算_多项式_09


插值法java 蒸汽计算公式 插值法举例计算_插值_10


高次插值会产生龙格现象,即在两端处波动较大,产生明显的震荡。在不熟悉曲线运动趋势的前提下,不要轻易使用高次插值。

由以上可得,插值多项式次数高,精度未必显著提高。那么如何提高插值精度呢?因为存在龙格现象,所以采用分段线性插值来解决。

插值法java 蒸汽计算公式 插值法举例计算_插值法_11


对于一个多项式的点,我们先找距离这个横坐标最近的两个点,然后这两个点连成一个线。然后根据横坐标的点,找到线上纵坐标的点。一般我们常用分段二次插值或者分段三次插值。

分段二次插值:

选取跟节点x最近的三个节点xi-1,xi,xi+1进行二次插值。即在每一个区间[xi-1,xi+1]上,取:

插值法java 蒸汽计算公式 插值法举例计算_插值法java 蒸汽计算公式_12


这种分段的低次插值称为分段二次插值,在几何上就是用分段抛物线代替y=f(x),故分段二次插值又称为分段抛物插值。

牛顿插值法:

插值法java 蒸汽计算公式 插值法举例计算_多项式_13


评价:

与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性,牛顿插值法每次插值只和前面n项的值有关,这样每次只要在原来的函数上添加新的项,就能够产生新的函数,但是牛顿插值也存在龙格现象。

插值法java 蒸汽计算公式 插值法举例计算_多项式_14


插值法java 蒸汽计算公式 插值法举例计算_插值_15


以上两种插值法的缺点:1.存在龙格现象,2.上面的两种插值仅仅要求插值多项式在插值点处与被插函数有相等的函数值,而这种插值多项式却不能全面反映被插值函数的形态,在实际问题种,不仅仅要求被插函数和插值函数在所有节点处有相同的函数值,也需要在一个或全部节点上插值多项式与被插值函数有相同的低阶或者高阶的导数值。然而牛顿法和拉格朗日插值法都不能满足。

埃尔米特插值法:

插值法java 蒸汽计算公式 插值法举例计算_插值法_16


一般插值的要求是函数值要求,但是更高级的插值法的要求是导数值也要对应起来。甚至要求高阶导数值也相等。满足这种要求的插值多项式就是埃尔米特插值多项式。导数值对应起来的原因是保持插值曲线在节点处有切线,也就是保证曲线光滑,使插值函数和被插值函数的密和程度更好。

插值原理:

插值法java 蒸汽计算公式 插值法举例计算_插值法_17


直接使用埃尔米特插值得到的多项式次数较高,也存在着龙格现象,因此在实际应用中,往往使用分段三次埃尔米特插值多项式。

分段三次埃尔米特插值

就是找四个点分段三次。

matlab有内置的函数:

p=pchip(x,y,new_x)

x是已知的样本点的横坐标,y是已知的样本点的纵坐标;new_x是要插入处对应的横坐标。new_x是要插入处对应的横坐标。

例如:

x=-pi:pi;
y=sin(x);
new_x=-pi:0.1:pi;
p=pchip(x,y,new_x);
plot(x,y,'o',new_x,p,'r-')

绘制图像如下:

插值法java 蒸汽计算公式 插值法举例计算_多项式_18


三次样条插值:

插值法java 蒸汽计算公式 插值法举例计算_插值法java 蒸汽计算公式_19


由上可知:需要S(x)是一个三次多项式。还要求S(x)上二阶连续可微。

插值法java 蒸汽计算公式 插值法举例计算_插值_20


matlab里面的内置函数为:spline

p=spline(x,y,new_x)

结果如下:

插值法java 蒸汽计算公式 插值法举例计算_插值_21


n维数据的插值:

p=interpn(x1,x2,xn,y,new_x1,new_x2,new_xn,method)

插值法java 蒸汽计算公式 插值法举例计算_插值法_22


栗子

根据过去10年的中国人口数据,预测接下来三年的人口数据:

populatinotallow=[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’)

插值法java 蒸汽计算公式 插值法举例计算_插值法java 蒸汽计算公式_23


个人感觉三次样条插值预测比灰色预测的更精确

建模实例:

MathorCup第六届A题 淡水养殖池塘水华发生及池水净化处理

附件一给的是1-15周数据,附件二给的是奇数1,3,5,…,15周数据

插值法java 蒸汽计算公式 插值法举例计算_插值_24


上面是数据,附件一中给出的是15周的数据,而附件二给出的是奇数十五周的数据。数据是不对称的。最好的方法是将附件二中缺失的值使用插值算法插进去,使得附件二的数据也是15周。

插值法java 蒸汽计算公式 插值法举例计算_插值_25