IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 基于MATLAB实现电磁场的动画演示 -> 正文阅读

[游戏开发]基于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)=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);

在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:25:48  更:2022-03-21 21:28:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 19:08:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码