電荷在磁場中的運動

在這個單元中我們要利用vpython的動畫模擬來呈現電荷在磁場中的運動。

磁力與帶電粒子在磁場中的運動

下面我們要做一個程式能夠模擬帶電粒子在磁場中的運動行為。我們知道一個帶電粒子如果以垂直於磁場的方向的速度,射入一個均勻的磁場當中,那麼帶電粒子將會受到垂直於運動速度方向的磁力的作用: \[\vec{F}=q \vec{v} \times \vec{B}\] 這個磁力將會造成帶電粒子改變運動方向,最後形成了一個圓週運動。磁場的磁力就提供了帶電粒子進行圓週運動所需要的向心力(\(F_c=\frac{mv^2}{r}\))。根據\(磁力=向心力\),我們就可以推導出圓週運動的半徑公式: \[\frac{mv^2}{r}=qvB \rightarrow r=\frac{mv}{qB}\] 在下面的程式設計中,我們將分成幾個程序來完成各種不同的問題,由淺到深,由簡單到複雜。
  1. 在均勻磁場當中的等速率圓週運動:
  2. 如果粒子運動的速度方向與磁場垂直,那麼這個磁力將會同時與磁場和速度垂直,並且並不改變粒子的速度大小,因此粒子會維持在一個平面上進行等速率圓週運動。
  3. 在均勻磁場中的螺旋運動:
  4. 如果粒子運動的速度方向並不全然與磁場垂直,也就是有平行於磁場的速度分量,那麼這個帶電粒子將會在這個均勻磁場中,一方面作垂直於磁場平面的圓週運動,一方面又在磁場的方向上進行等速度運動,兩種運動的結合就成為一個螺旋線的運動軌跡。
  5. 模擬質譜儀
  6. 模擬同步迴旋加速器




  1. 均勻磁場中的等速率圓週運動

  2. 運動的初始條件是物體有一個初始的速度\(\vec{v}=(0,v,0)\),初始的位置\((r,0,0)\),r=圓周運動的半徑,並且給定物體的質量\(m\)。這個物體將隨時受到一個垂直於\(\vec{v}\)指向圓心方向(原點(0,0,0))的固定大小力量(\(|\vec{f}|=\frac{mv^2}{r}\))的作用。ac=v**2/r是向心加速度的大小,-ball1.pos/abs(ball1.pos)代表指向原點(即為圓心)的單位向量,"-"代表向心。

    均勻磁場中的等速率圓週運動




    GlowScript 2.9 VPython
    scene = display(width=800, height=600, center=vec(0, 0, 0), background=vec(0.2,0.5,0.2))
    r=10.; v=10.
    ac=v**2/r
    ball0 = sphere(pos=vec(0,0,0), radius = 0.1, make_trail=True, color=color.red)
    ball1 = sphere(pos=vec(r,0,0), radius = 0.2, make_trail=True, color=color.yellow)
    ball1.v=vec(0,v,0)
    dt = 0.01   
    t=0.
    while True:
        rate(50)
        ball1.a=-ball1.pos/mag(ball1.pos)*ac
        ball1.v +=   ball1.a*dt
        ball1.pos += ball1.v*dt   
        t=t+dt
    



  3. 在均勻磁場中的螺旋運動

  4. 如果你可以成功的寫出一個物體在固定的大小的向心力的作用下,進行等速率圓週運動,那麼我們只需要將力量換成磁力,把整個物體運動的空間變成三維空間,磁力向量寫成速度與磁場的外積向量(\(\vec{F}=q\vec{v}\times\vec{B}\)),那麼我們就可以開始模擬帶電粒子在磁場中的運動。第一個小小的檢驗就是當速度與磁場的方向垂直的時候,應該是一個標準的圓週運動。進一步擴展我們的模擬,你可以嘗試把帶電粒子的速度方向調整,與磁場方向不完全垂直,而有一些磁場方向的速度分量,那麼我們都知道,在此情況下,帶電粒子將進行螺旋形的軌道運動,你應該可以成功的看到這樣的模擬結果。

    在均勻磁場中的螺旋運動




    GlowScript 2.9 VPython
    scene = display(width=800, height=800, center=vec(0, 0, 0), background=vec(0.2,0.5,0.2))
    q=1; m=1; r=10.; v=10.
    ball1 = sphere(pos=vec(r,0,0), radius = 0.1, make_trail=True, color=color.yellow)
    arr=arrow(pos=vec(0,0,0),axis=vec(0,0,8),shaftwidth=0.1)
    B=vec(0,0,1)
    ball1.v=vec(0,-v,0.2)
    t=0.; dt = 0.01; NR=int(1./dt)
    while True:
        rate(NR)
        ball1.a=q*cross(ball1.v,B)/m
        ball1.v +=   ball1.a*dt
        ball1.pos += ball1.v*dt   
        t=t+dt
    



  5. 質譜儀


  6. 最後希望引入多個帶電粒子進入磁場當中,每一個粒子有他自己的速度大小和方向,他們可以同時都在磁場中運動。我們也可以選用相同的速度和方向但是給予每一顆粒子不同的質量,那麼你將觀察到質譜儀的工作原理。


    質譜儀




    GlowScript 2.9 VPython
    scene = display(width=800, height=800, center=vec(0, -12, 0), background=vec(0.2,0.5,0.2))
    q=1; r=10.; v=10.
    arrx=arrow(pos=vec(-20,0,0),axis=vec(40,0,0),shaftwidth=0.05,color=vec(0,0.5,0.5))
    balls = [sphere(radius = 0.3, color=vec(0.3,0.5,0)*i, make_trail=True) for i in range(3)]
    m=[]
    for i in range(3):
        balls[i].pos=vec(r,5,0)
        balls[i].v=vec(0,-v,0)
        m.append(1.+0.2*i)
    vB=arrow(pos=vec(0,0,0),axis=vec(0,0,8),shaftwidth=0.1)
    B=vec(0,0,1)   
    t=0.; dt = 0.01; NR=int(1./dt)
    while t < 5:
        rate(NR/2)
        for i in range(3):
            if(balls[i].pos.y > 0. and balls[i].v.y > 0.) : continue
            if(balls[i].pos.y > 0.): a=vec(0,0,0)
            else: a=q*cross(balls[i].v,B)/m[i]
            balls[i].v += a*dt
            balls[i].pos += balls[i].v*dt   
        t=t+dt
    



  7. 迴旋加速器


  8. 有一種加速器稱為迴旋加速器,就像圖中所顯示的,它包含兩個相對的D,中間的空隙有平行的電場構成,帶電粒子穿越過平行電場的時候會受到電場的加速,速度會增加,這就是加速器的主要目的:增加帶電粒子的動能。為了讓帶電粒子持能夠多次穿越平行電場,能夠多次的被加數獲得較大的動能,因此我們利用存在於兩個D之內的磁場,讓帶電粒子在D區域內轉彎。每轉過半圈之後,又可以再度穿越電場,帶電粒子可以再度被電場加速。當然在粒子再度穿越之前,我們必須把電場的方向倒轉,才能夠繼續加速帶電粒子,因此迴旋加速器的中間的平行電場是一個震盪電場。
    在兩個D形區域內有一個均勻的磁場存在,磁場的方向為指向紙面的方向。從一個帶電質點在均勻磁場中進行圓週運動的學習中,我們已經很清楚的學到粒子進行圓週運動的週期(T),旋轉半徑(r),旋轉頻率(f)和旋轉角頻率(\(\omega\))的數學關係式分別如下:\[r=\frac{mv}{qB},\] \[T=\frac{2\pi m}{qB},\] \[f=\frac{qB}{2\pi m},\] \[\omega=\frac{qB}{m},\] 從公式中我們清楚地看到旋轉的週期或頻率與帶電粒子運動的速度無關,因此無論粒子的速度多快,粒子跨越過平行電場的時間(週期)是固定的,角頻率也是固定的。因此平行電場的振盪頻率就是這個頻率(f)。


    迴旋加速器




    GlowScript 2.9 VPython
    def qvB():
        global m,q,v,B
        vb=cross(v,B)
        a=q*vb/m
        return a
    R1=0.02; m=1.; q=1.;  v0=1.;  r0=1.
    d=0.2; d2=d/2.; E=4.; xi=-d2+0.0001
    acc=vec(q*E/m,0.,0.)
    v=vec(0.,1.,0.)
    B=vec(0.,0.,1.)
    a=qvB()
    scene = display(width=800, height=800, center=vec(0,-5,0), background=vec(0.2,0.5,0.2))
    b1 = sphere(radius=0.0001,color=color.blue,make_trail=True, trail_radius=0.01)
    b1.pos=vec(xi,0,0); b1.v=vec(0.0001,0.,0.)
    arr1=arrow(pos=vec(-d2,-8,0),axis=vec(0,16,0),shaftwidth=0.01)
    arr2=arrow(pos=vec(d2,-8,0),axis=vec(0,16,0),shaftwidth=0.01)
    s='%10.3f'*6
    t=0.
    dt = 0.001
    while t < 400.:
        rate(1000)
        if(t > 0.2):
            if(abs(b1.pos.x+d/2) < 0.001 and b1.v.x > 0.) or (abs(b1.pos.x-d/2) < 0.001 and b1.v.x < 0.):
                print ("{:12.4f}  {:12.6f}".format(t,mag(b1.v)))
        if(b1.pos.x > -d2 and b1.pos.x < d2 and b1.v.x > 0.):
            b1.v += acc*dt
            b1.pos += b1.v*dt
        elif(b1.pos.x > -d2 and b1.pos.x < d2 and b1.v.x < 0.):
            b1.v += -acc*dt
            b1.pos += b1.v*dt
        else:
            v=b1.v
            b1.a=qvB()
            b1.v += b1.a * dt
            b1.pos += b1.v * dt 
        t=t+dt
    
    
    ============輸出:=============
          3.4560      1.266086
          6.7290      1.792900
          9.9700      2.196347
         13.1980      2.540335
         16.4130      2.844798
         19.6220      3.117692