第三週上課綱要

 

 

在本週三小時半的課程中,我們將陸續完成下列幾個單元,每單元約半小時至一小時。

 

一、Fortran 程式寫作與編譯複習(30 分鐘)

複習寫可計算的程式

如:從 1 加到 N 的程式

複習如何用編譯器做出可執行檔

如:gfortran my_prog.f 或 gfortran -o my_prog.x my_prog.f

 

二、PGPLOT 繪圖副程式庫的詳細介紹

PGPLOT 簡介(一小時)

示範 pg_test1.f

( gfortran -o pg_test1.x pg_test1.f -L /usr/X11R6/lib -lX11 -L /usr/local/pgplot -lpgplot )

補充資料:Xmgr 互動式繪圖軟體 (30 分鐘)

 

三、PGPLOT 繪圖之實習(一小時至一小時半)

用打點的方式,畫出三角函數 y = sin(x) 的圖形(提示:call PGPT )

用連線的方式,畫出 y = x2 sin(x) 的圖形(提示:call PGLINE )

 

 

(第三週實際只做到這�堙^

 

四、 以 PGPLOT 輸出動畫的技巧介紹與實習

換顏色的指令

範例程式閱讀 planet.f

範例程式閱讀 md_pgplot.f

 

 

五、電腦模擬實驗:咖啡冷卻問題

問題:先加奶精或是後加奶精咖啡冷得快?

物體量:溫度隨時間的變化

物理定律(數學模型):牛頓冷卻定律(溫度變化率與溫差呈正比)

dT / dt = - r (T - Ts)

其中溫度 T 是時間 t 的函數,即 T(t) ,Ts 是外在環境的溫度(室溫),

冷卻係數 r 如何定出?

以下為實測值,當時室溫 17 度 C:

時刻(分鐘) 黑咖啡溫度(度C) 白咖啡溫度(度C)
0 82.3 68.8
2 78.5 64.8
4 74.3 62.1
6 70.7 59.9
8 67.6 57.7
10 65.0 55.9
12 62.5 53.9
14 60.1 52.3
16 58.1 50.8
18 56.1 49.5
20 53.3 48.1
22 52.8 46.8
24 51.2 45.9
26 49.9 44.8
28 48.6 43.7
30 47.2 42.6
32 46.1 41.7
34 45.0 40.8
36 43.9 39.9
38 43.0 39.3
40 41.9 38.6
42 41.0 37.7
44 40.1 37.0
46 39.5 36.4

白咖啡與黑咖啡是否都滿足牛頓冷卻定律所描述的呢?如何確認?如何做下一步?

 

演算法:

Euler 演算法

對於一個簡單的微分方程 dy / dx = f(x,y),在 Dx 很小時可當作 Dy / Dx = f(x,y),故 Dy = f(x,y) Dx

又當 Dx 是等間隔 xn - xn-1 = ... = x3 -x2 = x2 -x1 = Dx 時

Dy = yn+1 - yn = f(xn,yn) Dx

這�堛�

yn+1 = yn - f(xn,yn) Dx

就是有名的 Euler(奧依勒)演算法

 

程式流程:給定冷卻係數、咖啡初始溫度、室溫,畫出 T(t) 的圖

(0) 開始

(1) 讀入冷卻係數、咖啡初始溫度、室溫、小間隔時間設定、希望模擬之時間

(2) 在迴圈中,以 Euler 法預測下一小段時間後的溫度,並畫圖,直到迴圈跑完

(3) 結束

範例程式參考

 

分析與討論

我們怎麼知道程式寫得對或錯?

取 Dt 大一點或小一點有什麼不同?

假設加奶精總是把溫熱咖啡的溫度再降五度,先加奶精過是後加會比較快喝到咖啡?

變化率與當時之量有關的現象,還有什麼例子?

 

六、電腦模擬實驗:自由落體問題

問題:想知道炮彈打到那��

物理量:軌跡隨時間的變化 x(t), y(t)

物理定律(數學模型):f = m a ,在此 f 純粹來自於重力 (粗體字代表是向量)

粒子在地表附近所受的重力是 g (g = GmM/R),g = 9.8 牛頓/米

f = ma = m ( ax ex + ay ey ) ,其中 ax = dvx/dt 、 ay = dvy/dt

只有重力時,f = fy ey = g m ey ,也就是說 fy = g m

演算法:

利用 Euler 演算法:

位置 xn+1 = xn + vx,n Dt ; yn+1 = yn + vy,n Dt

速度 vx,n+1 = vx,n + ax,n Dt ; vy,n+1 = vy,n + ay,n Dt

 

進階補充:對計算穩定性及精確度,有更好的選擇

Euler-Richarson 演算法, 先求出

ax,n = fx(rn,vn,t)/m

vx,mid = vx,n + (1/2) ax,n Dt

xmid = xn + (1/2) vx,n Dt

ax,mid = fx( xmid, vx,mid, t+(1/2)Dt ) / m

然後才做

vx,n+1 = vx,n + ax,mid Dt

xn+1 = xn + vx,mid Dt

註:為什麼 Euler-Richarson 演算法 比 Euler 的好,可參考 Gould 課本上的推導: p1、p2

 

程式流程:

(0) 開始,宣告變數

(1) 問質量、初速度(含初速率與角度)

(2) 建立位置 x 與 y、速度 vx 與 vy 的初始值

(3) 用演算法求下一個小時段 Dt 後的位置與速度

(4) 畫出粒子位置並檢查高度是否己達地面,未達地面則回到 (3)

(5) 問要不要再射一次,若要則回到 (1)

(6) 結束

做不出來嗎?參考範例程式

動動腦、動動手,自己再改造(或回家做):

1. 畫個大砲把炮管的角度表現出來

2. 以火藥包裝填數表現炮彈動能,轉換成初速率

3. 物體被炸破片的彈出(配合亂數產生器 ran3.f)

分析與討論:

想預測炮彈打到那�堙A主要是基於那一條物理定律?

什麼樣的先決(初始)條件決定了炮彈的軌跡(和落點)?

同樣的火藥包充填數,怎麼打炮彈才飛得最遠?

 

七、電腦模擬實驗:受空氣阻力的落體

問題:在有空氣阻力的情況下,炮彈軌跡變得如何?

物理量:一樣是軌跡隨時間的變化 x(t), y(t)

物理定律(數學模型):f = m a,受力 f 同時包含了重力及空氣阻力

空氣阻力非常複雜(因此飛機或高速火車的阻力設計需要靠風洞實驗或電腦模擬來進行),基本上它是與速率有關,速率越高阻力越大,靜止的物體則沒有空氣阻力。可見它是一個與速率有關的量,常見的簡化公式,有隨速率一次方呈正比的,也有隨兩次方呈正比的,方向是速度反向(負號)的

Fd = - k1 v

Fd' = - k2 v2

由於有 x 與 y 兩個分量,假設速度與水平線的夾角為 i

Fd,x = Fd cos i

Fd,y = Fd sin i

因此,在有關力之部分的公式,

fx = Fd cos i

fy = - m g + Fd sin i

其他的部分,與上一個議題相同

新議題:如何求得室氣阻力係數 k?

利用終端速度,即垂直落下過程中重力與阻力達平衡,使合力為零不再加速,而呈等速運動時的速度。

合力 = 0 = - m g + Fd = - m g + k1 vy2

即 k1 = vy2 / (m g),此終端速度可藉由實驗量得

一個粉筆頭大小的石子其終端速度大約是每秒三十公尺,另外,一個重 0.254 克 、半徑 0.254 公分的保利龍球有以下的實測數據(引用 Physics Teacher 24, 153 (1986) )

時刻(秒) 位置(公尺)
-0.132 0.0
0.0 0.075
0.1 0.260
0.2 0.525
0.3 0.870
0.4 1.27
0.5 1.73
0.6 2.23
0.7 2.77
0.8 3.35

想想看,我們要怎麼從上列的數據求得空氣阻力係數 k?

 

演算法:

同樣採用 Euler 或 Euler-Richardson 演算法

 

程式設計:

與上一個議題相同

參考範例程式

 

分析與討論:

以同樣的力道向上拋一個小石子,在有空氣阻力與無室空氣阻力的兩種情況比較下,那一種會在空中停留較久?

在有空氣阻力的情況下,拋射物的角度要如何設定其距離才會最遠?

 

 

 

 

進階閱讀:

Gould and Tobochnik, An Introduction to Computer Simulation Methods -- Applications to Physical Systems, Addison Wesley (1996) Chapter 2, Chapter 3