大家好,又见面了,我是你们的朋友全栈君。
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 样条插值
编辑:青樱、蓬荜生辉、倾国倾城
复核:数韵校园工作室
如你对话题感兴趣,
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135934.html原文链接:https://javaforall.cn