物理、模式、预测与 Python

引言

物理学是一门关于模式的学科:重复出现的观测被提炼成简洁的定律,而这些定律又通过预测来检验。Python 在这一工作流程中很有用,因为它让我们能够在符号推理、数值模拟、可视化和机器学习之间切换,而不必频繁更换工具。

这篇笔记勾勒了一张从物理思想到计算方法的实用地图。它不能替代教材,但可以为用代码学习物理提供一个结构:识别模型,写出数学对象,在精确计算不可行时选择近似方法,并用量纲、极限情形和已知例子来检查结果。

模式识别与机器学习

模式识别始于数据。在物理学中,数据可以是振子的时间序列、实验得到的谱、一组粒子轨迹,或来自某个模型的模拟样本。基本工作流程相当稳定:

  1. 定义可观测量及其单位。
  2. 清洗数据,同时不破坏信号。
  3. 选择模型类别。
  4. 在训练数据上拟合参数。
  5. 在留出数据或已知物理极限上验证。
  6. 检查残差和不确定性。

当输入到输出的映射很难显式写出时,机器学习可以提供帮助。例如,神经网络可以根据构型对物质相进行分类,近似势能面,或为昂贵的模拟学习一个替代模型。需要特别注意的是,一个成功的预测器并不自动等同于物理解释。物理模型还应当满足守恒律、对称性、量纲一致性和因果性等约束。

在 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 库。它适合将量子线路与优化或机器学习结合起来的实验。典型工作流程是:

  1. 选择设备或模拟器。
  2. 定义量子节点。
  3. 构建参数化线路。
  4. 计算期望值。
  5. 使用经典优化器优化参数。

始终在本地检查已安装版本和受支持设备,因为量子软件变化很快。

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 版本的兼容性。

对于任何领域软件包,实用规则都是一样的:在隔离环境中安装它,运行当前文档中的最小示例,并编写一个小型验证测试来检查某个已知结果。

Leave a Reply