统计物理 · 第六部分 选讲专题与总结 · 第 32 章

计算统计物理:蒙特卡罗方法与分子动力学

Computational Statistical Physics: Monte Carlo and Molecular Dynamics
已完成讲义更新于 2026.10.08统计物理讲义 v1.0
本章目标

(1) 理解为什么要用计算机"做实验",以及为什么必须用重要性抽样;(2) 推导梅特罗波利斯算法满足细致平衡,并用它模拟二维伊辛模型;(3) 理解统计误差、临界慢化与有限尺寸标度;(4) 推导分子动力学的韦尔莱算法,学会测量温度、压强、对关联函数与扩散系数;(5) 用热力学积分与粒子插入法计算自由能与化学势。

§32.1为什么需要计算机模拟

对相互作用系统,配分函数一般无法解析计算(第17、18章)。直接数值求和也不可能:10×1010\times10 的伊辛模型就有 2100≈10302^{100}\approx10^{30} 个组态;NN 个粒子的位形积分是 3N3N 维的积分,用每维只取 10 个点的网格也需要 103N10^{3N} 个点。解决办法是随机抽样:不去遍历所有组态,而是按照玻尔兹曼分布抽取有代表性的组态,用样本平均代替系综平均。这有两种方式:

  • 蒙特卡罗方法:构造一个随机过程,使它的平稳分布就是玻尔兹曼分布(梅特罗波利斯、罗森布鲁斯夫妇、特勒夫妇,1953);
  • 分子动力学:直接对牛顿方程作数值积分,按各态历经假设(§2.7)用时间平均代替系综平均(奥尔德与温赖特,1957)。

§32.2重要性抽样

要计算 ⟨A⟩=∑iAie−βEi/Z\langle A\rangle = \sum_iA_ie^{-\beta E_i}/Z。若均匀地随机选取组态,绝大多数被选中的组态能量很高、玻尔兹曼因子小得可以忽略,对平均几乎没有贡献——高维空间中,玻尔兹曼分布集中在相空间里一个极小的区域(§2.3.4、§4.4)。重要性抽样:直接按概率 Pi=e−βEi/ZP_i = e^{-\beta E_i}/Z 抽取 MM 个组态 i1,…,iMi_1,\dots,i_M,则

⟨A⟩≈Aˉ=1M∑k=1MAik(32.1)\langle A\rangle\approx\bar A = \frac1M\sum_{k=1}^MA_{i_k} \tag{32.1}

若样本相互独立,由中心极限定理(提示 C6),Aˉ\bar A 的统计误差为 Var(A)/M\sqrt{\mathrm{Var}(A)/M},按 M−1/2M^{-1/2} 减小,与系统的维数无关。困难在于:ZZ 未知,无法直接按 PiP_i 抽样。

§32.3梅特罗波利斯算法

思路:构造一个马尔可夫过程(§23.6),使它的跃迁速率满足细致平衡 (23.18):

W(i→j)W(j→i)=e−β(Ej−Ei)(32.2)\frac{W(i\to j)}{W(j\to i)} = e^{-\beta(E_j - E_i)} \tag{32.2}

由 §23.6,这样的过程从任何初态出发,分布都会趋向玻尔兹曼分布(只要过程是各态历经的:任何组态都能经过有限步到达任何其他组态)。注意 (32.2) 只涉及能量差,不需要知道 ZZ。

梅特罗波利斯规则:

  1. 从当前组态 ii 出发,提出一个试探组态 jj(例如翻转一个随机选取的自旋,或把一个随机选取的粒子移动一小段随机距离),提议是对称的:从 ii 提出 jj 的概率等于从 jj 提出 ii 的概率;
  2. 计算 ΔE=Ej−Ei\Delta E = E_j - E_i;
  3. 以概率 min⁡(1,e−βΔE)\min\left(1,e^{-\beta\Delta E}\right) 接受 jj,否则保留 ii(并把 ii 再计一次)。

