本單元的參考程式

自由落體差分近似(VPYTHON)



  • 自由落體:牛頓第二運動定律
  • 自由落體運動是一個物體在均勻的重力場之下,受到定力的作用而產生的等加速度運動,它的運動微分方程式為: \[a=\frac{dv}{dt}, ma=f=mg, a=g\] \[\frac{dv}{dt}=g\] 因為重力加速度\(g\)是一個常數,所以我們很快的就可以得到這個微分方程的精確解為\(v(t)=v(0)+gt\),如果初速度為0的話,\(v(t)=gt\)。速度是位置的微分: \[ \frac{dx}{dt}=v(t)=gt\] 根據我們的微分經驗,我們很快的就可以猜到\(x(t)\)的函數應該是 \[x(t)=x(0)+\frac{1}{2} gt^2\] 如果地面的位置是座標的原點,物體的初始位置距離地面高度h,則 \[x(t)=h+\frac{1}{2} gt^2\] 在這樣一個座標體系下重力加速度往下應該是負的,\(g=-9.8 \lt 0\)。

    使用精確解模擬自由落體運動
    Web VPython 3.2
    g=9.8; h=25.0; y_0=h; v_0=0.; 
    y=y_0; v=v_0
    scene = canvas(width=600, height=600,center=vec(0,12,0),
        background=vec(0.0,0.0,0.0))
    ball1= sphere(pos=vec(0,y_0,0), radius=0.5, color=color.yellow)
    varr1=arrow(pos=ball1.pos,axis=vec(0,-0.0,0),
        shaftwidth=0.1,color=color.red)
    floor=box(pos=vector(0,0,0),size=vector(20,0.5,20), 
        color=color.blue,opacity=0.5)
    scene.camera.pos=vec(0,10,50)
    scene.pause('click')
    t=0.; dt=0.01
    NR=int(1./dt); NR=50
    while True:
        rate(NR)    
        y=h-0.5*g*t**2  #自由落體的精確解
        v+=-g*t         #自由落體的精確解
        ball1.pos=vector(0,y,0)
        varr1.pos=ball1.pos
        varr1.axis=vec(0,v*0.002,0)
        if(ball1.pos.y < 0): break
        t+=dt
    
    glowscript(PS-FreeFall-1.py)



  • 自由落體的差分近似
  • 自由落體問題我們得到的精確解,包括速度對時間的函數以及位置對時間的函數關係,但是我們仍然可以比較使用有限差分近似法,來求自由落體的數值近似解: \[v(t+dt) \simeq v(t) + g dt \] \[x(t+dt) \simeq x(t) + v dt \] 運動的初始條件為:\(x(0)=h, v(0)=0, g=-9.8\)。

    根據以上的分析,我們寫出下面的程式,並且使用vpython來模擬整個自由落體運動的過程。

    Web VPython 3.2
    g=9.8; h=25.0; y_0=h; v_0=0.; 
    y=y_0; v=v_0; v2=0
    scene = canvas(width=600, height=600,center=vec(0,12,0),
        background=vec(0.0,0.0,0.0))
    ball1= sphere(pos=vec(0,y_0,0), radius=0.5, color=color.yellow)
    varr1=arrow(pos=ball1.pos,axis=vec(0,-0.0,0),
        shaftwidth=0.1,color=color.red)
    ball2= sphere(pos=vec(1.2,y_0,0), radius=0.5, color=color.cyan)
    floor=box(pos=vector(0,0,0),size=vector(20,0.5,20), 
        color=color.blue,opacity=0.5)
    scene.camera.pos=vec(0,10,50)
    scene.pause('click')
    t=0.; dt=0.05
    NR=int(1./dt); 
    while True:
        rate(NR)    
        y=h-0.5*g*t**2  #自由落體的精確解
        v+=-g*t         #自由落體的精確解
        ball1.pos=vector(0,y,0)
        varr1.pos=ball1.pos
        varr1.axis=vec(0,v*0.002,0)
        v2 += -g*dt              #自由落體的差分近似
        ball2.pos.y += v2*dt     #自由落體的差分近似
        if(ball1.pos.y < 0): break
        t+=dt
    



    glowscript(PS-FreeFall-2.py)





  • 反彈跳躍的球


  • Web VPython 3.2
    g=9.8; h=25.0; y_0=h; v_0=0.; 
    y=y_0; v=v_0; v2=0
    scene = canvas(width=600, height=600,center=vec(0,12,0),
        background=vec(0.0,0.0,0.0))
    ball1= sphere(pos=vec(0,y_0,0), radius=0.5, color=color.yellow)
    ball1.arr=arrow(pos=ball1.pos,axis=vec(0,-0.0,0),
        shaftwidth=0.1,color=color.red)
    ball1.v=vec(0,v_0,0)
    floor=box(pos=vector(0,0,0),size=vector(20,0.5,20), 
        color=color.blue,opacity=0.5)
    scene.camera.pos=vec(0,10,50)
    scene.pause('click')
    t=0.; dt=0.01
    NR=int(1./dt/2); 
    while t < 20:
        rate(NR)    
        ball1.v.y += -g*dt
        ball1.pos.y += ball1.v.y*dt     #自由落體的差分近似
        ball1.arr.pos=ball1.pos
        ball1.arr.axis=ball1.v*0.2
        if(ball1.pos.y < 0): 
            ball1.v=-ball1.v
        t+=dt
    



    glowscript(PS-FreeFall-3.py)





  • 受到空氣阻力的自由落體

  • 在這個程式當中我們考慮一個進行自由落體運動的物體受到空氣阻力的影響。 假設阻力的大小可以表示為下面的公式: \(f_r=-mCv\), m=落體質量C=阻力係數,v=速度, 請注意到阻力的方向總是與物體運動的方向相反,所以他會削減掉速度的大小,動能就會損失。 然而由於地球的重力,物體的速度一直受到向下的加速,空氣阻力使他減速, 最後在這兩種力量大小相等,合力為零的時候將會,落體趨近於一個等速度運動。
    \[f=f_g+f_r=-mg-mCv \] \[a=f/m=-g-Cv \]
    1. 第一個球(藍色),在真空的管子內運動,沒有受到任何空氣阻力的影響,是一個理想的自由落體運動。
    2. 第二個黃色的球受到空氣阻力的影響,速度雖然越來越快但最後會趨近於一個等速度運動, 那個極限的速率稱為終端速率(terminal speed)。
    3. 為了彰顯這個現象, 我們在第二個球的加速度小於0.1的時候,就產生第三個紅球,讓這個紅球以終端速率做等速度運動。 我們不難發現黃色的球跟紅色地球同步運動,顯現出黃色的球已經進入一個等速度運動的狀態。

      Web VPython 3.2
      g=9.8; h=25.0; y_0=h; v_0=0.; gv=vec(0,9.8,0); C=0.3
      y=y_0; v=v_0; v2=0
      scene = canvas(width=600, height=600,center=vec(0,12,0),
          background=vec(0.0,0.0,0.0))
      ball1= sphere(pos=vec(0,y_0,0), radius=0.5, color=color.yellow)
      ball1.v=vec(0,v_0,0)
      ball2= sphere(pos=vec(2,y_0,0), radius=0.5, color=color.cyan)
      ball2.v=vec(0,v_0,0)
      floor=box(pos=vector(0,0,0),size=vector(20,0.5,20), 
          color=color.blue,opacity=0.5)
      scene.camera.pos=vec(0,10,50)
      scene.pause('click')
      t=0.; dt=0.01
      NR=int(1./dt); 
      while t < 20:
          rate(NR)    
          ball1.v.y += -g*dt
          ball1.pos.y += ball1.v.y*dt     #自由落體的差分近似
          ball2.v +=(-gv-C*ball2.v)*dt#重力+空氣阻力
          ball2.pos.y += ball2.v.y*dt     #自由落體的差分近似    
          if(ball1.pos.y < 0): ball1.v=-ball1.v
          if(ball2.pos.y < 0): ball2.v=-ball2.v
          t+=dt  
      


      glowscript(PS-FreeFall-4.py)










    程式練習


    自由練習1