数学建模笔记(1):插值法

1.插值法的用途

在对数据进行处理的时候,我们往往会碰到由于数据量比较小的情况,这样的情况不利对数据进行分析。插值法就是是针对这种情况,模拟产生和原来数据相近的数据来为数据分析提供完整可靠的数据。

总结:插值法是一种自己生产数据,使原数据完整的方法,同时这些数据和原有的数据是具有相同规律的。

2.插值法的实现方法

插值法总体来讲就是我们高中导数中学过的拟合方法。在二维平面上,已知存在横坐标为x_{1},x_{2}...x_{n},纵坐标为y_{1},y_{2}...y_{n}的n个函数值,插值法的目标就是找到一个函数f(x),使得任意f(x_{i})=y_{i}。这个过程其实本质上就是找一个拟合函数来是所有点都落在这个拟合函数上。

常见的插值方法有:

  • 多项式拟合,使用一个多项式a_0+a_1x+a_2x^2+...+a_nx^n来对所有的函数点进行拟合。
  • 分段插值,将所有函数点分为几段,每一段采用一个多项式进行拟合。
  • 三角插值,比较复杂,多项式为三角多项式(即x替换为\sin x或者\cos x),与傅里叶变换有关。

一般在比赛中,前两种方法使用的更多,尤其是第二种。 

两点注意,证明唯一性的过程在此省略,第二点也很好理解,次数的高低影响的是拟合的效果。

获得多项式函数的方法

拉格朗日插值法

具体的公式如下:

f(x) = \sum_{i=0}^{n} f(x_i) \cdot l_i(x)

l_i(x) = \prod_{\substack{j=0 \\ j \neq i}}^{n} \frac{x - x_j}{x_i - x_j} 

其中的f(x)就是插值函数,在已知n个函数点的情况下,根据这n个点推导出插值函数的方法。 

但是拉格朗日插值法的问题在于,当我们尝试仅仅是用一个多项式对所有函数点进行拟合,随着多项式最高次数的增大,拟合的效果随着自变量的增大可能会出现较大的波动,与实际的趋势相差较大。

如下图所示,高次多项式在原点处的拟合效果尚可,但是当自变量增大时,误差就会很大了。

因此,我们需要效果更好,更加稳定的方法来进行插值。

分段插值法 

顾名思义,即将已知的函数点进行划分,当我们想要获得某一个未知横坐标下的函数值,我们可以选取距离该点最近的两个点或者三个点,构造两点之间的线性函数或者三点之间的二次函数(抛物线)进行插值。

分段二次插值的公式如下:

牛顿插值法

牛顿插值法的概念如下,系数是一个叫做差商的东西。

差商的定义如下,可以看到,差商的计算是一个递归的形式,k阶差商是由两个k-1阶差商构造而成的,一阶差商是不是很像没取极限的导数的定义?

最终整体公式的表现形式为

牛顿插值法相对于拉格朗日插值的优势在于,牛顿插值法的结果可以通过递归产生,因此每多增加一个点, 通过前面的函数递归即可完成,比拉格朗日更加简单。但是牛顿插值法也存在之前所说的震荡不稳定的问题,所以用处也不大。

Hermite插值法

上述的插值法其实仅仅考虑了插值函数在函数点处的函数值相等的问题,但是拟合效果的好坏还和函数的趋势(形态)有关,这就涉及函数的导数问题。因此Hermite插值法是想要获得更高精度的插值的很好选择。

Hermite多项式的定义如下

 Hermite多项式的计算方法:

Hermite插值通过构造高阶连续的插值多项式,要求函数值,导数值,甚至更高阶导数值相同使得插值结果更加平滑且精确。

三次分段埃尔米特插值法(最常用,MatLab中有直接的函数可用)

具体原理远离在这里不进行详细的描述,这个方法在matlab中有直接的函数pchip可以使用,这里就简单介绍一下pchip的使用方法。下面是一个简单示例。

其中,x代表已知的函数点的横坐标数组,y代表已知函数点的纵坐标数组,new_x代表需要进行插值的点的横坐标,new_y代表插值获得的纵坐标。pchip函数最终返回的是new_y这个纵坐标。

plot函数是绘图函数,他的传参形式可以总结为:需要进行绘制的点的横坐标+纵坐标+绘制形式(以字符串形式),可以绘制多个,如上,只需格式一样即可。

下面是plot函数中的绘制形式的总结,绘制形式可以进行组合,每个字符都代表一个类型的一种。在实例中,前一个使用的圆点的格式,后一个使用的是红色实线的格式。

最后的语句figure是用来给图片进行编号的。目的是防止当一个代码中出现了多个绘图的时候,如果不编号会进行覆盖。

最终的插值结果如下,可以看到插值的结果还是比较贴近原函数的。

三次样条插值(比上一个方法更加精确,也比较常用)

三次样条插值相比于上一个方法的精确之处在于,他要求插值函数在整个插值区间上二阶连续可微,在每个分段区间的端点处都要满足以下条件:

同样,matlab也提供了这个方法的实现函数spline,下面是简单示例和结果,和原来的sinx函数的贴合程度比较高。

当然,三次样条插值方法还可以用interpn加上方法类型的参数来实现。spline(x,y,new_x)等价于interpn(x,y,new_x,'spline');

n维数据的插值(少用)

上面的都是在一维数据的层面上进行,如果数据有多个维度,可以使用上面的interpn函数来进行插值。

格式为:Vq = interpn(X1, X2, ..., Xn, V, Xq1, Xq2, ..., Xqn);

x1,xn代表已知的点在各个维度上的分量值的序列,可以理解为不同的自变量的值;

V代表的是这些点的纵坐标(广义上的),维度与前边的x中的数据数量一样,可以理解为因变量的值。

xq则是最终要插值的序列,最终返回插值获得的因变量的序列。

其他还有一些有关绘图的技巧,我就不在这里介绍了。总结一下,常见的插值方法就是三次埃尔米特方法和三次样条插值,并且在matlab中都有对应函数可以直接实现,总体来说难度不大。

插值的应用场景,可以在数据的预处理阶段对数据进行补齐,也可以使用插值函数进行预测,插值的用处还是很多的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值