验证细致平衡:设 Ej>EiE_j>E_i,则 W(i→j)∝e−β(Ej−Ei)W(i\to j)\propto e^{-\beta(E_j - E_i)},W(j→i)∝1W(j\to i)\propto1(提议概率相同,相消),两者之比正是 (32.2);Ej<EiE_j<E_i 时同理。

能量降低的步总被接受,能量升高的步以玻尔兹曼因子的概率被接受:系统主要在低能组态附近活动,又能借助热涨落越过势垒。

§32.4例:二维伊辛模型

对伊辛模型,翻转自旋 sis_i 的能量变化只依赖于它的近邻:ΔE=2Jsi∑j∈近邻sj\Delta E = 2Js_i\sum_{j\in\text{近邻}}s_j,在正方晶格上只能取 0,±4J,±8J0,\pm4J,\pm8J。把格点像棋盘一样分成两套,同一套中的自旋互不相邻,可以同时更新。下面是一个完整的 Python 程序(以 J=kB=1J = k_{\mathrm B} = 1 为单位,周期性边界):

Python
import numpy as np

def ising_mc(L, T, n_sweep=6000, n_therm=1500, seed=1):
    rng = np.random.default_rng(seed)
    s = np.ones((L, L), dtype=np.int8)               # 从全部向上出发
    i, j = np.indices((L, L))
    sublattices = [(i + j) % 2 == c for c in (0, 1)] # 棋盘的两套格点
    m_samples = []
    for sweep in range(n_sweep):
        for mask in sublattices:
            nb = (np.roll(s, 1, 0) + np.roll(s, -1, 0)
                  + np.roll(s, 1, 1) + np.roll(s, -1, 1))
            dE = 2 * s * nb                          # 翻转每个自旋的能量变化
            accept = rng.random((L, L)) < np.exp(-np.maximum(dE, 0) / T)
            s[mask & accept] *= -1                   # 梅特罗波利斯规则
        if sweep >= n_therm:                         # 先弃去趋向平衡的部分
            m_samples.append(abs(s.mean()))
    return np.mean(m_samples)

print(ising_mc(32, 2.0))   # 约 0.911

用这个程序得到的每个自旋平均磁化的绝对值 ⟨∣m∣⟩\langle\lvert m\rvert\rangle,与杨振宁的严格结果 (§18.6) 比较(kBTc/J=2.269k_{\mathrm B}T_{\mathrm c}/J = 2.269):

kBT/Jk_{\mathrm B}T/JL=16L = 16L=32L = 32L=64L = 64严格值(L=∞L = \infty)
2.00.910.910.910.911
2.20.770.780.790.785
2.30.640.570.420
2.50.370.210.100

远离 TcT_{\mathrm c} 时,即使很小的晶格也给出精确的结果;在 TcT_{\mathrm c} 附近与 TcT_{\mathrm c} 以上,有限尺寸效应很明显:有限的系统中没有真正的相变(§21.4),⟨∣m∣⟩\langle\lvert m\rvert\rangle 随 LL 增大才缓慢地趋于零。§32.5 将说明如何利用这种尺寸依赖。

∣m∣\lvert m\rvert,最近 300 次扫描严格解(L=∞L = \infty,h=0h = 0)
∣m∣\lvert m\rvert
扫描次数\text{扫描次数}
⟨∣m∣⟩\langle\lvert m\rvert\rangle
—
E/NJE/NJ
—
扫描次数\text{扫描次数}
—
图 32.1二维伊辛模型的梅特罗波利斯模拟:96×9696\times96 的正方晶格,周期性边界,棋盘式更新,与上面的程序相同(多了一个外场)。深色格点自旋向上。把温度调到 kBTc/J=2.269k_{\mathrm B}T_{\mathrm c}/J = 2.269 附近,可以看到各种大小的畴和明显变慢的弛豫(§32.5)。

§32.5统计误差、临界慢化与有限尺寸标度

