jjzjj

MATLAB之物理场可视化

力语 2024-03-20 原文

目录


物理场指一个物理量的值在时间和空间中的分布,其定义是一个向量到另一个向量或数的映射。物理场分标量场和矢量场,对于标量场,在二维情况下可以使用等值线表示,在三维情况下则可以使用 MATLAB绘图加强篇中提到的四维数据绘图方法,即使用颜色表示,当然也可以使用等值曲面表示;对于矢量场,我们则可以使用箭头、流线等来表示。

注:在矢量场中如果有需要也可根据场强大小绘制出等值线或等值面。

二维标量场

二维标量场使用等值线表示,函数contour可以绘制平面等值线。

z=peaks;		% peaks为MATLAB自带的演示函数
contour(peaks)		% 使用contourf函数绘制等值线


如果您觉得这样不够直观,那还可以使用contour3函数绘制立体等值线。(图片清晰度被降低了,读者可以自行去MATLAB跑一下代码,只需将contour替换为contour3即可)

又或者使用contourf函数在等值线内填充颜色。

三维标量场

四维数据作图

利用四维数据作图的技巧在MATLAB绘图加强篇已提到,此处直接给出代码,不再赘述。

clear all;clc;close all
[x,y,z]=meshgrid(-2:.2:2);	% .2=0.2,,meshgrid生成三维空间网格
v=x.*exp(-x.^2-y.^2-z.^2);	% 生成物理场
slice(v,[5 15],15,10)			% v所对应物理场的切片,分别在x=5,x=15,y=15,z=10处切片
axis([0 21 0 21 0 21]);		% 设置xyz坐标范围
hold on
colorbar('horiz')	% 在竖直方向显示温度表
colorbar('vert')		% 在水平方向显示温度表
view([-25 65])		% 通过方位角和俯仰角,设置观察角度

等值面

除了使用第四维数据作图来清晰的表示物理场之外,我们也可以仿照二维标量场,使用等值面来描绘物理场。

clc;clear all;close all
[x y z v]=flow;     % 数据来自MATLAB自带的演示函数
p=patch(isosurface(x,y,z,v,-3));    % 光照函数
isonormals(x,y,z,v,p)   % 数据归一化
set(p,'FaceColor','red','EdgeColor','none');    % 设置表面与边界颜色
daspect([1 1 1])    % 设置坐标轴比例
view(3)     % 视角
axis tight; grid on
camlight;   lighting phong  % 光照
alpha(.5)   % 设置表面透明度

二维矢量场

不同于二维标量场,矢量场在某点处既有大小又有方向,自然不能继续使用等值线表示,而是要使用 “带有箭头的等值线” ——流线以及大量的小箭头 来表示。

小箭头和流线的区别在于:小箭头只会根据某点的场强大小和方向两个属性绘图,小箭头仅表示该点的属性,与周围的场变化无关;而流线则不止受一个点的场强大小及方向影响,而流线密度同样反应了场的大小,因此流线可以更直观地反映出场的情况。

二维矢量场的箭头表示

二维矢量场可以使用quiver函数构成用来表示矢量场大小和方向的箭头,quiver(x,y,u,v)中x,y表示自变量,u,v表示矢量场的两个分量。

我们以电偶极子为例,假设有电量为 4 π ε 0 4\pi \varepsilon_0 4πε0 的正负电荷分别放置在 ( 0.2 , 0 ) (0.2, 0) (0.2,0) ( − 0.2 , 0 ) (-0.2, 0) (0.2,0) 处,形成一个电偶极子,则空间电势为 V = 1 ( x − 0.2 ) 2 + y − 0.2 ) 2 − 1 ( x + 0.2 ) 2 + y − 0.2 ) 2 V=\frac{1}{\sqrt{(x-0.2)^2}+\sqrt{y-0.2)^2}}-\frac{1}{\sqrt{(x+0.2)^2}+\sqrt{y-0.2)^2}} V=(x0.2)2 +y0.2)2 1(x+0.2)2 +y0.2)2 1,有了电势以后我们就可以求出其等势线和电场强度,进而将矢量场画出。

