大家好,欢迎来到IT知识分享网。
matlab流场可视化后处理
1流体中标量的可视化
流体力学中常见的标量为位置、速度绝对值、压强等。
1.1 云图
close all load wind x2=x(:,:,5);y2=y(:,:,5);u2=u(:,:,5);v2=v(:,:,5); %速度云图 figure() pcolor(x2,y2,sqrt(u2.^2+v2.^2)) shading interp%插值绘制颜色
绘制结果如下:
1.2 切片图绘制
close all load wind %涡量切片图绘制 %构建颜色图 mycmp=[[ones(20,1),(0.05:0.05:1)',(0.05:0.05:1)'];[(1:-0.05:0.05)',(1:-0.05:0.05)',ones(20,1)]]; cav = curl(x,y,z,u,v,w); %计算旋度 h = slice(x,y,z,cav,[90 134],59,0); %切片 shading interp daspect([1 1 1]); %坐标轴缩放 axis tight colormap(mycmp); caxis([-5,5]) %确定颜色范围,使得颜色图中白色对应0涡量 camlight %设置光照 set([h(1),h(2)],'ambientstrength',.6); %调整局部亮度
关于切片的更多方法,可以参见matlab的教程:
Exploring Volumes with Slice Planes利用切片平面探索三维体
1.3 三维等值面图绘制
close all clear load wind figure wind_speed = sqrt(u.^2 + v.^2 + w.^2);%速度 %绘制等值面 hiso = patch(isosurface(x,y,z,wind_speed,40)); isonormals(x,y,z,wind_speed,hiso) %平滑 hiso.FaceColor = 'red'; %等值面上色 hiso.EdgeColor = 'none'; %绘制断面 hcap = patch(isocaps(x,y,z,wind_speed,40),... 'FaceColor','interp', 'EdgeColor','none'); colormap hsv %调整图片视角光源等 axis tight set(gca,'BoxStyle','full','Box','on') camproj perspective %camzoom(1.25) view(65,30) camlight(-45,45) hcap.AmbientStrength = 1; lighting gouraud daspect([1 1 1]);
2流体中矢量的可视化
流体中常见的矢量有速度矢量、旋度矢量、梯度矢量等。
2.1 箭头图或速度图
matlab常用的速度图函数为quiver和quiver3。
quiver为二维矢量图绘制,用法如下图所示。如果绘制箭头太密集,可以采用间隔采样的方式绘制。
load wind figure() x2=x(:,:,5);y2=y(:,:,5);u2=u(:,:,5);v2=v(:,:,5); Q=quiver(x2,y2,u2,v2);%详见帮助文档quiver Q.AutoScaleFactor=1.2;%更改箭头比例,详见帮助文档Quiver Properties
输出结果如下
quiver3为3维矢量场的绘制。可视化效果不如coneplot函数的圆锥图。
推荐搭配空间曲面的使用。参见quiver3帮助文档。https://ww2.mathworks.cn/help/matlab/ref/quiver3.html
load wind quiver3(x([5 10],:,:),y([5 10],:,:),z([5 10],:,:),u([5 10],:,:),v([5 10],:,:),w([5 10],:,:))%quiver3
2.2 流线图
matlab中绘制流线常用的函数有:streamline、streamslice、stream2、stream3、interpstreamspeed。
matlab中标准的流线图streamline需要知道流场的起始点,但通常对于复杂流场,起始点没有规律。而且二维流场streamline也不会显示流场方向。
一种解决方法为随机在空间中散布一些点,然后以这些点为起点正向反向同时绘制流线。
matlab中的streamline用法:
load wind x2=x(:,:,5);y2=y(:,:,5);u2=u(:,:,5);v2=v(:,:,5); hold on startx=73*ones(1,6);starty=20:5:45;%定义流线起点 streamline(x2,y2,u2,v2,startx,starty) quiver(x2(1:3:end,1:3:end),y2(1:3:end,1:3:end),u2(1:3:end,1:3:end),v2(1:3:end,1:3:end),'color','r') hold off
结果如下所示
双向随机绘图:
load wind figure() N=30; %随机点的数量 x2=x(:,:,5);y2=y(:,:,5);u2=u(:,:,5);v2=v(:,:,5); maxx=max(x,[],'all');minx=min(x,[],'all'); maxy=max(y,[],'all');miny=min(y,[],'all');%最大值最小值 startx=rand(N,1)*(maxx-minx)+minx; starty=rand(N,1)*(maxy-miny)+miny;%生成随机点 XY1 = stream2(x2,y2,u2,v2,startx,starty);%正向流线计算 XY2 = stream2(x2,y2,-u2,-v2,startx,starty);%反向流线计算 hold on for j=1:N %绘制流线 plot([flipud(XY2{
j}(:,1));XY1{
j}(:,1)],[flipud(XY2{
j}(:,2));XY1{
j}(:,2)],'-k') end quiver(x,y,u,v) hold off
如果流场可以用具体的流函数表示出来,则可以利用等值线的方式绘制:
%等势面方法 [x2,y2]=meshgrid(-5:0.1:5,-5:0.1:5); P=x2.^2-y2.^2;Q=2*x2.*y2; [u2,v2]=gradient(P);u2=-u2;v2=-v2;%势函数全部是负号 max(abs(curl(x2,y2,u2,v2)),[],'all'); figure hold on pcolor(x2,y2,P)%势函数 shading interp quiver(x2(1:8:end,1:8:end),y2(1:8:end,1:8:end),u2(1:8:end,1:8:end),v2(1:8:end,1:8:end),'color','r') contour(x2,y2,Q,'LineColor','k','LineWidth',1.5,'LevelList',linspace(-50,50,20)) caxis([-25,25]) hold off
对于3维流场的流线图,推荐用streamslice绘制。
https://ww2.mathworks.cn/help/matlab/ref/streamslice.html
streamslice的优点是可以很好的反应出方向和中断,这里就不做过多说明了。
对如何绘制流线或向量场感兴趣的,可以参见我的另一篇文章:
利用matlab绘制二维均匀流线和向量场(向量场彩色箭头,颜色随变量变化)
2.4 带节点的流线图
matlab中带节点的流线图函数为interpstreamspeed()。它在每条流线上添加了一定的节点,单根流线上的节点密集代表流速慢,节点稀疏代表流速快。
这个函数直接看interpstreamspeed的帮助文档就行了,可视化效果不是很美观。
2.5流管图和流带图
matlab中的流管图和流带图函数为streamtube和streamribbon,可以同时反映流场的方向、的、散度、旋度信息。
下图为流管图示意图:
load wind%[x,y,z,v]=flow(); [sx,sy,sz] = meshgrid(80,20:10:50,0:5:15); verts = stream3(x,y,z,u,v,w,sx,sy,sz); div = divergence(x,y,z,u,v,w); htubes=streamtube(verts,x,y,z,-div);%以上3行可以用streamtube(x,y,z,u,v,w,sx,sy,sz);代替 set(htubes,'EdgeColor','none','AmbientStrength',.5) shading interp%彩色 view(3); axis tight camlight lighting gouraud
绘制结果如下:
其中流管的粗细代表散度的变化,流管的方向代表流线的变化。
流带图的绘制如下所示:
figure() load wind [sx,sy,sz] = meshgrid(80,20:10:50,0:5:15); verts = stream3(x,y,z,u,v,w,sx,sy,sz); cav = curl(x,y,z,u,v,w);%旋度 spd = sqrt(u.^2 + v.^2 + w.^2).*.1;%速度 streamribbon(verts,x,y,z,cav,spd); axis tight shading interp view(3); camlight; lighting gouraud
绘制结果如下:
除了方向和散度,流带的扭转还能表示旋度的变化。
此外matlab官方还有一副很酷炫的流带图,我也摘了过来:
2.6 圆锥体图
在三维向量场中以圆锥体形式绘制速度向量,由于其立体感比quiver3更好,所以更常用于三维流场。函数为coneplot。
clear close all load wind xmin = min(x(:)); xmax = max(x(:)); ymin = min(y(:)); ymax = max(y(:)); zmin = min(z(:));%确定最大最小值 xrange = linspace(xmin,xmax,8); yrange = linspace(ymin,ymax,8); zrange = 3:4:15; [cx,cy,cz] = meshgrid(xrange,yrange,zrange);绘制点的坐标位置 figure hcone = coneplot(x,y,z,u,v,w,cx,cy,cz,5); hcone.FaceColor = 'red'; hcone.EdgeColor = 'none'; view(30,40) daspect([2,2,1]) camlight right lighting gouraud hcone.DiffuseStrength = 0.8;
效果如下:
2.7 粒子动画图
load wind figure daspect([1,1,1]); view(2) [verts,averts] = streamslice(x,y,z,u,v,w,[],[],[5]); sl = streamline([verts averts]); axis tight manual off; ax = gca; ax.Position = [0,0,1,1]; %set(sl,'Visible','off') iverts = interpstreamspeed(x,y,z,u,v,w,verts,.05); zlim([4.9,5.1]); streamparticles(iverts, 200, 'Animate',15,'FrameRate',40, ... 'MarkerSize',10,'MarkerFaceColor',[0 .5 0])
输出粒子在某一时刻的截图如下:
2.8 Volume Viewer APP
最近看到了一个App,在matlab菜单栏的App里面,叫做Volume Viewer。看起来很有意思,用一个小的GUI形式,提供了三维数据的查看方式。
里面可以进行颜色映射、颜色透明度映射等修改。可以自定义切片。数据导入支持从已有的mat文件或者已有的变量导入。
如果只是快速查看三维数据的话,这种拖拖拽拽点点点就能看的感觉还是挺方便的。
3 参考链接
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/158932.html