【是什么】
根据实验来得到的点,绘制出的函数 $y=f(x)$ 可能不那么精确,有时就需要通过构造一些点,来构造一个近似函数,以满足我们的需要
拟合:不需要过所有点
插值:需要过所有点
【一维插值】
interp1(x,y,q,method)
:x 为自变量,y 为因变量,q 为插值变量,method 为插值方法
关于 method:
'nearest'
:临近点插值,插值点函数估计为与插值点最近的数据点的函数值'linear'
:线性插值,相邻点根据线性关系进行插值,默认'spline'
:三次样条插值,相邻点建立三次多项式函数来进行插值'pchip'
:立方插值,相邻点通过分段立方法来进行插值
优缺点:
- 临近点插值:速度最快,平滑性最差
- 线性插值:运算时间长,曲线结果不会改变,但顶点斜率会变,一般很少使用
- 三次样条插值:运算时间最长,内存占用较立方插值少,曲线结果与导数是连续的,平滑性最好
- 立方插值:运算时间较长,内存占用最多,平滑性较好
线性插值与分段线性插值
线性插值,是根据两点坐标得到一条线后,根据另一点坐标求得该点另一坐标值
即:$y=y_i+\frac{y_i-y_{i-1}}{x_i-x_{i-1}}(x-x_i)$
在 matlab 中,利用 interp1()
来进行线性插值
分段线性插值,是在每个区间 $[x_i,x_{i+1}]$ 上采取简单的线性插值
在区间 $[x_i,x_{i+1}]$ 上的子插值多项式为:$F_i=\frac{x-x_{i+1}}{x_i-x_{i+1}}f(x_i)+\frac{x-x_i}{x_{i+1}-x_i}f(x_{i+1})$
在 matlab 中,利用 interp1()
来进行分段线性插值
1 | >> x=0:2*pi; |
快速傅里叶插值
一维快速傅里叶插值利用傅里叶变换,将数据变换到频域,然后频域上增采样点,再逆傅里叶变换回时域
在 matlab 中,利用 interpft(y,q)
来进行分段线性插值
1 | >> x=0:1.2:10; |
【二维插值】
interp2(X,Y,Z,qx,qy,method)
:在数据点 [Xi,Yi] 上进行插值,Z 为函数,qx、qy 为要插值的点,method 控制方法
关于 method:
'nearest'
:临近点插值,插值点函数估计为与插值点最近的数据点的函数值'linear'
:双线性插值,相邻点根据线性关系进行插值,默认'spline'
:三次样条插值,相邻点建立三次多项式函数来进行插值'pchip'
:双立方插值,相邻点通过分段立方法来进行插值
优缺点:
- 临近点插值:速度最快,平滑性最差
- 线性插值:运算时间长,曲线结果不会改变,但顶点斜率会变,一般很少使用
- 三次样条插值:运算时间最长,内存占用较立方插值少,曲线结果与导数是连续的,平滑性最好
- 立方插值:运算时间较长,内存占用最多,平滑性较好
1 | >> [X,Y]=meshgrid(-5:0.5:5); |