課程學習要點
課程學習要點
數值方法這一門學問,是要教我們如何把一個可以用方程式表達出來的數學問題,轉化為可以適用於電腦反覆迭代運作方式的演算法,進而能讓我們使用電腦去求解這個數學問題。 數值方法的內涵頗廣,舉凡求解出該數學問題所要涉及的多種層面,諸如,不同演算方法的選擇、精確度的控制與硬體效能的配合,都包含在數值方法所涵蓋的範疇之中。
數值方法通常是用來解決無法以公式推導簡化 (不論是靠一般傳統的筆算或用所謂的符號運算 Symbolic Computing) 的數學式運算求值或方程式求解的問題。由於不是能析解(也就是說答案並不是以數學函數構成的公式來表達,而是以數值來表達),由此一個新的問題,即使是與之前處理過的類似,都需要重新用數值方法求解一次問題。數值方法這個名稱之對應於其反義詞 "解析方法 analytic methods", 有這樣本質上的差異性存在。科學研究或工程應用上的問題,在大多的情況下都是複雜難以獲得解析解的問題,我們因此必須對這些個別的、所有的個案都進行數值運算,像是每日的天氣預報從這個角度來看,能夠熟練於數值方法的應用便是十分重要的。
為甚麼要學習數值方法( 即 數值方法在科學與工程上的重要性 )
因為物理學家(物理系學生)的訓練,需要有一個完整能 解決問題 (Problem Solving) 的能力,一個真實世界中的科學或工程上之問題之獲得解決的程式不會像是基礎教科書的習題那樣,有完整的預設條件以供套入一個即定的公式去獲得答案。而是來自"真實世界"的問題,例如那一個材料會比較合我們特定的用途,怎樣設計的機械有最好的效率等等。
以下我用一個金字塔來說明並解構利用電腦解決真實問題的步驟:
問題
物理量
數學模型
演算法及程式
數值計算及分析
結論、解釋、預測一個真實世界的問題要獲得解決,我們必須要從幾個重要的步驟(從物理學家的訓練而言),首先,"真實世界"的問題中抓中關鍵的"物理量"是甚麼,質量、導電係數、彈性係數(硬度),這些都是物理量,而不能只把問問題的層次停留在那個材料比較"好"、"優良"、"耐用"、"理想" 等非 "物理" 的或非 "物理量" 的描述,這是第一步。
再來,是思考這些物理量是與其他的那些物理量有關,而物理量之間的關係通常以數學式子來表示,事實上,就是我們一直在學的各種物理定律。如描述波動粒子二元性的薛丁格方程式,以及描述電磁場的馬克斯威爾方程式等。物理定律是無法證明對錯的,日後也有可能被修正或甚至推翻,例如相對論修正牛頓力學,因此以數學式表示出來的物理定律,我們也可視之為是為了描述自然現象所使用的數學模型。
例如紅毛城上砲台的真實問題,是彈著點,也就是砲彈的軌跡。軌跡在發射前並不知道,然而,根據牛頓運動定律 f = ma = m(d2x/dt2) ,而這裏的力是重力 f = mg,為已知。而整個問題的中心,變成要求解牛頓運動方程式中的未知函數,也就是軌跡,的問題。
事實上,正是計算炮彈軌跡的問題,對促電子計算機的早期發展提供了推動力。有名的 ENIAC (電子數值積分與計算器),所謂公認的第一部泛用可程式的電子計算機,就是建造用來積分炮彈軌跡的。
http://libai.math.ncu.edu.tw/bcc16/pool/2.01.shtml
http://www.geocities.com/pc_hist/comp_beg.htm
有了數學模型要求解,則我們的真實問題已經轉化成數學問題。再下一步有兩種可能,一個是利用公式推導的方法(又叫解析方法),把數學問題的解來獲得;另一種可能,則是使用電腦運算來求得所謂的數值解。若要採用敔數值方法,首先,須再把人類習慣看的的數學公式轉化為適合電腦反覆運算的演算法,再依電腦看得懂的程式語言寫下來(在實作上則還需要用編譯器產生執行檔,它是機器真的可以接受的二元碼)。
有了程式之後便可以拿來跑計算,這需要在一個數值運算的環境中來進行,這樣的環境通常由電腦硬體、網路、作業系統,以及應用軟體(包含編譯器、函式庫、作圖軟體、操作分析介面或其他專用的等)。電腦跑完後的數據可能是龐大而複雜的,因此須要有有效的數據表列方式,或是藉由視覺化(visualisation)來突顯數據內所薀涵的意義(像我們在看天氣預報時的氣象圖那樣),以上我且把它們歸類到 "分析" 這個動作,意指備妥可供稍後直接拮取用以支持或反對原有科學推論結果之數據的動作。
即便是選對了演算法、寫了好程式,也跑完了數值計算,甚至作出漂亮的圖,如果就停在這裏的話,仍然不算是作到了 "解決問題" 的初衷。在我們取得足夠可靠度的數據之後,必須設法基於該數據來對我們探討的問題的觀點作出結論,或對所研究的現象作出解釋,抑或是對所要估算的物性作出預測,這樣才算完成了一次解決問題的流程。大家一定要記得,那怕是不完全保證正確的結論、解釋或預測,若沒有講出這一步,前面的努力仍不具有實際的用處。
如何學好數值方法
實際操作練習,多寫程式。
數學問題必須要能夠轉換或符合電腦運作那種反覆迭代方式的演算法,並且用程式語言來告訴電腦如何去進行演算法所規劃出來的運算動作。這些都不是我們人類的本能或是過去學習的數學方法裏我們所熟悉的。因此實際的操作、勤加練習、多寫程式正是能學好數值方法的關鍵。
學而時習之,不亦說乎
本課程的特色
1. 英語上課(限大三開課時;大二上課仍用中文)
2. 數學問題的剖析
3. 副程式直接套用
4. 在 Linux 環境
5. 平行計算
6. 完全自行建立環境的能力