2. 量子态与算符的Python表示

在量子动力学的数值仿真中,我们几乎不会直接操作抽象的狄拉克符号,而是把量子态和算符翻译成 NumPy 能够处理的数组。这一步翻译是否规范,直接决定了后续演化、测量和期望值计算能否正确进行。本节围绕三个核心对象展开:态矢(列向量)、密度矩阵(方阵)以及算符(方阵),并说明如何用 NumPy 构造泡利矩阵、升降算符,如何实现算符作用于态矢,最后用矩阵乘法验证对易关系。

一、态矢:用一维数组表示列向量

一个 n 维希尔伯特空间中的纯态可以写成基矢的线性组合。以二能级系统为例,取计算基 |0⟩ = [1, 0]ᵀ、|1⟩ = [0, 1]ᵀ,则任意纯态 |ψ⟩ = α|0⟩ + β|1⟩ 对应一个长度为 2 的复数列向量。NumPy 中一维数组默认没有“行/列”之分,因此约定:态矢一律用形状为 (n,) 的一维复数数组表示,并把它视为列向量。这个约定必须在整个项目中保持一致,否则矩阵乘法时会出现维度错位。

import numpy as np

# 计算基(约定为列向量)
ket0 = np.array([1, 0], dtype=complex)
ket1 = np.array([0, 1], dtype=complex)

# 叠加态 (|0> + i|1>)/sqrt(2)
psi = (ket0 + 1j * ket1) / np.sqrt(2)
print(psi)          # [0.707+0.j  0.+0.707j]
print(np.vdot(psi, psi))   # (1+0j),归一化检查

这里用 np.vdot 计算内积 ⟨ψ|ψ⟩,它会对第一个参数取复共轭,正好对应量子力学中左矢的定义。归一化检查的结果实部应接近 1、虚部接近 0,这是每次构造态矢后都应做的第一道校验。

二、密度矩阵:用二维数组表示混合态

纯态之外,温度、退相干或统计混合会带来混合态,此时用密度矩阵 ρ 描述。纯态对应 ρ = |ψ⟩⟨ψ|,是一个秩为 1 的厄米矩阵;混合态则是若干纯态按概率 pᵢ 的凸组合。NumPy 中用形状 (n, n) 的二维复数数组表示,并满足三个判据:厄米性 ρ = ρ†、迹为 1、半正定。

# 纯态的密度矩阵:外积 |psi><psi|
rho_pure = np.outer(psi, psi.conj())

# 混合态:以 0.7 概率处于 |0>,0.3 概率处于 |1>
rho_mix = 0.7 * np.outer(ket0, ket0.conj()) \
        + 0.3 * np.outer(ket1, ket1.conj())

print(np.trace(rho_mix).real)              # 1.0
print(np.allclose(rho_mix, rho_mix.conj().T))  # True,厄米
print(np.linalg.eigvalsh(rho_mix))         # [0.3 0.7],非负

注意 np.outer(psi, psi.conj()) 得到的是 |ψ⟩⟨ψ|,第二个因子必须取共轭,这是初学者最容易写错的地方。用 np.linalg.eigvalsh 求厄米矩阵的本征值,若出现负值就说明构造有误。

三、泡利矩阵与升降算符

二能级系统的算符都可以用泡利矩阵展开。按标准约定(σz 的本征值 +1 对应 |0⟩):

sx = np.array([[0, 1],  [1, 0]],  dtype=complex)
sy = np.array([[0, -1j],[1j, 0]], dtype=complex)
sz = np.array([[1, 0],  [0, -1]], dtype=complex)
I2 = np.eye(2, dtype=complex)

# 升降算符:sigma_+ = |0><1|,sigma_- = |1><0|
sigma_p = np.array([[0, 1], [0, 0]], dtype=complex)
sigma_m = np.array([[0, 0], [1, 0]], dtype=complex)

升降算符与泡利矩阵的关系是 σ± = (σx ± iσy)/2,可以顺手验证:np.allclose(sigma_p, (sx + 1j*sy)/2) 应返回 True。σ₊ 把 |1⟩ 抬到 |0⟩,σ₋ 把 |0⟩ 降到 |1⟩,作用在错误方向上结果为零向量,这一点在构造哈密顿量时非常关键。

四、算符作用于态矢与矩阵乘法

算符作用于态矢就是矩阵乘列向量,用 @ 运算符即可。算符作用于密度矩阵则是双侧乘法 AρA†。下面用 σx 作用在 |0⟩ 上,应得到 |1⟩:

