概述
最近,在一个项目中使用到了线性插值相关知识。首先我们从最简单的线性插值说起。在理解线性插值的基础上,我们可以去构建更高维度的插值算法。
原理
假设我们已知坐标
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0) 与
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1) ,要得到
[
x
0
,
x
1
]
[x_0,x_1]
[x0,x1] 区间内某一位置
x
x
x 在直线上的值。根据图中所示,我们得到
y
−
y
0
x
−
x
0
=
y
1
−
y
0
x
1
−
x
0
\frac{y-y_0}{x-x_0} = \frac{y_1 -y_0}{x_1-x_0}
x−x0y−y0=x1−x0y1−y0
由于
x
x
x值已知,所以可以从公式得到
y
y
y 的值
y
=
y
0
+
(
x
−
x
0
)
y
1
−
y
0
x
1
−
x
0
=
y
0
+
(
x
−
x
0
)
y
1
−
(
x
−
x
0
)
y
0
x
1
−
x
0
y = y_0 + (x - x_0)\frac{y_1 - y_0}{x_1 - x_0}=y_0 + \frac{(x - x_0)y_1 - (x - x_0)y_0}{x_1 - x_0}
y=y0+(x−x0)x1−x0y1−y0=y0+x1−x0(x−x0)y1−(x−x0)y0
已知
y
y
y 求
x
x
x的过程与以上过程相同,只是
x
x
x 与
y
y
y要进行交换。
- 1维双线性插值
void OneDimansionalInterpolation(int point_n,double x,double* Xn,double *Fn,double output)
{
int i;
for(i=0;i<point_n;i++)
{
if(x < Xn[i])
{
if(i == 0)
{
*output = ((Xn[i+1] - x)*Fn(i) - (Xn[i] - x)*Fn[i+1])/(Xn[i+1] - Xn[i]);
}
else
{
*output = ((x - Xn[i-1])*Fn(i) - (x - Xn[i])*Fn[i-1])/(Xn[i] - Xn[i-1]);
}
}
}
}
目前先写到这,后续会添加2维插值,3维插值,4维插值相关代码。