置頂

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

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

熱門文章

2019年1月31日 星期四

108學測自然科物理試題解析

作者:王一哲
日期:2019/1/27

試題與詳解


  1. 恆星的表面溫度與呈現的星光顏色有關,當我們觀賞夜空中閃爍的恆星,可看出恆星的顏色有白、藍、黃、紅等。下列選項中,顏色產生的原理何者相同?
    (A) 恆星與煙花的火光
    (B) 紅色恆星與紅色的火星
    (C) 藍色恆星與藍色的花
    (D) 紅色恆星與火山熔岩發出的紅光
    (E) 藍色恆星與瓦斯燃燒發出的藍光

答案:D
層次:理解
難度:易
觀念:近代物理—黑體輻射
詳解:恆星表面發出的光可以視為標準的黑體輻射,火山熔岩是因為表面溫度很高而發出紅光,因此與恆星發出紅光的原理相同。


  1. 水深越深,波浪的行進速度越快,然而受海底地形起伏影響,當波浪向海岸傳播時,往往會因速度變慢而產生偏折的現象。圖中虛線為等深線,越靠近海岸水深越淺。灰色實線為海浪的波前,箭頭代表波浪的行進方向,假設海底地形變化皆相同,則下列選項何者為最可能的波浪傳播路徑?



答案:B
層次:應用
難度:易
觀念:波—折射
詳解:水波在較深處波速較快,因此當水波由較深處往較淺處前進時,是由波速較快處傳向波速較慢處,前進方向會偏向法線。


2019年1月14日 星期一

NumPy 筆記:平移陣列元素

前言


今天學生問了一個好玩的問題:如果使用已經建立了一個二維陣列,要怎麼做才能將所有的元素向某個方向平移?以下是我找到的作法,請注意,以下的程式碼都省略了 import numpy as np

方法1:使用索引取出元素


產生陣列


首先我們產生一個 $9 \times 8$ 的陣列,為了一眼就看出每個元素原來的位置,我將第0列皆設定為個位數,第1列皆為1開頭,其餘依此類推。

m, n = 9, 8
a = np.zeros(m * n).reshape(m, n)

for i in range(m):
    for j in range(n):
        a[i][j] = i * 10 + j

print(a)

輸出為

[[ 0.  1.  2.  3.  4.  5.  6.  7.]
 [10. 11. 12. 13. 14. 15. 16. 17.]
 [20. 21. 22. 23. 24. 25. 26. 27.]
 [30. 31. 32. 33. 34. 35. 36. 37.]
 [40. 41. 42. 43. 44. 45. 46. 47.]
 [50. 51. 52. 53. 54. 55. 56. 57.]
 [60. 61. 62. 63. 64. 65. 66. 67.]
 [70. 71. 72. 73. 74. 75. 76. 77.]
 [80. 81. 82. 83. 84. 85. 86. 87.]]

2018年12月10日 星期一

於 Ubuntu 上安裝 Kyocera 多功能事務機驅動程式的方法

環境


  1. Ubuntu 18.04 LTS
  2. Kyocera TASKalfa 4501i
  3. 事務機本身有鎖定帳號,需要登錄帳號才能列印



步驟


  1. 於英文版的官方網站下載驅動程式,網址為https://www.kyoceradocumentsolutions.eu/index/service/dlc.false.driver.TASKALFA4501I._.EN.html#,我選擇的檔案是 Linux PPDs 8.1301 版
  2. Kyocera 官方網站
  3. 將下載的檔案解壓縮,我需要的驅動程式是在壓縮檔中的 /EU/English/Kyocera_TASKalfa_4501i.PPD
  4. 用文字編輯器開啟 .PPD 檔,找到以下的部分
  5. *KmManagment Default/Off: ""
    *KmManagment MG00000000/00000000: "(00000000) statusdict /setmanagementnumber get exec"
    *KmManagment MG00000001/00000001: "(00000001) statusdict /setmanagementnumber get exec"
    ......
    

2018年12月2日 星期日

NumPy 筆記:陣列 ndarray

前言


NumPy 是 Python 的運算套件,提供陣列 (ndarray)、矩陣 (matrix)……等常用的數學工具,運算速度比 Python 內建的資料格式快很多。NumPy 已經將許多常用的運算寫成函式,如果能善用這些函式,可以大幅加快程式的運算速度。以下是一些我目前常用到的陣列相關函式整理,如果之後有用到新的函式會再新增內容。請注意,以下的程式碼都省略了 import numpy as np



