1. 课程导入与计算物理全景
计算物理并不是“用电脑算物理题”这么简单的一句话。它和理论物理、实验物理并列,构成现代物理研究的第三种范式:理论给出方程与约束,实验给出可观测数据,而计算则负责在两者之间架起桥梁——当解析解不存在、实验代价过高或参数空间过大时,用数值方法把物理模型变成可执行的算法,再通过计算机得到可分析、可验证的结果。本课程的目标,是让你从“会写 Python”走到“能用 Python 完成一次可信的物理建模与仿真”。
计算物理解决什么问题
典型的计算物理问题大致可以分为几类。第一类是求解微分方程,例如用欧拉法或四阶龙格–库塔法模拟抛体运动、简谐振子、行星轨道;第二类是线性代数与特征值问题,例如求解一维薛定谔方程的能级、分析耦合振子的简正模;第三类是随机过程与统计物理,例如蒙特卡罗方法估算圆周率、伊辛模型的相变模拟;第四类是数据处理与参数拟合,例如从实验数据中拟合衰减常数、用最小二乘法估计模型参数。这些问题有一个共同点:物理模型明确,但解析求解困难,必须借助数值手段。
需要强调的是,计算物理的结果不是“绝对真理”。数值方法本身会引入截断误差和舍入误差,离散化步长、迭代次数、随机种子都会影响结果。因此,一个合格的计算物理工作者必须同时关注三件事:模型是否正确、算法是否稳定、结果是否收敛。这也是本课程反复强调“验证”的原因。
Python 在科学计算中的角色
Python 之所以成为科学计算的主流语言,核心在于它的生态。NumPy 提供高效的多维数组和向量化运算,把原本需要循环的运算交给底层 C 实现;Matplotlib 负责把数据变成可读的图表;SciPy 则封装了大量成熟的数值算法,包括积分、插值、优化、常微分方程求解和稀疏矩阵运算。对于物理建模来说,这意味着你不需要从零实现龙格–库塔法或快速傅里叶变换,而可以把精力放在物理模型本身。
但也要清醒地认识到 Python 的边界:纯 Python 循环速度较慢,涉及大规模迭代时应尽量向量化,或借助 Numba、Cython 等工具加速。本课程前期以 NumPy 向量化和 SciPy 现成求解器为主,避免过早陷入性能优化。
建模与仿真的基本流程
一次完整的计算物理实践通常遵循这样的路径:先明确物理对象与假设,写出控制方程;再选择合适的数值方法并离散化;接着编写代码实现,设定初始条件与边界条件;然后运行程序、观察中间量是否合理;最后对结果做收敛性检验和物理合理性判断。这个流程不是线性的,往往需要回到模型或算法环节反复修正。
上图把这一闭环画了出来:从物理假设出发,经过离散化、编码、运行观察,再进入收敛性与物理合理性两道检验;若检验不通过,就回到离散化或模型环节修正。注意图中“收敛性检验”和“物理合理性判断”是两条独立的关卡,前者关心数值是否稳定,后者关心结果是否还有物理意义。
课程项目总览
本课程围绕一条主线展开:从简单的一维运动开始,逐步过渡到振子、轨道、波动、量子本征值和统计模型。每个阶段都会产出一个可运行的小项目,例如“带空气阻力的抛体轨迹”“阻尼受迫振子的共振曲线”“一维无限深势阱的能级与波函数”。这些项目规模不大,但都要求完成“建模—实现—验证”的完整闭环,而不是只跑出一张图。
环境准备与验证
开始之前,请确保本机已安装 Python 3.10 或更高版本,并安装 NumPy、Matplotlib、SciPy 三个核心库。推荐使用虚拟环境隔离依赖:
python -m venv physenv
# Windows
physenv\Scripts\activate
# macOS / Linux
source physenv/bin/activate
pip install numpy matplotlib scipy
安装完成后,不要只看“安装成功”的提示,而要用一段最小脚本验证各库确实可用、版本正确、绘图后端正常。下面这段代码同时检查版本、做一次数组运算、解一个简单方程并保存一张图:
import numpy as np
import scipy
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
print("numpy", np.__version__)
print("scipy", scipy.__version__)
print("matplotlib", matplotlib.__version__)
x = np.linspace(0, 2*np.pi, 200)
y = np.sin(x)
print("sin 最大值:", y.max()) # 应接近 1.0
from scipy.integrate import solve_ivp
sol = solve_ivp(lambda t, s: [s[1], -s[0]], [0, 10], [1.0, 0.0], t_eval=np.linspace(0, 10, 100))
print("末端状态:", sol.y[:, -1]) # 简谐振子,应接近 [cos10, -sin10]
plt.plot(x, y)
plt.savefig("check.png", dpi=100)
print("图像已保存")
判断环境是否就绪,可以看三个信号:版本号正常打印;sin 最大值在 1.0 附近(浮点误差范围内);solve_ivp 返回的末端状态与解析解 cos(10)≈−0.839、−sin(10)≈0.544 接近。若绘图报错,多半是后端问题,在无图形界面的环境中使用 Agg 后端即可。上述数值为教学示例的预期量级,实际运行会因浮点误差有微小差异。
check_env.py,以后每次换机器或升级库后先跑一遍,能快速排除“代码没错但环境坏了”的干扰。到这里,你已经具备了开始建模的基本条件:一个可复现的 Python 环境、一套数值工具链,以及一个明确的判断标准——结果不仅要能算出来,还要经得起收敛性和物理合理性的检验。接下来的章节,我们就从最简单的运动学模型开始,把这条闭环真正跑起来。