基于MATLAB实现电磁场的动画演示

基于MATLAB实现电磁场的动画演示

简介:学习过电磁场的小伙伴们都比较清楚,电磁场由于其抽象的概念,时空分布复杂等问题,成功劝退一大波小朋友,如果我们在学习的时候能够将抽象的概念可视化,再将静态的图片动态实现,那么将会大大提高我们的学习兴趣,同时可以很好的帮助我们理解相关的概念,今天就帮助大家如何实现这种类型的动画演示,当然欢迎小伙伴在评论区里面留言,你们想要的实现的其他的东西,本文做抛砖引玉之用。

动画演示函数简介

驻波与行波

动画演示函数

​ MATLAB中实现动画演示一般分为两个步骤:首先第一步需要调用getframe函数生成每帧的信息;第二步调用movie2avi函数将阵列中一系列的动画帧转化成视频avi文件,但是由于在新版的matlab里面,上面的函数已经被删除,取而代之的是videowriter 的函数,因此我这里将两种函数的写法都罗列出来,供大家选择,这样可以就可以脱离MATLAB 实现播放效果。

getframe函数的调用格式有以下三种:

  • F = getframe, 从当前的图形框中得到动画帧
  • F = getframe(h), 从图形句柄h中得到动画帧
  • F = getframe(h,rect), 从图形句柄h中的指定区域rect得到动画帧

movie2avi函数的调用形式如下:

  • movie2avi(mov,“filename”),将getframe捕捉到的一系列帧图像mov转化并写入到filenama中。

movie函数使用比较简单,基本格式就是movie(mov,n,fps),将保存在mov变量中的帧序列按照fps设定的速度进波播放n次。

videowriter 函数的格式

  • 配合open,writeVideoclose方法从图像*(figure)中创建视频文件、静态图像或Matlab*视频

驻波与行波

​ 在理想介质中传播的电磁波,如果它的电场和磁场是没有传播方向上的纵向分量的,而是只有在与传播方向垂直的横向分量,并且在横向截面上分布均匀,这种电磁波被称为均匀电磁波,又可以称为是横电磁波(Transvers Electromagnetic wave, TEM). 均匀平面波的电场矢量E 和磁场矢量H 在时间的相位是相同的,在空间中是互相垂直的。

​ 假设我们现在的所要讨论的电磁波沿着z 轴的方向进行传播,此时只有电场分量* E x E_{x} Ex* ,磁场只有* H y H_{y} Hy* 分量,那么此时的电磁场可以表示为
E ( z , t ) = E m c o s ( ω t − k z ) e x H ( z , t ) = H m c o s ( ω t − k z ) e y \boldsymbol{E}(z,t) = E_mcos(\omega t-kz)\boldsymbol{e}_x \\ \boldsymbol{H}(z,t) = H_mcos(\omega t-kz)\boldsymbol{e}_y E(z,t)=Emcos(ωtkz)exH(z,t)=Hmcos(ωtkz)ey
其中:kz 表示初始相位;k 表示波数。

根据Maxwell functions 我们可以得到电场和磁场之间的关系为:
H ( z , t ) = 1 Z × E ( z , t ) \boldsymbol{H}(z,t)= \frac{1}{Z}\times\boldsymbol{E}(z,t) H(z,t)=Z1×E(z,t)
其中Z 表示波阻抗。电磁波在无线大的空间中传播的时候,电磁场的能量不断地向前传播,这样地电磁波叫做行波。电磁场如果入射到理想导体的界面的时候,就会发生全发射,此时反射波和入射波进行叠加就会形成驻波。驻波的特点是随着时间的变化,电磁波的波腹和波节的位置是固定的

​ 一维的电磁波问题十分简单,可以直接用plot 函数,这里我们实现如何使用movie2avi 函数实现动画演示:

omega = 2*pi;  %设定行波的角频率
t = 0;
z = linspace(0,15,100);  %方位划分
k = 1;  
for  i = 1:300  %设置帧数
     y = sin(omega*t-k*z);
     plot(z,y);
     axis([0 15 -2 2]);  %这里表示的是观察的范围
     hold on
     mov(i) = getframe(gcf);  %获取信息
     pause(0.1);  %时间间隔
     t = t+0.1;
     hold off
end
movie2avi(mov,'正弦波传播.avi');

​ 需要注意的是,在新版的matlab里面已经将movie2avi函数已经删除,因此这里我用新的函数的实现操作如下:

omega = 2*pi;  %设定行波的角频率
t = 0;
z = linspace(0,15,100);  %方位划分
k = 1;  
writerObj  = VideoWriter('test.avi');  %打开一个文件用于储存动画
open(writerObj);  %首先需要打开这个动画文件句柄
for  i = 1:20  %设置帧数
     y = sin(omega*t-k*z);
     plot(z,y);
     axis([0 15 -2 2]);  %这里表示的是观察的范围
     hold on
     mov = getframe(gcf);  %获取信息
     writeVideo(writerObj,mov);
     pause(0.1);  %时间间隔
     t = t+0.1;
     hold off
end
close(writerObj);  %注意最后需要关闭这个动画句柄

​ 当两列频率相同但是传播方向不同的电磁波相遇的时候,此时就会生成驻波,对于驻波的形式,我们可以直接设置为两束波传播的时候一个沿着z 的方向,一个沿着*-z*的方向即可:

omega = 2*pi;  %设定行波的角频率
t = 0;
z = linspace(0,15,100);  %方位划分
k = 1;  
writerObj  = VideoWriter('test.avi');  %打开一个文件用于储存动画
open(writerObj);
for  i = 1:50  %设置帧数
     y1 = sin(omega*t-k*z); %两列传播方向不同的电磁波
     y2 = sin(omega*t+k*z);
     y = y1+y2;
     plot(z,y1,'b',z,y2,'g',z,y,'r');  %全部绘制到一起
     axis([0 15 -2.5 2.5]);  %这里表示的是观察的范围
     hold on
     mov = getframe(gcf);  %获取信息
     writeVideo(writerObj,mov);
     pause(0.1);  %时间间隔
     t = t+0.1;
     hold off
end
close(writerObj);

但是,对于一般的一维来说,还是存在一定的问题,还是不能够直观的感受到电磁波的空间传播,因此,绘制三维变化的情况,可以帮助我们更好的理解相关的概念。在MATLAB中我们可以结合quiver3 函数进行三维的绘制,下面我们绘制沿着x方向传播的平面波的三维图像:

t = 0; 
k = 2;
omega  = 2*pi;
x = linspace(0,10,100);
nill  = zeros(size(x));
writerObj  = VideoWriter('test.avi');  %打开一个文件用于储存动画
open(writerObj);
for i = 1:100
    E = cos(omega*t-k*z);
    H = 0.3.*E;
    quiver3(x,nill,nill,nill,E,nill,'b');
    hold on
    quiver3(x,nill,nill,nill,nill,H,'r');
    axis([0,10,-1,1,-1,1]);
    view(20,40);
    mov = getframe(gcf);
    writeVideo(writerObj,mov);
     pause(0.1);  %时间间隔
     t = t+0.1;
     hold off
end
close(writerObj);

在这里插入图片描述

  • 10
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值