熱門文章

2019年11月9日 星期六

Matplotlib 繪圖技巧:繪製選擇題用的函數圖形選項

作者:王一哲
日期:2019/11/9

前言


有時候選擇題會以五張不同的函數圖形作為選項,之前我是用 LibreOffice Draw 的繪圖工具畫好圖形之後再加上選項標籤,最後將五張函數圖形以及選項標籤匯出成一張圖片。下圖是我用 LibreOffice Draw 繪製的選項,題目是要選出自由落下的小球觸地時發生彈性碰撞的v-t圖,但是選項中的曲線畢竟是手動繪製的,只能算是示意圖。如果對於圖形的精準度要求不高,這樣的作法應該可以符合需求,但如果需要畫出精準的函數圖形,LibreOffice Draw 就不太適合了。


使用 LibreOffice Draw 繪製的函數圖形選項



於是我試著改用 NumPy 計算函數值,再用 Matplotlib 中的 subplots 將圖形及標籤一口氣畫好,以下是實際出題的例子。



使用 NumPy + Matplotlib 繪製都卜勒效應題目的選項


試題


假設聲源發出的聲波頻率為 1000 Hz,空氣中的聲速為 340 m/s,下表中是兩種不同狀況下觀察者觀測到的聲波頻率,單位為 Hz。狀況 I:聲源移動速度為 v 接近靜止的觀察者;狀況 II:觀察者移動速度為 v 接近靜止的聲源。下列的 5 張圖形中,請問何者最符合表格中數據?

v (m/s) 0 5 10 15 20 25 30 35 40
狀況 I 測到的聲波頻率 (Hz) 1000.0 1014.9 1030.3 1046.2 1062.5 1079.4 1096.8 1114.8 1133.3
狀況 II 測到的聲波頻率 (Hz) 1000.0 1014.7 1029.4 1044.1 1058.8 1073.5 1088.2 1102.9 1117.6






2019年11月8日 星期五

使用 numpy.genfromtxt 讀取混合格式的資料

作者:王一哲
日期:2019/11/8




之前我測試過使用 numpy.loadtxt 匯入 csv 檔的資料,但是資料的格式都是浮點數 (float),如果資料中某些欄位的資料格式是字串 (string),處理起來相當麻煩,改用 numpy.genfromtxt 會比較簡單。我匯入的資料檔如下:

行星名稱, a (AU), T (yr)
水星, 0.387, 0.241
金星, 0.723, 0.615
地球, 1.000, 1.000
火星, 1.524, 1.881
木星, 5.203, 11.863
土星, 9.555, 29.458
天王星, 19.218, 84.022
海王星, 30.110, 164.774



我用以下程式碼匯入資料並繪製 XY 散布圖。

import numpy as np
import matplotlib.pyplot as plt

# 從 csv 檔讀取資料, 資料以 ',' 分隔, 略過第1列
data = np.genfromtxt("PlanetsData.csv", delimiter=',', dtype=None,
                     names=('Planet', 'a', 'T'), skip_header=1, encoding='UTF-8')
planet, a, T = data['Planet'], data['a'], data['T']

# a - T 關係圖
plt.figure(figsize=(6, 4.5), dpi=100)
plt.title(r'$a - T ~\mathrm{Plot}$', fontsize=16)
plt.xlabel(r'$T ~\mathrm{(yr)}$', fontsize=14)
plt.ylabel(r'$a ~\mathrm{(AU)}$', fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.subplots_adjust(left=0.12, bottom=0.15)
plt.grid(color='grey', linestyle='--', linewidth=1)
plt.plot(T, a, color='blue', marker='o', markersize=10, markeredgecolor='black', linestyle='')
plt.show()


2019年11月5日 星期二

克卜勒第三行星運動定律

作者:王一哲
日期:2019/11/4




克卜勒 (Johannes Kepler, December 27, 1571 – November 15, 1630) 提出的行星運動定律共有三條:

1. 第一定律:又稱為軌道定律,繞太陽公轉的行星軌道為橢圓形,太陽位於其中一個焦點上。
2. 第二定律:又稱為等面積速率定律,行星與太陽連線於單位時間內掃過的面積 $\frac{dA}{dt} = \frac{1}{2}rv \sin \theta$
3. 第三定律:又稱為週期定律,繞太陽公轉的行星,其平均軌道半徑,也就是橢圓軌道的半長軸 $a$,與公轉週期$T$的關係為$\frac{a^3}{T^2}=定值$

現行的高中物理教材中,只有提到第三定律的數學式子,我們可以讓學生用現代的觀測資料,試著驗證第三定律。




太陽系八大行星


從網路上可以找到行星公轉軌道的資料,為了簡化數值,半長軸$a$的單位為天文單位 (astronomical units, AU),公轉週期的單位為地球年 (yr)。

行星 公轉週期T (yr) 半長軸 a (AU)
水星 0.241 0.387
金星 0.615 0.723
地球 1.000 1.000
火星 1.881 1.524
木星 11.862 5.203
土星 29.458 9.555
天王星 84.022 19.218
海王星 164.774 30.110



我們先試著畫出 $a - T$ 關係圖,基本上看不出兩者的數學關係。