登 录
註 冊
论坛
微波仿真网
注册
登录论坛可查看更多信息
微波仿真论坛
>
时域有限差分法 FDTD
>
Python的实现
发帖
回复
1
2
3
4
8487
阅读
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:
Mi#i 3y(
XYR q"{Id
dx[k] = dx[k]+0.5*(hy[k-1]-hy[k])
Rd7U5MBEF
ex[k] = ga[k]*(dx[k]-ix[k])
&lU\9
ix[k] = ix[k]+gb[x]*ex[k]
m-$}'mEO
hy[k] = hy[k]+0.5*(ex[k]-ex[k+1])
C)R hld
p*5_+u
式中:
JwxKWVpWv
;o'r@4^&$R
ga[k] = 1/(epsilon+sigma*dt/epsz)
FRR05%K
gb[k] = sigma*dt/epsz
?\8
"P?O1
这次是把程序中的循环用向量化的方式实现的:
QY4;qA
E9mu:T
from pylab import *
;_SSR8uHv
C{$iuus0
KE = 200; NSTEPS = 500
iJE:>qOTD5
?;v\wx
ex = zeros(KE); hy = zeros(KE)
*Sdx:G~gp
dx = zeros(KE); ix = zeros(KE)
L7{}`O/g7
B-_b.4ND)
epsz = 8.8e-12
7omHorU+
ddx = 0.01; dt = ddx/6e8
c_ncx|dUs
w>cqsTq
kstart = 100
q 8sfG ;)
epsilon = 4.0; sigma = 0.04
s}". po]
hDTC~~J/
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz)
"`cN k26JZ
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
$ c-O+~
,v mn{gz
ex_low_m1 = 0.0; ex_high_m1 = 0.0
Ph]b6
ex_low_m2 = 0.0; ex_high_m2 = 0.0
-5
{H(l"KuL
freq_in = 7e8; T = 0
n=4
YFS6YA
for n in range(NSTEPS+1):
riOaqV
niCK(&z
T += 1
)%S@l<%@?
jZ-s6r2=
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
I;"pPJ3G
pulse = sin(2*pi*freq_in*dt*T); dx[5] = dx[5]+pulse
D|Q7dIZm
ex = ga*(dx-ix); ix = ix+gb*ex
0sU*3 r?
>v, si].
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
_p4]\LA
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
UH6 7<_mK
vE^tdzAG
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
zMA;1Na
O6/ vFEB
plot(ex)
Uc:NW
show()
VO eVS&}
J;Z2<x/H
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
11楼
发表于: 2010-07-28 16:44:57
fd1d_2.2.c是计算500MHz处的频域响应
pc*)^S
;Z{D@g+
from pylab import *
V+Tv:a
t6nRg
KE = 200; NSTEPS = 400
).5X
V,_m>$Mo
ex = zeros(KE); hy = zeros(KE)
C*(
dx = zeros(KE); ix = zeros(KE)
nf /*n
D8Fi{?A#FV
epsz = 8.8e-12
{3`385
ddx = 0.01; dt = ddx/6e8
VQla.Y
AVpg
kstart = 100
2; ^ME\
epsilon = 4.0; sigma = 0.0
!G;u )7'v
Os"('@jd>
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz)
*(Dmd$|0|
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
4MS<t FH)
+\Vm t[v
ex_low_m1 = 0.0; ex_high_m1 = 0.0
N;|^C{uz
ex_low_m2 = 0.0; ex_high_m2 = 0.0
2DW@}[G
kCTf>sJe
freq_in = 7e8; T = 0
;yJ:W8U]+;
b4_0XmL
real_pt = zeros((KE,3)); imag_pt = zeros((KE,3))
m]2xOR_
ampn = zeros((KE,3)); phasen = zeros((KE,3))
Kn~Rck| ]
,_3hbT8Q
real_in = zeros(3); imag_in = zeros(3)
: ZrJL&
amp_in = zeros(3); phase_in = zeros(3)
O6;"cUv
)JS6W
freq = array([1.0e8,2.0e8,5.0e8]); arg = 2*pi*freq*dt
}9S}?R
X@`a_XAfd
t0 = 50.0; spread = 10.0
|EE1S{!24m
p +i1sY
ex3 = zeros((KE,3))
LQR2T5S/Q,
O{X~,Em=q
for n in range(NSTEPS+1):
GF ux?8A:%
kMQ /9~
T += 1
s7Agr!>f
_HUbE /
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
>Wr%usNxc
pulse = exp(-0.5*((t0-T)/spread)**2); dx[5] = dx[5]+pulse
f,HUr% @
ex = ga*(dx-ix); ix = ix+gb*ex
NGc~%0n
#Lhv=0op
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
HK!ecQ^+
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
C27:tyV
B'}?cG]
for m in range(3): ex3[:,m] = ex
uNzc,OH
real_pt = real_pt+cos(arg*T)*ex3
ss)x fG
imag_pt = imag_pt-sin(arg*T)*ex3
0\%g@j-aD
QadguV6|
real_in = real_in+cos(arg*T)*ex[5]
O_:l;D#i
imag_in = imag_in-sin(arg*T)*ex[5]
s/D)X=P1
`t U
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
p u(mHB
/d3Jd.l!
amp_in = sqrt(real_in**2+imag_in**2)
3%Y:+%VE
ampn = 1.0/amp_in*sqrt(real_pt**2+imag_pt**2)
~gfR1SE
OH\^j1x9I
plot(ampn[:,2],label='T='+str(NSTEPS))
x z_sejKB
legend()
P"vrYom
show()
eQbHf
图片:fd1d_2.2.JPG
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
12楼
发表于: 2010-07-28 17:43:45
如果是色散介质,增加参数:
]R__$fl`8
Tg\bpLk0=
gc = chil*dt/tau
xUo6~9s7
FfoOJzf~o
fd1d_2.3.c:
M+/xw8}a
V>Wk\'h
from pylab import *
{Mx(|)WkL
LFp "Waiv
KE = 200; NSTEPS = 1000
6 63o
wKV4-uyr
ex = zeros(KE); hy = zeros(KE)
c`;\sW-_W
dx = zeros(KE); ix = zeros(KE)
xs$$fPAQ
sx = zeros(KE)
P15 H[<:Fz
25^?|9o 7
epsz = 8.8e-12
UtZ,q!sg
ddx = 0.01; dt = ddx/6e8
ahBqYAK9
%`Re{%1;
kstart = 100
ep0,4!#FAO
epsilon = 2.0; sigma = 0.01; chil = 2.0; tau = 1.0e-9; del_exp = exp(-dt/tau)
\/A.j|by,>
W yL+HB}
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz+chil*dt/tau)
m>>.N?
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
zw0w."V
gc = zeros(KE); gc[kstart:] = chil*dt/tau
K5""%O+
qNp1<QO0
ex_low_m1 = 0.0; ex_high_m1 = 0.0
P]_d;\ !"v
ex_low_m2 = 0.0; ex_high_m2 = 0.0
c'2d+*[
*XVwTW[a
freq_in = 7e8; T = 0
1yy?1&88S
]MbPivM
real_pt = zeros((KE,3)); imag_pt = zeros((KE,3))
^J!q>KJs
ampn = zeros((KE,3)); phasen = zeros((KE,3))
v9*m0|T0M
a?cJl
real_in = zeros(3); imag_in = zeros(3)
xO~ElzGm
amp_in = zeros(3); phase_in = zeros(3)
K=g</@L6R
Cs'LrUB?=U
freq = array([50.0e6, 200.0e6, 500.0e6]); arg = 2*pi*freq*dt
VtreOJ+
7s9h:/Lu
t0 = 50.0; spread = 10.0
Ui{%q@
bDI%}k9#
ex3 = zeros((KE,3))
pSZ2>^";
PnlI {d
for n in range(NSTEPS+1):
>DqF>w.1
<n"BPXF~
T += 1
?1e{\XW
+6m.f,14q
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
\mqx '
pulse = exp(-0.5*((t0-T)/spread)**2); dx[5] = dx[5]+pulse
PNU(;&2<
ex = ga*(dx-ix-sx)
; ix = ix+gb*ex;
sx = del_exp*sx+gc*ex
y8Va>ul"U
y_]+;% w:
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
x0*{oP
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
-%K!Ra\W
G#M)5'Q]U
for m in range(3): ex3[:,m] = ex
eL!41_QI
real_pt = real_pt+cos(arg*T)*ex3
FR&`R
imag_pt = imag_pt-sin(arg*T)*ex3
ny={OhP-
jG5HW*>k0
real_in = real_in+cos(arg*T)*ex[5]
hsZ/Vnn`
imag_in = imag_in-sin(arg*T)*ex[5]
s\ IKSoE
YO6BzS/~
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
2G8pDvBr
0D X_*f
amp_in = sqrt(real_in**2+imag_in**2)
>@ t
ampn = 1.0/amp_in*sqrt(real_pt**2+imag_pt**2)
hlTbCl
vqf$("
for m in range(3):
Yo-}uTkw
plot(ampn[:,m],label='Freq: '+str(freq[m]/1e6)+'MHz')
gL; Kie6Z
legend()
taQE r2Zy
show()
{pzj@b 1S
s='+[*&&
第二章完活。
wb-yAQ8
图片: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:
yR[6s#F/h
.qBc;u
from pylab import *
K7}.# *% ~
from mpl_toolkits.mplot3d import Axes3D
W"{Ggk`
q8 v iC|
IE = 60; JE = 60; NSTEPS = 50
Y2|i> 5/|<
ic = IE/2; jc = JE/2
Xfiwblg
ddx = 0.01; dt = ddx/6.0e8; epsz = 8.8e-12
]HKt7 %,
y:G%p3h)[
dz = zeros((IE,JE)); ez = zeros((IE,JE))
js$R^P
hx = zeros((IE,JE)); hy = zeros((IE,JE))
+ NlnK6T/
ga = ones((IE,JE))
}1a}pm2p
CTMC78=9}
t0 = 20.0; spread = 6.0; T = 0
V"Q\7,_k.
FW]tDGJOw
for n in range(NSTEPS):
~id6^#&>
T += 1
<z Gh}.6v
for i in range(1,IE):
h*w9{[L
for j in range(1,JE):
#~0Nk6*u
dz
[j] = dz
[j]+0.5*(hy
[j]-hy[i-1][j]-hx
[j]+hx
[j-1])
)e(<YST
pulse = exp(-0.5*((t0-T)/spread)**2); dz[ic][ic] = pulse
6v%yU3l
ez = ga*dz
)g5?5f;
for i in range(IE-1):
Q_mphW:[
for j in range(JE-1):
5K vp%
hx
[j] = hx
[j]+0.5*(ez
[j]-ez
[j+1])
ly0R'4j \
hy
[j] = hy
[j]+0.5*(ez[i+1][j]-ez
[j])
+Z`=iia>
fig = plt.figure()
emSq{A
ax = Axes3D(fig)
Rv1W &s&
x = arange(IE); y = arange(JE)
qHt/,w='Q
X,Y = meshgrid(x,y)
fQ+whGB
ax.plot_surface(X,Y,ez,rstride=1, cstride=1, cmap=cm.jet)
?Uql30A
show()
x}G:n[B7_V
图片:fd2d_3.1.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
15楼
发表于: 2010-07-29 15:00:31
这个图是python画的么?
BabaKSm}LP
y-<.l=6A
感觉很不错,与MATLAB相比还不错
zs$r>rlO
$8^Hkxy
不知道能否写动画。
共
条评分
离线
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,都是针对科学绘图的。
Es>' N3A z
pRQ7rT',v
安装pythonxy或者enthought就什么都不用再配置了呀,都是针对科学计算做的软件包,numpy等全都在里面,pythonxy是免费的,并且包括了enthought。enthought虽然是商业软件,但是可以免费使用。出了pythonxy后,应该很少有人自己配置numpy,scipy,gcc等软件包了。还有一款叫sage的,适合做计算平台,不适合做软件开发。
<]Td7-n
!MoAga_ j
动画:
~5 6&!4
01 from pylab import *
7hJX
02 import os
rKgl:sj+
03 # set the interactive mode of pylab to ON
CL0lMZ
04 ion()
9'MGv*Ho
05 # opens a new figure to plot into
m6R/,
06 fig_hndl = figure()
a1pp=3Pd?~
07 # make an empty list into which we'll append
YsmRY=3
08 # the filenames of the PNGs that compose each
?LMQz=
09 # frame.
=l(euBb
10 files=[]
h,/Aq
11 # filename for the name of the resulting movie
.xIAep_
12 filename = 'animation'
8063LWV
13 number_of_frames = 100
j]Gn\QF
14 for t in range(number_of_frames):
're:_;lG
15 # draw the frame
L{/% "2>
16 imshow(rand(100,100))
(xgw';g
17 # form a filename
4,y7a=qf3
18 fname = '_tmp%03d.png'%t
x3n9|Uud
19 # save the frame
etX@z'H
20 savefig(fname)
nDnJ}`k
21 # append the filename to the list
U["0B8
22 files.append(fname)
Fk=SkSky
23 # call mencoder
'TeH(?3G
24 os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10
>pu4 G+M
25 -ovc lavc -lavcopts vcodec=wmv2 -oac copy
T)P)B6q
26 -o " + filename + ".mpg")
)rEl{a
27 # cleanup
Kx9u|fp5
28 for fname in files: os.remove(fname)
[8T{=+k
1Uup.(
图片: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下的配置令人绝望。
NP;W=A F
希望这个东西不错吧。
0AHQ(+Ap
(MLcA\LJ
还有能否介绍一下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》的相应章节。
0+SDFh
ithov.com上有下载
共
条评分
发帖
回复