數值分析基本上分為兩大類,一類是做微分方程之模擬(即數值微分方程),一類是做大型矩陣運算。統合而言,有人又把它叫做科學計算。 如同微分方程介紹裡面所提到的,當解無法寫成可以計算的型式(另一個說法:closed form solution),但又想了解解長成什麼樣子時,數值方法便可以用來幫助我們「解決」這個問題。數值微分方程的主要想法是,利用電腦的高速計算能力,設法讓電腦能夠跑出微分方程的解的「長相」,注意,只是長相,並不代表電腦可以告訴我們那個解是由哪些函數所構成(例如看到解是波型的長相,不表示那個解是三角函數所構成)。 數值微分方程用來解決微分方程的問題時,通常是將微分方程的「微分算子」給「離散化」。這是個很難說明的概念,所以讓我舉數位音樂為例。以前在錄音時是用類比的方式錄下每一個時間點的聲音,而所謂的數位化則是例如把一秒切割成 N 等份,每一等份都只會有一個固定頻率、固定大小的聲音,數位化的好處是電腦可以處理,但是壞處是失真。在數學中,要求一個微分方程的解,有點像是要知道滿足方程的函數(或說是解)在每個時間、每個位置的值 (value) 是多少(因為若不知道每個點的值,不可能可以計算微分),數值方法即是只想知道這個函數在某些選定的樣本點的值(之後簡稱樣本值)是多少就好。然而,只知道樣本值是無法計算微分的,因此需要發展方法只利用樣本值去計算微分的逼近值,然後利用這些方法將原先的微分方程式改寫成一個只依賴樣本值的代數方程式(一般會歸結到矩陣系統 Ax=b,其中 x 是樣本值,而 A 和 b 是已知的矩陣及向量)。有了代數方程式,理論上電腦就可以算出每個樣本點該有的值,而這些樣本值也就是所謂的微分方程的近似解 (approximated solution)。 顧名思義,近似解並不是真實的解,只是一個「可能」接近於真實解的東西。在這裡特別要強調這個「可能」,因為如果要能明確地說這的確是個接近於真實解的好東西,那麼數學上是需要證明的。計算數學發展的歷史上,常常有一些人宣稱他們的數值方法可以跑出一些結果,進而推論什麼樣的現象,然後幾年之後不同的數值方法卻發現前人所發現的東西是錯誤的,原因很簡單,都是沒有證明,純是一廂情願。 做理論應用數學的我,曾經對這樣的想法不以為然,在我問過一位我做數值方法的好朋友之後得到了一個很滿意的解答。我的朋友說,我們常常拿到一些不知從何下手做分析的問題,沒辦法做分析,當然理論也沒辦法做下去。但是,數值方法在這時至少可以提供一個方向,因為在對手上的問題完全沒有了解的情況之下,數值方法往往是很直接的,幾乎是用暴力法 (brutal force) 去找逼近解,當我們觀察這個近似解時,會累積我們對真實解的了解(當然是假設得到的是個好的近似解)。而在離散化問題的過程中,也會得知這個問題可能的困難處是哪些,需要加以特別關照。不知道看倌們的想法又是如何? 說到這,也許開始有人會懷疑起,如果數學的必備因素是邏輯的推演,證明是表達數學精神的具體象徵,那麼,這些看來並不嚴謹的學問算是數學的一部份嗎?這個問題要從兩個方面來回答,其一,並非所有的數值方法都沒有辦法證明其收斂性,意思是有些情況之下,近似解的確可以被證明出近似於真實解;其二,數值方法本身有其嚴謹的一套學問。例如某個常被用來解微分方程的方法叫有限元素法 (Finite Element Method), 若抽離掉在微分方程的應用層面,它本身是可以被證明構成一套嚴謹的系統。然而,麻煩就是在於應用時常會遇到整個理論成立時所要求的條件不被滿足的情況,此時就是得靠這些數值專家想辦法去克服。 至於大型矩陣運算的起緣,亦是在於當離散化微分方程之後,當希望逼近解的精確度夠高時,所必須計算的矩陣便變得十分龐大(例如幾百萬乘幾百萬的矩陣),這時即使要求行列式可能都得花很多時間計算,更別說是要解 Ax=b 這樣的問題。大型矩陣運算的研究,便是在抽離了原先的微分方程之後,只單純地考慮大型矩陣本身該如何做處理的研究。例如要如何計算大型方陣的特徵值 (eigenvalue),如何解 Ax=b 等等皆在這個範疇以內。 當然,在這類的研究裡面不可能考慮一般的大型矩陣,所以還是假設矩陣是某些特殊的型式,例如離散化 Laplace operator 時,一般都是會得到一個稀疏矩陣 (sparse matrix),所以 Ax=b 這類的問題往往都是假設 A 本身是稀疏矩陣。 另外,雖然我主要還是做理論的,但是因實務的需要,還是寫了一些小程式來模擬流體的行為。下面是一個跟我做的理論相關的數值模擬,希望看倌們可以看出這是在模擬海浪!其中顏色是代表壓力的變化。 數學的美妙就在於:您給我一個式子,我給你一片天。 |