一些时候如果想要通过已知数据推断未知数据时,我们就要用到数据插值,若是想要得到数据集内部的数据就是内插;想要得到数据集外部数据时就是外插.
插值的方法中应用最多的是一维数据插值.下面是一种用MATLAB进行一维数据插值的方法.
内插
MATLAB中用interp1(x,y,xi,method)
函数实现一维数据插值,x,y
是已知数据(x,y均用向量表示),xi
表示希望获得的位置数据横坐标,method
表示使用的插值方法.
参数method
有'nearest'
,'linear'
,'spline'
,'cubic'
四个可供选择,分别表示最近邻插值、线性插值、样条插值和三次插值,以下为使用举例:
已知数据为 x = [ 1, 2, 3, 5, 6, 8, 10, 11 ] , y = [ 0, 4.2, 5.6, 6.4, 7.2, 8.8, 7.0, 5.3 ]
% 'spline' method
x = [ 1, 2, 3, 5, 6, 8, 10, 11 ] ;
y = [ 0, 4.2, 5.6, 6.4, 7.2, 8.8, 7.0, 5.3 ] ; % 输入已知数据
x_ = x(1) : 0.5 : x(end) ; % 以间隔0.5进行插值
for i=1 : length(x_)
y_(i)=interp1(x , y , x_(i) , 'spline');
end % 利用for循环对'spline'插值的所有插值点进行插值
plot(x,y,'r*'); % 画出已知数据点,用红色*表示
hold on;
plot(x_,y_,'b-'); % 画出插值得到的点的图像,用蓝色-连接
运行以上代码就得到了下图
其他方法同样道理,全部画出后我们就会得到下图
这几张图对比之后我们会发现,利用最近邻插值得到的图像最为粗糙,线性插值实际上就是用直线将已知数据相连,所以这两种方法误差可能比较大;而样条插值和三次插值利用三次函数拟合和Hermit插值的原理,得到的曲线较为平滑.
外插
外插的方法实际上与内插类似,唯一不同就是需要给interp1(x,y,method)
函数增加一个新的参数(标注)'extrap'
如下
interp1(x,y,'spline','extrap')
即可