如何分析和可视化三维速度场?

5
我正在尝试使用计算流体力学领域的最佳实践技术来分析和可视化速度场
给定6个移动粒子位置和速度的数组:x,y,zvx,vy,vz
我想要可视化和计算感应速度场及其属性,例如:旋度散度等值面等。
这是一个谦虚的脚本,其中包含了我能够使用的体积可视化函数,而没有调用meshgrid(以避免插值和更多噪声)。

总的来说,有两件事情我不确定如何明智地从我的50个空间点创建一个网格,第二个是如何使用CFD方法可视化速度场,无论数据点数量很少。

close all
rng default
t=0.1:0.1:10;
x = sin(t)'; 
y = cos(t)'; 
z = t.^0.2';
vx=y;vy=x;vz=z;

figure
subplot(2,3,1);
quiver3(x,y,z,vx,vy,vz);
hold on
streamribbon({ [x y z] }, {vx},{vy},{vz});

subplot(2,3,2);
[curl_val, cav] = curl([x,y,z],[vx,vy,vz]);  
surfc([x,y,z],cav);
subplot(2,3,3);
surfc([x,y,z],curl_val);

w = sqrt( vx.^2 + vy.^2 + vz.^2 );
subplot(2,3,4);
quiver3(x,y,z,vx,vy,vz);
streamtube({ [x y z] }, {w});

subplot(2,3,5);
quiver3(x,y,z,vx,vy,vz);

subplot(2,3,6);
surfc([x,y,z],[vx,vy,vz]);

enter image description here

当我在真实数据上运行上述脚本(不包括数据生成)时,我得到了以下并不是很有信息量的图表:

enter image description here


1
请问您能否添加数据的实际情况,而不仅仅是理想数据的图表呢?我认为这将有助于读者了解为什么传统的图表会失效。 - bremen_matt
@bremen_matt 谢谢,伙计。我很感激。我会这样做的。 - 0x90
1
另外,对于您的数据,您可能希望在没有流带的情况下包含第一个图。原因是太少的数据点以及数据中的噪声可能会使一些传统工具出现问题。其中许多工具本质上是近似噪声信号的梯度,当您这样做时,会放大噪声。通过仅使用箭头绘制速度场,人类更容易看到任何潜在结构。 - bremen_matt
@bremen_matt,已完成。感谢您的评论。我认为最终版本更加全面。 - 0x90
1
你说:“我得到了以下不太有信息量的图表。” 但是制作漂亮的图表并不是CFD的终极目标。你实际上想要展示什么,或者你试图回答什么问题?在我看来,仅从完整的3D数据中获得的简单2D图形通常比这些复杂的图形更具信息量。 - Bernhard
显示剩余3条评论
1个回答

10
我强烈怀疑问题在于数据,而不是可视化技术。但总的来说,问题可能是以下一个或多个方面:
1)你没有足够的数据来捕捉底层动态(空间动态的频率比你采样的频率更高)
2)数据噪声过大,与收集到的数据点数不匹配。
3)流体基本上是湍流的,因此希望得到漂亮的层流图是不可能的。
当你有问题需要可视化数据时,第一条经验法则总是要放弃任何试图以任何方式近似导数(或梯度)的可视化。原因是当你试图用真实数据来近似导数时,噪声几乎总会使得估计值毫无意义。例如,假设我们有一个余弦函数,被某些噪声破坏了,我们试图从数据中数值地估计导数。
figure
% Create a signal 
dt  = .1;
t = 0:.1:10;
x = cos(t);

% Add some noise 
y = x + .5 * randn(size(x));

% Compute the first order approximation of the derivatives of the signals 
dx = diff(x)/dt;
dy = diff(y)/dt;

% Plot everything
subplot(2,1,1)
plot(t,x,t,y)
axis tight
subplot(2,1,2)
plot(t(2:end),dx,t(2:end),dy)
axis tight

在此输入图像描述

在第一个图中,显示了原始数据,噪声看起来还不错,但是当我们看到导数估计时!哎呀...噪声真的被放大了。因此,请忘记关于流的更高阶特性,例如旋度和涡度,因为它们需要数据的梯度。

那么在这种情况下我们能做什么呢?基本上,只需查看原始数据即可。如果有模式,它将显现出来。例如,让我们从3个不同的角度查看您的原始速度向量:

data = dlmread('data.csv','\s')
x = data(:,1);
y = data(:,2);
z = data(:,3);
vx = data(:,4);
vy = data(:,5);
vz = data(:,6);

close all
figure
subplot(1,3,1);
quiver3(x,y,z,vx,vy,vz);
view([1,0,0])
subplot(1,3,2);
quiver3(x,y,z,vx,vy,vz);
view([0,1,0])
subplot(1,3,3);
quiver3(x,y,z,vx,vy,vz);
view([0,0,1])

enter image description here

唯一看起来有点结构化的是最后一个图。然而,那个图告诉我们,我们可能还要应对湍流(除了噪音)。

具体来说,从第三个视角来看,你肯定是在一个紧贴着物体的流中进行速度测量。在这种情况下,你的测量可能过于严格了......并且可能处于边界层中。如果是这种情况(测量位于边界层),那么你可以得到流中的时变效应,这意味着在没有时间组件的情况下查看任何内容都是没有意义的。你在回答中拥有的“好”图只有在流是层流时才真正有用,因为我们可以看到这些漂亮、一致的流线。如果是湍流,则无论你如何努力寻找,都看不出流中的任何可辨别模式。

因此,总之,我认为你不可能为你的数据找到一个好的可视化,因为你使用的传感器可能太嘈杂,或者流动太湍流了。

另外...考虑一下当我们查看你的“好”数据集中的原始速度矢量时会发生什么:

enter image description here

那,我的朋友,就像是一只训练有素的家庭宠物。你手上却拥有一头野生的山狮。


谢谢,您能否解决可视化问题? - 0x90
在我看来,你使用的可视化工具是完全正常和有效的。作为证明,只需看一下你生成的第一组图表。因此,我不确定你在这方面期望什么。我的回答希望强调的是问题不在于你使用的可视化工具,而在于数据本身。如果你想捕捉流程中的某个特定方面,而这些图表没有捕捉到,那么请告诉我们。 - bremen_matt
此外,从数据点生成网格并没有太多意义,因为本质上你是在询问如何在一个小数据集上进行插值。虽然你可以这样做,但你必须知道底层动态才能做得好。 - bremen_matt
我同意,这就是为什么我问这个问题的原因。 - 0x90
实际流程,但我的问题是关于最优数据的,我喜欢你的噪声分析,不过如果你能添加可视化部分就更好了。 - 0x90
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接