MATLAB:绘制三维偏振光动画

ⅰ亾dé卋堺 提交于 2020-01-24 20:17:47

MATLAB:绘制三维偏振光动画

基础

偏振光波包括线偏振、圆偏振、椭圆偏振几个方向,其中线偏振的电场公式为:
E1=e1E1ei(krwt)\vec E_1=\vec e_1E_1e^{i(\vec k\cdot \vec r-wt)}

两个线偏振可以合成圆偏振和椭圆偏振,其区别在于相位和幅度。
将公式做变形处理,取实部:
E1=e1E10cos(krwt+φ1)\vec E_1=\vec e_1E_{10}cos(\vec k\cdot \vec r-wt+\varphi_1)
E2=e2E20cos(krwt+φ2)\vec E_2=\vec e_2E_{20}cos(\vec k\cdot \vec r-wt+\varphi_2)

代码


u0 = 4*pi*1e-7;            %自由空间中的磁导率
e0 = 1e-9/(36*pi);         %自由空间中的电介质常数
f = 3*1e8;                 %电磁波的频率,单位Hz
w = 2*pi*f;
k = w*(u0*e0)^0.5;         %计算波数
pha=pi/2;                  %相位差
z=0:0.01:5;                %假设传播方向沿+z正方向
i=1;
fmat=moviein(10000);       %建立一个10000帧的动画

for t=0:0.05:2
Ex=cos(2*pi*t-k*z);        %计算x方向上t时刻,z平面的电场振幅
Ey=cos(2*pi*t-k*z+pha);    %计算y方向上t时刻,z平面的电场振幅,

h=figure;set(h,'Visible','off');%设置不弹窗,避免和movie重复了

plot3(Ex,Ey,z);            %3维图
xlabel('Ex')               %x,y,z坐标名
ylabel('Ey')          
        zlabel('Z')            
        title('圆极化波传播','fontsize',14)   
%图像命名

hold on 
grid on                   %格点
hold on
quiver3(0,0,0,Ex(1),Ey(1),z(1));   %矢量箭头
hold off
fmat(:,i)=getframe;      %抓取图像放入fmat
i=i+1;     
end

h=figure(1);
set(h,'Visible','on');
movie(fmat,1,7);         %将fmat以每秒7帧的速度播放一遍

此处建立的是动画,有许多不足的地方,例如:

fmat=moviein(10000);       %建立一个10000帧的动画

提前开辟一个足够大的空间不如一边生成图片一边开辟

所以稍加改动重新设计了一个生成gif的程序

u0 = 4*pi*1e-7;            %自由空间中的磁导率
e0 = 1e-9/(36*pi);         %自由空间中的电介质常数
f = 3*1e8;                 %电磁波的频率,单位Hz
w = 2*pi*f;
k = w*(u0*e0)^0.5;         %计算波数
pha=1.2;                  %相位差

z=0:0.01:5;                %假设传播方向沿+z正方向
%i=1;
pic_num=1;                 %帧数
for t=0:0.05:5
    Ex=cos(2*pi*t-k*z);     %计算x方向上t时刻,z平面的电场振幅
    Ey=2*cos(2*pi*t-k*z+pha); %计算y方向上t时刻,z平面的电场振幅,
  
    plot3(Ex,Ey,z);         %3维图
    xlabel('Ex')            %x,y,z坐标名
    ylabel('Ey')          
    zlabel('Z')            
    title('圆极化波传播','fontsize',14)    %图像命名
    hold on 
    grid on                %格点
    hold on
    quiver3(0,0,0,Ex(1),Ey(1),z(1));    %矢量箭头
    hold off
    F=getframe;            %抓取当前图像
    I=frame2im(F); 
    [I,map]=rgb2ind(I,256);%因gif不支持三维数据,所以应调用 rgb2ind,将rgb图像转为关联256种色彩的索引图像
    if t==0
        imwrite(I,map,'test.gif','gif'); %创建一个.gif文件,将索引图像数组和其关联的颜色图写入
    else     
        imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.01);%将多个图像并入第一个,帧间加入0.01s的延时
    end
    pic_num=pic_num+1;
end

pic_num是gif的帧数,每保存一次图片pic_num+1

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!