Alex_McAvoy

想要成为渔夫的猎手

Matlab 插值法

【是什么】

根据实验来得到的点,绘制出的函数 $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
2
3
4
5
6
7
8
>> x=0:2*pi;
>> y=sin(x);
>> subplot(2,1,1)
>> plot(x,y)
>> subplot(2,1,2)
>> xx=0:0.5:2*pi;
>> yy=interp1(x,y,xx);
>> plot(xx,yy)

快速傅里叶插值

一维快速傅里叶插值利用傅里叶变换,将数据变换到频域,然后频域上增采样点,再逆傅里叶变换回时域

在 matlab 中,利用 interpft(y,q) 来进行分段线性插值

1
2
3
4
5
6
7
8
9
>> x=0:1.2:10;
>> y=sin(x);
>> n=2*length(x);
>> subplot(2,1,1)
>> plot(x,y)
>> subplot(2,1,2)
>> yy=interpft(y,n);
>> xx=0:0.6:10.2;
>> plot(xx,yy)

【二维插值】

  • interp2(X,Y,Z,qx,qy,method):在数据点 [Xi,Yi] 上进行插值,Z 为函数,qx、qy 为要插值的点,method 控制方法

关于 method:

  • 'nearest':临近点插值,插值点函数估计为与插值点最近的数据点的函数值
  • 'linear':双线性插值,相邻点根据线性关系进行插值,默认
  • 'spline':三次样条插值,相邻点建立三次多项式函数来进行插值
  • 'pchip':双立方插值,相邻点通过分段立方法来进行插值

优缺点:

  • 临近点插值:速度最快,平滑性最差
  • 线性插值:运算时间长,曲线结果不会改变,但顶点斜率会变,一般很少使用
  • 三次样条插值:运算时间最长,内存占用较立方插值少,曲线结果与导数是连续的,平滑性最好
  • 立方插值:运算时间较长,内存占用最多,平滑性较好
1
2
3
4
5
6
7
8
9
>> [X,Y]=meshgrid(-5:0.5:5);
>> Z=peaks(X,Y);
>> subplot(2,1,1)
>> plot3(X,Y,Z)

>> [qx,qy]=meshgrid(-5:0.05:5);
>> zz=interp2(X,Y,Z,qx,qy,'spline');
>> subplot(2,1,2)
>> plot3(qx,qy,zz)

感谢您对我的支持,让我继续努力分享有用的技术与知识点!