Download presentation
Presentation is loading. Please wait.
1
第三单元 第4课 Matlab数据插值 1.一维插值 2.二维插值 3.对非网格数据进行插值
2
1.一维插值 在工程测量和科学实验中,所得到的数据通常是离散的,要得到这些离散点以外的其他点的数值,就需要根据已知的数据进行插值。插值函数一般由线性函数、多项式、样条函数或这些函数的分段函数充当。 一维数据插值:被插值函数有一个单变量。
3
采用的方法有:线性方法、最近方法、三次样条和三次插值。在Matlab中实现这些插值的函数是interp1,其调用格式如下:
Y1 = interp1(X,Y,X1,method) 函数根据X,Y的值,计算函数在X1处的值。X,Y是两个等长的已知向量,分别描述采样点和样本值;X1是一个向量或标量,描述欲插值的点;Y1是一个与X1等长的插值结果。method是插值方法,允许的取值为:
4
(1)‘linear’:线性插值。默认的插值方式。它是把插值点靠近的两个数据点用直线连接,然后在直线上选取对应插值点的数据。
(2)‘nearest’:最近点插值。根据已知插值点与已知数据点的远近程度进行插值。插值点优先选择较近的数据点进行插值。 (3)‘cubic’:3次多项式插值。根据已知数据求出一个3次多项式,然后根据该多项式进行插值。 (4)‘spline’:3次样条插值。指在每个分段内构造一个3次多项式,使其满足插值条件外,在各节点处具有光滑的条件。
5
例12.1:给出概率积分数据表如下,用不同的插值方法计算f(0.472)。
程序如下: x = 0.46:0.01:0.49; f =[ , , , ]; format long interp1(x,f,0.472) interp1(x,f,0.472,’nearest’) interp1(x,f,0.472,’spline’) interp1(x,f,0.472,’cubic’) 其中,3次样条和3次多项式的插值结果优于最近点插值方法和线性插值方法,但插值方法的好坏依赖于被插值函数,没有一种对所有函数都是最好的插值方法。 x 0.46 0.47 0.48 0.49 f(x)
6
2.二维插值 命令 interp2 功能 二维数据内插值(表格查找) 格式1 ZI = interp2(X,Y,Z,XI,YI) %返回矩阵ZI,其元素包含对应于参量XI与YI(可以是向量、或同型矩阵)的元素。参量X与Y必须是单调的,且相同的划分格式,就像由命令meshgrid生成的一样。若Xi与Yi中有在X与Y范围之外的点,则相应地返回NaN。
7
格式2 ZI = interp2(Z,XI,YI) %缺省地,X=1:n、Y=1:m,其中[m,n]=size(Z)。再按第一种情形进行计算。 格式3 ZI = interp2(X,Y,Z,XI,YI,method) %用指定的算法method计算二维插值: ’linear’:双线性插值算法(缺省算法); ’nearest’:最临近插值; ’spline’:三次样条插值; ’cubic’:双三次插值。
8
例12.2:由计算出一些稀梳网格数据,再对整个函数曲面进行各种插值。
[x,y]=meshgrid(-3:.6:3,-2:.4:2); z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y); surf(x,y,z), axis([-3,3,-2,2,-0.7,1.5])
9
用默认的线性插值算法进行插值 >>[x1,y1]=meshgrid(-3:.2:3,-2:.2:2); >>z1=interp2(x,y,z,x1,y1); >>surf(x1,y1,z1),axis([-3,3,-2,2,-0.7,1.5])
10
• 立方和样条插值: >>z1=interp2(x,y,z,x1,y1,'cubic'); >> z2=interp2(x,y,z,x1,y1,'spline'); >>surf(x1,y1,z1),axis([-3,3,-2,2,-0.7,1.5]) >>figure;surf(x1,y1,z2),axis([-3,3,-2,2,-0.7,1.5])
12
3.对非网格数据进行插值 格式:z=griddata(x0,y0,z0,x,y,’method’)
’ v4 ’:MATLAB4.0提供的插值算法,公认效果较好; ’linear’:双线性插值算法(缺省算法); ’nearest’:最临近插值; ’spline’:三次样条插值; ’cubic’:双三次插值。
13
例12.3:在x为[-3,3],y为[-2,2]矩形区域随机选择一组坐标,用’ v4 ‘与’cubic’插值法进行处理,并对误差进行比较。
>> x=-3+6*rand(200,1); >>y=-2+4*rand(200,1); >> z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y); >> [x1,y1]=meshgrid(-3:.2:3,-2:.2:2); >> z1=griddata(x,y,z,x1,y1,'cubic'); >> surf(x1,y1,z1),axis([-3,3,-2,2,-0.7,1.5]) >> z2=griddata(x,y,z,x1,y1,'v4'); >> figure;surf(x1,y1,z2),axis([-3,3,-2,2,-0.7,1.5])
16
误差分析 >> z0=(x1. ^2-2. x1). exp(-x1. ^2-y1. ^2-x1
误差分析 >> z0=(x1.^2-2*x1).*exp(-x1.^2-y1.^2-x1.*y1); >> surf(x1,y1,abs(z0-z1)),axis([-3,3,-2,2,0,0.15]) >> figure;surf(x1,y1,abs(z0-z2)),axis([-3,3,-2,2,0,0.15]
Similar presentations