关联时间。马尔可夫链中相继的样本不是独立的:每一步只改变一个或几个自旋。若某个量的自关联函数(§22.4,以"扫描"即每个自旋平均被尝试一次为时间单位)的积分关联时间为 τ\tau,则 MM 次扫描中大约只有 M/(2τ)M/(2\tau) 个独立样本,统计误差相应地增大。

临界慢化。在临界点附近,关联长度 ξ\xi 很大,局域的单自旋翻转要改变大小为 ξ\xi 的区域需要很多步:τ∝ξz\tau\propto\xi^z,在 TcT_{\mathrm c} 处 τ∝Lz\tau\propto L^z。对二维伊辛模型的梅特罗波利斯算法,z≈2.17z\approx2.17。斯文森–王(1987)与沃尔夫(1989)的集团算法一次翻转一整团相互关联的自旋(集团的选取规则保证细致平衡),把 zz 降低到 0.3 以下,使临界点附近的模拟效率提高了许多个数量级。

有限尺寸标度。有限系统中 ξ\xi 不能超过 LL。由 χ∝∣t∣−γ∝ξγ/ν\chi\propto\lvert t\rvert^{-\gamma}\propto\xi^{\gamma/\nu},在尺寸为 LL 的系统中可以写成标度形式

χ(t,L)=Lγ/ν Φ(L1/νt)(32.3)\chi(t,L) = L^{\gamma/\nu}\,\Phi\left(L^{1/\nu}t\right) \tag{32.3}

(当 L≫ξL\gg\xi 时 Φ(x)∝∣x∣−γ\Phi(x)\propto\lvert x\rvert^{-\gamma},回到无限系统的结果;当 ξ≫L\xi\gg L 时 χ\chi 被截断在 Lγ/νL^{\gamma/\nu}。)由此:χ\chi 的峰高 ∝Lγ/ν\propto L^{\gamma/\nu}(二维伊辛模型为 L7/4L^{7/4});峰的位置偏离 TcT_{\mathrm c} 的距离 ∝L−1/ν\propto L^{-1/\nu};把不同 LL 的数据画成 χL−γ/ν\chi L^{-\gamma/\nu} 对 L1/νtL^{1/\nu}t,应落在同一条曲线上。宾德累积量 UL=1−⟨m4⟩3⟨m2⟩2U_L = 1 - \frac{\langle m^4\rangle}{3\langle m^2\rangle^2} 是一个无量纲的量,在 TcT_{\mathrm c} 处与 LL 无关,所以不同 LL 的 UL(T)U_L(T) 曲线交于一点,给出 TcT_{\mathrm c} 的精确估计。今天三维伊辛模型最精确的临界温度,以及精度仅次于共形自举(§20.5)的临界指数,大多来自这类有限尺寸标度分析。

§32.6分子动力学

韦尔莱算法。对每个粒子的牛顿方程 mr¨=F(r)m\ddot{\mathbf r} = \mathbf F(\mathbf r) 作数值积分。把 r(t±Δt)\mathbf r(t\pm\Delta t) 泰勒展开(提示 A3):r(t±Δt)=r±vΔt+12aΔt2±16\dddotrΔt3+O(Δt4)\mathbf r(t\pm\Delta t) = \mathbf r\pm\mathbf v\Delta t + \frac12\mathbf a\Delta t^2\pm\frac16\dddot{\mathbf r}\Delta t^3 + O(\Delta t^4),两式相加,奇次项相消:

r(t+Δt)=2r(t)−r(t−Δt)+F(t)mΔt2+O(Δt4)(32.4)\mathbf r(t + \Delta t) = 2\mathbf r(t) - \mathbf r(t - \Delta t) + \frac{\mathbf F(t)}{m}\Delta t^2 + O(\Delta t^4) \tag{32.4}

