matlab流场可视化后处理

标签: matlab  流场  可视化  流线  后处理

1流体中标量的可视化

流体力学中常见的标量为位置、速度绝对值、压强等。

1.1 云图

常用的云图绘制有pcolor、image、imagesc、imshow、contourf等函数。
这里利用matlab自带的wind数据作为演示案例,显示二维云图的速度场。

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 切片图绘制

切片图常用于可视化复杂的三维流动。
由于二维计算机屏幕和二维视网膜的限制,人类对垂直于眼球面的速度分量不是很敏感,所以绘制三维可视化的时候一定要注意光照、视角、明暗、反光等信息,辅助人去补全第三维度的信息。

常用的切片显示函数有contourslice和slice,对应二维的contour和pcolor用法。
下面以流场的涡量切片图为例,介绍切片图的用法。

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); %调整局部亮度

在这里插入图片描述

1.3 三维等值面图绘制

等值面相关的常用函数有:patch、isosurface、isocaps、isocolors、isonormals、reducevolume、subvolume等。
下面以绘制三维速度等值面为例,介绍等值面的用法。

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的优点是可以很好的反应出方向和中断,这里就不做过多说明了。
在这里插入图片描述

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 粒子动画图

streamparticles函数可以绘制流粒子,即定常流场的迹线动画。
缺点是不能输出gif动图,不能显示非定常流场,如果想专门做这块的话建议自己编程。

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])

输出粒子在某一时刻的截图如下:
在这里插入图片描述

3 参考链接

https://ww2.mathworks.cn/help/matlab/volume-visualization.html
或 搜索matlab的Volume Visualization文档

版权声明:本文为weixin_42943114原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42943114/article/details/88415270

智能推荐

Matlab学习-可视化和编程

函数function 跟脚本script一样,就有一个不同的地方,就是函数必须又声明。 有些要注意的地方 必须要有function的关键字,函数名要和文件名一直 不需要返回return 函数范围,在函数内创建的变量如果不返回,那么函数结束后也会消失,成为本地变量。 函数重载 像size函数一样,可以多个输入或者多个输出的重载...

Linux环境下配置和安装hadoop及hadoop集群搭建(VMware)

文章目录 一、安装准备 二、hadoop的配置 1.首先配置hadoop-env.sh 2.配置core-site.xml 3.配置hdfs-site.xml 4.配置mapred-site.xml 5.配置yarn-site.xml 6.配置slaves 7.配置hadoop环境变量 三、格式化HDFS 四、启动hadoop 五、集群搭建 1.克隆虚拟机 2.配置免密登录 3.修改主机器的配置文...

使用QProcess打开和关闭第三方应用,比如CMD

使用QProcess打开和关闭第三方应用,比如CMD 注意: 很多教程不一定是对的,但我这篇绝对是对的,因为我踩坑过啊。 为了节省时间,直接上图、上代码,so easy! 重要事情说3遍: 杀死进程,一定要加/F 和 /T 杀死进程,一定要加/F 和 /T 杀死进程,一定要加/F 和 /T 开始 验证下,打开任务管理器就能看到 总结 从上面看,是不是很简单,taskkill不知道是啥,是windo...

自定义View实现注销图案的加载动画

先看效果图: 有那味了。。。(懂得都懂^ ^ √) 我们先来分析一下怎么画,然后再研究怎么让他动起来 这个View是由内部的注销图案和外面一圈圆环构成。而内部的注销图案又是由一个基本满角度的圆弧和一根竖线组成 一、绘制内部注销图案 首先初始化画笔和圆弧的外切矩形: 圆弧的中心是View的中心,坐标为(getWidth()/2,getWidth()/2),半径设置为getWidth/4,...

vue3使用vue-count-to组件

项目场景: 数据可视化大屏开发的过程中,需要实现一种滚动数字的效果,在使用vue2时,使用vue-count-to完全没有问题,功能也比较完善(滚动时长,开始值,结束值,前缀,后缀,千分隔符,小数分隔符等等),但是在vue3中使用会出现问题。 展示的效果 问题描述: 出现的错误时 == Cannot read property ‘_c’ of undefined== 这是一...

猜你喜欢

【java设计模式】中介者模式

步骤一:创建 中介者 Mediator 步骤二:建立具体中介者 实现者 步骤三:建立同事类接口 User 步骤四:建立同事类的具体实现类 步骤五:测试...

包的安装

包的分类: 包的安装方式: 1. yum 安装 不需要手动解决依赖关系 本地yum源配置:不需要网络 网络源配置 yum : 2. 源码安装 2.1 安装准备: 2.2 分析安装平台环境 查看安装平台参数,下载合适的包 2.3 下载源码包 根据查到的参数下载源码包,建议下载到/usr/local/src目录下 2.4 安装源码包 示例: 此处以apache http示例:https://mirro...

李洪义机器学习课程(一)——Learning Map学习笔记

  我们先一张一张PPT来分析讲解[1]。 总体框图 : 这张图表明了接下来的知识脉络体系,也可以看成目前学术界、工业界的几大研究方向。整体上分为: 监督学习、半监督学习、无监督学习、迁移学习、强化学习。 对于监督学习又分为:回归、分类、结构化学习[2] 对于分类问题,整体上分为线性模型和非线性模型,非线性模型包括深度学习、SVM、决策树、KNN等。 接下来一个一个说明。  李大大对回归有一个例子...

druid配置和后台监控

最简单快速的druid配置 1.pom.xml 引入依赖包 2.spring.xml配置druid 3.web.xml配置 4.启动Tomcat服务器,输入localhost:8080/你的项目名/druid MISSION COMPLETED!...

week14作业

B - Q老师与十字叉(必做) 解题思路: 首先,这个题目并不是很难,第一反应是和我们第三次csp模拟的第二题有些类似,一开始也就直接对每个点进行暴力遍历,但这道题目的数据量偏大,这样肯定会TLE。我们应当采取更有效的做法。其实对于一个点的检验便是对一行一列的检验,我们不能简单的当用到某一行某一列时才去计算它,这样会有很多的重复性工作,我们可以将每一行每一列计算好等待备用。我对这道题目感触比较大的...