登 录
註 冊
论坛
微波仿真网
注册
登录论坛可查看更多信息
微波仿真论坛
>
时域有限差分法 FDTD
>
Python的实现
发帖
回复
1
2
3
4
8478
阅读
33
回复
[
RFEDA原创
]
Python的实现
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
10楼
发表于: 2010-07-28 13:13:34
fd1d_2.1.c是fd1d_1.5.c的另一种实现方式,利用麦克斯韦中的散度方程引入了dx和ix:
b'`C<Rk
[cfXcl
dx[k] = dx[k]+0.5*(hy[k-1]-hy[k])
,x[~|J!
ex[k] = ga[k]*(dx[k]-ix[k])
!(j<Y0xo:
ix[k] = ix[k]+gb[x]*ex[k]
%;GRR (K
hy[k] = hy[k]+0.5*(ex[k]-ex[k+1])
%wJ?+D/
99~-TiU
式中:
QbWeQ[V{
^'b\OUty-
ga[k] = 1/(epsilon+sigma*dt/epsz)
G{a_\'7
gb[k] = sigma*dt/epsz
z<cPy)F]"
qUQP.4Z9 5
这次是把程序中的循环用向量化的方式实现的:
]qk`Yi
PnI_W84z
from pylab import *
@]V_%,
ZRa~miKyM
KE = 200; NSTEPS = 500
2aUE<@RU[
m='_O+ $
ex = zeros(KE); hy = zeros(KE)
9A\\2Zz6F
dx = zeros(KE); ix = zeros(KE)
I]91{dq
k/Ao?R=@gI
epsz = 8.8e-12
j#H&~f
ddx = 0.01; dt = ddx/6e8
2>^jMln
Qb86*
kstart = 100
gm: xtN
epsilon = 4.0; sigma = 0.04
%w3tzE1Hq
[F,s=,S'M
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz)
0v3 8LBH)
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
q-+_Y `_\
7;sF0oB5e
ex_low_m1 = 0.0; ex_high_m1 = 0.0
mw\Pv|
ex_low_m2 = 0.0; ex_high_m2 = 0.0
IfCa6g<&(
H"pwIiC
freq_in = 7e8; T = 0
%e/L .#0
kNrd=s,-]D
for n in range(NSTEPS+1):
4(8BWP~.y2
f Q2U|
T += 1
CL!s #w1I\
StLbX?d 6
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
x^ Y sXzu
pulse = sin(2*pi*freq_in*dt*T); dx[5] = dx[5]+pulse
j>hBNz
ex = ga*(dx-ix); ix = ix+gb*ex
FJ|JXH*
G8b`>@rZ
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
(Ii+}Mfp
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
W)odaab7
9*[!ux7h
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
!qs3fe<uh"
<7MxI@\
plot(ex)
H5A7EZq}`
show()
v 5&8C
c 1{nOx
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
11楼
发表于: 2010-07-28 16:44:57
fd1d_2.2.c是计算500MHz处的频域响应
SBu"3ym
L]|gZ&^
from pylab import *
/aCc17>2V{
df8k7D;~e
KE = 200; NSTEPS = 400
.fqN|[>
93>jr<A
ex = zeros(KE); hy = zeros(KE)
o+iiSTJEe
dx = zeros(KE); ix = zeros(KE)
7DogM".}~Q
@,j*wnR
epsz = 8.8e-12
5X:AbF
ddx = 0.01; dt = ddx/6e8
PudS2k_Qv
JJ-( Sl
kstart = 100
zy?|ODM
epsilon = 4.0; sigma = 0.0
6xmZXpd!
98c(<
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz)
PA{PD.4Du
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
[-1^-bb
dmtr*pM_
ex_low_m1 = 0.0; ex_high_m1 = 0.0
q4h]o^ +
ex_low_m2 = 0.0; ex_high_m2 = 0.0
x M/+L:_<
/|m2WxK)
freq_in = 7e8; T = 0
{_"<1C
sjHE/qmq-Z
real_pt = zeros((KE,3)); imag_pt = zeros((KE,3))
qCC.^8
ampn = zeros((KE,3)); phasen = zeros((KE,3))
m,_Z6=I:
\[i1JG
real_in = zeros(3); imag_in = zeros(3)
.[KrlfI
amp_in = zeros(3); phase_in = zeros(3)
6dr%;Wp
e`_LEv
freq = array([1.0e8,2.0e8,5.0e8]); arg = 2*pi*freq*dt
GT.,
!x=~g"d<&
t0 = 50.0; spread = 10.0
z]y.W`i
wo{gG?B
ex3 = zeros((KE,3))
&{n.]]%O.
+4~_Ei[i
for n in range(NSTEPS+1):
\~mT] '5
2DDtu[}
T += 1
T@B/xAq5!
OX0%C.K)hZ
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
oG?Xk%7&\
pulse = exp(-0.5*((t0-T)/spread)**2); dx[5] = dx[5]+pulse
/)>3Nq4Zx
ex = ga*(dx-ix); ix = ix+gb*ex
DH!~ BB;
]IQ&>z}<
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
#$07:UJ
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
X=&ET)8-Y
z (wc0I
for m in range(3): ex3[:,m] = ex
e\l7Iu
real_pt = real_pt+cos(arg*T)*ex3
!sP{gi#=
imag_pt = imag_pt-sin(arg*T)*ex3
K#d`Hyx
O"9\5(w
real_in = real_in+cos(arg*T)*ex[5]
20 h, ^
imag_in = imag_in-sin(arg*T)*ex[5]
CAWNDl4
N/2T[s_&
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
;7V%#-
`5.'_3
amp_in = sqrt(real_in**2+imag_in**2)
`i*E~'
ampn = 1.0/amp_in*sqrt(real_pt**2+imag_pt**2)
'@KEi%-^>
%)W2H^
plot(ampn[:,2],label='T='+str(NSTEPS))
OX!tsARC@
legend()
D2eckLT
show()
xGg )Y#
图片:fd1d_2.2.JPG
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
12楼
发表于: 2010-07-28 17:43:45
如果是色散介质,增加参数:
d>qY{Fdz
B:'US&6Lf'
gc = chil*dt/tau
1#+S+g@#
_KAQ}G3
fd1d_2.3.c:
^s"R$?;h
9CD_os\h
from pylab import *
-PR N:'T
WNrk}LFof
KE = 200; NSTEPS = 1000
w~qT1vCCN
ye5&)d"fa(
ex = zeros(KE); hy = zeros(KE)
1/J=uH
dx = zeros(KE); ix = zeros(KE)
</*6wpN
sx = zeros(KE)
]N F[>uiW
K J4.4Zq{c
epsz = 8.8e-12
&gx%b*;`L0
ddx = 0.01; dt = ddx/6e8
&0JI!bR(
gc$l^`+M
kstart = 100
##" HF
epsilon = 2.0; sigma = 0.01; chil = 2.0; tau = 1.0e-9; del_exp = exp(-dt/tau)
Q hO!Ma]
nb%6X82Q
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz+chil*dt/tau)
P@c5pc#|
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
-6B4sZpzD
gc = zeros(KE); gc[kstart:] = chil*dt/tau
9p(.A$
+@wD qc
ex_low_m1 = 0.0; ex_high_m1 = 0.0
m!HJj>GEo
ex_low_m2 = 0.0; ex_high_m2 = 0.0
QhJiB%M
c9h6C
freq_in = 7e8; T = 0
P+/e2Y
6(ol1 (U
real_pt = zeros((KE,3)); imag_pt = zeros((KE,3))
Mb~F%_
ampn = zeros((KE,3)); phasen = zeros((KE,3))
0flRh)[J
'/s)%bc
real_in = zeros(3); imag_in = zeros(3)
A2Gevj?F$
amp_in = zeros(3); phase_in = zeros(3)
l!u_"I8j5
[` 7ThHX
freq = array([50.0e6, 200.0e6, 500.0e6]); arg = 2*pi*freq*dt
wz%NbLy-
f._ua>v,f
t0 = 50.0; spread = 10.0
7zG_(83)K
1p=]hC
ex3 = zeros((KE,3))
Uz]|N6`
c5GuM|*7
for n in range(NSTEPS+1):
=B @2#W#
& >fQp(f
T += 1
T9[Q
97!;.f-
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
R8'RA%O9J
pulse = exp(-0.5*((t0-T)/spread)**2); dx[5] = dx[5]+pulse
8bld3p"^
ex = ga*(dx-ix-sx)
; ix = ix+gb*ex;
sx = del_exp*sx+gc*ex
$qj2w"'
{_v#~595
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
pZy~1L
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
j&qub_j"xX
Er?&Y,o
for m in range(3): ex3[:,m] = ex
ZPYS$Ydy
real_pt = real_pt+cos(arg*T)*ex3
O:Tj"@h
imag_pt = imag_pt-sin(arg*T)*ex3
II,8O
)+9Uoe~6
real_in = real_in+cos(arg*T)*ex[5]
]~siaiN[
imag_in = imag_in-sin(arg*T)*ex[5]
Qt<&WB fn
}0Ed]
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
l+^*LqEW2
Mb*?5R6;
amp_in = sqrt(real_in**2+imag_in**2)
t"oeQ*d%
ampn = 1.0/amp_in*sqrt(real_pt**2+imag_pt**2)
7-fb.V9
DSn_0D
for m in range(3):
:d'8x
plot(ampn[:,m],label='Freq: '+str(freq[m]/1e6)+'MHz')
lrIe"H@
legend()
I%KYtv~`
show()
ncT&Gr
*\F~[
第二章完活。
=@~Y12o?%
图片:fd1d_2.3.JPG
共
条评分
离线
haiyang
UID :55297
注册:
2010-03-21
登录:
2023-07-03
发帖:
246
等级:
仿真三级
13楼
发表于: 2010-07-28 23:49:35
很有用来分享
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
14楼
发表于: 2010-07-29 12:57:41
二维FDTD,fd2d_3.1.c:
PZzMHK?hP
f%8C!W]Dm
from pylab import *
aDN`6[
from mpl_toolkits.mplot3d import Axes3D
\ B%+fw
y>ktcuML
IE = 60; JE = 60; NSTEPS = 50
HK%7g
ic = IE/2; jc = JE/2
D)}v@je"yP
ddx = 0.01; dt = ddx/6.0e8; epsz = 8.8e-12
)LCHy^'
MWh6]gGs
dz = zeros((IE,JE)); ez = zeros((IE,JE))
5~S5F3
hx = zeros((IE,JE)); hy = zeros((IE,JE))
0tJZ4(0
ga = ones((IE,JE))
A":T1s
9jGu}Vo
t0 = 20.0; spread = 6.0; T = 0
/zox$p$?h
NX&_p!_V
for n in range(NSTEPS):
@'|~v<<WZ
T += 1
Ni7nq8B<
for i in range(1,IE):
dgP3@`YS
for j in range(1,JE):
dD@(z:5M\
dz
[j] = dz
[j]+0.5*(hy
[j]-hy[i-1][j]-hx
[j]+hx
[j-1])
.A|@?p[
pulse = exp(-0.5*((t0-T)/spread)**2); dz[ic][ic] = pulse
HE\K@3-
ez = ga*dz
wKY_Bo/d
for i in range(IE-1):
_','9|
for j in range(JE-1):
4 H&#q>
hx
[j] = hx
[j]+0.5*(ez
[j]-ez
[j+1])
2>59q$|
hy
[j] = hy
[j]+0.5*(ez[i+1][j]-ez
[j])
O33`+UV"W
fig = plt.figure()
-ze J#B)C
ax = Axes3D(fig)
f,Ghb~y
x = arange(IE); y = arange(JE)
O&hTNIfi
X,Y = meshgrid(x,y)
Gp\ kU:}&
ax.plot_surface(X,Y,ez,rstride=1, cstride=1, cmap=cm.jet)
Kf-JcBsrT
show()
IvNT6]6 P
图片:fd2d_3.1.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
15楼
发表于: 2010-07-29 15:00:31
这个图是python画的么?
G]aOHJ:.
t3^&;&[
感觉很不错,与MATLAB相比还不错
{Hk}Kow
~bpgSP"
不知道能否写动画。
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
16楼
发表于: 2010-07-29 15:02:05
还有就是,不知道楼主对scipy,numpy等python的数值包用得怎样?这些需要配置lapack等fortran包,当时配置了好长时间以失败而告终。
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
17楼
发表于: 2010-07-29 16:00:18
是用绘图库matplotlib画的,也可用mayavi,都是针对科学绘图的。
koi^l`B$
SMK_6?MZ
安装pythonxy或者enthought就什么都不用再配置了呀,都是针对科学计算做的软件包,numpy等全都在里面,pythonxy是免费的,并且包括了enthought。enthought虽然是商业软件,但是可以免费使用。出了pythonxy后,应该很少有人自己配置numpy,scipy,gcc等软件包了。还有一款叫sage的,适合做计算平台,不适合做软件开发。
e\75:oQ
;i:d+!3XwC
动画:
E8&TO~"a]e
01 from pylab import *
U~7c+}:c
02 import os
>b4eL59
03 # set the interactive mode of pylab to ON
j"Pv0tehw
04 ion()
r",GC]
05 # opens a new figure to plot into
L_iFt!
06 fig_hndl = figure()
|$_sX9\`?|
07 # make an empty list into which we'll append
XU7qd:|
08 # the filenames of the PNGs that compose each
D.XvG _
09 # frame.
Pk)1WK7E
10 files=[]
)w%!{hn
11 # filename for the name of the resulting movie
DM>eVS3}
12 filename = 'animation'
u\JNr}bL
13 number_of_frames = 100
P7/X|M z
14 for t in range(number_of_frames):
K",N!koj
15 # draw the frame
|P}y,pNQ
16 imshow(rand(100,100))
5l*&>C[(i
17 # form a filename
m`r(p"
18 fname = '_tmp%03d.png'%t
`*KHSA
19 # save the frame
Ooy7*W';
20 savefig(fname)
}JAG7L&{
21 # append the filename to the list
SasJic2M
22 files.append(fname)
<Q?F?.^e
23 # call mencoder
0:d_Yv,D
24 os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10
>[*qf9$
25 -ovc lavc -lavcopts vcodec=wmv2 -oac copy
8)I^ t81
26 -o " + filename + ".mpg")
*4Y Vv
27 # cleanup
x-3\Ls[I
28 for fname in files: os.remove(fname)
{Y9q[D'g .
/&94 eC
图片:fd2d_3.1.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
18楼
发表于: 2010-07-29 16:26:01
用过很多开源的东西,比如scilab,gnuplot,maxima等,由于很多都是从LINUX泊来的,因此在WINDOWS下的配置令人绝望。
=rX>.P%Q 5
希望这个东西不错吧。
~qOa\#x_
V "h +L7T
还有能否介绍一下python和C++的联合编程么?想用python做前后处理,fdtd计算用C++。各发挥各自的优点。两者怎样接口,能否给大家培训一下。谢谢!
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
19楼
发表于: 2010-07-29 17:23:46
我在windows下装的,spyder相当于matlab,eclipse pydev相当于vc ide,完全傻瓜式的,不需要计算机背景知识。混合编程可参考《Python Scripting for Computational Science》的相应章节。
?5 7Sk+
ithov.com上有下载
共
条评分
发帖
回复