线性插值数学计算机图形学等领域广泛使用的一种简单插值方法。

如何进行线性插值的呢?

Linear interpolation.png

假设我们已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值。根据图中所示,我们得到

\frac{y - y_0}{y_1 - y_0} = \frac{x - x_0}{x_1 - x_0}. \,\!

假设方程两边的值为 α,那么这个值就是插值系数—从 x0x 的距离与从x0x1 距离的比值。由于 x 值已知,所以可以从公式得到 α 的值

\alpha = \frac{x-x_0}{x_1-x_0}. \,\!

同样,

\alpha = \frac{y-y_0}{y_1-y_0} \,\!

这样,在代数上就可以表示成为:

y = (1 - \alpha) y_0 + \alpha y_1 \,\!

或者,

y = y_0 + \alpha (y_1-y_0)\,\!

这样通过 α 就可以直接得到 y。实际上,即使 x 不在 x0x1 之间并且 α 也不是介于 0 到 1 之间,这个公式也是成立的。在这种情况下,这种方法叫作线性外插—参见 外插值

已知 yx 的过程与以上过程相同,只是 xy 要进行交换。

线性插值近似法

线性插值经常用于已知函数 f 在两点的值要近似获得其它点数值的方法,这种近似方法的误差定义为

R_T = f(x) - p(x) \,\!

其中 p 表示上面定义的线性插值多项式

p(x) = f(x_0) + \frac{f(x_1)-f(x_0)}{x_1-x_0}(x-x_0). \,\!

根据罗尔定理,我们可以证明:如果 f 有两个连续导数,那么误差范围是

|R_T| \leq \frac{(x_1-x_0)^2}{8} \max_{x_0 \leq x \leq x_1} |f''(x)|. \,\!

正如所看到的,函数上两点之间的近似随着所近似的函数的二阶导数的增大而逐渐变差。从直观上来看也是这样:函数的曲率越大,简单线性插值近似的误差也越大。

 应用

线性插值经常用于补充表格中的间隔部分。假设一个表格列出了一个国家 1970年1980年1990年以及 2000年的人口,那么如果需要估计 1994年的人口的话,线性插值就是一种简便的方法。

两值之间的线性插值基本运算在计算机图形学中的应用非常普遍,以至于在计算机图形学领域的行话中人们将它称为 lerp。所有当今计算机图形处理器的硬件中都集成了线性插值运算,并且经常用来组成更为复杂的运算:例如,可以通过三步线性插值完成一次双线性插值运算。由于这种运算成本较低,所以对于没有足够数量条目的光滑函数来说,它是实现精确快速查找表的一种非常好的方法。

 

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

红色的数据点与待插值得到的绿色点

假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 fQ11 = (x1y1)、Q12 = (x1y2), Q21 = (x2y1) 以及 Q22 = (x2y2) 四个点的值。

首先在 x 方向进行线性插值,得到

 f(R_1) \approx \frac{x_2-x}{x_2-x_1} f(Q_{11}) + \frac{x-x_1}{x_2-x_1} f(Q_{21}) \quad\mbox{where}\quad R_1 = (x,y_1),
 f(R_2) \approx \frac{x_2-x}{x_2-x_1} f(Q_{12}) + \frac{x-x_1}{x_2-x_1} f(Q_{22}) \quad\mbox{where}\quad R_2 = (x,y_2).

然后在 y 方向进行线性插值,得到

 f(P) \approx \frac{y_2-y}{y_2-y_1} f(R_1) + \frac{y-y_1}{y_2-y_1} f(R_2).

这样就得到所要的结果 f(x, y),

 f(x,y) \approx \frac{f(Q_{11})}{(x_2-x_1)(y_2-y_1)} (x_2-x)(y_2-y) + \frac{f(Q_{21})}{(x_2-x_1)(y_2-y_1)} (x-x_1)(y_2-y)
  + \frac{f(Q_{12})}{(x_2-x_1)(y_2-y_1)} (x_2-x)(y-y_1) + \frac{f(Q_{22})}{(x_2-x_1)(y_2-y_1)} (x-x_1)(y-y_1).

如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

 f(x,y) \approx f(0,0) \, (1-x)(1-y) + f(1,0) \, x(1-y) + f(0,1) \, (1-x)y + f(1,1) xy.

或者用矩阵运算表示为

 f(x,y) \approx \begin{bmatrix}
1-x & x \end{bmatrix} \begin{bmatrix}
f(0,0) & f(0,1) \\
f(1,0) & f(1,1) \end{bmatrix} \begin{bmatrix}
1-y \\
y \end{bmatrix}

与这种插值方法名称不同的是,这种插值方法并不是线性的,它的形式是

 (a_1 x + a_2)(a_3 y + a_4), \,

它是两个线性函数的乘积。另外,插值也可以表示为

 b_1 + b_2 x + b_3 y + b_4 x y. \,

在这两种情况下,常数的数目]都对应于给定的 f 的数据点数目。

线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。

双线性插值的一个显然的三维空间延伸是三线性插值

posted on 2011-01-19 12:17  夜叉ben  阅读(614)  评论(0)    收藏  举报