產生陣列


手動輸入


一維陣列語法

np.array([元素1, 元素2, 元素3, 元素4, 元素5], dtype = 格式)

二維陣列語法

np.array([(元素11, 元素12, 元素13, 元素14, 元素15), (元素21, 元素22, 元素23, 元素24, 元素25)], dtype = 格式)

數值格式可以是 整數 (int)、浮點數 (float)、複數 (complex),如果不指定的話系統會自動判斷。
範例:

in[1]:  np.array([1, 2, 3, 4, 5])
out[1]: array([1, 2, 3, 4, 5])
in[2]:  np.array([1, 2, 3, 4, 5], dtype = float)
out[2]: array([1., 2., 3., 4., 5.])
in[3]:  np.array([1, 2, 3, 4, 5], dtype = complex)
out[3]: array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 5.+0.j])
in[4]:  np.array([(1, 2, 3, 4, 5), (6, 7, 8, 9, 10)], dtype = int)
out[4]: array([[ 1,  2,  3,  4,  5],
               [ 6,  7,  8,  9, 10]])

2018年11月29日 星期四

Python 符號運算套件:SymPy

前言


SymPy 是 Python 的符號運算套件,可以幫助我們計算函數的微分、積分,而且套件裡已經內建了常用的常數和函數,例如圓周率$\pi = 3.14159265358979$、尤拉常數$E = 2.71828182845905$、正弦函數$\sin$。如果已經在電腦上安裝好 Python,接下來只要在文字介面中執行下的指令即可安裝 SymPy

pip install sympy

如果是 Windows 的用戶,可以使用 Windows PowerShell(系統管理員) 替這部電腦所有的使用者安裝,如果是 Linux 的用戶,在執行指令時可能需要在最前面加上 sudo 暫時取得管理者權限。如果只想要試用看看,可以到 SymPy 的官方網站按右上角的 Online Shell 使用線上版的 SymPy Live。



SymPy 官方網站




SymPy Live



2018年11月26日 星期一

利用殼層定理推導電量均勻分布的球殼產生的電場

球殼外部


高中物理課本或是講義通常會避開這個問題,直接告訴學生經由微積分的計算後,我們可以將所有的電量集中在球心,用球心到該點的距離計算該點的電場,但是某些學生可能覺得無法接受,這時只好請出微積分這個強大的數學工具。推導過程如下:

下圖中A點是我們要計算電場的位置,B點為球殼上的某個點,O點為球心,R為球殼半徑,r為球心到A點的距離,s為A、B的距離,$\theta$為角AOB,$\phi$為角OAB。其中變數為s、$\theta$、$\phi$,但是由餘定理可得
$$\cos \theta = \frac{r^2 + R^2 - s^2}{2rR}$$
$$\cos \phi = \frac{r^2 + s^2 - R^2}{2rs}$$
所以真正的變數只有s


電量均勻分布的球殼產生的電場(外部)


2018年11月24日 星期六

Matplotlib 繪圖技巧:讀取數據及線性擬合

前言


對於物理實驗而言,我們在處理數據時通常會繪製 xy 散佈圖,將應變變因的數值畫在 y 軸、操縱變因的數值畫在 x 軸,如果數據點分布在一條斜直線上,就可以利用最小平方法找出最接近直線的斜率和截距,再利用物理定律解釋斜率和截距的成因。但如果數據點不是分布在一條斜直線上,就要先想辦法處理數據,圖形化為直線。

以雙狹縫干涉的實驗為例,假設雷射光波長為 $\lambda$ 、狹縫間距為 $d$ 、狹縫與屏幕間的距離為 $L$,則干涉的寬度
$$\Delta y = \frac{\lambda L}{d}$$
如果我們固定 $\lambda$ 和 $d$,改變 $L$ 並測量 $\Delta y$,再畫出 $\Delta y - L$ 關係圖,這些數據點應該會分布在一條斜直線上,而且斜率 = $\frac{\lambda}{d}$、截距 = 0。

