引言
物理学是一门关于模式的学科:重复出现的观测被提炼成简洁的定律,而这些定律又通过预测来检验。Python 在这一工作流程中很有用,因为它让我们能够在符号推理、数值模拟、可视化和机器学习之间切换,而不必频繁更换工具。
这篇笔记勾勒了一张从物理思想到计算方法的实用地图。它不能替代教材,但可以为用代码学习物理提供一个结构:识别模型,写出数学对象,在精确计算不可行时选择近似方法,并用量纲、极限情形和已知例子来检查结果。
模式识别与机器学习
模式识别始于数据。在物理学中,数据可以是振子的时间序列、实验得到的谱、一组粒子轨迹,或来自某个模型的模拟样本。基本工作流程相当稳定:
- 定义可观测量及其单位。
- 清洗数据,同时不破坏信号。
- 选择模型类别。
- 在训练数据上拟合参数。
- 在留出数据或已知物理极限上验证。
- 检查残差和不确定性。
当输入到输出的映射很难显式写出时,机器学习可以提供帮助。例如,神经网络可以根据构型对物质相进行分类,近似势能面,或为昂贵的模拟学习一个替代模型。需要特别注意的是,一个成功的预测器并不自动等同于物理解释。物理模型还应当满足守恒律、对称性、量纲一致性和因果性等约束。
在 Python 中,一个最小的可复现检查是将物理模型与拟合代码分离:
import numpy as np
from sklearn.linear_model import LinearRegression
# Example: y = a x + b with noisy observations.
rng = np.random.default_rng(42)
x = np.linspace(0, 10, 100)
y = 2.5 * x - 1.0 + rng.normal(scale=0.8, size=x.shape)
model = LinearRegression()
model.fit(x.reshape(-1, 1), y)
print(model.coef_[0], model.intercept_)
在相信结果之前,要检查拟合参数是否具有预期的量纲,以及残差是否呈现结构。如果残差带有模式,说明模型遗漏了物理内容。
经典物理
经典物理是自然的起点,因为许多系统都可以用位置、速度、力、场和能量来描述。牛顿力学给出了熟悉的方程
F = m a
对于位置为 x(t) 的系统,计算问题通常会变成求解常微分方程。对于阻尼振子,
m x'' + c x' + k x = 0
我们可以将其改写为一阶方程组,从而对系统进行数值积分:
import numpy as np
from scipy.integrate import solve_ivp
m = 1.0
c = 0.2
k = 4.0
def oscillator(t, state):
x, v = state
dxdt = v
dvdt = -(c / m) * v - (k / m) * x
return [dxdt, dvdt]
solution = solve_ivp(
oscillator,
t_span=(0.0, 20.0),
y0=[1.0, 0.0],
max_step=0.05,
)
print(solution.t.shape, solution.y.shape)
同样的模式也出现在电磁学、流体动力学和连续介质力学中:写出控制方程,选择边界条件和初始条件,选定数值方法,并在可能的情况下验证守恒性或稳定性。
有用的检查包括:
- 在
c = 0的极限下,振子应当守恒能量。 - 更小的时间步长不应从根本上改变结果。
- 参数应具有一致的单位。
- 不应将数值伪影误认为物理效应。
量子力学与量子计算
量子力学用态、算符、振幅和测量概率取代确定性的轨迹。纯态由向量 |psi> 表示,可观测量由算符表示。薛定谔方程描述时间演化:
i hbar d|psi>/dt = H |psi>
对于有限维系统,哈密顿量 H 可以表示为矩阵。二能级系统是最简单且有用的例子:
import numpy as np
from scipy.linalg import expm
hbar = 1.0
sigma_x = np.array([[0, 1], [1, 0]], dtype=complex)
H = 0.5 * sigma_x
psi0 = np.array([1, 0], dtype=complex)
def evolve(t):
U = expm(-1j * H * t / hbar)
return U @ psi0
psi_t = evolve(np.pi)
probabilities = np.abs(psi_t) ** 2
print(probabilities)
量子计算将受控的量子演化作为一种计算资源。量子比特是一个二能级量子系统,量子门是幺正操作。实际问题通常包括:
- 态是如何制备的?
- 应用了哪些幺正操作?
- 执行了什么测量?
- 需要多少样本来估计结果?
- 相关的噪声模型是什么?
使用量子计算库时,要在本地确认已安装的版本,并阅读当前文档,因为 API 和受支持的设备会随时间变化。
相对论与张量
相对论建立在能够在坐标系之间一致变换的对象之上。张量提供了描述这种对象的语言。在广义相对论中,时空曲率通过爱因斯坦场方程与能量和动量联系起来:
(1) 
这里 g 是度规张量,R 是曲率,T 是应力-能量张量,G 是牛顿引力常数。这个方程形式紧凑,但求解通常需要对称性假设、近似方法或数值相对论。
张量记号用于追踪分量如何变换。例如:
(2) 
一种实用的计算习惯,是将抽象对象与其坐标表示分开。例如,在处理度规张量时,要检查:
- 正在使用的坐标图。
- 度规符号约定。
- 指标是协变还是逆变。
- 是否将
c等常数设为1。 - 单位采用几何化单位还是 SI 单位。
张量软件包可以自动化指标操作,但它们并不能替代对约定的理解。
宇宙学与天体物理
宇宙学将广义相对论、热力学、核物理和统计推断应用于整个宇宙。标准的大尺度模型假设均匀性和各向同性,由此得到弗里德曼-勒梅特-罗伯逊-沃克度规和弗里德曼方程。
天体物理跨越广泛的尺度:恒星结构、致密天体、星系、引力波和宇宙背景辐射。Python 常用于单位处理、坐标变换、星表处理、拟合和可视化。
一个持久有用的计算习惯,是让单位显式化。例如使用 astropy:
from astropy import units as u
from astropy.constants import G, M_sun
mass = 1.0 * M_sun
radius = 6.96e8 * u.m
escape_velocity = (2 * G * mass / radius) ** 0.5
print(escape_velocity.to(u.km / u.s))
这种风格可以避免许多静默错误。一个数值看起来可能很合理,但它的单位却是错的。
统计力学
统计力学将微观状态与温度、熵、压强和自由能等宏观量联系起来。核心对象通常是配分函数:
Z = sum_i exp(-beta E_i)
其中 beta = 1 / (k_B T)。一旦知道 Z,就可以从中推导热力学量。对于小系统,可以直接计算这个求和:
import numpy as np
k_B = 1.0
T = 2.0
beta = 1.0 / (k_B * T)
energies = np.array([0.0, 1.0, 2.0, 4.0])
weights = np.exp(-beta * energies)
Z = weights.sum()
probabilities = weights / Z
mean_energy = np.sum(probabilities * energies)
print(Z, probabilities, mean_energy)
对于大系统,直接枚举会变得不可能。这时会使用蒙特卡洛方法、分子动力学和近似技术。和往常一样,数值结果应当根据极限情形进行检查:高温、低温、小系统尺寸,或可解析求解的模型。
使用 Python 实现
Python 很有用,因为它的生态系统覆盖了物理工作的多个层次:
NumPy用于数组和线性代数。SciPy用于积分、优化、稀疏矩阵和特殊函数。Matplotlib用于绘图。SymPy用于符号数学。scikit-learn用于标准机器学习流程。- 面向量子力学、相对论、天体物理和热力学的领域库。
一个可靠的环境始于隔离的虚拟环境和明确的依赖:
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install numpy scipy matplotlib sympy scikit-learn
然后在本地验证版本:
python - <<'PY'
import numpy, scipy, sympy
print('numpy', numpy.__version__)
print('scipy', scipy.__version__)
print('sympy', sympy.__version__)
PY
PennyLane
PennyLane 是一个用于可微量子编程的 Python 库。它适合将量子线路与优化或机器学习结合起来的实验。典型工作流程是:
- 选择设备或模拟器。
- 定义量子节点。
- 构建参数化线路。
- 计算期望值。
- 使用经典优化器优化参数。
始终在本地检查已安装版本和受支持设备,因为量子软件变化很快。
SymPy
当数学表达式与数值结果同样重要时,SymPy 很有用。它可以化简表达式、进行符号微分、求解方程,并生成数值函数。
import sympy as sp
x, k, m = sp.symbols('x k m', positive=True)
V = sp.Rational(1, 2) * k * x**2
force = -sp.diff(V, x)
print(force)
在投入数值实现之前,符号计算尤其有助于推导方程。
QuTiP、einsteinpy、astropy、thermopy
QuTiP 用于量子动力学和开放量子系统。当密度矩阵、主方程和量子算符是核心时,它很有用。
einsteinpy 专注于相对论计算,例如测地线、度规和符号张量操作。
astropy 是一个成熟的天文学与天体物理库,尤其适用于单位、坐标、常数、时间和数据格式。
thermopy 用于热力学计算。在项目中依赖它之前,要确认它当前的维护状态以及与你的 Python 版本的兼容性。
对于任何领域软件包,实用规则都是一样的:在隔离环境中安装它,运行当前文档中的最小示例,并编写一个小型验证测试来检查某个已知结果。