clc;clear all;close all
h=0.041; x=-0.3:h:0.3; y=-0.3:h:0.3;    % 此处h设置的是绘图精度,单独使用变量表示是为了方便后续调试代码
[X Y]=meshgrid(x,y);
Z=1./sqrt((X-0.2).^2+Y.^2)-1./sqrt((X+0.2).^2+Y.^2);	
[PX PY]=gradient(-Z,h);	% 利用梯度生成矢量场,电势的梯度为电场
contour(x,y,Z,[-12,-8,-5,-3,-2,-1,-.5,-0.1,0.1,0.5,1,2,3,5,8,12],'b')		% 绘制电势标量场的等值线——等势线
hold on
quiver(X,Y,PX,PY,'k')

二维矢量场的流线表示

streamline函数则可以构成流线,其所需的三组参数为空间坐标、矢量场的分量、流线起点。

clc;clear all;close all
load wind   % 数据为MATLAB内部的大气某处风速的数据
zmax=max(z(:));   zmin=min(z(:));
streamslice(x,y,z,u,v,w,[],[],(zmax-zmin)/2)
axis([70.1879, 134.3, 17.4999, 60]) 

三维矢量场

MATLAB提供了多种三维矢量场的可视化方法:可以用箭头quiver3或三维椎体coneplot表示各点场的大小;流线streamline,流线的切线表示该点场的大小,流线的密度表示场的大小;流管streamtube,流管的粗细反应矢量场的散度;流带streamribbon表示矢量场的旋转情况。

三维箭头 quiver3

clc;clear all;close all
t=0:0.5:8;  
x=sin(t);   y=cos(t);   z=t;
plot3(x,y,z,'linewidth',2)
hold on
u=gradient(x);  v=gradient(y);  w=gradient(z);
quiver3(x,y,z,u,v,w,0,'linewidth',2)
view(-60,60)

椎体 coneplot

clc;clear all;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);   

% 绘制圆锥体,并将缩放因子设置为5,使圆锥体大于默认大小。
figure
hcone = coneplot(x,y,z,u,v,w,cx,cy,cz,5);   

% 设置圆锥图颜色。
hcone.FaceColor = 'red';    
hcone.EdgeColor = 'none';

% 计算向量场的模(代表风速),以生成用于切片命令的标量数据。
hold on
wind_speed = sqrt(u.^2 + v.^2 + w.^2);

hsurfaces = slice(x,y,z,wind_speed,[xmin,xmax],ymax,zmin);
set(hsurfaces,'FaceColor','interp','EdgeColor','none')
hold off

view(30,40);     daspect([2,2,1])	% 更改坐标区视图并设置数据纵横比

camlight right;     lighting gouraud	% 在相机的右侧添加光源,并设置光照
set(hsurfaces,'AmbientStrength',0.6);    hcone.DiffuseStrength = 0.8;

流线 streamline

clc;clear all;close all
load wind

% 标出流线起点
[startx,starty,startz] = meshgrid(80,20:10:50,0:5:15);
plot3(startx(:),starty(:),startz(:),'*r');

% 绘制流线
streamline(x,y,z,u,v,w,startx,starty,startz)
axis tight
view(3);

流管 streamtube

clc;clear all;close all

load wind
[sx,sy,sz] = meshgrid(80,[20 30 40],[5 10]);
verts = stream3(x,y,z,u,v,w,sx,sy,sz);
div = divergence(x,y,z,u,v,w);
streamtube(verts,x,y,z,-div);
view(3);
axis tight
shading interp
camlight 
lighting gouraud

流带 streamribbon

clc;clear all;close all
load wind
[sx,sy,sz] = meshgrid(80,[20 30 40],[5 10]);
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提供了如此多函数用以表示三维矢量场,根据要表示的场选择合适的函数,总能将自己想要表示的效果展现出来。

总结

总结部分笔者现在先放在这里,本篇文章可能还没有结束更新,等笔者掌握更多的物理场可视化方法之后再回来写下总结。

