基于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,writeVideo和close方法从图像*(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)=Em?cos(ωt?kz)ex?H(z,t)=Hm?cos(ωt?kz)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);
|