基礎計算物理作業08 - 磁力與帶電粒子在磁場中的運動

  1. 帶電粒子在4個均勻的磁場當中運動



  2. 上傳作業檔名:MF-motion-CY4
    在這個作業當中我們有四個均勻的磁場分別侷限在4個圓柱形的區域當中,如圖所示,只有在圓柱形的區域當中磁場存在,在其他的區域是沒有磁場的。四個區域當中的磁場方向交錯。我們考慮6個帶電的粒子,帶電粒子運動的時間錯開,每個粒子相隔4秒之後開始運動。6個帶電的粒子出發點的位置相同但是初速度不同,越來越快。這6個粒子陸續進入磁場中的軌跡不同,最後的軌跡如圖片中所示,細節的運動模擬如下面的影片所示。請同學們以下面提供的程式為基礎,試圖做出做出整個運動的模擬。
    GlowScript 3.2 VPython
    scene=canvas(width=800, height=550, center=vec(0, 0, 0), forward=vec(0,0,-1))
    q=1; m=1; r=1.; v=0.6;NB=3; Rc=0.3; x0=2; y0=0.4
    ball0 = sphere(pos=vec(0,0,0), radius = 0.05, make_trail=True, color=color.red)
    balls = [sphere(pos=vec(x0,-0.4+0.0*i,0), radius = 0.05, make_trail=True, color=vec(((i+1)%4/4),((i+1)%3/3),((i+1)%5/5))) for i in range(NB)]
    arrx=arrow(pos=vec(0,0,0),axis=vec(3,0,0),shaftwidth=0.02,headwidth=0.02,color=vec(1,0,0))
    arrY=arrow(pos=vec(0,0,0),axis=vec(0,3,0),shaftwidth=0.02,headwidth=0.02,color=vec(0,1,0))
    arrZ=arrow(pos=vec(0,0,0),axis=vec(0,0,3),shaftwidth=0.04,headwidth=0.02,color=vec(0,0,1))
    CY=[cylinder(pos=vec(0,0,-1),axis=vec(0,0,2),radius=Rc,color=vec(1,1,1),opacity=0.5) for i in range(2)]
    CY[0].pos=vec(0.5,0.5,0);CY[1].pos=vec(0.5,-0.5,0);
    print_options(width=800, height=100)
    B=[vec(0,0,4*(-1)**(i+1)) for i in range(2)]
    print('CY pos=',[CY[i].pos for i in range(2)])
    print('B=',B)
    for i in range(NB): balls[i].v=vec(-(v+0.2*i),0,0)
    print('balls pos=',[balls[i].pos for i in range(NB)])
    print('balls   v=',[balls[i].v for i in range(NB)])
    
    t=0.; dt = 0.001; NR=int(1./dt)
    time='{:02d}'.format(t)
    T=label(text=time,pos=vector(1.2,1.5,0))
    #scene.pause('click')
    while t < 13:
        rate(NR)
        time='{:02d}'.format(t); T.text=time    
        for i in range(NB):
            if(t < 4*i): continue
            balls[i].a=vec(0,0,0)
            if(mag(balls[i].pos) > 3): continue
            for j in range(2):
                rho=sqrt((balls[i].pos.x-CY[j].pos.x)**2+(balls[i].pos.y-CY[j].pos.y)**2)
                if(rho < Rc): balls[i].a=q*cross(balls[i].v,B[j])/m; 
            balls[i].v += balls[i].a*dt
            balls[i].pos += balls[i].v*dt   
        t=t+dt
    for i in range(NB):
        label(text=str(i),pos=balls[i].pos*1.1,box=False)
    
    glowscript:帶電粒子在4個均勻的磁場當中運動參考程式(PS-HW-08-01-A.py)








  3. 帶電粒子在磁瓶子的磁場當中運動

  4. 上傳作業檔名:MF-motion-bottle

    帶電粒子在磁瓶子的磁場當中運動影片
    GlowScript 3.2 VPython
    scene=canvas(width=800,height=600,center=vec(0,0,2),background=vec(0,0,0),forward=vec(-1,-1,-1))
    print_options(width=800, height=100)
    
    def BF_coil_2(R,Z2,Ni,ic,r,br,bc):
        mu0=1.
        ds=2.*pi*R/Ni
        B=vec(0.,0.,0.)
        for i in range(Ni):
            t=2.*pi/Ni*i
            rp=vec(R*cos(t),R*sin(t),0)
            dl=ds*vec(-sin(t),cos(t),0.)
            rrp=r-rp
            dB=mu0*ic/4.*pi*cross(dl,rrp)/mag(rrp)**3
            B=B+dB
        for i in range(Ni):
            t=2.*pi/Ni*i
            rp=vec(R*cos(t),R*sin(t),Z2)
            dl=ds*vec(-sin(t),cos(t),0.)
            #if(curr==0):    arr=arrow(pos=rp, axis=dl,shaftwidth=0.02, color=vec(0.5,0,0.5))
            rrp=r-rp
            rrp0=mag(rrp)
            dB=mu0*ic/4.*pi*cross(dl,rrp)/rrp0**3
            B=B+dB
        return B
           
    def Bline(R,Z2,Ni,ic,r,br,bc,a):
        maxi=2000
        ss=0.01
        ri=r
        for i in range(maxi):
            B=BF_coil_2(R,Z2,Ni,ic,r,br,bc)
            curr=1
            nr=r+B/mag(B)*ss
            arr=arrow(pos=r,axis=nr-r,shaftwidth=0.02,headwidth=0.02,color=a)
            r=nr
            dr=mag(r-ri)
            if(i>100 and dr < 0.08): break
            if(i>100 and dr > 3.5): break
        return
        
    ic=30; R=1.; Z2=4; Ni=40; br=0.1
    print('ic=',ic,'  R=',R,'  Z2=',Z2)
    arrx=arrow(pos=vec(0,0,0),axis=vec(2,0,0),shaftwidth=0.02,headwidth=0.02,color=vec(1,0,0))
    arrY=arrow(pos=vec(0,0,0),axis=vec(0,2,0),shaftwidth=0.02,headwidth=0.02,color=vec(0,1,0))
    arrZ=arrow(pos=vec(0,0,0),axis=vec(0,0,6),shaftwidth=0.04,headwidth=0.02,color=vec(0,0,1))
    ring(pos=vec(0,0,0),radius=R,axis=vec(0,0,1),color=vec(1,1,1),thickness=0.02)
    ring(pos=vec(0,0,Z2),radius=R,axis=vec(0,0,1),color=vec(1,1,1),thickness=0.02)
    [sphere(pos=vec(-0.7+0.2*i,0.0,0),color=vec(0,0.5,1),radius=0.05) for i in range(8)]
    arrow(pos=vec(0,R,0),axis=vec(-0.3,0,0),shaftwidth=0.04,color=vec(1,1,0))
    scene.pause('click')
    bc=vec(1,0.5,0)
    NC=8
    for i in range(NC):
        t=2*pi/NC*i
        xi=0.5*cos(t)
        yi=0.5*sin(t)
        r=vec(xi,yi,0)
        Bline(R,Z2,Ni,ic,r,br,bc,bc)
    scene.pause('click')
    m=1; q=1; v0=2; th=pi/2; rq=vec(0.1*R*cos(th),0.1*R*sin(th),0.5); vq=vec(-sin(th),cos(th),0.00)*v0
    b=sphere(pos=rq,color=vec(1,1,0),radius=0.05,make_trail=True,retain=50)
    b.v=vq
    time='{:02d}'.format(t)
    T=label(text=time,pos=vector(1.2,1.5,0))
    t=0; dt=0.0001; NR=int(1/dt)
    print('m=',m,'  q=',q,'  rq=',rq,'  vq=',vq,'  dt=',dt)
    scene.pause('click')
    while t < 4.1:
        rate(NR/4)
        time='{:02d}'.format(t); T.text=time
        b.pos+=vec(0,0,1)*dt
        t+=dt
    
    glowscript:帶電粒子在磁瓶子的磁場當中運動參考程式(PS-HW-08-01-A.py)