4.5  插值

插值就是在已知数据之间计算估计值的过程,是一种实用的数值方法,是函数逼近的重要方法。在信号处理和图形分析中,插值运算的应用较为广泛,MATLAB提供了多种插值函数,可以满足不同的需求。

4.5.1  一维数据插值

一维数据插值常使用函数interp1,其一般的语法格式为:yi=interp1(x,y,xi,method)。其中y为函数值矢量,x为自变量的取值范围,x与y的长度必须相同;xi为插值点的向量或者数组,method为插值方法选项。对于插值,MATLAB提供了如下几种方法。

(1)邻近点插值(method=’nearest’)。

(2)线性插值(method=’linear’):在两个数据点之间连接直线,计算给定的插值点在直线上的值作为插值结果,该方法是interp1函数的默认方法。

(3)三次样条插值(method=’spline’):通过数据点拟合出三次样条曲线,计算给定的插值点在曲线上的值作为插值结果。

(4)立方插值(method=’pchip’or’cubic’):通过分段立方Hermite插值方法计算插值结果。

选择一种插值方法时,考虑的因素包括运算时间、占用计算机内存和插值的光滑程度。一般来说:

(5)邻近点插值方法的速度最快,但平滑性最差;

(6)线性插值方法占用的内存较邻近点插值方法多,运算时间也稍长,与邻近点插值不同,其结果是连续的,但顶点处的斜率会改变;

(7)三次样条插值方法的运算时间最长,但内存的占用较立方插值法要少,但其插值数据和导数都是连续的。在这4种方法中,三次样条插值结果的平滑性最好,但如果输入数据不一致或数据点过近,就可能出现很差的插值效果。

【例4-39】  一维插值函数interp1应用与比较示例。

>> x=0:10;

>> y=cos(x);

>> xi=0:0.25:10;

>> strmod={'nearest','linear','spline',' pchip'}%  将插值方法存储到元胞数组

'nearest'    'linear'    'spline'   'pchip'

>> strlb={'(a)method=nearest','(b)method=linear',...

'(c)method=spline','(d)method=pchip'}              %  绘图标签

Columns 1through 2

'(a)method=nearest'   '(b)method=linear'

Columns 3through 4

'(c)method=spline'    '(d)method=pchip'

>> for i=1:4

yi=interp1(x,y,xi,strmod{i});                     %  插值

subplot(2,2,i)                                        %  子图

plot(x,y,'ro',xi,yi,'b'),xlabel(strlb(i))         %  绘图

本例创建了元胞数组strmod来存储4种用到的插值方法{'nearest','linear','spline','pchip'},然后通过循环来调用插值函数interp1,最终插值的结果用图形来对比。一维插值结果比较如图4-4所示。可以看出,三次样条插值结果的平滑性最好,而邻近点插值效果最差。

图4-4  一维插值方法结果比较

4.5.2  二维数据插值

二维插值也是常用的插值运算方法,主要应用于图形图像处理和三维曲线拟合等领域。二维插值由函数interp2实现,其一般语法为:zi=interp2(x,y,z,xi,yi,method)。

其中x和y为由自变量组成的数组,x与y的尺寸相同,z为二者相对应的函数值;xi和yi为插值点数组,method为插值方法选项。interp1函数中的4种插值方法也可以在interp2函数中使用。

【例4-40】  二维插值函数interp2应用与比较示例。

[x,y,z]=peaks(6);                                  %  MATLAB自带的测试函数

mesh(x,y,z)                                        %  绘制原始数据图

title('原始数据')

[xi,yi]=meshgrid(-3:0.2:3,-3:0.2:3);               %  生成供插值的数据网格

strmod={'nearest','linear','spline','cubic'};     %  将插值方法存储到元胞数组

strlb={'(a)method=nearest','(b)method=linear',...

'(c)method=spline','(d)method=cubic'};       %  绘图标签

figure                                           % 建立新绘图窗口

zi=interp2(x,y,z,xi,yi,strmod{i});       % 插值

subplot(2,2,i)

mesh(xi,yi,zi);                             %  绘图

title(strlb{i})                              %  图标题

本例计算了调用'nearest'、'linear'、'spline'和'cubic'等4种方法进行插值,其中原始数据如图4-5所示,插值之后的结果如图4-6所示。由结果图可以看出,各种插值方法的精度是不同的。

图4-5 二维插值原始数据

图4-6  二维插值结果

4.5.3  多维插值

多维插值包括三维插值函数interp3和n维插值函数interpn,其函数的调用方式及插值方法与一维、二维插值基本相同。这里以三维为例,其一般格式为:

zi=interp3(x,y,z,v,xi,yi,zi,method)

其中x、y、z为由自变量组成的数组,x、y、z的尺寸相同,v为相应的函数值;xi、yi、zi为插值点数组,method为插值方法选项。和一维插值的4种方法一致。

【例4-41】  三维插值函数interp3示例。

>> [x,y,z,v]=flow(8);                             %  flow是MATLAB自带的测试函数

>> slice(x,y,z,v,[3,5],2,[-2,3])                  % 画切片图

>> title('插值前')

>>[xi,yi,zi]=meshgrid(0.1:0.25:10,-3:0.25:3,-3:0.25:3);  %  创建插值点数据网格

>> vi=interp3(x,y,z,v,xi,yi,zi);                            %  插值

>> figure

>> slice(xi,yi,zi,vi,[3,5],2,[-2,3])                        %  画插值后切片图

>> title('插值后')

插值前的flow函数如图4-7所示,进行三维插值之后的结果如图4-8所示。

图4-7 插值前函数图

图4-8  插值后函数图

4.5.4  样条插值

样条函数产生的基本思想是:设有一组已知的数据点,目标是找一组拟合多项式。在拟合过程中,对于此数据组的每个相邻样点对(Breakpoints),用三次多项式去拟合样点之间的曲线。为保证拟合的唯一性,对该三次多项式在样点处的一阶、二阶导数加以约束。这样除被研究区间端点外,所有内样点处可保证样条有连续的一阶、二阶导数。

MATLAB中提供了spline函数来进行样条插值。spline函数的调用语法如下。

(1)yy = spline(x,y,xx):根据样点数据(x,y),求xx所对应的三次样条插值。

(2)pp = spline(x,y):从样点数据(x,y)获得逐段多项式样条函数数据pp。

【例4-42】  样条插值spline函数应用示例。

>> x = -4:4;

>> y = [0 .15 1.12 2.36 2.36 1.46 .49 .060];         %  插值前数据

>> cs = spline(x,[0 y 0]);                              %  插值

>> xx = linspace(-4,4,101);                              % 创建绘图自变量数组

>> plot(x,y,'o',xx,ppval(cs,xx),'-');                  %  绘制结果图

得到的结果如图4-9所示。

图4-9  样条插值

编辑:青樱、蓬荜生辉、倾国倾城

复核:数韵校园工作室

如你对话题感兴趣,