计算电磁学之FDTD算法的MATLAB语言实现要点.docx
- 文档编号:6665235
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:14
- 大小:185.59KB
计算电磁学之FDTD算法的MATLAB语言实现要点.docx
《计算电磁学之FDTD算法的MATLAB语言实现要点.docx》由会员分享,可在线阅读,更多相关《计算电磁学之FDTD算法的MATLAB语言实现要点.docx(14页珍藏版)》请在冰点文库上搜索。
计算电磁学之FDTD算法的MATLAB语言实现要点
SouthChinaNormalUniversity
课程设计实验报告
课程名称:
计算电磁学
指导老师:
专业班级:
2014级电路与系统
姓名:
学号:
FDTD算法的MATLAB语言实现
摘要:
时域有限差分(FDTD)算法是K.S.Yee于1966年提出的直接对麦克斯韦方程作差分处理,用来解决电磁脉冲在电磁介质中传播和反射问题的算法。
其基本思想是:
FDTD计算域空间节点采用Yee元胞的方法,同时电场和磁场节点空间与时间上都采用交错抽样;把整个计算域划分成包括散射体的总场区以及只有反射波的散射场区,这两个区域是以连接边界相连接,最外边是采用特殊的吸收边界,同时在这两个边界之间有个输出边界,用于近、远场转换;在连接边界上采用连接边界条件加入入射波,从而使得入射波限制在总场区域;在吸收边界上采用吸收边界条件,尽量消除反射波在吸收边界上的非物理性反射波。
本文主要结合FDTD算法边界条件特点,在特定的参数设置下,用MATLAB语言进行编程,在二维自由空间TEz网格中,实现脉冲平面波。
关键词:
FDTD;MATLAB;算法
1绪论
1.1课程设计背景与意义
20世纪60年代以来,随着计算机技术的发展,一些电磁场的数值计算方法逐步发展起来,并得到广泛应用,其中主要有:
属于频域技术的有限元法(FEM)、矩量法(MM)和单矩法等;属于时域技术方面的时域有限差分法(FDTD)、传输线矩阵法(TLM)和时域积分方程法等。
其中FDTD是一种已经获得广泛应用并且有很大发展前景的时域数值计算方法。
时域有限差分(FDTD)方法于1966年由K.S.Yee提出并迅速发展,且获得广泛应用。
K.S.Yee用后来被称作Yee氏网格的空间离散方式,把含时间变量的Maxwell旋度方程转化为差分方程,并成功地模拟了电磁脉冲与理想导体作用的时域响应。
但是由于当时理论的不成熟和计算机软硬件条件的限制,该方法并未得到相应的发展。
20世纪80年代中期以后,随着上述两个条件限制的逐步解除,FDTD便凭借其特有的优势得以迅速发展。
它能方便、精确地预测实际工程中的大量复杂电磁问题,应用范围几乎涉及所有电磁领域,成为电磁工程界和理论界研究的一个热点。
目前,FDTD日趋成熟,并成为分析大部分实际电磁问题的首选方法。
1.2时域有限差分法的发展与应用
经过四十多年的发展,FDTD已发展成为一种成熟的数值计算方法。
在发展过程中,几乎都是围绕几个重要问题展开的,即数值稳定性、计算精度、数值色散、激励源技术以及开域电磁问题的吸收边界条件等。
数值稳定和计算精度对任何一种数值计算方法都是至关重要的。
其中激励源的设计和引入也是FDTD的一个重要任务。
目前,应用最广泛的激励源引入技术是总场/散射场体系。
对于散射问题,通常在FDTD计算空间中引入连接边界,它将整个计算空间划分为内部的总场区和外部的散射场区,如图1.1。
利用Huygens原理,可以在连接边界处引入入射场,使入射场的加入变得简单易行。
图1.1总场/散射场区
2FDTD法基本原理
2.1Maxwell方程和Yee氏算法
根据电磁场基本方程组的微分形式,若在无源空间,其空间中的煤质是各向同性、线性和均匀的,即煤质的参数不随时间变化且各向同性,则Maxwell旋度方程可写成:
式中,E是电场强度,单位为伏/米(V/m);H是磁场强度,单位为安/米(A/m);ε表示介质介电系数,单位为法拉/米(F/m);μ表示磁导系数,单位为亨利/米(H/m);σ表示介质电导率,单位为西门子/米(S/m);σm表示导磁率,单位为欧姆/米(Ω/m)。
K.S.Yee在1966年建立了如图2.1所示的空间网格,这就是著名的Yee氏元胞网格。
图2.1Yee氏网格及其电磁场分量分布
电场和磁场被交叉放置,电场分量位于网格单元每条棱的中心,磁场分量位于网格单元每个面的中心,每个磁场(电场)分量都有4个电场(磁场)分量环绕。
这样不仅保证了介质分界面上切向场分量的连续性条件得到自然满足,而且还允许旋度方程在空间上进行中心差分运算,同时也满足了法拉第电磁感应定律和安培环路积分定律,也可以很恰当地模拟电磁波的实际传播过程。
2.2时域有限差分法相关技术
2.2.1数值稳定性问题
FDTD方程是一种显式差分方程,在执行时,存在一个重要的问题:
即算法的稳定性问题。
这种不稳定性表现为在解显式方程时,随着时间步数的继续增加,计算结果也将无限制地增加。
Taflove于1975年对Yee氏差分格式的稳定性进行了讨论,并导出了对时间步长的限制条件。
数值解是否稳定主要取决于时间步长Δt与空间步长Δx、Δy、Δz的关系。
对于非均匀媒质构成的计算空间选用如下的稳定性条件:
上式是空间和时间离散之间应当满足的关系,又称为Courant稳定性条件。
若采用均匀立方体网格:
Δx=Δy=Δz=Δs
其中,v为计算空间中的电磁波的最大速度。
2.2.2数值色散
FDTD方程组是对Maxwell旋度方程进行差分近似,在进行数值计算时,将会在计算网格中引起数字波模的色散,即在FDTD网格中,电磁波的相速与频率有关,电磁波的相速度随波长、传播方向及变量离散化的情况不同而改变。
这种关系由非物理因素引起,且色散将导致非物理因素引起的脉冲波形畸变、人为的各向异性和虚假折射等现象。
为获得理想的色散关系,问题空间分割应按照小于正常网格的原则进行。
一般选取的最大空间步长为Δmax=λmin/20,λmin为所研究范围内电磁波的最小波长。
由上分析说明,数值色散在用FDTD法分析电磁场传播中的影响是不可能避免的,但我们可以尽可能的减小数值色散的影响。
2.2.3离散网格的确定
无论是简单目标还是复杂目标,在进行FDTD离散时网格尺寸的确定,除了受计算资源的限制不可能取得很小外,还需要考虑以下几个因素:
1.目标离散精确度的要求。
网格应当足够小以便能精确模拟目标几何形状和电磁参数。
2.FDTD方法本身的要求。
主要是考虑色散误差的影响。
设网格为立方体Δx=Δy=Δz=δ,所关心频段的频率上限为fmax,对应波长为fmin,则考虑FDTD的数值色散要求
δ≤λmin/N
通常N≥10。
上式是根据已知所关心频率上限情况下来确定FDTD网格尺寸的;反之,若给定,则FDTD计算结果可用的上限频率也随之确定。
2.3吸收边界条件
由时域有限差分法的基本原理可知,在利用时域有限差分法研究电磁场时,需在全部问题空间建立Yee氏网格空间,并存储每个单元网格上任一时间步的六个场分量用于下一时间步的计算。
而在对于辐射、散射这类开放系统的实际研究中,不可能有无限大的存储空间。
因此,必须在某处将网格空间截断,且在截断边界网格点处运用特殊的场分量计算方法,使得向边界面行进的波在边界处保持“外向行进”特性、无明显的反射现象,并且不会使内部空间的场产生畸变,从而用有限网格空间模拟电磁波在无界空间中传播的情况。
具有这种功能的边界条件称之为吸收边界条件,或辐射边界条件,或网格截断条件,如图2.2所示
图 2.2 附加截断边界使计算区域变为有限域
从FDTD的基本差分方程组可以看出,在截断边界面上切向场分量的计算需要利用计算空间以外的电磁场分量,因此FDTD基本差分方程对这些截断边界面上的场分量失效。
如何处理截断边界上的场分量,使之与需要考虑的无限空间有尽量小的差异,是FDTD中必须很好解决的一个重要问题。
实际上,这是要求在误差可容忍的范围内,计算空间中的外向波能够顺利通过截断边界面而不引起波的明显反射,使有限计算空间的数值模拟与实际情况趋于一致,对外向波而言,就像在无限大空间中传播一样。
所以,需要一种截断边界网格处的特殊计算方法,它不仅要保证边界场计算的必要精度,而且还要大大消除非物理因素引起的波反射,使得用有限的网格空间就能模拟电磁波在无限空间中的传播。
但是如果处理不当,截断边界面可能造成较大反射,构成数值模拟误差的一部分,甚至可能造成算法不稳定。
加于截断边界场分量符合上述要求的算法就称为吸收边界条件(Absorbing Boundary Conditions)。
2.4FDTD计算所需时间步的估计
为了使计算达到稳定,通常计算所需要时间步按照电磁波往返穿越FDTD计算区对角线3~5次来估计。
若FDTD计算区总元胞数为N,则对角线上元胞约为
(三维)。
按照Courant稳定条件,设计算中心区Δt=δ/(2c),即穿
越对角线一次需要时间步为
。
总计算时间步约为需。
对于二维情况则约为。
或者说,计算时间步大约等于FDTD计算区对角线上元胞数目的12~20倍。
实际上,计算所需时间步还与散射体具体形状、结构有关。
图2.3给出了应用FDTD分析电磁场问题时的程序流程图
图2.3 FDTD 程序流程图
3课程设计要求及MATLAB语言实现
3.1课程设计要求
Ø采用总场/散射场技术,在二维自由空间TEz网格中,实现脉冲平面波。
Ø总场区域100*100个网格。
Ø周边散射场区域20个网格。
Ø散射场区域外采用PML吸收边界条件。
Ø平面波0度角入射。
使用高斯脉冲,中心频率为1GHz,带宽为1/e。
Ø采用正方形Yee网格,离散步长Δ=1.5cm,时间离散步长为Δ=Δ/2c.
3.2MATLAB程序
%%%%%%%%此程序实现自由空间的平面波%%%%%%%%
%%%%%%%%此程序采用总场/散射场技术%%%%%%%%
%%%%%%%%此程序使用PML设置吸收边界条件%%%%%%%%
KE=128;%真空区域网格数
IE=KE;
JE=KE;
T=0;
NSTEP=300;%迭代次数
e=2.71828;
%%%%%%%%初始化%%%%%%%%
dz=zeros(KE,KE);
ez=zeros(KE,KE);
hx=zeros(KE,KE);
hy=zeros(KE,KE);
ihx=zeros(KE,KE);
ihy=zeros(KE,KE);
ga=ones(KE,KE);
ez_inc=zeros(1,JE);
hx_inc=zeros(1,JE);
%%%%%%%%PML参数%%%%%%%%
gi2=ones(1,IE);gi3=gi2;
fi1=zeros(1,IE);
fi2=ones(1,IE);fi3=fi2;
gj2=ones(1,JE);gj3=gj2;
fj1=zeros(1,JE);
fj2=ones(1,JE);fj3=fj2;
npml=8;
fori=1:
8%设置PML层中的参数
xnum=npml-i;
xd=npml;
xxn=xnum/xd;
xn=0.33*xxn^3;
gi2(i)=1.0/(1.0+xn);
gi2(IE-1-i)=1.0/(1.0+xn);
gi3(i)=(1.0-xn)/(1.0+xn);
gi3(IE-1-i)=(1.0-xn)/(1.0+xn);
xxn=(xnum-0.5)/xd;
xn=0.25*xxn^3;
fi1(i)=xn;
fi1(IE-2-i)=xn;
fi2(i)=1.0/(1.0+xn);
fi2(IE-2-i)=1.0/(1.0+xn);
fi3(i)=(1.0-xn)/(1.0+xn);
fi3(IE-2-i)=(1.0-xn)/(1.0+xn);
end
forj=1:
8
xnum=npml-j;
xd=npml;
xxn=xnum/xd;
xn=0.33*xxn^3;
gj2(j)=1.0/(1.0+xn);
gj2(JE-1-j)=1.0/(1.0+xn);
gj3(j)=(1.0-xn)/(1.0+xn);
gj3(JE-1-j)=(1.0-xn)/(1.0+xn);
xxn=(xnum-0.5)/xd;
xn=0.25*xxn^3;
fj1(j)=xn;
fj1(JE-2-j)=xn;
fj2(j)=1.0/(1.0+xn);
fj2(JE-2-j)=1.0/(1.0+xn);
fj3(j)=(1-xn)/(1.0+xn);
fj3(JE-2-j)=(1.0-xn)/(1.0+xn);
end
%%%%%%%%总场/散射场边界%%%%%%%%
ia=28;
ib=IE-ia-1;
ja=28;
jb=JE-ja-1;
ez_inc_low_m1=0;
ez_inc_low_m2=0;
ez_inc_high_m1=0;
ez_inc_high_m2=0;
%%%%%%%%信号源%%%%%%%%
t0=80;%脉冲高度
spread=12;%脉冲宽度
%%%%%%%%网格%%%%%%%%
ddx=0.015;%%%%%%%%离散步长%%%%%%%%
dt=ddx/(2*3e8);%%%%%%%%计算时间离散步长%%%%%%%%
epsz=8.851*1e-12;%%%%%%%%自由空间的介电常数%%%%%%%%
%%%%%%迭代求解电场与磁场%%%%%%%%
forn=1:
NSTEP
a=1;
T=T+1;
forj=2:
JE
ez_inc(j)=ez_inc(j)+0.5*(hx_inc(j-1)-hx_inc(j));
end
%%%%%%%%入射波缓冲区%%%%%%%%
ez_inc
(1)=ez_inc_low_m2;
ez_inc_low_m2=ez_inc_low_m1;
ez_inc_low_m1=ez_inc
(2);
ez_inc(JE-1)=ez_inc_high_m2;
ez_inc_high_m2=ez_inc_high_m1;
ez_inc_high_m1=ez_inc(JE-2);
%%%%%%%%计算dx区域%%%%%%%%
fori=2:
KE
forj=2:
KE
dz(i,j)=gi3(i)*gj3(j)*dz(i,j)+gi2(i)*gj2(j)*0.5*(hy(i,j)-hy(i-1,j)-hx(i,j)+hx(i,j-1));
end
end
%%%%%%%%输入高斯脉冲信号源%%%%%%%%
pulse=exp(-0.5*(t0-T)^2/spread^2);%%%%%%%%
ez_inc(3)=pulse;
%%%%%%%%入射波DZ参数%%%%%%%%
fori=ia:
ib
dz(i,ja)=dz(i,ja)+0.5*hx_inc(ja-1);
dz(i,jb)=dz(i,jb)-0.5*hx_inc(jb);
end
%%%%%%%%计算电场dx区域%%%%%%%%
fori=1:
KE
forj=1:
KE
ez(i,j)=ga(i,j)*dz(i,j);
end
end
%%%%%%%%设置电场EZ边缘为0,作为PML的参数%%%%%%%%
forj=1:
JE-1
ez(1,j)=0;
ez(IE,j)=0;
end
fori=1:
IE-1
ez(i,1)=0;
ez(i,JE)=0;
end
forj=1:
JE-1
hx_inc(j)=hx_inc(j)+0.5*(ez_inc(j)-ez_inc(j+1));
end
%%%%%%%%计算磁场hx区域%%%%%%%%
fori=1:
KE
forj=1:
KE-1
curl_e=ez(i,j)-ez(i,j+1);
ihx(i,j)=ihx(i,j)+fi1(i)*curl_e;
hx(i,j)=fj3(j)*hx(i,j)+fj2(j)*0.5*(curl_e+ihx(i,j));
end
end
%%%%%%%%入射磁场Hx区域参数%%%%%%%%
fori=ia:
ib
hx(i,ja-1)=hx(i,ja-1)+0.5*ez_inc(ja);
hx(i,jb)=hx(i,jb)-0.5*ez_inc(jb);
end
%%%%%%%%计算磁场hy区域%%%%%%%%
fori=1:
KE-1
forj=1:
KE
curl_e=ez(i+1,j)-ez(i,j);
ihy(i,j)=ihy(i,j)+fj1(j)*curl_e;
hy(i,j)=fi3(i)*hy(i,j)+fi2(i)*0.5*(curl_e+ihy(i,j));
end
end
%%%%%%%%入射磁场hy区域参数%%%%%%%%
forj=ja:
jb
hy(ia-1,j)=hy(ia-1,j)-0.5*ez_inc(j);
hy(ib,j)=hy(ib,j)+0.5*ez_inc(j);
end
%%%%%%%%图形展示%%%%%%%%
m=moviein(500);
x=1:
KE;
y=1:
KE;
[X,Y]=meshgrid(x,y);
surf(X,Y,ez);
axis([0KE0KE-11]);
set(gcf,'Color','white','Number','off','Name',sprintf('SimulationFDTD2D,Iteration=%i',n));
title(sprintf('t=%.3fnsec',n*dt*1e9))
xlabel('x');
ylabel('y');
zlabel('Ez');
m(a)=getframe(gcf);
a=a+1;
end
下图为该程序实现的效果图:
4.结语
以上结合FDTD和MATLAB在自由空间中实现了平面波,所编MATLAB程序简洁明了,运行效率也较高。
FDTD法在电磁场数值分析方面有很大的优越性,而MATLAB具有强大的数据处理和图形处理功能,可以快速地编出高效高质量的程序。
将二者的优势有效地结合起来,可以将算法迅速程序化,并获得很好的数据处理结果。
但由于我的编程思路不是很规范,所以在实现过程中,遇到了很多的问题,比如在完全匹配层吸收效果上稍有差距,但已经基本上达到了预期的效果。
参考文献:
[1]葛德彪,闫玉波.电磁场时域有限差分方法[M].西安:
西安电子科技大学出版社,2005.
[2]MATLAB模拟的电磁学时域有限差分法.[美]AtefElsherbeniVeyselDemir著.
喻志远译.国防工业出版社,2012.
[3]Engquist B, Majda A. Absorbing Boundary Conditions for the Numerical Simulation of Waves. Mathematics of Computation. 1977.
[4] (美)Duane Hanselman,Bruce Littlefield著.精通Matlab 7[M].朱仁峰,译.北京:
清华大学出版社, 2006.5.
[5]数值解法和MATLAB实现与应用.GeraldRecktenward著.伍卫国万群张辉等译.
[6]MATLAB数字计算与仿真.周品编著.电子工业出版社2013.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 电磁学 FDTD 算法 MATLAB 语言 实现 要点