Skip to content

WARNING

🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。

量子模拟 — demo.py 代码详解

Download demo.py

运行方式

bash
cd docs/quantum/simulation/code
python demo.py

CPU、NumPy。两自旋横场 Ising,比精确 eiHT 与一阶 Trotter。一张图 trotter_error.png(对数轴:步数↑,失真度↓)。希尔伯特空间只有 4 维,对角化是精确答案不是近似。

代码逐段详解

第1步:把 H 拆成可对角的两块

H=A+B,A=JZZ,B=h(XI+IX)
python
ZZ = np.kron(Z, Z)
XI = np.kron(X, I2)
IX = np.kron(I2, X)
A = J * ZZ
B = h * (XI + IX)
Htot = A + B

J=1h=0.7、总时间 T=1.2A 在计算基对角(ZZ 本征值 ±1);BX 基对角。分开指数化比直接对 H 做 Trotter 更便宜——这正是数字模拟要把哈密顿量劈开的原因。

np.kron 顺序与两比特计算基 |00⟩…|11⟩ 一致。


第2步:expm_herm — 厄米矩阵的 eiMt

M=Vdiag(λ)VeiMt=Vdiag(eiλt)V
python
w, v = np.linalg.eigh(m)
return v @ np.diag(np.exp(-1j * w * t)) @ v.conj().T
  • eigh:专供厄米,特征值实。不要用通用 eig(可能出复本征值噪声)。
  • -1j * w * t:Schrödinger 演化 eiHt。漏掉负号会变成时间反演。
  • v.conj().T:本征矢矩阵的 dagger。eighv 列是本征矢。

精确解:u_exact = expm_herm(Htot, T),一次对角化 A+B


第3步:一阶 Trotter

ei(A+B)t(eiBΔteiAΔt)n,Δt=t/n
python
def trotter(n_steps, t=T):
    dt = t / n_steps
    u = np.eye(4, dtype=complex)
    ua, ub = expm_herm(A, dt), expm_herm(B, dt)
    for _ in range(n_steps):
        u = ub @ ua @ u
    return u
  • 先算一次 ua, ub:每步同一 Δt,不必在循环里对角化。
  • u = ub @ ua @ u:右乘旧 U,即「再作用一层 eiAΔteiBΔt」。次序 B 在左、A 在右,对应公式里 eiBdteiAdt
  • np.eye(4):从恒等开始。for _ in range(n_steps):循环变量不用。

一阶误差理论上 O(t2/n)[A,B]0)。n 加倍,失真应大致按幂律下降。


第4步:失真度 1|ψex|ψtr|2

python
psi0 = np.array([1, 0, 0, 0], dtype=complex)  # |00⟩
psi_exact = u_exact @ psi0
infid.append(1.0 - np.abs(np.vdot(psi_exact, psi)) ** 2)
ax.loglog(steps, infid, 'o-')
  • vdot:共轭点积 ψexψtr。普通 dot 对复数不共轭,会错。
  • loglog:横纵都对数。步数 1,2,4,…,32 在对数轴上均匀。应看到近似直线往下。
  • 终端 zip(steps.tolist(), np.round(infid, 6)) 打印对照表。

steps = np.array([1, 2, 4, 8, 16, 32])trotter(int(n))loglog 要求正数;步数取 2 的幂,横坐标等间距。int(n) 因为数组元素可能是 np.int32range 要 Python int(多数 NumPy 版本其实也能用,写成 int 更明确)。

初态 [1,0,0,0]|00,不是 Bell、不是叠加。横场 B 会立刻把自旋打出计算基,所以即使用 1 步 Trotter,终态也已经「动过」——误差比「B=0AH 对易、任意 n 都精确」更可见。

没有随机电路、没有量子硬件噪声:误差纯粹来自 Trotter 劈裂。np.random.seed(42) 在本文件没有用到抽样。


关键概念速查表

概念数学 / 直觉代码
A=JZZ对角相互作用J * kron(Z,Z)
B=h(XI+IX)横场h * (XI+IX)
eigh厄米对角化expm_herm
eiMtexp(-1j*w*t)对角相位
Trotter(eiBdteiAdt)nub @ ua @ u
Δt=T/n步数越多刀越薄t / n_steps
失真度$1-|\langle\mathrm\mathrm{tr}\rangle|^2$
loglog看幂律trotter_error.png
vdot复数内积不要用 dot

源码位置

clone 后打开(相对仓库根目录):

docs/quantum/simulation/code/demo.py