(韦尔莱,1967。)等价的"速度韦尔莱"形式为:r(t+Δt)=r+vΔt+F(t)2mΔt2\mathbf r(t + \Delta t) = \mathbf r + \mathbf v\Delta t + \frac{\mathbf F(t)}{2m}\Delta t^2,v(t+Δt)=v+F(t)+F(t+Δt)2mΔt\mathbf v(t + \Delta t) = \mathbf v + \frac{\mathbf F(t) + \mathbf F(t + \Delta t)}{2m}\Delta t。这个算法是时间可逆的(把 Δt\Delta t 换成 −Δt-\Delta t 就沿原路返回,与 §P1.2 一致),并且是一种"辛"积分方法:像真实的哈密顿演化一样保持相空间的几何结构(其中包括相空间体积,刘维尔定理,§2.6)。正因为如此,总能量的误差在长时间内只是有界地振荡而不会系统地漂移,这对长时间模拟至关重要。时间步长通常取最快振动周期的约 1/20:对伦纳德–琼斯氩约 10 fs,对含 C–H 键的分子约 1 fs。

测量(周期性边界条件下的 NN 个粒子):

  • 温度:由均分定理,32NkBT=⟨K⟩\frac32Nk_{\mathrm B}T = \langle K\rangle(KK 为总动能);
  • 压强:由 (17.16) 的推导推广到一般的力,p=nkBT+13V⟨∑i<jrij⋅Fij⟩p = nk_{\mathrm B}T + \frac{1}{3V}\left\langle\sum_{i<j}\mathbf r_{ij}\cdot\mathbf F_{ij}\right\rangle;
  • 对关联函数 g(r)g(r):统计粒子对的距离直方图(§17.7),再傅里叶变换得到 S(k)S(k)(§22.3),可以与衍射实验直接比较;
  • 扩散系数:由均方位移 ⟨∣r(t)−r(0)∣2⟩→6Dt\langle\lvert\mathbf r(t) - \mathbf r(0)\rvert^2\rangle\to6Dt,或由格林–久保公式 (23.9);黏度、热导率同样可以用格林–久保公式(§24.7)由平衡模拟算出。

恒温。上述算法保持能量守恒,抽样的是微正则系综。要模拟恒定温度,可以给每个粒子加上朗之万方程中的摩擦与随机力,两者的比例由 (23.6) 确定,这样就抽样正则系综(朗之万恒温器);也可以用确定性的诺泽–胡佛方法。

一个历史上的发现。奥尔德与温赖特(1957)以及伍德与雅各布森(1957)的模拟发现:只有排斥、没有任何吸引的硬球,在足够高的密度下也会结晶。有序的晶体反而比无序的流体熵更高——在高密度下,排列整齐的球各自有更大的"活动空间"。这个纯粹由熵驱动的相变在当时出人意料,后来在胶体悬浮液中被实验证实。

§32.7自由能的计算

自由能与熵不是某个量的系综平均,不能直接从样本平均得到,需要专门的方法。

热力学积分。设哈密顿量依赖于参数 λ\lambda(例如从理想气体 λ=0\lambda = 0 逐渐"打开"相互作用到 λ=1\lambda = 1)。由 F=−kBTln⁡ZF = -k_{\mathrm B}T\ln Z,∂F∂λ=−kBTZ∂Z∂λ=1Z∑∂H∂λe−βH\frac{\partial F}{\partial\lambda} = -\frac{k_{\mathrm B}T}{Z}\frac{\partial Z}{\partial\lambda} = \frac1Z\sum\frac{\partial\mathcal H}{\partial\lambda}e^{-\beta\mathcal H},即

F(1)−F(0)=∫01⟨∂H∂λ⟩λdλ(32.5)F(1) - F(0) = \int_0^1\left\langle\frac{\partial\mathcal H}{\partial\lambda}\right\rangle_\lambda d\lambda \tag{32.5}

在若干个 λ\lambda 值上做平衡模拟,测量 ⟨∂H/∂λ⟩λ\langle\partial\mathcal H/\partial\lambda\rangle_\lambda,再数值积分。