out = sx @ ket0
print(out)                       # [0.+0.j 1.+0.j],即 |1>

# 算符作用在密度矩阵上(如演化或测量通道)
rho_out = sx @ rho_pure @ sx.conj().T

需要强调:不要用 np.dot 混用于一维数组与二维矩阵的场景,统一使用 @ 可读性最好,也避免形状歧义。若态矢被误存成形状 (2,1) 的二维列向量,sx @ psi 仍能算,但后续内积会变成矩阵而非标量,容易埋下隐患。

五、验证对易关系

对易子 [A, B] = AB − BA 是量子力学中判断两个可观测量能否同时确定的核心工具。泡利矩阵满足 [σx, σy] = 2iσz,反对易关系 {σx, σy} = 0。用 NumPy 验证只需几行:

def commutator(A, B):
    return A @ B - B @ A

def anticommutator(A, B):
    return A @ B + B @ A

print(np.allclose(commutator(sx, sy), 2j * sz))   # True
print(np.allclose(anticommutator(sx, sy), np.zeros((2,2))))  # True
print(np.allclose(commutator(sigma_m, sigma_p), -sz))  # True

浮点运算会带来 1e-16 量级的误差,因此判断相等必须用 np.allclose 而不是 ==。此外,[σ₋, σ₊] = −σz 这一结果说明升降算符不对易,这正是它们无法同时对角化的原因。

量子态与算符的 NumPy 表示关系 态矢 |ψ⟩ 形状 (n,) 一维复数数组 视为列向量 例:[0.707, 0.707j] 密度矩阵 ρ 形状 (n, n) 二维复数数组 ρ = ρ†,Tr ρ = 1,ρ ≥ 0 纯态:ρ = |ψ⟩⟨ψ| 混合态:Σ pᵢ|ψᵢ⟩⟨ψᵢ| 算符 A(方阵) 泡利矩阵 σx, σy, σz 升降算符 σ₊ = |0⟩⟨1|,σ₋ = |1⟩⟨0| 关系式 σ± = (σx ± iσy)/2 对易子 [A,B] = AB − BA [σx,σy] = 2iσz 算符作用于态矢 A @ |ψ⟩ → 新态矢 σx @ |0⟩ = |1⟩ σ₊ @ |1⟩ = |0⟩ 算符作用于密度矩阵 A ρ A† → 新密度矩阵 保持厄米性与迹为 1 用于演化与测量通道 作用 双侧乘 验证要点: 归一化 ⟨ψ|ψ⟩=1 | 厄米性 ρ=ρ† | 迹 Tr ρ=1 | 对易子 [σx,σy]=2iσz | 用 np.allclose 判等,容差 1e-8

六、一个可复用的校验流程

把上述检查固化成一个小函数,每次构造新态或新算符后调用,能显著减少调试时间。下面这份检查清单可直接用于本节及后续章节的代码:

检查项判据NumPy 写法
态矢归一化⟨ψ|ψ⟩ = 1np.isclose(np.vdot(psi, psi), 1)
密度矩阵厄米性ρ = ρ†np.allclose(rho, rho.conj().T)
密度矩阵迹Tr ρ = 1np.isclose(np.trace(rho), 1)
密度矩阵半正定本征值 ≥ 0np.all(np.linalg.eigvalsh(rho) > -1e-10)
算符厄米性A = A†(可观测量)np.allclose(A, A.conj().T)
对易关系[σx, σy] = 2iσznp.allclose(sx@sy - sy@sx, 2j*sz)
建议在项目里统一使用 dtype=complex 构造所有量子对象。若用整数数组构造泡利矩阵,sy 中的 1j 会触发类型提升,虽然结果正确,但混合类型在大型矩阵运算中会带来不必要的隐式转换开销。
常见错误:把 np.outer(psi, psi) 当作密度矩阵。缺少共轭会得到非厄米矩阵,迹虽然仍为 1,但本征值可能为复数,后续求期望值时会出现非实数的“能量”。务必写成 np.outer(psi, psi.conj())。

完成本节后,你应当能够独立地把任意二能级态写成 NumPy 数组,构造泡利矩阵与升降算符,正确执行算符对态矢和密度矩阵的作用,并用对易子验证算符代数关系。这套表示约定将贯穿后续的哈密顿量构造、时间演化与测量统计,是整门课程最基础的“数据层”。