咖啡冷卻問題�堛漱j問題:定出 r 值

 

如何定出 r 值?

像牛頓冷卻定律這樣簡單的公式,我們只需要知道冷卻係數 r 就可以進行模擬,但是,如何從一組實驗量測的溫度對時間變化來找出 r 呢?

 

直觀的想法與作法:

首先,把溫度對時間的實驗數據畫出,再來,試用不同的 r 值把冷卻曲線畫在一起, 一條接一條用不同的顏色,直到你找到能使模擬曲線看起來最接近的 r 值。

小挑戰:你如何讓程式可以允許你不斷輸入新 r 值繪圖,而畫面上又只保留兩三條線以便看清楚?

為了讓大家省卻輸入的麻煩,在此已經將 時刻-黑咖啡溫度-白咖啡溫度 存在一個文字檔中,大家可用 Fortran 開檔 (OPEN) 讀入 (READ) 兩種指令的組合,把數據直接從外部讀進來。範例程式片段如下:

open (unit=10, file='coffee_expt.dat')

do j = 1, j_max

read (10,*) time_expt(j), T_white(j), T_black(j)

end do

close (10)

以上的程式,是利用開啟了陣列的方式,來把存入自外部讀入的數據,由於 Fortran 77 在一開始宣告陣列時就必須先確定陣列的大小,通常有兩種策略來配合進行宣告,分述如下:

第一種,是宣告一個比較大一點陣列,足夠檔案的資料長度所使用,頂多再測試一下迴圈次數是否會超過陣列大小。如下:

real time_expt(100), T_white(100), T_black(100)

...

j_max = 24 (或 read (*,*) j_max )

if (j_max .gt. 100) then

write(*,*) 'Error, data length is loger than arry size.'

stop

end if

...

do j=1, j_max

 

第二種常用的方法,是把宣告了整數變數,進一步以 parameter 指令設定變成常數(一旦設定成常數則在程式中不會改變),如下面方式:

integer j_max

parameter (j_max = 24)

real time_expt(j_max), T_white(j_max), T_black(j_max)

...

do j=1, j_max

 

老師寫的範例程式:

cooling_r_n_expt.f 、 cooling_r_n_expt.f.txt

量測的數據:

coffee_expt.dat

 

 

較嚴密的作法:

先想什麼叫做接近?那什麼又叫做兩條曲線接近?

跟遠、近有關的物理量是什麼? 答案就是距離,所謂的接近,就是兩點間距離短。

至於兩條線的情形如何?先想兩種極端的情況,兩條曲線完全重合一模一樣最接近,形狀位置完全不同,就會差比較遠。線是許多點構成的集合,對於模擬出來的曲線 T(t) 與實驗數據 {(tj, Tj), for all j} 而言,我們也可以定義一種距離 d(r) = F(r)(1/2),其中 F(r) 是以下函數

F(r) = Σj [T(tj) - Tj]2

由於 x(1/2) 是一個遞增函數,所以能使 F(r) 最小的 r 值就會是同一個能使 d(r) 最小的 r 值,我們只要問什麼樣的 r 能使 F(r) 達到極小即可。

接下來,是要寫一段程式來進行 F(r) 函數值的計算。這就要進行以下的動作:

(1) 把實驗值 time_expt(j) 及 T_expt(j) 準備好,

(2) 在給定的 r 值情況下,跑一輪模擬的 T(t),也就是有一組遠比 j 點數更多點的 time(i) 及 T(i),在進行迴圈 i 的過程中,要

(3) 研判下一個 j 是否剛好超過,若是,則以 i-1 與 i 兩點來進行所謂的線性插值。插值的意思,就是好比說我們已知第 87 秒是 45.0 度、第 88 秒是 46.0 度,問在 87.75 秒是幾度這種問題,使用線性差值,就是把兩個己知道數據點之間未知的部分直接拉一條直線來代表,這是一種最簡單的取求插值的方法,因為我們的 i 迴圈每一格是推進很小的 Dt 時間,所以線性差值很合理。

小註解 1:線性差值

在已知兩點 (x1,y1)、(x2,y2) 點之間的任意點 x,其 y 值(由於 (x,y) 是在同一條直線上)必定滿足以下關係式

(y2 - y1) / (x2 - x1) = (y -y1) / (x - x1)

整理後可得

y = S (x - x1) + y1

其中 S 是直線的斜率,也就是 (y2 - y1) / (x2 - x1) 。

 

小註解 2:自變數重合

如果覺得上面的步驟 (3) 太麻煩,在這�堨悕騛篘蝻ず琲熄q測時間點是有非常規律間距的特珠的情況,如第 0 分鐘、第 2 分鐘、第 4 分鐘等,有剛好的規律跟間距,因此,時間間隔 Dt 可以安排成剛好會有模擬的時刻與量測的時刻點是重合的,如此就不必再借助上述的步驟 (3) 了。

 

符合以上功能的程式,會問初始及最終的 r,以及 r 的變化要分幾段的範例程式如下:

(現場實作,大家加油)

 

 

最嚴謹的作法:

前述的方法藉由作圖目視來決定最好的 r 值,目測一個拋物線(只要所看的範圍夠小,平滑函數枉極值發生之處一定是拋物線的形狀)底部的位置雖然已經比在一堆線之由找最相接近的要容易得多,但仍不是全自動的方法。最嚴謹的作法,直接用數值演算法的技巧將函數 F 最小化找 r,方法可在數值計算方法的教科書找到,在此暫不作深入介紹。

 

定出 r 值以外的問題:模型與數據的吻合度探討

前述的作法固然卻是明確地足以給出 r 值,但光得到 r 卻沒有讓我們知道所採用的數學模型(物理定律)本身它對現象的描述是很吻合或不太吻合實驗數據(千萬不要忘了實驗數據本身也含有誤差)。檢視上述的函數 F(r) 的大小,或者是是 F(r) 的開根號 d 值,提供我們一個量度的指標。

事實上,F(r) 在形式上很像是統計學上是變異數的定義,而 d(r) 則像是標準差。在統計的意義上,標準差越小,代表數據偏離與散亂的程度越低,而在我們的例子�堙A則是意味著數學模型越符合現象的觀察。

 

 

延伸思考:

r 值是否為常數?

在本單元中,冷卻係數 r 的值在冷卻定律公式中是被視作為一個常數。如果它不是一個常數,是否對擬合(重現)實驗數據的一致度上會更提昇?

在此所謂不是常數,可以有兩種可能,一是 r 可隨時刻變化,或是可隨溫度(或溫差)變化。其中前者的可能性將導致時間對稱性的問題,除非狀況特殊(例如液體成份隨時間變化而逐漸變質),否則還是以第二種情況,即 r 本身隨溫度(差)的變化仍有相關,是我們較有興趣探討的可能方向。

如果牛頓冷卻定律中的 r 仍是溫度(差)的函數,我們可以怎樣來處理這個數學模型的來解呢?

基於原有之 r 為溫度(差)常數的模型已經能大致地重現出不錯的冷卻曲線,我們可以假設常數加上一個相當微小的溫度一次項可能把數據重現

如此,則數學模型就變成為含有溫度(差)的一次方及平方項,我們可以再次使用最小平方法作曲線擬合,使計算值

 

除了最小化差的平方和之外,用邊界條件法(如射擊法)也可以得到最佳的兩個待定參數