置頂

我的 VPython 教學文件 (HackMD 版本)

VPython 教學文件目錄 安裝及測試 基本語法 等速度直線運動 自由落下 終端速度 水平抛射 使用For迴圈計算水平抛射資料 斜向抛射 圓周運動 簡諧運動 單擺 木塊彈簧系統分離 重力及簡諧 行星運動 相疊木塊 雙重簡諧運動 一維彈性碰撞 ...

熱門文章

2018年4月22日 星期日

相疊木塊

作者:王一哲
日期:2018/4/22




這是會出現在基礎物理2B下的例題,出現的章節甚至橫跨動量守恆、功與能量、碰撞等三章,題目敘述如下:

木塊A質量為 $2m$、木塊B質量為 $m$,兩個木塊相疊,桌面與木塊A之間沒有摩擦力,A的初速度為 $v$。兩個木塊之間的動摩擦係數為 $\mu_k$,若A的長度夠長,A、B最後能以相同的速度前進,請問:(1) A、B的末速為何? (2) 經過多久之後兩者速度相同。


兩木塊相疊示意圖



題目有兩種版本,第一種是像上圖的版本,木塊B的初位置在木塊A的最右側且原為靜止,木塊A的初速度向右;第二種則是木塊B的初位置在木塊A的最左側且初速度向右,木塊A原為靜止。這次的目標是將運動過程中木塊A、B的速度 - 時間關係圖、能量 - 時間關係圖畫出來。


模擬程式畫面截圖



2018年4月18日 星期三

行星運動

作者:王一哲
日期:2018/4/18




克卜勒行星運動定侓(Kepler’s laws of planetary motion)共有以下3條:

  1. 第一定律(軌道定律):所有行星繞太陽公轉的穩定軌道為橢圓形,太陽在其中一個焦點上。
  2. 第二定律(等面積速率定律):行星與太陽連線於單位時間內掃過的面積相等。
  3. 第三定律(週期定律):所有繞太陽公轉的行星,公轉週期平方分之平均軌道半徑的三次方等於定律。

我們知道第一定律是因為太陽與恆星之間只有重力作用,依照萬有引力定律可以證明只有橢圓是穩定軌道。第二定律則是因為重力通過太陽,所以行星相對於太陽的角動量守恆,因此行星與太陽連線於單位時間內掃過的面積相等。第三定律則可以用有引力定律當作向心力推導出來。如果配合太陽系星球的真實數據,應該可以將這三個定律畫出來。




用 ejs 自製的行星運動定律動畫


2018年4月15日 星期日

重力及簡諧

作者:王一哲
日期:2018/4/15




這是在高二下的課程當中一定會出現卻又很抽象的題目:



在外太空有兩個質量為 $M$ 的星球,星球質量均勻分布且位置固定,兩星球的球星距離為 $2d$,在中垂線上距離 $x$ 處有一個質量為 $m$ 的質點。若質點原為靜止,若只考慮重力的作用,當 $x \ll d$ 時,求 $m$ 運動的週期為何?








解析:

先對 $m$ 畫力圖,則 $m$ 所受合力

$$ F_x = -\frac{2GMmx}{(d^2 + x^2)^{\frac{3}{2}}} \approx -\frac{2GMm}{d^3} x = -kx $$

$$ T = 2\pi \sqrt{\frac{m}{k}} = 2\pi \sqrt{\frac{d^3}{2GM}}$$


m 的力圖




m 所受合力與距離 x 的關係圖 (0 ≤ x ≤ 100)



2018年4月5日 星期四

木塊彈簧系統分離

作者:王一哲
日期:2018/4/5




我們在上課時,經常用水平光滑桌面上的木塊彈簧系統分離過程說明動量守恆定律,但是幾乎所有的課本、講義都只看開始、結束時兩個木塊的速度與質量的關係,很少有書把分離過程中各個物理量與時間的關係圖畫出來,即使有畫圖大概也是憑感覺畫,所以我們希望藉由 VPython 把運動過程畫出來。我們希望藉由動畫看出以下3點:

  1. 分離過程中系統力學能守恆。
  2. 分離過程中系統動量守恆,也就是木塊的速度量值與質量成反比。
  3. 分離過程中木塊的加速度量值與質量成反比。


木塊彈簧系統分離畫面截圖


單擺

作者:王一哲
日期:2018/4/5




將小球用一條理想的繩子懸掛在天花板底下,若繩子與鉛垂線的夾角(擺角)為 $\theta_0$,小球由靜止釋放。當擺角為 $\theta$ 時,小球受到重力及繩子張力的作用,相對於懸掛點產生的力矩為

$$ \vec \tau = \vec r \times \vec F ~\Rightarrow~ \tau = -rF \sin \theta $$

$$ \tau = I \alpha ~\Rightarrow~ -rF \sin \theta = mr^2 \frac{d^2 \theta}{dt^2} $$

由於上式中 $\tau$ 與 $\theta$ 的方向相反,需要加上負號。若 $r = L$,$F = mg$,當 $\theta < 5^{\circ}$ 時, $\sin \theta \approx \theta$,可以解出 $$ \theta (t) = \theta_0 \cos \left(\sqrt{\frac{g}{L}} t \right) $$ 週期為 $$ T = 2 \pi \sqrt{\frac{L}{g}} $$


以下共有2個程式:

  1. 理想的單擺,改變起始的擺角計算運動過程及週期。 (GlowScript 網站動畫連結)
  2. 考慮空氣阻力的單擺。 (GlowScript 網站動畫連結)


單擺畫面截圖



簡諧運動

作者:王一哲
日期:2018/4/5




