根据 MA​​TLAB 中的数据集绘制曲面

计算科学 matlab 插值 可视化 绘图 3d
2021-12-05 04:53:01

我尝试在 MATLAB 中绘制曲面,但由于这是我第一次必须做这样的事情,我需要确认我遵循的过程,因为绘制正确的曲面对我的项目很重要。

我从测量数据中获得了 3 个向量:(位移)、(速度)和(力)。目标是绘制一个曲面,其中代表平面中的一个点,是该平面上方的“高度”。这个想法是要有一个非常光滑的表面,因为我必须使用数学模型拟合从测量数据创建的这个表面。xvpxvp

这就是我所做的:

首先我创建了网格:(因为我的测量向量有超过 400000 个样本,我是否必须使用超过 1000 个x_plot才能y_plot得到一个好的图?当我增加过多的长度时我也有一个问题x_plotand y_plot,事实上我收到"out of memory"错误消息)

x_plot = linspace(min(x),max(x),1000);
y_plot = linspace(min(v),max(v),1000);
[XI,YI] = ndgrid(x_plot,y_plot);

然后我创建分散数据插值:

F = TriScatteredInterp(x,v,p,'natural');

现在我评估网格上的插值:

ZI = F(XI,YI);

最后我绘制表面:

figure()
mesh(XI,YI,ZI)

这是正确的方法吗?

使用 ndgrid 或 meshgrid 创建网格更好吗?

1个回答

使用稍微不同的表面绘图方法可能会更好,尤其是当您遇到内存问题时。你现在正在做的实际上是两件不同的事情:

  1. 将数据插值到网格上。

  2. 在网格上绘制与插值数据对应的表面。

由于您有一些可能与您的网格不对齐的原始数据值,这会增加与插值相关的额外错误。它还给出了具有统一数据的外观,无论这是否正确。

这是我将采取的方法:

  1. 使用生成数据点的三角剖分delaunay

  2. 使用trisurf(或者trimesh如果您愿意)使用三角测量来绘制数据

这具有直接绘制数据而不需要插值到网格的优点。它还将最小化使用的内存量并消除设置网格分辨率的需要。

这是一个最小的例子:

clear all

% Number of points:
N = 10000;

% Generate some points:
x = 15*(rand(N,1)-.5);
y = 15*(rand(N,1)-.5);
z = cos(sqrt(x.^2+y.^2)).*exp(-0.025*(x.^2+y.^2));

% Delaunay triangulation:
tri = delaunay(x,y);

% Plot:
figure(1)
clf
trisurf(tri,x,y,z,'linestyle','none')
shading interp
lighting p
camlight

如果您愿意,可以使用patch代替trisurf

figure(1)
clf
p.Faces=tri;
p.Vertices=[x, y, z];
p.FaceVertexCData=z;
patch(p)
view(3)
shading interp
lighting p
camlight

结果如下:

trisurf 或三角形曲面的补丁图

请注意,这将产生由一组三角形组成的分段平面。显然,您拥有的点越多,表面看起来就越平滑。如果你想平滑这个表面,我认为这真的是一个单独的问题。