計算物理/為什麼是計算物理?
計算物理是研究和實施數值演算法以及利用計算機使計算變得容易的技術。
本課程的目的是向學生展示計算機如何透過大幅增加我們可以方便地執行的數學計算範圍,使我們能夠擴充套件和深化對物理學的理解。
我們對計算物理學的做法是在高階科學語言(即 FORTRAN 或 C++)中編寫自包含的程式。當然,還有許多其他可能的方法,每種方法都有其獨特的優缺點。簡要檢查可用的選項是有益的。
基本上,我們可以透過三種方法執行我們在本課程中將遇到的數值計算。
首先,我們可以使用數學軟體包,如 MATHEMATICA、MAPLE 或 MATLAB。這些軟體包的主要優勢在於它們促進了數值問題的快速編碼。主要缺點是它們生成的執行程式碼是解釋的,而不是編譯的。編譯後的程式碼直接從高階語言翻譯成機器程式碼指令,這些指令定義上是平臺相關的,畢竟,英特爾 x86 晶片的指令集與 Power-PC 晶片完全不同。解釋後的程式碼從高階語言翻譯成一組與平臺無關的元程式碼指令。然後,每個元程式碼指令都翻譯成一組固定的機器程式碼指令,這些指令是程式碼執行的特定硬體平臺所特有的。一般來說,就計算機資源利用率而言,解釋後的程式碼遠不如編譯後的程式碼高效:即解釋後的程式碼執行速度遠不如等效的編譯後的程式碼。因此,儘管 MATHEMATICA、MAPLE 和 MATLAB 是執行相對較小的計算的理想環境,但它們不適合完整的科研專案,因為它們生成的程式碼通常執行速度太慢。
其次,我們可以在高階語言中編寫自己的程式,但使用對常用子程式庫(如 NAG、4 LINPACK、5 和 ODEPACK、6)中預先編寫的、預先編譯的例程的呼叫來執行所有實際的數值工作。這是大多數研究物理學家使用的方法。
第三,我們可以從頭開始完全用高階語言編寫自己的程式。這是本課程中使用的方法。我選擇不使用預先編寫的子程式庫,僅僅是因為我希望學生培養獨立思考科學程式設計和數值技術的能力。然而,學生應該意識到,在許多情況下,預先編寫的庫例程為數值問題提供了難以改進的解決方案。
最適合科學程式設計的高階語言是什麼?不幸的是,這是一個極具爭議的問題。多年來,已經開發了數百種高階語言。然而,只有少數經受住了時間的考驗。許多語言(例如 Algol、Pascal、Haskell)可以被視為短暫的計算機科學潮流。其他語言(例如 Cobol、Lisp、Ada)過於專門化而無法適應科學用途。讓我們檢查一下剩下的選項。
FORTRAN 是第一個開發的高階程式語言:事實上,它比下面列出的語言早了幾十年。在 FORTRAN 出現之前。此外,FORTRAN 是專門為科學計算而設計的。事實上,在計算機的早期,所有的計算都是科學性質的,即物理學家和數學家是最初的計算機科學家!FORTRAN 的主要優勢在於它非常直觀,並且與大多數常用的預先編寫的子程式庫(因為這些庫通常包含編譯後的 FORTRAN 程式碼)很好地整合。FORTRAN 的主要缺點都與其相對古老的歷史有關。例如,FORTRAN 的控制語句相當原始,而它的輸入/輸出功能簡直是史前時代的。
這門語言最初由計算機科學家開發來編寫作業系統。事實上,所有 UNIX 作業系統都是用 C 語言編寫的。因此,C 是一種非常靈活且功能強大的語言。它的主要優勢包括良好的控制語句和出色的輸入/輸出功能。C 的主要缺點是,因為它不是專門為科學語言而編寫的,所以缺少一些重要的科學功能(例如複數運算)。儘管 C 是一種高階語言,但它包含了許多相對低階的功能,例如指標(這並不奇怪,因為 C 最初是為編寫作業系統而設計的)。C 的低階功能(特別是對陣列的相當原始的實現)有時使科學程式設計比必要時更復雜,並且無疑促進了程式設計錯誤。另一方面,這些功能使科學程式設計師能夠編寫極其高效的程式碼。由於效率通常是科學計算中最重要的問題,因此 C 的低階功能總的來說是有利的。
這門語言是 C 的主要擴充套件,其主要目的是促進面向物件的程式設計。面向物件是與更傳統的程式式方法完全不同的程式設計方法:它特別適合大型專案,涉及許多人,每個人都編寫同一程式碼的不同部分。然而,對於本課程中考慮的這種簡單、單人程式設計任務型別,面向物件代表著大量的、多少有些不必要的開銷。但是請注意,C++ 包含了一些對 C 的非面向物件的擴充套件,這些擴充套件非常有用。在上述語言中,我們可以立即排除 C++,因為面向物件是一個不必要的複雜化(至少,就我們的目的而言),以及 FORTRAN 90,因為缺乏廉價的編譯器。剩下的選項是 FORTRAN 77 和 C。我選擇在本課程中使用 C++(因為它不僅可以面向物件,也可以像 C 那樣進行程式式程式設計),僅僅是因為我發現 FORTRAN 77 的複雜功能令人尷尬,無法在 21 世紀教給學生。