2019年12月31日 星期二

木棍轉動落下所需時間

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




前言


我最近在 YouTube 上看到李永樂老師的一部影片:家長輔導小學生作業崩潰:抽出我“40米長大砍刀”,你有幾秒逃生時間?,李老師在影片中很正經地用物理理論,計算40米長大砍刀轉動落下所需時間,這樣一本正經地講解奇怪的東西也挺有趣的。以下用兩種方法計算類似的問題,但是為了使情境稍微正常一點,我將物體改為長度為$L = 1 ~\mathrm{m}$、質量均勻分布的木棍,下端立於水平桌面上,木棍與桌面的夾角$\theta$原為89°,並假設落下過程中木棍不會滑動。



理論計算


假設木棍的質量為$m$且質量均勻分布,長度$L = 1 ~\mathrm{m}$,下端立於水平桌面上,木棍與桌面的夾角原為$\theta_0 = 89^{\circ}$,受到重力作用由靜止開始落下,重力加速度$g = 9.8~\mathrm{m/s^2}$

若以下端為轉軸,則轉動慣量
$$I = \frac{1}{3}mL^2$$

重力產生的力矩
$$\tau = \frac{1}{2}mgL \cos \theta$$

角加速度
$$\alpha = \frac{\tau}{I} = \frac{3g \cos \theta}{2L}$$

由於轉動動能
$$K = \frac{1}{2}I \omega^2$$

當木棍與水平方向夾角為$\theta$時,角速度為$\omega$,由力學能守恆可得
$$\frac{1}{2} \cdot \frac{1}{3}mL^2 \cdot \omega^2 + \frac{1}{2}mgL \sin \theta = 0 + \frac{1}{2}mgL \sin \theta_0$$

$$\omega = \sqrt{\frac{3g(\sin \theta_0 - \sin \theta)}{L}}$$

假設木棍轉動一個很小的角位移$d \theta$,由於$\omega$與$d \theta$反方向,所需時間為
$$dt = -\frac{d \theta}{\omega}$$

當角度由$\theta_0$變為$\theta$時,可以算出經過的時間
$$t = \int_0^t dt = \int_{0}^{\theta_0} \frac{d \theta}{\omega} = \sqrt{\frac{L}{3g}}\int_{0}^{\theta_0} (\sin \theta_0 - \sin \theta)^{-\frac{1}{2}} d \theta$$

無法得到解析解,可以求數值解。利用SymPy計算角度$\theta$由$89^{\circ}$開始,變為$88^{\circ}$、$87^{\circ}$、……、$0^{\circ}$所經過的時間,程式碼寫法如下

2019年12月23日 星期一

U 形物體與木塊系統的動量守恆

作者:王一哲
日期:2019/12/23




題目


在水平光滑桌面上有一個質量為 1.8 kg 的 U 形物體,左、右兩側各連接一條原長為 0.5 m、彈性常數為 5.0 N/m 的理想彈簧,將一個質量為 0.2 kg 的木塊放在水平底面上,將右側的彈簧向右壓縮 0.2 m,整個系統原為靜止,假設摩擦力可以忽略,將木塊釋放後整個系統會如何運動?


模擬動畫畫面截圖



理論推導


由於右側彈簧原來被壓縮,右側彈簧的回復力會將木塊往左推、將 U 形物體往右推;當木塊開始壓縮左側的彈簧時,左側彈簧的回復力會將木塊往右推、將 U 形物體往左推;由於整個系統所受外力合為0,系統動量守恆,質心速度為0。



2019年12月20日 星期五

Matplotlib 繪圖技巧:移動的點

作者:王一哲
日期:2019/12/20




前言


在這篇文章中,我利用 Matplotlib 繪製一個隨著 sin 函數移動的點,由於圖片中的物件比較簡單,算是上一篇文章〈Matplotlib 繪圖技巧:水波干涉動畫〉的前置作業。


使用Matplotlib產生的動畫



2019年12月14日 星期六

小球與圓環碰撞

作者:王一哲
日期:2019/12/14




題目


