## 11.3 計算物理學
計算物理學(computational physics)研究利用計算機來解決物理問題,是計算機科學、 計算數學和物理學相結合而形成的交叉學科。如今,計算物理已經與理論物理、實驗物理一 起構成了物理學的三大支柱。
物理學旨在發現、解釋和預測宇宙運行規律,而為了更準確地做到這一點,今天的物理 學越來越依賴于計算。首先,很多物理問題涉及海量的實驗數據,依靠手工處理根本無力解決。例如在高能物理實驗中,由于實驗技術的發展和測量精度的提高,實驗規模越來越大, 實驗數據也大幅增加,只能利用計算機來處理實驗數據。其次,很多物理問題涉及復雜的計 算,解析方法或手工數值計算無法解決這樣的計算問題。例如電子反常磁矩修正的計算,對 四階修正的手工解析技術已經相當繁雜,而對六階修正的計算已經包含了 72 個費曼圖,手 工解析運算已不可能完成。同樣只能利用計算機來解決問題。
在物理學中運用計算思維,使我們可以利用數值計算、符號計算和模擬等方法來發現和 預測物理系統的特性和規律。
解決物理問題時,通常在獲得描述物理過程的數學公式后,需要進行數值分析以便與實 驗結果進行對照。對于復雜的計算,手工數值分析是不可能的,只能采用數值方法利用計算 機來計算。
有些物理問題不是數值計算問題,需要利用計算機的符號處理能力來解決。例如,理論 物理中的公式推導,就是純粹的符號變換。有時即使是數值計算問題,由于精度要求很高, 導致計算耗時很長甚至無法達到所需精度,這時可以利用符號計算來推導出解析形式的問題 解。又如,有時數值方法是病態的,如果能將數值計算改成解析計算,則可以得到有意義的 結果。
統計物理中有個自回避隨機遷移問題,它是在隨機漫步中加上了一個限制,即以后的步 子不能穿過以前各步所走過的路徑。這樣的問題不像一般的遷移問題那樣可以用微分方程來 描寫系統的統計行為,計算機模擬幾乎是唯一的研究方法。計算機模擬不受實驗條件、時間 和空間的限制,只要建立了模型,就能進行模擬實驗,因而具有極大的靈活性。下面通過一 個實例來介紹模擬方法在計算物理學中的應用。
熱平衡系統的模擬
為了研究一個包含 N 個粒子的熱系統,原則上只要了解每個粒子的運動,就能弄清楚 粒子和粒子之間的每一次相互作用。但由于粒子數目太大,要想計算 N 個粒子的軌跡以及 N(N-1)對相互作用,是非常困難的。
然而,對于處于平衡態的熱系統,雖然系統的微觀特性總是在變動,但其宏觀特性則是 恒定不變的,體現為具有恒定的溫度。系統的微觀狀態由每個粒子的速度等物理量來刻劃, 粒子間的相互作用會導致微觀狀態改變;而系統的宏觀狀態是微觀狀態的集體特性,表現為 系統的總能量(或溫度等)。統計物理學認為,雖然微觀狀態可能沒有規則,但宏觀狀態服 從統計規律。對于處于平衡態的理想氣體而言,雖然微觀相互作用可導致粒子能量的重新分 配,但系統的總能量保持不變。
考慮一個由三個粒子組成的小系統 S。假設共有 4 份能量在這三個粒子之間交換,則能 量分布可以有以下 15 種狀態:(4,0,0)、(0,4,0)、(0,0,4)、(3,1,0)、(3,0,1)、(1,3,0)、(0,3,1)、(1,0,3)、(0,1,3)、(2,2,0)、(2,0,2)、(2,1,1)、(0,2,2)、(1,2,1)、(1,1,2)。這里元組(a,b,c)表示三個粒子各
自獲得的能量。每種微觀狀態都有自己的出現概率,例如從這 15 種微觀狀態可見,一個粒 子占有全部能量的概率為 3/15 = 0.2。S 的平衡特性由概率較高的微觀狀態決定,而通過隨 機抽樣方法(蒙特卡洛方法)可以有效地產生高可能性微觀狀態,從而可以用來評估 S 的 平衡特性。
我們引入一個“demon”來與系統 S 發生相互作用。作用方式是:令 demon 與 S 中某 個隨機選擇的粒子進行相互作用,并試著隨機改變該粒子的狀態(對氣體來說就是改變粒子 的速度);如果這個改變導致粒子能量減少,則執行這個改變,并將少掉的能量傳遞給 demon; 如果這個改變導致粒子能量增加,則僅當 demon 有足夠能量傳遞給粒子時才執行這次改變。 按這種方式,每次產生新的微觀狀態時,系統 S 的能量加上 demon 的能量保持不變。
具體地,將 demon 加入到 S(包含三個微觀粒子)中后,宏觀狀態仍為 4 份能量。新系統“S+demon”的 demon 為 0 能量的狀態共有 15 個,正對應于原始系統 S 的那 15 個狀態。 如果嘗試改變一個微觀狀態使得某個粒子減少一份能量,則將那份能量轉給 demon,這樣就 使原始系統變成了具有 3 份能量的系統,而 demon 具有 1 份能量。與這種情況對應的微觀 狀態有 10 個,即(3,0,0)、(0,3,0)、(0,0,3)、(2,1,0)、(2,0,1)、(1,2,0)、(0,2,1)、(1,0,2)、(0,1,2)和(1,1,1)。由此可見,如果實施一系列的微觀狀態隨機改變,將發現 demon 具有 1 份能量與 具有 0 份能量的相對概率為 10/15 = 2/3。也就是說,當 demon 擾亂小系統 S 時,S 仍然處于 原來的宏觀能量的可能性更大,而不是處于某個較低能量。
同理,如果 demon 具有 2 份能量,則 S+demon 系統具有 6 個微觀狀態;如果 demon 具 有 3 份能量,則組合系統具有 3 種微觀狀態;如果 demon 擁有全部 4 份能量,則組合系統 只有一種微觀狀態。這幾種情形對應的相對概率分別為 6/15、3/15 和 1/15。
一般地,對于一個宏觀系統,當產生大量的微觀狀態改變之后,其中 demon 擁有能量 E 的微觀狀態,與 demon 擁有 0 能量的微觀狀態數目之比是隨 E 的升高而呈指數形式下降的, 具體公式為

