登 录
註 冊
论坛
微波仿真网
注册
登录论坛可查看更多信息
微波仿真论坛
>
时域有限差分法 FDTD
>
Python的实现
发帖
回复
1
2
3
4
8479
阅读
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:
"8{#R*p
.(T*mk*>
dx[k] = dx[k]+0.5*(hy[k-1]-hy[k])
!9yOFd_
ex[k] = ga[k]*(dx[k]-ix[k])
NRU&GCVwu
ix[k] = ix[k]+gb[x]*ex[k]
&rY73qfP'
hy[k] = hy[k]+0.5*(ex[k]-ex[k+1])
]"Y? ZS;H
WEgJ_dB
式中:
-%8*>%
9os>k*
ga[k] = 1/(epsilon+sigma*dt/epsz)
fUy:TCS
gb[k] = sigma*dt/epsz
e nsou!l
i7hWBd4wK
这次是把程序中的循环用向量化的方式实现的:
+AGI)uQQ
R-Y07A
from pylab import *
eEvE3=,hg
"uR,WY
KE = 200; NSTEPS = 500
k+ Shhe1
=+{SZh@
ex = zeros(KE); hy = zeros(KE)
'!8'Xo@Go3
dx = zeros(KE); ix = zeros(KE)
b 4o`eR
.EJo9s'
epsz = 8.8e-12
~ ;CnwG
ddx = 0.01; dt = ddx/6e8
hS<lUG!9UJ
{OA2';3
kstart = 100
.wj?}Fr?97
epsilon = 4.0; sigma = 0.04
wxy.&a]
9?8Yf(MC%u
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz)
bb@@QzR
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
u-yVc*<,
p%;n4*b2
ex_low_m1 = 0.0; ex_high_m1 = 0.0
>K<n~;ON|
ex_low_m2 = 0.0; ex_high_m2 = 0.0
O}Y& @V%4k
X=Qa TV
freq_in = 7e8; T = 0
5Oh>r K(
J]|Zh
for n in range(NSTEPS+1):
_ISIq3A?
-:mT8'.F-
T += 1
.UJp#/EHs
[wHGt?R
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
QahM)Gb
pulse = sin(2*pi*freq_in*dt*T); dx[5] = dx[5]+pulse
/G}TPXA
ex = ga*(dx-ix); ix = ix+gb*ex
Aj9<4N
Tf[o'=2
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
|$AoI
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
0$8iWL
;[pY>VJ(
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
NGsG4y^g?z
;JQ:S~K9
plot(ex)
TGUlJLT
show()
Fp3NWvu
zQpF,N<b
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
11楼
发表于: 2010-07-28 16:44:57
fd1d_2.2.c是计算500MHz处的频域响应
,.Sd)JB'
iUH{rh!
from pylab import *
FF} A_ZFY
6 2YT)/i3
KE = 200; NSTEPS = 400
1kDr;.m%
QO fqW@g
ex = zeros(KE); hy = zeros(KE)
Ok/U"N-
dx = zeros(KE); ix = zeros(KE)
udld[f.
I7[F,xci
epsz = 8.8e-12
S*0P[R
ddx = 0.01; dt = ddx/6e8
mW+QJ` 3
\NgBF
kstart = 100
BZdryk:S
epsilon = 4.0; sigma = 0.0
94Hs.S)
E <O:
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz)
~[wh
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
D on8xk
4Iq-4IG(
ex_low_m1 = 0.0; ex_high_m1 = 0.0
-C
ex_low_m2 = 0.0; ex_high_m2 = 0.0
jO5R0^w
df'xx)kW
freq_in = 7e8; T = 0
0QakFt
D=!e6E<>@
real_pt = zeros((KE,3)); imag_pt = zeros((KE,3))
KeIk9T13O
ampn = zeros((KE,3)); phasen = zeros((KE,3))
7y/Pch
|1rKGDc
real_in = zeros(3); imag_in = zeros(3)
~"IjT'W3
amp_in = zeros(3); phase_in = zeros(3)
-nsI5\]
[Y%H8}
freq = array([1.0e8,2.0e8,5.0e8]); arg = 2*pi*freq*dt
M8,_E\*
m0$4
t0 = 50.0; spread = 10.0
-\2T(3P
s{30#^1R
ex3 = zeros((KE,3))
5VLJ:I?0O
p,cw-lN
for n in range(NSTEPS+1):
A/xo'G
r6x"D3
T += 1
sy s6 V?
n}f*>Mn
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
Y)7LkZO(y
pulse = exp(-0.5*((t0-T)/spread)**2); dx[5] = dx[5]+pulse
!(&N{NH9
ex = ga*(dx-ix); ix = ix+gb*ex
/&T"w,D
0=,vdT
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
i^O(JC
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
HHZGu8tzt
rNl`w.
for m in range(3): ex3[:,m] = ex
/8s+eHn&%
real_pt = real_pt+cos(arg*T)*ex3
-weCdTY`X
imag_pt = imag_pt-sin(arg*T)*ex3
`g~T #U\>d
c}l?x \/
real_in = real_in+cos(arg*T)*ex[5]
vT&xM
imag_in = imag_in-sin(arg*T)*ex[5]
PrZs@ Y
s/"l ?d
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
(:TZ~"VY
kZfUwF:yN
amp_in = sqrt(real_in**2+imag_in**2)
X (0`"rjg
ampn = 1.0/amp_in*sqrt(real_pt**2+imag_pt**2)
Fh3>y2`/
n>5/y c"/q
plot(ampn[:,2],label='T='+str(NSTEPS))
+OTNn@!9
legend()
|Nfi y
show()
z4UJo!{S
图片:fd1d_2.2.JPG
共
条评分
离线
samuelp
UID :63797
注册:
2010-07-23
登录:
2010-10-19
发帖:
28
等级:
仿真二级
12楼
发表于: 2010-07-28 17:43:45
如果是色散介质,增加参数:
&:3uK`
{[<o)k .A
gc = chil*dt/tau
Uh9p,AV
tcm?qro)
fd1d_2.3.c:
C1V@\mRi
,'KS:`m!
from pylab import *
wTu_Am
^>3q@,C]c
KE = 200; NSTEPS = 1000
zHEH?xZ6sD
de&*#O5
ex = zeros(KE); hy = zeros(KE)
ks}J ke>
dx = zeros(KE); ix = zeros(KE)
)Td;2
sx = zeros(KE)
)U?O4| \P
\m\E*c ):
epsz = 8.8e-12
sX :)g>b
ddx = 0.01; dt = ddx/6e8
|6ZH+6[
YoT<]'
kstart = 100
!(-lY(x
epsilon = 2.0; sigma = 0.01; chil = 2.0; tau = 1.0e-9; del_exp = exp(-dt/tau)
2EU((Q`>=(
.d4L@{V
ga = ones(KE); ga[kstart:] = 1.0/(epsilon+sigma*dt/epsz+chil*dt/tau)
49gm=XPm
gb = zeros(KE); gb[kstart:] = sigma*dt/epsz
~eVq Fc
gc = zeros(KE); gc[kstart:] = chil*dt/tau
H2p lT
gHB*u!w7Z
ex_low_m1 = 0.0; ex_high_m1 = 0.0
wd 4]Z0;
ex_low_m2 = 0.0; ex_high_m2 = 0.0
$P{|^ou3a#
m#^ua^JV
freq_in = 7e8; T = 0
7jZE(|G-
mw[T[
real_pt = zeros((KE,3)); imag_pt = zeros((KE,3))
mHiV};$
ampn = zeros((KE,3)); phasen = zeros((KE,3))
#%=6DHsK
D<DSK~
real_in = zeros(3); imag_in = zeros(3)
,k,RXgQ
amp_in = zeros(3); phase_in = zeros(3)
h.~:UR*
T@S\:P
freq = array([50.0e6, 200.0e6, 500.0e6]); arg = 2*pi*freq*dt
W$I^Ej}>$
9}=]oX!+V
t0 = 50.0; spread = 10.0
#jc+2F,+{
'#;%=+=;
ex3 = zeros((KE,3))
EINjI:/D
\$iU#Z
for n in range(NSTEPS+1):
d&@>P&AT
S-4C>gM
T += 1
+J`HI1
CXe2G5
dx[1:] = dx[1:] + 0.5*(hy[:-1]-hy[1:])
6ojEEM
pulse = exp(-0.5*((t0-T)/spread)**2); dx[5] = dx[5]+pulse
d"P\ =`+
ex = ga*(dx-ix-sx)
; ix = ix+gb*ex;
sx = del_exp*sx+gc*ex
whA
,"@Tm01os
ex[0] = ex_low_m2; ex_low_m2 = ex_low_m1; ex_low_m1 = ex[1]
f4h|Nn%;
ex[-1] = ex_high_m2; ex_high_m2 = ex_high_m1; ex_high_m1 = ex[-2]
TN+iv8sT
Tx+Bkfj
for m in range(3): ex3[:,m] = ex
<fZ?F=
real_pt = real_pt+cos(arg*T)*ex3
-$; h+9BO
imag_pt = imag_pt-sin(arg*T)*ex3
|3a1hCxt
vq.~8c1
real_in = real_in+cos(arg*T)*ex[5]
%/K'VE6pb
imag_in = imag_in-sin(arg*T)*ex[5]
P_ [A
nQ$4W
hy[:-1] = hy[:-1] + 0.5*(ex[:-1]-ex[1:])
T[z}^"
>R9_;
amp_in = sqrt(real_in**2+imag_in**2)
5Dhpcgq<<
ampn = 1.0/amp_in*sqrt(real_pt**2+imag_pt**2)
na5:)j4<
}^}fx [
for m in range(3):
JFJ_ PphvD
plot(ampn[:,m],label='Freq: '+str(freq[m]/1e6)+'MHz')
QXQ'QEG
legend()
(F<VcB
show()
O]XdPH20
{1<XOp#b
第二章完活。
D.i(Irqw!
图片: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:
iE}Lw&x
8Hf:yG,
from pylab import *
:/.SrkN(A7
from mpl_toolkits.mplot3d import Axes3D
%mO.ur>21
zFFip/z\
IE = 60; JE = 60; NSTEPS = 50
[yEH!7
ic = IE/2; jc = JE/2
odm!}stus
ddx = 0.01; dt = ddx/6.0e8; epsz = 8.8e-12
Y*KP1=Md
kdam]L:9
dz = zeros((IE,JE)); ez = zeros((IE,JE))
~vL`[JiK
hx = zeros((IE,JE)); hy = zeros((IE,JE))
Yp;6.\Z8[
ga = ones((IE,JE))
>k)zd-
G2,9$8qE
t0 = 20.0; spread = 6.0; T = 0
gdx2&~
GY3g`M
for n in range(NSTEPS):
;7HL/-
T += 1
Jn+k$'6%#
for i in range(1,IE):
k>'c4ay290
for j in range(1,JE):
T1([P!g*
dz
[j] = dz
[j]+0.5*(hy
[j]-hy[i-1][j]-hx
[j]+hx
[j-1])
g.V{CJ*V
pulse = exp(-0.5*((t0-T)/spread)**2); dz[ic][ic] = pulse
QMI6l'"s
ez = ga*dz
T2%{pcdV/
for i in range(IE-1):
/_?y]Ly[r
for j in range(JE-1):
,WA[HwY-
hx
[j] = hx
[j]+0.5*(ez
[j]-ez
[j+1])
`1hM3N.nO
hy
[j] = hy
[j]+0.5*(ez[i+1][j]-ez
[j])
G<MX94?
fig = plt.figure()
gQ0W>\xz
ax = Axes3D(fig)
|E(`9
x = arange(IE); y = arange(JE)
b.4H4LV
X,Y = meshgrid(x,y)
l)d(N7HME
ax.plot_surface(X,Y,ez,rstride=1, cstride=1, cmap=cm.jet)
CZ~%qPwDw
show()
uQ_s$@brI
图片:fd2d_3.1.JPG
共
条评分
离线
caocheng82
UID :10116
注册:
2008-03-28
登录:
2025-05-26
发帖:
697
等级:
积极交流六级
15楼
发表于: 2010-07-29 15:00:31
这个图是python画的么?
jkrv2 `"
jx?"m=`s:
感觉很不错,与MATLAB相比还不错
#K4lnC2qz
W,53|9b@
不知道能否写动画。
共
条评分
离线
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,都是针对科学绘图的。
w-3 B~e
DdG*eKC
安装pythonxy或者enthought就什么都不用再配置了呀,都是针对科学计算做的软件包,numpy等全都在里面,pythonxy是免费的,并且包括了enthought。enthought虽然是商业软件,但是可以免费使用。出了pythonxy后,应该很少有人自己配置numpy,scipy,gcc等软件包了。还有一款叫sage的,适合做计算平台,不适合做软件开发。
1r-#QuV#
!~5=tK
动画:
H5'Le{
01 from pylab import *
5%Xny8 ]|D
02 import os
(qky&}H
03 # set the interactive mode of pylab to ON
h4 X >
04 ion()
@U;U0
05 # opens a new figure to plot into
~?x `f+
06 fig_hndl = figure()
S}T*g UO
07 # make an empty list into which we'll append
OlJkyL8|
08 # the filenames of the PNGs that compose each
AWqc?K@
09 # frame.
R{hq1-
10 files=[]
^ 1 P@BRh
11 # filename for the name of the resulting movie
C $r]]MSj
12 filename = 'animation'
1X45~
13 number_of_frames = 100
N`Q[OFe
14 for t in range(number_of_frames):
6d%|yl
15 # draw the frame
61}hB>TT:
16 imshow(rand(100,100))
kpU-//lk+
17 # form a filename
::Nhs/B/
18 fname = '_tmp%03d.png'%t
TM1D|H
19 # save the frame
faJ>,^V#
20 savefig(fname)
"VfV;)]|w
21 # append the filename to the list
k"V@9q;*
22 files.append(fname)
#ivN-WKCl
23 # call mencoder
M^$liS.D
24 os.system("mencoder 'mf://_tmp*.png' -mf type=png:fps=10
/cN. -lEo%
25 -ovc lavc -lavcopts vcodec=wmv2 -oac copy
}s7ibm'
26 -o " + filename + ".mpg")
$kM8E@x2
27 # cleanup
*z{.9z`
28 for fname in files: os.remove(fname)
&\_cU?0d
{q}# Sq
图片: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下的配置令人绝望。
1D pRm(
希望这个东西不错吧。
L9FijF7
M\f1]L|8d
还有能否介绍一下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》的相应章节。
KC`~\sYRN]
ithov.com上有下载
共
条评分
发帖
回复