在水平光滑桌面上有一個質量為$m_1$的小球及一個質量為$m_2$的圓環,小球放置於圓環的圓心處。若兩者原為靜止,用手撥動小球,使小球以初速度$v_1$向右移動,小球與圓環之間為彈性碰撞,請問兩者會如何運動?


模擬動畫畫面截圖



理論推導


當小球開始運動之後,小球與圓環系統所受外力合為0,因此系統動量守恆,質心速度為定值、方向向右。小球向右移動,第1次撞擊圓環時使圓環開始向右移動,小球的速度變慢或反向移動;接下來小球撞擊圓環左側,使圓環減速、小球向右移動;不斷重複這個過程,整個系統向右移動。


2019年12月13日 星期五

解決 Linux Mint 上 HackMD 網頁等寬字體問題

日期:2019/12/13
作者:王一哲




我在 Linux Mint 19.1 Cinnamon 上使用 Chrome 瀏覧器開啟 HackMD 網站時,程式碼的部分沒有辦法使用等寬字體顯示,這樣很難看清楚縮排的格數,今天剛好遇到一個高手學生幫我解決了這個問題。




無法使用等寬字體顯示程式碼



先在程式碼區段按滑鼠右鍵開啟快速選單,點選最下方的檢查

開啟快速選單


2019年12月12日 星期四

Matplotlib 繪圖技巧:水波干涉動畫

作者:王一哲
日期:2019/12/12




前言


以前在維基百科上看到用 MATLAB 繪製的兩個點波源水波干涉動畫,後來我參考網頁上的程式碼,試著用 Scilab 畫出一樣的動畫,甚至把它改成立體圖。但是我現在比較常用 Matplotlib 套件繪圖,也在網路上看過一些用 Matplotlib 繪製的 gif 檔,於是我花了一點時間研究一下繪製動畫的方法。


維基百科兩個點波源水波干涉動畫,圖片來源為 https://en.wikipedia.org/wiki/File:Two_sources_interference.gif




使用 Scilab 自行繪製的水波干涉動畫(2D版)




使用 Scilab 自行繪製的水波干涉動畫(3D版)


2019年12月6日 星期五

SciDAVis 教學 1:XY 散佈圖基本使用方法

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




SciDAVis 的全名為 Scientific Data Analysis and Visualization,照字面的意思可以翻譯為科學資料分析與視覺化工具,用來分析數據、作圖,而且它是一套自由軟體最新的版本為1.25,下載頁面在此(前往下載) 。類似的商業軟體為 OriginSigmaPlot,但是這兩套軟體的售價不便宜,都在萬元以上。雖然用 MicroSoft Excel 和 LibreOffice Calc 也能做到類似的效果,但是 SciDAVis 處理大量數據的效果更好,即使操作界面是沒有中文化,對高中生而言應該還在可接受的範圍內。




SciDAVis

安裝軟體


如果作業系統為 Windows,請選用 scidavis.1.25-win-dist.msi,下載後使用系統管理員身份執行安裝檔,接著不斷地按下一步就完成了。如果作業系統為 Linux,請選用 scidavis-1.25.tar.gz,下載後解壓縮,再依照資料夾中的檔案 "README.installer" 的指示編輯檔案及安裝。安裝完成後執行程式,畫面如下。


SciDAVis 畫面截圖


SciDAVis 教學 2:作圖技巧及化直

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




作圖原則


  1. 假設自變數為$x$、應變數為$y$,先畫出$y-x$關係圖,如果數據點看起來分布在一條斜直線上,利用線性迴歸畫出最接近直線,計算斜率、截距及其不準量;如果數據點看起來是分布在一條曲線上則進行步驟2。
  2. 計算 $\log x$、$\log y$,畫出$\log y - \log x$關係圖,如果數據點看起來分布在一條斜直線上,利用線性迴歸畫出最接近直線,計算斜率、截距及其不準量,其中斜率可以代表$x$、$y$取幾次方時兩者的關係為線性。假設$x$、$y$數學關係為
    $$y^m = kx^n$$
    $$m \log y = \log k + n \log x$$
    $$\log y = \frac{n}{m} \log x + \frac{\log k}{m}$$
    因此$\log y - \log x$關係圖的最接近直線斜率為$n/m$。
  3. 計算 $x^n$、$y^m$,畫出$y^m - x^n$關係圖,如果數據點看起來分布在一條斜直線上,利用線性迴歸畫出最接近直線,計算斜率、截距及其不準量。