其中 k 是玻爾茲曼常數,T 是宏觀系統的溫度。以我們的小系統 S 為例,p(Ed=1) / p(Ed = 0) 約為 2/3。
總之,計算物理學依據理論物理提供的物理原理和數學方程,針對實驗物理提供的實驗 數據,進行數值計算或符號計算,從而為理論研究提供數據、幫助分析實驗數據和模擬物理 系統。
- 前言
- 第 1 章 計算與計算思維
- 1.1 什么是計算?
- 1.1.1 計算機與計算
- 1.1.2 計算機語言
- 1.1.3 算法
- 1.1.4 實現
- 1.2 什么是計算思維?
- 1.2.1 計算思維的基本原則
- 1.2.2 計算思維的具體例子
- 1.2.3 日常生活中的計算思維
- 1.2.4 計算思維對其他學科的影響
- 1.3 初識 Python
- 1.3.1 Python 簡介
- 1.3.2 第一個程序
- 1.3.3 程序的執行方式
- 1.3.4 Python 語言的基本成分
- 1.4 程序排錯
- 1.5 練習
- 第 2 章 用數據表示現實世界
- 2.1 數據和數據類型
- 2.1.1 數據是對現實的抽象
- 2.1.1 常量與變量
- 2.1.2 數據類型
- 2.1.3 Python 的動態類型*
- 2.2 數值類型
- 2.2.1 整數類型 int
- 2.2.2 長整數類型 long
- 2.2.3 浮點數類型 float
- 2.2.4 數學庫模塊 math
- 2.2.5 復數類型 complex*
- 2.3 字符串類型 str
- 2.3.1 字符串類型的字面值形式
- 2.3.2 字符串類型的操作
- 2.3.3 字符的機內表示
- 2.3.4 字符串類型與其他類型的轉換
- 2.3.5 字符串庫 string
- 2.4 布爾類型 bool
- 2.4.1 關系運算
- 2.4.2 邏輯運算
- 2.4.3 布爾代數運算定律*
- 2.4.4 Python 中真假的表示與計算*
- 2.5 列表和元組類型
- 2.5.1 列表類型 list
- 2.5.2 元組類型 tuple
- 2.6 數據的輸入和輸出
- 2.6.1 數據的輸入
- 2.6.2 數據的輸出
- 2.6.3 格式化輸出
- 2.7 編程案例:查找問題
- 2.8 練習
- 第 3 章 數據處理的流程控制
- 3.1 順序控制結構
- 3.2 分支控制結構
- 3.2.1 單分支結構
- 3.2.2 兩路分支結構
- 3.2.3 多路分支結構
- 3.3 異常處理
- 3.3.1 傳統的錯誤檢測方法
- 3.3.2 傳統錯誤檢測方法的缺點
- 3.3.3 異常處理機制
- 3.4 循環控制結構
- 3.4.1 for 循環
- 3.4.2 while 循環
- 3.4.3 循環的非正常中斷
- 3.4.4 嵌套循環
- 3.5 結構化程序設計
- 3.5.1 程序開發過程
- 3.5.2 結構化程序設計的基本內容
- 3.6 編程案例:如何求 n 個數據的最大值?
- 3.6.1 幾種解題策略
- 3.6.2 經驗總結
- 3.7 Python 布爾表達式用作控制結構*
- 3.8 練習
- 第 4 章 模塊化編程
- 4.1 模塊化編程基本概念
- 4.1.1 模塊化設計概述
- 4.1.2 模塊化編程
- 4.1.3 編程語言對模塊化編程的支持
- 4.2 Python 語言中的函數
- 4.2.1 用函數減少重復代碼 首先看一個簡單的用字符畫一棵樹的程序:
- 4.2.2 用函數改善程序結構
- 4.2.3 用函數增強程序的通用性
- 4.2.4 小結:函數的定義與調用
- 4.2.5 變量的作用域
- 4.2.6 函數的返回值
- 4.3 自頂向下設計
- 4.3.1 頂層設計
- 4.3.2 第二層設計
- 4.3.3 第三層設計
- 4.3.4 第四層設計
- 4.3.5 自底向上實現與單元測試
- 4.3.6 開發過程小結
- 4.4 Python 模塊*
- 4.4.1 模塊的創建和使用
- 4.4.2 Python 程序架構
- 4.4.3 標準庫模塊
- 4.4.4 模塊的有條件執行
- 4.5 練習
- 第 5 章 圖形編程
- 5.1 概述
- 5.1.1 計算可視化
- 5.1.2 圖形是復雜數據
- 5.1.3 用對象表示復雜數據
- 5.2 Tkinter 圖形編程
- 5.2.1 導入模塊及創建根窗口
- 5.2.2 創建畫布
- 5.2.3 在畫布上繪圖
- 5.2.4 圖形的事件處理
- 5.3 編程案例
- 5.3.1 統計圖表
- 5.3.2 計算機動畫
- 5.4 軟件的層次化設計:一個案例
- 5.4.1 層次化體系結構
- 5.4.2 案例:圖形庫 graphics
- 5.4.3 graphics 與面向對象
- 5.5 練習
- 第 6 章 大量數據的表示和處理
- 6.1 概述
- 6.2 有序的數據集合體
- 6.2.1 字符串
- 6.2.2 列表
- 6.2.3 元組
- 6.3 無序的數據集合體
- 6.3.1 集合
- 6.3.2 字典
- 6.4 文件
- 6.4.1 文件的基本概念
- 6.4.2 文件操作
- 6.4.3 編程案例:文本文件分析
- 6.4.4 緩沖
- 6.4.5 二進制文件與隨機存取*
- 6.5 幾種高級數據結構*
- 6.5.1 鏈表
- 6.5.2 堆棧
- 6.5.3 隊列
- 6.6 練習
- 第 7 章 面向對象思想與編程
- 7.1 數據與操作:兩種觀點
- 7.1.1 面向過程觀點
- 7.1.2 面向對象觀點
- 7.1.3 類是類型概念的發展
- 7.2 面向對象編程
- 7.2.1 類的定義
- 7.2.2 對象的創建
- 7.2.3 對象方法的調用
- 7.2.4 編程實例:模擬炮彈飛行
- 7.2.5 類與模塊化
- 7.2.6 對象的集合體
- 7.3 超類與子類*
- 7.3.1 繼承
- 7.3.2 覆寫
- 7.3.3 多態性
- 7.4 面向對象設計*
- 7.5 練習
- 第 8 章 圖形用戶界面
- 8.1 圖形用戶界面概述
- 8.1.1 程序的用戶界面
- 8.1.2 圖形界面的組成
- 8.1.3 事件驅動
- 8.2 GUI 編程
- 8.2.1 UI 編程概述
- 8.2.2 初識 Tkinter
- 8.2.3 常見 GUI 構件的用法
- 8.2.4 布局
- 8.2.5 對話框*
- 8.3 Tkinter 事件驅動編程
- 8.3.1 事件和事件對象
- 8.3.2 事件處理
- 8.4 模型-視圖設計方法
- 8.4.1 將 GUI 應用程序封裝成對象
- 8.4.2 模型與視圖
- 8.4.3 編程案例:匯率換算器
- 8.5 練習
- 第 9 章 模擬與并發
- 9.1 模擬
- 9.1.1 計算機建模
- 9.1.2 隨機問題的建模與模擬
- 9.1.3 編程案例:乒乓球比賽模擬
- 9.2 原型法
- 9.3 并行計算*
- 9.3.1 串行、并發與并行
- 9.3.2 進程與線程
- 9.3.3 多線程編程的應用
- 9.3.4 Python 多線程編程
- 9.3.5 小結
- 9.4 練習
- 第 10 章 算法設計和分析
- 10.1 枚舉法
- 10.2 遞歸
- 10.3 分治法
- 10.4 貪心法
- 10.5 算法分析
- 10.5.1 算法復雜度
- 10.5.2 算法分析實例
- 10.6 不可計算的問題
- 10.7 練習
- 第 11 章 計算+X
- 11.1 計算數學
- 11.2 生物信息學
- 11.3 計算物理學
- 11.4 計算化學
- 11.5 計算經濟學
- 11.6 練習
- 附錄
- 1 Python 異常處理參考
- 2 Tkinter 畫布方法
- 3 Tkinter 編程參考
- 3.1 構件屬性值的設置
- 3.2 構件的標準屬性
- 3.3 各種構件的屬性
- 3.4 對話框
- 3.5 事件
- 參考文獻