第五週上課綱要

 

 

電腦模擬實驗:咖啡冷卻問題(共三小時)

 

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

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

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

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 演算法:觀點一(把斜率離散化)

若 dx 很小,原函數 y(x) 在 x0 處的斜率值 f(x0) 是相當於(白板作圖示範):

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

[ 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 環境用的)

 

(本次上課進度操作到這�堙^

6 月 30 日

首先我們把 cooling.f 程式回顧一下它的內容,以便待會進入狀況:

 

 

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

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

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

(提示:以人腦代替電腦以玻簡單之例子或較少的步驟來核對)

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

老師的叮嚀:即使歐樂演算法的程式都做對了,仍要注意微小時間步幅 Dt 不能取得太小,否則會錯得非常離譜,原因可簡短地理解為,有某個瞬間,由於冷卻常數是負的(降溫)的緣故,Dt 乘上去應該要讓溫度降一點點(因為冷卻定律公式中有負號), 如果 Dt 太大了,甚至會發生咖啡溫度減得太多而低於環境溫度,如此就大大地不對了。

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

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

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

自己先想一想,如何定出 r 值(想不出來再看)

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

 

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

 

五、演算法的精確度與穩定性的問題。(原參考教科書內文)

利用電腦進行數值運算,其誤差的來源有二,其中一個是四捨五入誤差(又叫捨去誤差或捨入誤差,英文叫 round-off error 或 rounding error,它是發生在當電腦在利用其有限的位元處理有小數點的數值(如實數,又叫浮點數)傯會有需要四捨五入的情況,比方說若僅保留小數點後一位,則 1.1 乘以 1.1 的結果就要表示成 1.2 而不是更正確的 1.21,;另外一種誤差是來自演算法�媕Y所使用的近似,叫截斷誤差或修剪誤差,英文叫做 truncation error,會有這種名稱是因為演算法常用無窮級數展開的形式,其中很有名的比方說泰勒展開式(Tylar's expansion)。

 

 

 

進階閱讀:

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