在水平光滑桌面上有一個木塊質量為 m,用一條彈性係數為 k 的彈簧連接到左側的牆壁上,若將木塊向右拉一段距離 R 再由靜止釋放,木塊所受合力與加速度的關係為

$$ F = -kx = ma ~\Rightarrow -kx = m \frac{d^2 x}{dt^2} $$

此時木塊的運動方式稱為簡諧運動(simple harmonic motion, S.H.M.),由上式可以解出

$$ x(t) = R \cos (\omega t + \phi) $$

$$ v(t) = -\omega R \sin (\omega t + \phi) $$

$$ a(t) = -\omega^2 R \cos (\omega t + \phi) $$

上式中 $\omega$ 為角頻率

$$ \omega = \sqrt{\frac{k}{m}} $$

週期為

$$ T = 2\pi \sqrt{\frac{m}{k}} $$

理論上我們只要在 VPython 中設定好木塊所受的彈簧回復力與木塊離開平衡點位置的關係,應該就能畫出簡諧運動的過程與週期。以下共有2個程式:

  1. 理想的簡諧運動。 (GlowScript 網站動畫連結)
  2. 考慮阻尼(damping)的簡諧運動。 (GlowScript 網站動畫連結)


2018年4月4日 星期三

圓周運動

作者:王一哲
日期:2018/4/4




如果一個小球的質量為 m,速度為 v,轉彎時的曲率半徑為 R,則轉彎需要的向心加速度與向心力分別為

$$ F_c = ma_c = m \cdot \frac{v^2}{R} $$

也就是說,如果想要用 VPython 畫出小球在水平面上做等速率圓周運動,我們需要想辦法計算向心加速度的大小與方向。如果成功地畫出水平面上的等速率圓周運動,也許就可以進一步挑戰鉛直面圓周運動。以下共有3個程式:

  1. 只畫出小球的等速率圓周運動。 (GlowScript 網站動畫連結)
  2. 畫出小球、繩子、轉軸的等速率圓周運動。 (GlowScript 網站動畫連結)
  3. 鉛直面圓周運動,畫出速率、切線加速度、法線加速度與時間的關係圖,計算週期。 (GlowScript 網站動畫連結)



2018年3月29日 星期四

斜向抛射

作者:王一哲
日期:2018/3/29




將一個小球由地面以初速 v0、仰角 𝜃 抛出,小球受到重力作用向下加速,計算小球的飛行時間及水平射程。分為以下3種不同的狀況:

  1. 只考慮重力的作用,小球撞到地板時停止運動。 (GlowScript 網站動畫連結)
  2. 同時考慮重力及空氣阻力 $f = -bv$,同時畫出考慮空氣阻力與不考慮空氣阻力的小球。 (GlowScript 網站動畫連結)
  3. 使用 for 迴圈,分別計算不同仰角 𝜃、不同的空氣阻力係數 b 對應的飛行時間和水平射程。 (GlowScript 網站動畫連結)

成果如下:


只考慮重力的作用,小球撞到地板時停止運動



2018年3月28日 星期三

使用for迴圈計算水平抛射資料

作者:王一哲
日期:2018/3/28




在前一篇文章〈水平抛射〉中,我們寫了一個模擬水平抛射運動的程式,再手動修高度 h 計算飛行時間 t 及水平射程 R。但是手動修改是很麻煩的,如果能多寫一個 for 迴圈,就能讓程式幫我們自動代入不同的 h 並將資料存成文字檔。以下共有兩個程式:

  • 程式5-4:水平抛射, 改變h, 記錄R (GlowScript 網站動畫連結)
  • 程式5-5:由程式5-4修改, 用for迴圈改變h, 記錄t、R



程式 5-4:水平抛射, 改變h, 記錄R

取得程式碼

"""
 VPython教學: 5-4.水平抛射, 改變h, 記錄R
 Ver. 1: 2018/2/19
 Ver. 2: 2019/9/6
 作者: 王一哲
"""
from vpython import *

"""
 1. 參數設定, 設定變數及初始值
"""
size = 1     # 小球半徑
v0 = 5       # 小球水平初速
h = 15       # 小球離地高度5, 10, 15, 20, 25, 30, 35, 40, 45, 50
L = 50       # 地板長度
g = 9.8      # 重力加速度 9.8 m/s^2
t = 0        # 時間
dt = 0.001   # 時間間隔

"""
 2. 畫面設定
"""
scene = canvas(title="Projectile", width=800, height=600, x=0, y=0, center=vec(0, h/2, 0), background=vec(0, 0.6, 0.6))
floor = box(pos=vec(0, -size, 0), size=vec(L, 0.01, 10), texture=textures.metal)
ball = sphere(pos=vec(-L/2, h, 0), radius=size, texture=textures.wood, make_trail=True, v=vec(v0, 0, 0), a=vec(0, -g, 0))

"""
 3. 物體運動部分, 小球觸地時停止
"""
while(ball.pos.y - floor.pos.y > size + 0.5*floor.height):
    rate(1000)
    ball.v += ball.a*dt
    ball.pos += ball.v*dt
    t += dt

print(t, ball.pos.x + L/2)



2018年3月26日 星期一

水平抛射

作者:王一哲
日期:2018/3/20




將一個小球由高度 h 處以水平初速 v0 抛出,小球受到重力作用向下加速,小球撞到地板時反彈,共有以下3種不同的狀況:

  1. 只考慮重力的作用,小球與地板間為彈性碰撞。 (GlowScript 網站動畫連結)
  2. 只考慮重力的作用,小球撞地板的恢復係數為 e。 (GlowScript 網站動畫連結)
  3. 同時考慮重力及空氣阻力 f = -bv。 (GlowScript 網站動畫連結)

成果如下:


只考慮重力的作用,小球與地板間為彈性碰撞