用不规则数据绘曲面图

实际生活中我们得到的试验数据往往无法满足\(M\times N\)规则网格分布的要求,具有散乱、不规则的特征。用不规则数据绘制曲面图,主要有两种实现方法。[大谦MATLAB,dqmatlab点com]

通过Delaunay三角化绘制曲面图;

通过插值将不规则数据网格化,然后绘曲面图。

下面生成[-8,8]范围内的非均匀采样数据,并用它计算函数,绘制数据点图。

code.matlab
>> x=rand(100,1)*16 - 8;
>> y=rand(100,1)*16 - 8;
>> r=sqrt(x.^2 + y.^2) + eps;
>> z=sin(r)./r;
>> plot(x,y,'.','markersize',12)
>> xlabel('X'), ylabel('Y')
>> grid on

生成图1-3。可见该数据具有随机分布,不规则(散乱)的特征。

Document Image
\[\]

图1-3 数据散点图

1 基于Delaunay三角剖分的曲面图

第4.3节介绍了Delaynay三角化的方法,请参阅。

下面应用Delaunay三角化,并用triplot函数在散点图上叠加生成的三角形。

code.matlab
>> tri=delaunay(x,y);
>> hold on, triplot(tri,x,y), hold off

如图1-4所示。

Document Image Document Image
\[\]

图1-4 对点集进行Delaunay三角化 图1-5 生成三维网格

用trimesh函数生成三维网格。类似地,可以用trisurf函数生成曲面。

code.matlab
>> figure
>> hidden on
>> trimesh(tri,x,y,z)
>> grid on
>> xlabel('X); ylabel('Y'); zlabel('Z')

生成图1-5。

2 散乱数据的网格化

生成散乱数据的曲面图,可以先用griddata函数在非均匀间隔点上进行插值,然后根据插值得到的数据用mesh函数和surf函数进行绘图。

下面的例子计算指定范围内一些随机点上的sinc函数值,然后生成非均匀采样数据,显示为曲面图。包括以下步骤:

用linspace函数生成非均匀采样数据中一定范围内的均匀间隔值。

用meshgrid函数,利用linspace函数的输出数据生成绘图网格。

用griddata函数将非均匀采样数据插值到meshgrid函数返回的均匀间隔网格中。

用绘图函数显示数据。

用linspace函数生成一定范围内均匀间隔的数。

code.matlab
>> xlin=linspace(min(x),max(x),33);
>> ylin=linspace(min(y),max(y),33);

用这些点生成均匀间隔的网格。

code.matlab
>> [X,Y]=meshgrid(xlin,ylin);

用griddata函数,根据原始数据点上的函数值,通过插值法计算均匀间隔点上的函数值。下面的语句采用3次插值生成新数据。

code.matlab
>> Z=griddata(x,y,z,X,Y,'cubic');
Document Image Document Image
\[\]

图1-6 将散点数据网格化以后绘制的曲面图 图1-7 网格化数据绘制的曲面图的俯视图

然后根据插值后的数据绘网格图,用红色圆点表示非均匀采样点。

code.matlab
>> mesh(X,Y,Z2)
>> axis tight; hold on
>> plot3(x,y,z,'.','MarkerSize',15)

结果如图1-6所示。图1-7为俯视图。

上面使用griddata函数进行插值时,使用的是cubic方法,即三次插值。该函数可以采用的方法还包括:

linear – 线性插值(默认)。图形效果如图1-8所示。

nearest – 最近邻插值。图形效果如图1-9所示。

natural – 自然邻点插值。图形效果如图1-10所示。

v4 – 双调和样条插值。图形效果如图1-11所示。

Document Image Document Image
\[\]

图1-8 线性插值效果 图1-9 最近邻插值效果

Document Image Document Image
\[\]

图1-10 自然邻点插值效果 图1-11 双调和样条插值效果