1 线性插值(Linear Interpolation):
原理:已知一组(x, y)数据点,如[(x0, y0), (x1, y1), ......, (xn, yn)],通过在每一对点之间建立直线方程,来求解出未知点x所对应的y值,如图1.1,图1.2所示:
*注:该方式其实也就是线性样条法,这与如Lagrange插值的插值方式,有一个本质性的区别。
对多个点使用Lagrange插值,其实是使用 “1个” 综合性的多项式,来拟合出一个过这些点的曲线。使用线性样条,则是通过使用 “多个” 更为简单基本的多项式,来拟合出一个曲线。
图1.1
图1.2
如上图中的例子,已知数据 (x2, y2) 与 (x3, y3),要计算 [x2, x3] 区间内某一位置 x 在直线上的y值,则根据(x2, y2) 与 (x3, y3)两点,得出直线方程公式1:
公式1
变换一下,即的到公式2:
公式2 (*:其实这就是2个点情况下的Lagrange插值公式)
因此,在代码实现时,可以通过对每段区间应用公式2,即可计算出每个区间内的线性插值结果。*注:其实就是对“每个”区间段,使用2个点情况下的Lagrange插值公式,从而得到“每个”区间段的一个多项式,这些多项式组成的方程组,即完整的曲线公式。
在具体的代码实现中,有一个比较麻烦的地方是如何快速的确定出x在哪一个(x_i, y_i)区间,如图1.3所示,对于该问题,我采用了"二分法"进行的搜索,这相比于直接遍历搜索,能够很好的提高区间搜索的时间效率
图1.3
对于落在插值点之外的情况,需要进行“外推”计算,如图1.4所示(*:像上面讲的那种待求解点位于插值点范围内的情况所进行的插值运算,我们一般也可称为“内插”)
图1.4
外推法一般预测的误差比较大。一般应用中,我们可以选择下面如图1.5(最邻近插值的方式),1.6(继续使用线性方式进行外推)所示的两种外推方式:
图1.5 对范围之外的点,使用最邻近插值
图1.6 继续使用线性方式进行外推
2 双线性插值(Bilinear Interpolation):
原理:双线性插值,其实就是线性插值在2维数据空间上的拓展
如图2.1所示,先在x方向上:
对点(x0, y0),(x1, y0)进行1次线性插值,得到点(x, y0)的值z_0
对点(x0, y1),(x1, y1)进行1次线性插值,得到点(x, y1)的值z_1
图2.1
接着,如图2.2所示,在y方向上:
对点(x, y0),(x, y1)进行1次线性插值,得到点(x, y)的值z
图2.2
总计使用了3次线性插值
如图2.3,图2.4所示,是更为详细的数据产生过程图
图2.3
图2.4
对于落在插值点之外的情况,需要进行“外推”计算,总共有8个区域,如图2.5中的棕色区域所示
图2.5 对边界之外的区域,可以使用最邻近方式、线性方式进行外推计算
使用最邻近方式进行外推,如图2.6所示:
图2.6 使用最邻近方式外推
使用线性方式进行外推,如图2.7所示:
图2.7 使用线性方式外推
3 ***思考过程中产生的一些误区:
这里有一个我在看插值算法过程中,所产生过的一个思维错误,在这里分享一下:
为什么如图3.1的方式,不能做到2-D数据的线性插值?
图3.1
原因:
如图3.2所示,若采用上面的那种思路,则则在(x, y)处,则没有值可计算了,因为2维空间(x, y)对应的是一个面,因此待求解的坐标点所在区间其实是一个面区域,因此,上述那种思路,其实只能投影到面区域中的一条线上,这是错误的
图3.2
本文原创,转载请注明出处