自由落下時間與高度關係圖


假設小球原為靜止、離地面高度為$h$、受到重力作用開始落下,只考慮重力的作用,重力加速度$g = 9.8~\mathrm{m/s^2}$,小球在空中飛行時間為$t$、飛行時間不準量為$errt$,實驗數據如下

h(m),t(s),errt(s)
2,0.65,0.01
4,0.89,0.01
6,1.11,0.01
8,1.27,0.01
10,1.42,0.01
12,1.57,0.01
14,1.71,0.01
16,1.79,0.01
18,1.92,0.01
20,2.03,0.01



先畫出$t - h$關係圖,發現數據點應該是分布在一條曲線上,無法進行線性擬合。


t - h 關係圖


2019年12月2日 星期一

Streamplot 範例

作者:王一哲
日期:2019/12/2




前言


我為了寫〈均勻帶電圓環的電場〉找到了 matplotlib 官網上關於 streamplot 指令的範例,範例中利用 numpy 的指令直接產生繪圖資料,但是我需要從 csv 檔中讀取由 VPython 產生的資料,因此我需要改寫範例的程式碼。




streamplot 指令範例繪圖成果



2019年12月1日 星期日

均勻帶電圓環的電場

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




前言


這是一個選修物理上第6章靜電學的題目,但是題目只會問圓心處或是圓心上一段距離處的電場,因為這些位置才能利用對稱性計算電場量值,如果想計算其它位置的電場該怎麼辦?由於我們在 VPython 教學〈靜電力及簡諧〉程式 19-3 已經寫過類似的東西,應該可以從這支程式開始修改。



用 VPython 計算空間中各處的電場


GlowScript 版本
from vpython import *

"""
 1. 參數設定, 設定變數及初始值
"""
Q, R, N = 2E-11, 1, 100  # 帶電圓環總電量, 半徑, 分割數量
q, r = Q/N, 0.01*R       # 分割後小球電量, 半徑
L = 4.1*R                # 畫面寬度
ke = 8.988E9             # 靜電力常數
num = 100                # 將顯示的空間每邊切成 N 等份

"""
 2. 產生帶電球體類別, 回傳帶電球體產生的電場
"""
class Ball:
    def __init__(self, pos, radius, color, charge):
        self.pos = pos
        self.radius = radius
        self.color = color
        self.charge = charge
        self.ball = sphere(pos=self.pos, radius=self.radius, charge=self.charge, color=self.color)
    def electric(self, pos2):
        return ke*self.charge / mag2(pos2-self.pos) * norm(pos2-self.pos)

