本單元的程式PS-EM-01.pyPS-EM-02.py PS-EM-03.py |
本單元的解說影片 |
Web VPython 3.2 def EF_point(q,rq,r): ke=1. rrq=r-rq rrq0=mag(rrq) E=ke*q*rrq/rrq0**3 return E q=1.; rq=vec(0,3,0) scene = display(width=600, height=600, center=vec(0, 4, 0), background=vec(0,0,0)) Xaxis=arrow(pos=vec(-4,0,0),axis=vec(8,0,0),shaftwidth=0.01 \ ,headwidth=0.02) Yaxis=arrow(pos=vec(0,0,0),axis=vec(0,8,0),shaftwidth=0.01 \ ,headwidth=0.02) charge = sphere(pos=rq, radius=0.2, color=color.red) qe=-1.; me=1.; xe=-2; ve=0.5 e = sphere(pos=vec(xe,0,0), radius=0.1, color=color.cyan, \ make_trail=True, retain=500, trail_radius=0.02) e.v=vec(ve,0,0) t=0.; dt=0.01; NR=int(1/dt) scene.camera.pos=vec(0,4,12) scene.pause('click') while t < 100: rate(NR*4) E=EF_point(q,rq,e.pos) e.v+=qe*E/me*dt e.pos+=e.v*dt t+=dt |
![]() |
Web VPython 3.2 # 帶負電的電子受到一個圓環上16\n個正電荷的吸引而進行簡諧運動 \ # qe=-1, me=1, 電子初始的位置x0=1, \n正電荷q=1, 圓環的半徑R=1' def EF_ring_q(Nq,q,rq,R,r): k=1. E=vec(0.,0.,0.) for i in range(Nq): t=2.*pi/Nq*i rrp=r-rq[i] rrp0=mag(rrp) E=E+k*q*rrp/rrp0**3 return E Nq=16; q=1.; R=1. scene = display(width=800, height=800, center=vec(0, 0, 0), background=vec(0,0,0)) arr=arrow(pos=vec(-2,0,0),axis=vec(4,0,0),shaftwidth=0.01, \ headwidth=0.02,color=vec(1,1,1)) scene.camera.pos=vec(1,0,6) rq=[] for i in range(Nq): t=2.*pi/Nq*i rq.append(vec(0,R*cos(t),R*sin(t))) ball = sphere(pos=rq[i], radius=0.1, color=color.red) qe=-1.; me=1.; x0=1. e = sphere(pos=vec(x0,0,0), radius=0.1, color=color.blue) E=EF_ring_q(Nq,q,rq,R,e.pos) ss='帶負電的電子受到一個圓環上16\n個正電荷的吸引而進行簡諧運動 \ \n qe=-1, me=1, 電子初始的位置x0=1, \n正電荷q=1, 圓環的半徑R=1' T=label(text=ss,pos=vector(0,3,0),height=20) scene.pause('click') e.v=vec(0,0,0) t=0.; dt=0.01; NR=int(1/dt) while t < 20: rate(NR) E=EF_ring_q(Nq,q,rq,R,e.pos) e.v+=qe*E/me*dt e.pos+=e.v*dt t+=dt |
![]() |
Web VPython 3.2 N=160; L1=5; d=2; L2=25 scene = canvas(width=800, height=600, background=vec(0.2,0.2,0.2)) X=arrow(pos=vec(0,0,0),axis=vec(27,0,0),shaftwidth=0.1,color=vec(1,1,0)) Y=arrow(pos=vec(0,0,0),axis=vec(0,8,0),shaftwidth=0.1,color=vec(0,0,1)) Z=arrow(pos=vec(0,0,0),axis=vec(0,0,8),shaftwidth=0.1,color=vec(1,1,1)) X.headwidth=0.1; Y.headwidth=0.1; Z.headwidth=0.1; plate1=box(pos=vec(L1/2.,-d,0),size=vec(L1,0.1,L1), color=color.blue) plate2=box(pos=vec(L1/2.,d,0),size=vec(L1,0.1,L1), color=color.blue) screen=box(pos=vec(L2,0,-20),size=vec(0.1,20,40), color=color.cyan) gun=cylinder(radius=0.6,pos=vec(-2,0,0),axis=vec(2,0,0)) balls=[sphere(pos=vec(0.1,0,0),radius=0.2,color=color.red) for i in range(N)] vx=4. vp=1. ay0=0.5 vy=[0. for i in range(N)] ay=[0. for i in range(N)] q0=1.0 q=[q0*sin(0.2*i) for i in range(N)] t,dt=0.,0.01; NR=int(1./dt) scene.forward=vec(cos(-pi/6),0,sin(-pi/6)) print(t,scene.camera.pos,scene.forward,scene.center) scene.pause('click') while t < 30.: rate(NR) screen.pos.z += vp*dt for i in range(N): if(t < 0.15*i): continue if(balls[i].pos.x >= 0.) and (balls[i].pos.x < 10.): ay[i]=q[i]*ay0 else: ay[i]=0. if(balls[i].pos.x > 25.): balls[i].color=color.blue balls[i].pos.z += vp*dt continue vy[i] += ay[i]*dt balls[i].pos.y += vy[i]*dt balls[i].pos.x += vx*dt t += dt print(t,scene.camera.pos,scene.forward,scene.center) |
![]() |
Web VPython 3.2 scene = canvas(width=800, height=800,center=vec(10,0,0), \ background=vec(0.2,0.2,0.2), forward=vec(0.5,0,-1)) arrx=arrow(pos=vec(0,0,0),axis=vec(8,0,0),shaftwidth=0.05, \ color=vec(1,1,0)) arrY=arrow(pos=vec(0,0,0),axis=vec(0,8,0),shaftwidth=0.05, \ color=vec(0,0,1)) arrZ=arrow(pos=vec(0,0,0),axis=vec(0,0,8),shaftwidth=0.05, \ color=vec(1,1,1)) N=250; L1=5; L2=25; d=2; R=0.1 balls = [sphere(pos=vec(-2,0,0), radius=R, color=color.red) \ for i in range(N)] plate1=box(pos=vec(L1/2.,-d,0),size=vec(L1,0.1,L1), \ color=color.blue, opacity=0.3) plate2=box(pos=vec(L1/2.,d,0),size=vec(L1,0.1,L1), \ color=color.blue, opacity=0.3) plate3=box(pos=vec(L1*1.5+L1/2.,0,-d),size=vec(L1,L1,0.1), \ color=color.green, opacity=0.3) plate4=box(pos=vec(L1*1.5+L1/2.,0,d),size=vec(L1,L1,0.1), \ color=color.green, opacity=0.3) plate5=box(pos=vec(L2,0,0),size=vec(0.1,20,20), \ color=color.cyan) gun=cylinder(radius=0.6,pos=vec(-2,0,0),axis=vec(2,0,0)) vx=4. ay0=0.8 az0=6.0 vy=[0. for i in range(N)] ay=[0. for i in range(N)] vz=[0. for i in range(N)] az=[0. for i in range(N)] T=4. t,dt=0.,0.01; NR=int(1./dt) scene.pause('click') while t < 100.: rate(NR) for i in range(N): if(t < 0.05*i): continue if(balls[i].pos.x > 0.) and (balls[i].pos.x < 10.): ay[i]=ay0*sin(0.2*(t-0.5)+pi/2.) else: ay[i]=0. if(balls[i].pos.x > 25-R): continue vy[i] += ay[i]*dt balls[i].pos.y += vy[i]*dt if(balls[i].pos.x > 1.5*L1) and (balls[i].pos.x < 2.5*L1): az[i]=az0*sin(4.*t) else: az[i]=0. if(balls[i].pos.x > 25.): continue vz[i] += az[i]*dt balls[i].pos.z += vz[i]*dt balls[i].pos.x += vx*dt t += dt |
![]() |
GlowScript 3.2 VPython def EF_point(q,rq,r): ke=1. rrq=r-rq rrq0=mag(rrq) E=ke*q*rrq/rrq0**3 return E q=79; rq=vec(0,0,0) scene = canvas(width=1000, height=700, center=vec(0, 0, 0)) Xaxis=arrow(pos=vec(-4,0,0),axis=vec(8,0,0),shaftwidth=0.01, \ headwidth=0.02) Yaxis=arrow(pos=vec(0,-1,0),axis=vec(0,2,0),shaftwidth=0.01) charge = sphere(pos=rq, radius=0.03, color=color.red) Na=21; qa=2.; ma=4.; xa=-2; va=60; Ly=0.2; Ly2=Ly/2; dy=Ly/Na qc=[qa for i in range(Na)] es = [sphere(pos=vec(-2,-Ly2+dy*i,0), radius=0.03, \ color=vec(0.5+0.5*random(),0.5+0.5*random(),0.5+0.5*random()), make_trail=True) for i in range(Na)] for i in range(Na): es[i].v=vec(va,0,0) t=0.; dt=0.0002; NR=int(1/dt) labva='va={:04.1f}'.format(va) label(text=labva,pos=vector(-2,2,0)) print_options(width=1000, height=100) print('q=',q,' rq=',rq,' Na=',Na,' qa=',qa,' ma=',ma, \ ' xa=',xa,' va=',va,' Ly=',Ly) scene.waitfor('click') while t < 10: rate(NR/100) for i in range(Na): if(mag(es[i].pos) > 2.2): break E=EF_point(q,rq,es[i].pos) es[i].v+=qc[i]*E/ma*dt es[i].pos+=es[i].v*dt t+=dt |
![]() |