维多姆粒子插入法。化学势 μ=F(N+1)−F(N)=−kBTln⁡(ZN+1/ZN)\mu = F(N+1) - F(N) = -k_{\mathrm B}T\ln(Z_{N+1}/Z_N)。由 (17.2),ZN+1ZN=QN+1(N+1)λ3QN\frac{Z_{N+1}}{Z_N} = \frac{Q_{N+1}}{(N+1)\lambda^3Q_N};而 QN+1/QN=V⟨e−βΔU⟩NQ_{N+1}/Q_N = V\langle e^{-\beta\Delta U}\rangle_N,其中 ΔU\Delta U 是在 NN 粒子系统中随机位置插入一个"试验粒子"时它与其他粒子的相互作用能,平均对 NN 粒子的平衡组态与插入位置进行。于是

μ=kBTln⁡(N+1)λ3V⏟理想气体部分 − kBTln⁡⟨e−βΔU⟩N⏟剩余部分(32.6)\mu = \underbrace{k_{\mathrm B}T\ln\frac{(N+1)\lambda^3}{V}}_{\text{理想气体部分}}\ \underbrace{-\ k_{\mathrm B}T\ln\left\langle e^{-\beta\Delta U}\right\rangle_N}_{\text{剩余部分}} \tag{32.6}

第一项就是 (3.17)。对稠密液体,随机插入的粒子几乎总与别的粒子重叠,e−βΔU≈0e^{-\beta\Delta U}\approx0,这个方法就失效了,需要更复杂的技巧。远离平衡的拉伸实验与模拟中,还可以用雅津斯基等式(§33.4)由非平衡功的分布求出平衡自由能差。

§32.8本章小结

  1. 高维的系综平均必须用重要性抽样;统计误差按样本数的 −1/2-1/2 次方减小。
  2. 梅特罗波利斯算法用满足细致平衡的马尔可夫链抽取玻尔兹曼分布,只需要能量差。
  3. 临界点附近有临界慢化 τ∝Lz\tau\propto L^z,集团算法可以克服它;有限尺寸标度把尺寸效应变成测量临界指数的工具。
  4. 分子动力学用时间可逆、保持相空间体积的韦尔莱算法积分牛顿方程;输运系数可以由平衡模拟的格林–久保公式求出。
  5. 自由能需要专门的方法:热力学积分、粒子插入法、非平衡功的等式。

自测题

  1. 证明:若梅特罗波利斯算法的提议不对称(从 ii 提出 jj 的概率 qij≠qjiq_{ij}\ne q_{ji}),把接受概率改为 min⁡(1,qjiqije−βΔE)\min\left(1,\frac{q_{ji}}{q_{ij}}e^{-\beta\Delta E}\right) 仍满足细致平衡(梅特罗波利斯–黑斯廷斯算法)。
  2. 修改 §32.4 的程序,计算每个自旋的磁化率 χ=βN(⟨m2⟩−⟨∣m∣⟩2)\chi = \beta N(\langle m^2\rangle - \langle\lvert m\rvert\rangle^2),对 L=16L = 16、3232 找出峰的位置与高度,并检验峰高之比是否接近 27/4≈3.42^{7/4}\approx3.4。
  3. 用速度韦尔莱算法积分一维谐振子(ω=1\omega = 1),取 Δt=0.1\Delta t = 0.1,验证能量误差不随时间累积;再用简单的欧拉法 (x,v)←(x+vΔt, v−xΔt)(x,v)\leftarrow(x + v\Delta t,\ v - x\Delta t)(同时更新,右边都用旧值)比较。[答:欧拉法的能量每步乘以 1+Δt21 + \Delta t^2,不断增长;若先更新 xx、再用新的 xx 更新 vv,就成为"辛欧拉法",能量误差有界]
  4. 由 (32.5) 证明:若 H(λ)\mathcal H(\lambda) 是 λ\lambda 的线性函数,则 F(λ)F(\lambda) 是 λ\lambda 的凹函数。[提示:计算 ∂2F/∂λ2=−β(⟨(∂λH)2⟩−⟨∂λH⟩2)≤0\partial^2F/\partial\lambda^2 = -\beta\left(\langle(\partial_\lambda\mathcal H)^2\rangle - \langle\partial_\lambda\mathcal H\rangle^2\right)\le0]