如果我們固定 $\lambda$ 和 $L$,改變 $d$ 並測量 $\Delta y$,再畫出 $\Delta y - d$ 關係圖,這些數據點會分布在一條曲線上。如果我們猜測 $\Delta y$ 和 $d$ 成反比,應該要計算 $1/d$,再畫出 $\Delta y - 1 / d$ 關係圖,如果數據點分布在一條斜直線上,才能證明 $\Delta y$ 和 $d$ 成反比。由理論式可知,直線的斜率 = $\lambda L$、截距 = 0。


左:雙狹縫干涉 Δy - d 關係圖;右:雙狹縫干涉 Δy - 1/d 關係圖



2018年11月21日 星期三

GeoGebra 繪圖技巧:反比函數

我們在〈Matplotlib 繪圖技巧:在同一張圖上繪製兩個函數、兩張圖並列〉中使用 Matplotlib 繪製反比及平方反比的函數圖形,但如果想要在函數的曲線上,沿著 x 軸方向每隔一段固定的距離畫一個點,再標示出對應的 y 軸數值,使用 Matplotlib 會有一點複雜。如果改用 GeoGebra 會比較簡單一點,成果如下圖,這個檔案的 GeoGebra 網頁版連結為 https://ggbm.at/p4hzbuza


反比函數圖形


2018年11月20日 星期二

Matplotlib 繪圖技巧:在同一張圖上繪製兩個函數、兩張圖並列

我們在〈冰與水蒸氣混合達熱平衡時溫度與質量比值關係圖〉中使用 Matplotlib 繪製單一的函數圖形,但如果我們想在同一張圖上繪製兩個函數,或是將兩張圖並列畫在同一張圖片中時要怎麼做呢?

我們以兩個點電荷之間的靜電力和電位能與距離的關係為例,假設點電荷的電量分別為 Q 和 q,兩者之間的距離為 r,則兩者之間的靜電力量值
$$F = \frac{kQq}{r^2}$$
電位能量值
$$U = \frac{kQq}{r}$$
由於使用 Matplotlib 繪圖時必須代入數值,我將數值設定為 $Q = 1 \times 10^{-4} ~\mathrm{C}$、$q = 1 \times 10^{-4} ~\mathrm{C}$、$0.01 \leq r \leq 10~\mathrm{m}$,r 不從 0 開始畫是為了避免靜電力和電位能量值變為無窮大。接著我們來繪製函數圖形。


在同一張圖上繪製兩個函數


我們希望圖片能有以下的特點:

  1. 用不同的顏色繪製不同的函數
  2. 加上圖例、格線、坐標軸標籤
  3. 設定縱軸繪圖範圍

成果如下圖所示,使用的程式碼如下。


在同一張圖上繪製靜電力、電位能與距離的關係圖



2018年11月18日 星期日

冰與水蒸氣混合達熱平衡時溫度與質量比值關係圖

題目


假設 0°C 的冰塊質量為 M1,100°C 的水蒸氣質量為 M2,將兩者放入絕熱容器內達到熱平衡時的溫度為 T,請畫出 T 與質量比值 M1 / M2 的關係圖。(水的熔化熱為 80 cal/g,水的汽化熱為 540 cal/g)

解答


假設平衡時的溫度為 T,由於系統與外界沒有熱交換,冰塊吸收的熱等於水蒸氣釋放的熱,因此
$$M_1 \times 80 + M_1 \times 1 \times (T-0) = M_2 \times 540 + M_2 \times 1 \times (100 - T)$$
$$\frac{M_1}{M_2} \times 80 + \frac{M_1}{M_2} \times T = 640 - T$$
若$\frac{M_1}{M2} \equiv x$,則上式可改為
$$80x+xT = 640−T$$
$$T=\frac{640−80x}{x+1}$$
若 $x < 3$ 代入上式則 $T > 100$,代表水蒸氣沒有用完,此時水與水蒸氣共存 $T = 100$;若 $x > 8$ 代入上式則 $T < 0$,代表冰塊沒有用完,此時水與冰塊共存 $T = 0$。因此 $$T(x) = \begin{cases} 100 & \text{ if } x < 3 \\ 0 & \text{ if } x > 8 \\
\frac{640 - 80x}{x + 1} & \text{ if } 3 \leq x \leq 8
\end{cases}$$
很明顯地,這個函數圖形並不好畫,我們需要使用一些輔助工具會比較方便。