有关MATLAB之物理场可视化的更多相关文章

  1. ruby - Ruby 中的波形可视化 - 2

    我即将开始一个将录制和编辑音频文件的项目,我正在寻找一个好的库(最好是Ruby,但会考虑Java或.NET以外的任何库)以进行实时可视化波形。有人知道我应该从哪里开始搜索吗? 最佳答案 要流入浏览器的数据量很大。Flash或Flex图表可能是唯一能提高内存效率的解决方案。Javascript图表往往会因大型数据集而崩溃。 关于ruby-Ruby中的波形可视化,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  2. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  3. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  4. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  5. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  6. Unity数据可视化图表插件XCharts3.0发布 - 2

    Unity数据可视化图表插件XCharts3.0发布历时8个多月,业余时间,断断续续,XCharts3.0总算发布了。如果要打个满意度,我给3.0版本来个80分。对于代码框架结构设计的调整改动,基本符合预期,甚是满意。相比之前的1.0和2.0版本,我认为3.0才是一个拿得出手给广大开发者使用的版本。1.0发布的时候,很兴奋,从0.1到1.0,也磨了一年,真的等不及想给大家试用了,还特地写过一篇文章以示庆祝。那个时候,1.0虽然还还不够完善,功能也不够丰富,但它是XCharts的开始,没有1.0,也就没有后面的2.0和3.0。后面的2.0发布,做了很多改进和优化,随着版本迭代,慢慢的发现有不少硬

  7. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  8. ruby-on-rails - Ruby On Rails 4.2 的可视化日志查看器 - 2

    我以前在Laravel4上工作过,它有一个很棒的日志查看器工具laravellogviewer查看demo我正在寻找与Rubyonrails4.2非常相似的东西,如果你们知道Rails4.2的任何好的可视化日志记录GEM,请告诉我..从代码我需要记录不同的日志级别,这个工具应该直观地组织我的日志,谢谢.. 最佳答案 这应该可以帮助您入门https://github.com/shadabahmed/logstasher如其所说Thisgemisheavilyinspiredfromlograge,butit'sfocusedonone

  9. 慢跑者与狗 & 地中海鲨鱼问题的matlab解法 - 2

    慢跑者与狗问题描述一个慢跑者在平面上沿椭圆以恒定的速率𝒗=𝟏跑步,设椭圆方程为:𝒙=𝟏𝟎+𝟐𝟎𝒄𝒐𝒔(𝒕),𝒚=𝟐𝟎+𝟓𝒔𝒊𝒏(𝒕)。突然有一只狗攻击他,这只狗从原点出发,以恒定速率𝒘跑向慢跑者,狗的运动方向始终指向慢跑者。分别求出𝒘=𝟐𝟎,𝒘=𝟓时狗的运动轨迹。模型建立设时刻t慢跑者的坐标为(𝑿(𝒕),𝒀(𝒕)),狗的坐标为(𝒙(𝒕),𝒚(𝒕))。则𝑿=𝟏𝟎+𝟐𝟎𝒄𝒐𝒔(𝒕),𝒀=𝟐𝟎+𝟏𝟓𝒔𝒊𝒏(𝒕),狗从(0,0)出发,建立狗的运动轨迹的参数方程:由于狗始终对准人,因而狗的速度方向平行于狗与人位置的差向量:消去𝝀,得由题意𝑿=𝟏𝟎+𝟐𝟎𝒄𝒐𝒔𝒕,𝒀=𝟐𝟎+1𝟓𝒔𝒊𝒏(𝒕),狗从(0,0)

  10. C++调用matlab函数(未安装 matlab 也可以使用) - 2

            在正常工作环境中往往是可以使用无线网络的,此时安装一个matlab也不是什么难事;但是也难免也会遇到一些工作电脑不允许链接无线网络,此时若安装一个matlab则是一件非常痛苦的事,因为其安装包就20多个G,当时我是用手机开热点下载的,仅仅下载安装包就浪费了一个下午+一个晚上;       下面就举一个例子,针对安装过matlab和未安装过matlab的情况去介绍C++调用matlab函数的操作流程:一、封装matlab函数首先把matlab代码封装成函数的形式,下面举一个简单的函数为例;functionc=myadd(a,b)c=a+b;end二、编译matlab函数具体的编译

随机推荐