第四週上課綱要

 

 

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

 

一、 以 PGPLOT 輸出動畫的技巧介紹與實習(半小時)

範例程式閱讀 planet.f

基本關鍵的指令

換顏色的指令 call pgsci(i)

其他(非絕對必要,但仍有用之)指令(副程式)

設定填充屬性的指令 call pgsfs(j)

j 可以是整數 1、2、3、4,效果如下:

畫圓 pgcirc(x,y,r)

開始緩衝區納入 pgbbuf

結束緩衝區送出 pgebuf

設定圖面大小 pgpap(x_size,y/x-ratio)

 

自行試做,盡情創意發揮

寫好程式後編譯時,由於你的程式中有使用到 pgplot 繪圖副程式,因此編譯指令要像這樣下:

gfortran -o my_prog.x my_prog.f -L /usr/X11R6/lib -lX11 -L /usr/local/pgplot -lpgplot

以上注意 X11R6 的 X 與 R 是大寫、11 跟 6 一樣是數字、有 -L 的地方一定要用大寫,後面連結程式庫用的 -lX11 與 -lpgplot 之 "-l" 則是英文小寫 l 。

 

小技巧與注意事項

在最後有用 call pgclos 與沒有使用的差別

有用 call pgclos 時,所有繪圖動作完畢後,該畫面仍會留著供使用者有時間觀看,直到按下 enter 才全部關閉退出。 反之, 若程式最後沒有有用到 call pgclos 時,程式一跑完就什麼都關起來,我們因此就只見畫面閃了一下,一點都看不清楚所畫的東西。

 

使用 top 來殺掉不停不掉的執行中程式

(1) 打 top 進入按 CPU 忙碌程度排序的畫面

(2) 看你的程式的 PID (Processs ID) ,順便看一下它的 CPU 使用百分比

(3) 按 k 畫面會等你打入想殺掉之 job 的 PID

(4) 它問你殺掉該指定 PID,要你確認,按了 Enter 就殺掉了,並則到動態排序狀態

(5) 按 q 退出 top

 

於虛擬機器使用隨身碟的方法

(1) 在虛擬機器是前景的情況下, 插入隨身碟

(2) 在終端機試窗中可以打 df 來觀看檔案系統的情況,會看到新增加的 /media/disk 檔案系統目錄。並且在桌面上也會看到新的可卸載裝置出現。

(3) 在文字介面中操作標準 UNIX 的指令,將檔案 cp 到 /media/disk 即可,也可以在桌面開啟相關的資料夾之間拖放檔案。

(4) 傳檔完成後,關閉屬於隨身碟的資料夾(注意要所有視窗都沒有 cd 到隨身碟的資料夾中),並用滑鼠右鍵使跳出選單並選卸載,即可。另也可再用 df 於終端機視窗中查看 /media/disk 目錄是否己經消失。

 

 

學生創意動畫成果展

請至此連結欣賞

 

 

(本週實際進度進行到此,仍未能開始進入咖啡冷卻)

 

 

二、電腦模擬實驗:咖啡冷卻問題(共兩小時半)

 

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

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

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

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

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

 

演算法:

這�媦ずヶ暋D的本質問題:

我們只知道函數 y(x) 的處處斜率 y'(x) 是等於已知的 f(x),(f(x) 中若明顯出現 y,則也可以寫成 f(x,y) ) 。而我們希望知道函數 y(x) 。

 

Eular 演算法:觀點一(把積分離散化)

原函數 y(x) 在 x0 處的斜率值 f(x0) 是

[ y(x0+dx) - y(x0-dx) ] / 2x0,也可寫作

[ y(x0+dx) - y(x) ] / dx (反正 dx 很小)

,因此

y(x0+dx) = y(x0) + f(x0) dx

如果我們定一格 xn 到下一格 xn+1 之間的間格是 dx ,則上式變成

y(xn+1) = y(xn) + f(xn) dx

而這正是 Eular 演算法,告訴我們如何從斜率函數一步步推出原函數。 (但也請大家注意,起始的第一個點的函數值必須要先知道。)

 

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) 結束

 

請自行撰寫程式

 

寫好程式後編譯時,由於你的程式中有使用到 pgplot 繪圖副程式,因此編譯指令要像這樣下:

gfortran -o my_prog.x my_prog.f -L /usr/X11R6/lib -lX11 -L /usr/local/pgplot -lpgplot

以上注意 X11R6 的 X 與 R 是大寫、11 跟 6 一樣是數字、有 -L 的地方一定要用大寫,後面連結程式庫用的 -lX11 與 -lpgplot 之 "-l" 則是英文小寫 l 。

 

完成圖例

 

範例程式參考

等不及了,先玩一下老師己經做好了的可執行檔 cooling.x

一下子寫不出來,偷看一下老師範例程式中的寫法 cooling.f

(儘量先自己試試看,注意可執行檔是 Linux 環境用的)

 

分析與討論(暨系列習題)

一、依照牛頓冷卻定律,寫一個預測物體溫度 T(t) 的程式,其中冷卻係數 r、初始溫度 T(0)、環境溫度 Ts,以及微小時間間隔 Dt 由外部讀入。

A.你的程式寫好了,也順利地通過編譯並產生一個可執行檔,也就是指令的語法都正確了,但你怎麼知道它有沒有邏輯上的錯誤(程式內部的錯誤通常叫 bug,因為歷史上曾有蟲子卡在真空管燒掉導致電路借邏輯錯誤的事件)),或比方說不小心把 + 號打成 - 號?

B.微小時間間隔 Dt 是程式使用者自己必須決定的量,請試試看不用數量級的大小。你覺得用多小的值才夠精確?

 

二、從實驗數據(參考下表)建立咖啡之冷卻係數的實作

A.你認為牛頓冷卻定律能不能描述上述的實況?(想想看我們要怎麼樣來回答這個問題。)

B.如果我們願意接受用牛頓冷卻定律為模型來描述實況中的冷卻過程,則你要怎麼樣獲得一個較符合的冷卻係數 r 值?

 

三、假設加入奶精只會簡單地把瓶中溫度降低攝氏五度,則問一瓶剛沖好攝氏 90 度的咖啡,要想快點達到開始可以品嚐的攝氏 75 度,你建議先加奶精或是後加奶精?

 

四、一個量的變化率與當時該量之大小有關的現象,還有什麼例子?

 

 

 

進階閱讀:

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