## 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 的升高而呈指数形式下降的, 具体公式为
![](https://box.kancloud.cn/2016-02-22_56cafce99e0a3.png)
其中 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 事件
- 参考文献