第四週上課綱要
在本週三小時的課程中,我們將陸續完成下列幾個單元,每小單元約半小時
一、 以 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