"""
 3. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Electric Field (Circle)", width=600, height=600, x=0, y=0,               
               background=color.black, center=vec(0, 0, 0), range=L)

# 產生帶電圓環上計算電場用的小球
balls = [Ball(pos=vec(R*cos(i*2*pi/N), R*sin(i*2*pi/N), 0), radius=r, color=color.white, charge=q) for i in range(N)]

# 計算畫箭頭的位置
locations = []

# 直線, 儲存資料後用 plot 繪圖
'''
for i in range(num+1):
    locations.append(vec(L/num*i - L/2, 0, 0))
'''
# 平面, 儲存資料後用 streamplot 繪圖
for i in range(num+1):
    for j in range(num+1):
        locations.append(vec(L/num*i - L/2, L/num*j - L/2, 0))

# 立體, 展示用, 但是箭頭太多, 不容易看清楚
'''
for i in range(num+1):
    for j in range(num+1):
        for k in range(num+1):
            locations.append(vec(L/num*i - L/2, L/num*j - L/2, L/num*k - L/2))
'''

# 依序讀取串列 locations 的元素, 在對應的位置產生箭頭
fields = [arrow(pos=location, axis=vec(0, 0, 0), color=color.green) for location in locations]

with open("ElectricFieldCircleData.csv", "w", encoding="UTF-8") as file:
    file.write("x, y, E, Ex, Ey\n")
    
# 更新箭頭的長度及方向, 記錄電場強度最大值, 量值接近最大值偏紅色, 量值接近 0 偏綠色
fmax = 0
for field in fields:
    for ball in balls:
        field.axis += ball.electric(field.pos)
    with open("ElectricFieldCircleData.csv", "a", encoding="UTF-8") as file:
        file.write(str(field.pos.x) + "," + str(field.pos.y) + "," + str(field.axis.mag) + "," + str(field.axis.x) + "," + str(field.axis.y) + "\n")
    if(field.axis.mag >= fmax): fmax = field.axis.mag

for field in fields:
    field.color = vec(field.axis.mag/fmax, 1 - field.axis.mag/fmax, 0)



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$ 關係圖,基本上看不出兩者的數學關係。




2019年10月26日 星期六

都卜勒效應及震波示意圖

作者:王一哲
日期:2019/10/25

本次課程檔案已上傳至 GeoGebraTube,可以線上操作或下載檔案。


原理


假設波源發出的聲波頻率為 $f_0$,空氣中的聲速為 $v$,波源以速度 $v_S$ 接近靜止的觀察者時,由於聲波的波長被壓縮,但空氣中的聲速不變,因此觀測到的聲波頻率會變為

$$f = \frac{v}{v-v_S} f_0$$

若波源以速度 $v_S$ 遠離靜止的觀察者時,由於聲波的波長被拉長,但空氣中的聲速不變,因此觀測到的聲波頻率會變為

$$f = \frac{v}{v+v_S} f_0$$


都卜勒效應示意圖動畫 (波源移動速度為0.6倍聲速)


2019年8月14日 星期三

一維彈性碰撞次數與圓周率

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




前言


如下圖所示,假設在水平光滑桌面上有兩個木塊,右側紅色木塊的質量為$m_1$、初速度方向向左,左側綠色木塊的質量為$m_2$、原為靜止,且$m_1 = 100^n m_2$,最左側有固定的牆壁。若木塊之間、木塊與牆壁之間的碰撞皆為一維彈性碰撞,則碰撞次數與$n$的關係如下。


裝置示意圖



n 碰撞次數
1 31
2 314
3 3141
4 31415
5 314159



如果想要了解背後的原理請看這部影片 So why do colliding blocks compute pi? [1],影片作者是3Blue1Brown。接下來我們拿之前寫過的〈一維彈性碰撞〉程式碼來修改,試著畫出這個現象。


2019年8月13日 星期二

使用 Python 產生聲音及繪製頻譜圖

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




前言


我在去年看到了啾啾鞋講解電話按鍵聲的影片 [1],裡面用到的技術稱為雙音多頻訊號 (Dual-Tone Multi-Frequency, DTMF) [2],各個按鍵對應的聲音頻率如下表所示

1209 Hz 1336 Hz 1477 Hz 1633 Hz
697 Hz 1 2 3 A
770 Hz 4 5 6 B
852 Hz 7 8 9 C
941 Hz * 0 # D



另外也在 YouTube 上找到了成功大學數學系舒宇宸教授演講的影片 [3],教授在演講時用 MATLAB 產生了上述表格中的聲音。既然用 MATLAB 可以做到,應該也可以用 Python 做到同樣的效果才對,於是我花了一天的時間研究了一下,找到以下的解決方案。



2019年8月8日 星期四

使用 numpy.genfromtxt 從文字檔中讀取資料

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




假設某人儲存資料時不是用csv檔,而是使用數量不一致的空格分格資料,我們將前一篇文章〈最接近直線〉的數據排列成底下這樣再儲存為文字檔data.txt。

index   x  errx   y     erry
    0   1.0  0.1      4.9   0.5
 1  2.0   0.1    6.9  0.5
2   3.0  0.1     9.0      0.5
  3   4.0    0.1  11.1   0.6
   4  5.0   0.1  13.2   0.6
 5  6.0   0.2    15.2     0.8
6 7.0 0.2  16.9    0.8
  7  8.0  0.2     18.9      0.8
 8    9.0   0.2  20.9   0.8
9   10.0  0.2   22.8    0.8

我絕對不會用這樣的格式儲存資料,但如果真的遇到這種狀況還是有辦法解決,只要使用numpy.genfromtxt即可,語法為

2019年8月6日 星期二

最接近直線

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

前言


物理科及化學科在處理實驗數據時,通常會先繪製 XY 散佈圖,如果資料點看起來有線性的關係,就要用最小平方法計算最接近直線的斜率和截距,再試著解釋斜率和截距的物理意義。但如果更講究一點,由於測量數據時本身就會有一定的不準量,最接近直線的斜率、截距也會有不準量,要用什麼方法才能很方便地算出這些數呢?



最接近直線公式


以下的公式是我從物理奧林匹亞培訓講義上抄來的。假設操縱變因(自變數)為$x$、不準量為$\Delta x$,測量的應變變因(應變數)為$y$、不準量為$\Delta y$,數據共有$n$組。則最接近直線

$$斜率 \quad a = \frac{\sum x \sum y - n \sum xy}{(\sum x)^2 - n \sum x^2}$$
$$截距 \quad b = \frac{\sum x \sum xy - \sum y \sum x^2}{(\sum x)^2 - n \sum x^2}$$
$$相關係數 \quad R = \frac{\sum x \sum y - n \sum xy}{\sqrt{\left[ (\sum x)^2 - n \sum x^2 \right] \left[ (\sum y)^2 - n \sum y^2 \right]}}$$

為了要計算斜率及截距的不準量,我們先定義下列的符號

$$\sigma_x = \sqrt{\frac{\sum (\Delta x)^2}{n}}$$
$$\sigma_y = \sqrt{\frac{\sum (\Delta y)^2}{n}}$$
$$\sigma = \sqrt{\sigma_y^2 + a^2 \sigma_x^2}$$

斜率與截距的不準量分別為

$$斜率的不準量 \quad \Delta a = \sqrt{\frac{n \sigma^2}{n \sum x^2 - (\sum x)^2}}$$
$$截距的不準量 \quad \Delta b = \sqrt{\frac{\sigma^2 \sum x^2}{n \sum x^2 - (\sum x)^2}}$$

如果要將$x$軸的不準量$\Delta x$加到$y$軸上,等效的$y$軸不準量計算方式為

$$\Delta y_{eff} = \sqrt{(\Delta x)^2 + (a \Delta y)^2}$$



2019年7月22日 星期一

Matplotlib 繪圖技巧:四張小圖並列

作者:王一哲
日期:2019/7/22

前言


以下是將在四張小圖畫在同一張圖中的作法,將圖排列為 $2 \times 2$ 的樣子,圖中的函數分別為

$$\mathrm{sigmoid:}~~~~~S(x) = \frac{1}{1+e^{-x}}$$
$$\mathrm{tanh:}~~~~~\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$$
$$\mathrm{ReLU:}~~~~~f(x) = \begin{cases} 0 & \mathrm{if~~~} x < 0 \\ x & \mathrm{otherwise} \end{cases}$$ $$\mathrm{Leaky~ReLU:}f(x) = \begin{cases} \lambda x & \mathrm{if~~~} x < 0 \\ x & \mathrm{otherwise} \end{cases}$$


2019年7月21日 星期日

於 Matplotlib 繪製的圖表中插入 LaTeX 數學式

作者:王一哲
日期:2019/7/21

前言


如果想在 Matplotlib 繪製的圖形中插入簡單的 $\LaTeX$ 數學式,例如

$$f(x) = ax^2 + bx + c$$

只需要在繪圖時加入
label=r'$f(x) = ax^2 + bx + c$'

即可。但如果要插入更複雜的數學式,例如

$$f(x) =
\begin{cases}
0.2x & \mathrm{if~~~} x < 0 \\ x & \mathrm{otherwise} \end{cases}$$ 會需要另外安裝 $\LaTeX$ 軟體,還需要另外加上一些程式碼。

2019年7月14日 星期日

用 Google 試算表製作工作清單

作者:王一哲
日期:2019/7/14

前言


我最近讀了一本關於工作方法的書,裡面提到了工作清單及優先順序的問題,處理原則和我之前讀過的時間管理書籍完全一致。不過書中的工作清單是用 Excel 製作的,我想用 Google 試算表應該會更方便,於是就有了這個檔案:工作清單範本公開版


2019年7月11日 星期四

設定 Python 路徑

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

前言


當我們在 Windows 中安裝 Python 時,如果沒有勾選安裝視窗中最下方的選項Add Python 3.6 to PATH,在安裝之後系統會不知道要從什麼地方找到 Python 指令,也就無法指令介面執行 Python。這時我們需要自行修改 Windows 的環境變數 PATH,以下是修改的步驟。


Python 3.6.4 安裝視窗

2019年7月9日 星期二

Google for Education Level 1 認證

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

前言


由於本校資訊組正在推行 G Suite,希望吸引更多的老師將 Google 軟體運用在教學上,因此特地找了 Google 認證培訓機構的講師來開課,並在課程的最後一個下午參加 Google for Education Level 1 認證考試,以下是關於考試的筆記。



Google for Education Level 1 認證


簡介


這個認證考試主要是針對適合用在教學上的 Google 系列產品,分為教育家第1級教育家第2級,考試內容可以先參考 Google for Education 官方網站的訓練課程,第1級為基礎課程,第2級為進階課程

教育家第1級的考試費用為10美金,通過考試後取得的認證有效期限為3年,考試時間為3小時,考試內容分為觀念題及實作題,但如果點 Google 認證教育家第1級頁面中的練習,只能看到幾個例題而已。如果平常就有在用 Google 的產品,應該只要照著題目的指示操作就可以通過考試。

2019年6月25日 星期二

於 Linux Mint 上安裝 EPSON 印表機的方法

作者:王一哲
日期:2019/6/25

環境


  1. Linux Mint 19.1 Cinnamon
  2. EPSON AL-C300DN
  3. 由內部網路連線至印表機


步驟


  1. 於官方網站下載驅動程式頁面搜尋印表機型號AL-C300DN,或是按後方的連結下載epalc300dn.ppd
  2. EPSON 官方網站

2019年6月4日 星期二

兩條長直載流導線產生的磁場

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

如下圖所示,兩導互相平行的長直載流導線,如果電流方向相同時,兩條導線間的磁力會相吸;如果電流方向相反則會相斥。通常我們會用安培右手定則比出導線A在導線B處產生的磁場方向,再用右手開掌定則比出導線B所受磁力,接著用同樣的方法比出導線A所受磁力。但要如何畫出兩條導線在附近的空間產生的磁場呢?


兩導互相平行的長直載流導線


已知長直載流導線在距離導線r處產生的磁場強度
$$B = \frac{\mu_0 I}{2 \pi r}$$
只要能夠寫出磁場方向的數學關係式,應該就能用 Python 繪圖,以下是我採用的兩種方法。

2019年5月7日 星期二

於 Blogger 中插入 SVG 檔

作者:王一哲
日期:2019/5/7

SVG 的全名是 Scalable Vector Graphics,中文翻譯為可縮放向量圖形。如果用文字編輯器打開 SVG 檔,會發現它其實是一個純文字檔,所以 SVG 的圖片在縮放時不會模糊、失真,目前主流的瀏覽器皆支援 SVG 檔,但是要在 Blogger 的文章中插入 SVG 檔會有點麻煩。以下的方法主要是參考這篇文章 "Add/Embed SVG to Blogger website"。

將 SVG 檔上傳至存放圖片的網站


文章中使用的網站是 https://svgur.com/,但是我上傳的圖片無法顯示,於是我再找了另一個網站 https://sendeyo.com/en/


https://sendeyo.com/en/



上傳檔案區塊

2019年4月21日 星期日

三角函數微分推導

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

由於高中物理課程中會用到三角函數微分,但是現行的數學教材中已經將這部分刪除,所以我將 $\sin x$ 及 $\cos x$ 對 $x$ 的微分推導過程整理在這篇文章中,希望對比較好學的同學能有一些幫助。

方法1:利用代數及極限運算


前置作業


由於三角函數微分的推導會用到以下兩個函數的極限值,需要先推導出來才行。
$$\lim_{x \rightarrow 0} \frac{\sin x}{x} = 1$$
$$\lim_{x \rightarrow 0} \frac{1 - \cos x}{x} = 0$$


請參考下圖,圖中的圓形半徑為 1,圓心角為 $x$,由於 $x$ 在第一象限中,所有的三角函數值皆為正值或零。



2019年4月11日 星期四

電磁波示意圖

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

本次課程檔案已上傳至 GeoGebraTube,可以線上操作或下載檔案。
1. 電磁波示意圖 https://ggbm.at/aetrezwe
2. 電磁波示意圖(使用參數式) https://ggbm.at/j3zrheab




電磁波示意圖動畫




繪圖步驟


  1. 由於電場、磁場、電磁波前進方向三者互相垂直,必須開啟3D繪圖區才能顯示圖形,我們先由檢視3D繪圖區或是快速鍵Ctrl+Shift+3開啟3D繪圖區。
  2. 先定義下列的變數:振幅 A = 2、波長 λ = 4、週期 T = 1、角波數 $k = \frac{2 \pi}{\lambda}$、角頻率 $\omega = \frac{2 \pi}{T}$。
  3. 新增代表時間 t 的數值滑桿,最小值為0,最大值為T,增量為0.01T,動畫效果預設為遞增
  4. t = Slider(0, T, 0.01*T)
    
  5. 由於我希望電磁波沿著 +x 軸方向前進,若電場沿著 z 軸方向振動,則磁場必須沿著 y 軸方向振動,先用以下指令畫出磁場的波形。
  6. B(x) = If(0 <= x <= 3*λ, A sin(k*x - ω*t + 180°))
    
  7. 為了畫出磁場的振動位移,我先在 x 軸上每隔一段距離取一個點,將一個波長平均分為8等份,再於 B(x) 上畫出對應的點,最後用向量畫出箭頭。
  8. num = 4 * 2 * 3
    points = Sequence(Point({3*λ / num*i, 0, 0}), i, 1, num)
    points_B = Sequence(Point({3*λ / num*i, B(3*λ / num*i), 0}), i, 1, num)
    arrows_B = Sequence(Vector(points(i), points_B(i)), i, 1, num)
    

2019年4月7日 星期日

向量積

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

向量積 (vector product) 也稱為叉積 (cross product),在高中數學課本中被稱為外積,但是在數學上有另一個外積 (outer product),兩者是不同的。假設向量$\mathbf{a}$、$\mathbf{b}$分別定義為

$$\mathbf{a} = (x_1, y_1, z_1)$$
$$\mathbf{b} = (x_2, y_2, z_2)$$

則兩者的向量積為

$$\mathbf{c} = \mathbf{a} \times \mathbf{b} =
\begin{vmatrix}
\hat i & \hat j & \hat k \\
x_1 & y_1 & z_1 \\
x_2 & y_2 & z_2
\end{vmatrix}
= (y_1 z_2 - z_1 y_2, z_1 x_2 - x_1 z_2, x_1 y_2 - y_1 x_2)$$

相當於是向量$\mathbf{a}$、$\mathbf{b}$在空間中形成的平行四邊形的法向量。

本次課程檔案已上傳至 GeoGebraTube,可以線上操作或下載檔案,網址為 https://ggbm.at/upfavbyq


向量積



2019年3月29日 星期五

帶電粒子在電場及磁場中的運動

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

題目


如下圖所示,在平行於$+y$方向上施加一強度為$E$的均勻電場,另在垂直射出紙面的方向上施加一強度為$B$的均勻磁場。起始時,有一質量為$m$、帶有正電荷$q$的質點,靜止放置在原點處。只受此電磁場的作用下(重力可不計),則在質點的運動過程中,下列敘述何者正確?【96指考單選6】
(A) 任何時刻質點的加速度朝向$+y$方向
(B) 任何時刻磁場對質點不作功
(C) 任何時刻電場對質點不作功
(D) 任何時刻磁場對質點的作用力為零
(E) 質點在此電磁場中的運動軌跡為圓形





解答


質點會同時受到靜電力及磁力的作用,兩者分別為

$$\mathbf{F_E} = q \mathbf{E} = (0, qE, 0)$$

$$\mathbf{F_B} = q (\mathbf{v} \times \mathbf{B}) \perp \mathbf{v}$$

  1. 質點的加速度方向會隨著速度而改變,當速度為0時磁力為0,只有$+y$方向的靜電力,因此加速度為$+y$方向;當質點有$+y$方向的速度時,就會受到$+x$方向的磁力作用而偏轉,(A)選項錯誤
  2. 由於$\mathbf{F_B} \perp \mathbf{v}$,磁力不會對質點作功,(B)選項正確
  3. 由於$\mathbf{F_E} = q \mathbf{E} = (0, qE, 0)$,除了質點速度正好與$+y$方向垂直時,靜電力會對質點作功,(C)選項錯誤
  4. 由於$\mathbf{F_B} = q (\mathbf{v} \times \mathbf{B})$,(D)選項錯誤
  5. 質點在此電磁場中的運動軌跡不會是圓形,(E)選項錯誤



使用 VPython 模擬的結果


2019年3月21日 星期四

立方體電阻

作者:王一哲
日期:2019/3/21

題目


如下圖所示,每個電阻器的電阻值皆為$r$,若電流由A流入、由G流出,請問A之間的等效電阻值為何?





解答


由於電流$I$由A點流入之後,往B、D、E的電流皆為$I/3$,可以推測這三個位置等電位,同理可推C、F、H等電位,因此可以將電路圖化簡為下圖,AG之間的等效電阻值為
$$R_{AG} = \frac{r}{3} + \frac{r}{6} + \frac{r}{3} = \frac{5}{6} r$$




2019年2月11日 星期一

堅果雲Markdown

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

前言


Markdown 是一種語法相當簡單的標記語言,可以使用 LaTeX 編碼產生數學式子,也可以根據程式語言將程式碼自動上色,對於我這種經常寫數學式子和程式碼的人相當方便。當我可以用電腦上網時,我通常是用線上版的 HackMD,如果不能上網時則改用 Typora,至於在手機上則會用堅果雲Markdown。這是一款 Android 系統上的 Markdown 編輯器,不過這是由對岸的公司製作的軟體,這家公司主要的產品是雲端硬碟,網址為 https://www.jianguoyun.com/ ,如果能接受對岸的產品可以試用看看。



軟體介紹


使用界面


開啟軟體後,在畫面下方有五個選項:
  1. 最近:顯示最近使用的檔案
  2. 坚果云:開啟位於雲端硬碟的檔案
  3. +:新增檔案
  4. 本地:顯示手機上的檔案
  5. 设置:軟體選項




軟體畫面截圖


2019年2月4日 星期一

Matplotlib 繪圖技巧:三張小圖並列

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

以下是將在三張小圖並列在同一張圖中的作法,部分內容與〈Matplotlib 繪圖技巧:在同一張圖上繪製兩個函數、兩張圖並列〉相似,但使用兩種不同的作法。這次要畫的圖形是在人工神經網路中常用的激勵函數 (activation function):
$$sigmoid:~~~~~f(x) = \frac{1}{1 + e^{-x}}$$
$$ReLU:~~~~~f(x) = \left\{\begin{matrix}
0 & \mathrm{for}~x < 0\\ x & \mathrm{for}~x \ge 0 \end{matrix}\right.$$ $$tanh:~~~~~f(x) = tanh(x)$$
三種激勵函數圖形


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.]]