【Python】FDTD 法で z 方向を進む 1 次元の電磁波解析
真空中の z 方向へ進む電磁波を FDTD (Finite Difference Time Domain) 法で解析する。前回,FDTD 法で解析するコードを MATLAB で記載したが,今回は Python で記載した。
本稿で紹介する FDTD 法で z 方向を進む 1 次元の電磁波解析の Python コードは標準ライブラリのみを使用している。
解析コード
z 方向は 0 ~ 2 000 mm の解析領域を設ける。z = 1 000 mm の位置に,広がり 100 mm のガウシアンパルスの電界を波源として与える。
このパルスが真空中を伝搬していく様を以下のフォローチャートのとおり,FDTD 法でシミュレーションする(電磁界シミュレーション)。

ライブラリの読み込み
解析に使用する Python のライブラリをインポートする。今回は,標準ライブラリである math のみを使用した。
import math
パラメータの設定
真空中の誘電率,透磁率など電磁界シミュレーションに用いるパラメータを設定する。
ep=8.85418782e-12#真空の誘電率
mu=4*math.pi*1e-7#真空の透磁率
cc=1/math.sqrt(ep*mu)#光速
dd=2e-3#メッシュサイズ 2 mm
NZ=1000#z 方向の格子数
CFL=0.5#CFL
dt=CFL*dd/cc#時間刻み
NT=1500#時間ステップ
ee=dt/ep/dd
hh=dt/mu/dd
cz=(cc*dt-dd)/(cc*dt+dd)
sig=100e-3#ガウシアンパルスの広がり
初期条件の設定 ~ z 軸,電界,磁界の配列~
z 軸,z 方向へ進む電磁界として Ex,Ey,Hx,Hy の配列を用意する。ここで,電界 Ex にガウシアンパルスを与えている。
zz=[]
Ex=[]
Ey=[]
Hx=[]
Hy=[]
for i in range(0,NZ+1):
zz.append(i)
Ex.append(i)
Ey.append(i)
Hx.append(i)
Hy.append(i)
zz[i]=i*dd
Ex[i]=math.exp(-(zz[i]-NZ/2*dd)*(zz[i]-NZ/2*dd)*2/2/sig/sig)
Ey[i]=0
Hx[i]=0
Hy[i]=0
FDTD 法
FDTD 法では,電界の更新,磁界の更新を順に行い,電磁界を伝搬する電磁波をシミュレーションする。今回,解析領域の境界には,Mur の 1 次吸収境界条件を適用した。
# ループ開始
for t in range(0,NT+1):
# Ex, Ey の更新
oldEx0=Ex[1]
oldEy0=Ey[1]
oldExN=Ex[NZ-1]
oldEyN=Ey[NZ-1]
for i in range(1,NZ):
Ex[i]=Ex[i]-ee*(Hy[i]-Hy[i-1])
Ey[i]=Ey[i]+ee*(Hx[i]-Hx[i-1])
# Ex,Ey の吸収境界条件(Mur の 1 次吸収境界条件)
Ex[0]=oldEx0+cz*(Ex[1]-Ex[0])
Ey[0]=oldEy0+cz*(Ey[1]-Ey[0])
Ex[NZ]=oldExN+cz*(Ex[NZ-1]-Ex[NZ])
Ey[NZ]=oldEyN+cz*(Ey[NZ-1]-Ey[NZ])
# Hx,Hy の更新
oldHx0=Hx[1]
oldHy0=Hy[1]
oldHxN=Hx[NZ-2]
oldHyN=Hy[NZ-2]
for i in range(1,NZ-1):
Hx[i]=Hx[i]+hh*(Ey[i+1]-Ey[i])
Hy[i]=Hy[i]-hh*(Ex[i+1]-Ex[i])
# Hx,Hy の吸収境界条件(Mur の 1 次吸収境界条件)
Hx[0]=oldHx0+cz*(Hx[1]-Hx[0])
Hy[0]=oldHy0+cz*(Hy[1]-Hy[0])
Hx[NZ-1]=oldHxN+cz*(Hx[NZ-2]-Hx[NZ-1])
Hy[NZ-1]=oldHyN+cz*(Hy[NZ-2]-Hy[NZ-1])
解析結果
真空中の z 方向へ進む電磁波を FDTD 法で解析した結果を示す。電界 Ex,磁界 Hy の伝搬をアニメーションで示している。
電界 Ex の伝搬
電界 Ex の伝搬の様子をアニメーションで示す。

磁界 Hy の伝搬
磁界 Hy の伝搬の様子をアニメーションで示す。

まとめ
FDTD 法で z 方向を進む 1 次元の電磁波の伝搬を解析した。今回,用いた FDTD 法はシンプルなアルゴリズムであるが,正確にプログラムで記述するのに苦労した。
次回は Numpy を使って,FDTD 法のプログラムを記載したい。
アニメーションの作成
FDTD 法で解析した電界,磁界の伝搬のアニメーションを作成する方法について述べる。アニメーションの作成においては,Python の標準外ライブラリを使用している。
ライブラリの読み込み
アニメーションを作成するときは,Python の標準外ライブラリ matplotlib を読み込む。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
アニメーションの作成
matplotlib の animation を使って,アニメーションを作成した。
fig = plt.figure()
image_list = []
for t in range(0,NT+1):
# FDTD 法のコード参照
if t % 10 ==0:
print(t,'/',NT)
img = plt.plot(zz,Ex,color="blue")
plt.xlim(0,dd*NZ)
plt.ylim(-0.2,1.2)
plt.xlabel('z [mm]')
plt.ylabel('Ex [A/m]')
image_list.append(img)
ani = animation.ArtistAnimation(fig, image_list, interval=50)
ani.save("FDTD1D_without_Numpy.gif", writer="pillow")
参考文献
更新履歴
- 2024年2月17日 新規作成
- 2024年11月23日 加除修正,タグに「電磁界シミュレーション」を追加
- 2025年1月4日 「数値電磁界解析のための FDTD 法」の商品リンクを追加
- 2025年1月12日 FDTD 法のコードのコメントを見直し(フローチャートに合わせたコメントへ見直し),Amazon アフェリエイトを追加
“【Python】FDTD 法で z 方向を進む 1 次元の電磁波解析” に対して1件のコメントがあります。