1. 课程导入与实验环境搭建

贝尔不等式是量子力学基础中最具“判决性”的命题之一。1964年,约翰·贝尔提出:如果自然界可以由一类满足“局域性”与“实在性”的隐变量理论描述,那么两个纠缠粒子在不同测量方向上的关联程度必须服从某个上限;而量子力学预言的关联可以突破这个上限。此后,Clauser、Horne、Shimony、Holt 将其改造为可在实验室检验的 CHSH 形式,把抽象的哲学争论转化为一个可测量、可统计、可判定的数值比较问题。

本课程的目标不是复述哲学争论,而是把贝尔不等式当作一个可编程、可仿真、可分析的物理实验对象:我们会用 Python 构造量子态、计算关联函数、统计测量结果、估计 CHSH 量 S,并讨论在有限采样、噪声与测量误差下如何判断“是否违背不等式”。学习路径大致分为三段:先建立数学与物理图像(量子态、测量算符、关联函数),再搭建数值实验工具链(NumPy、SciPy、Matplotlib、QuTiP),最后进入实验设计与数据分析(采样统计、误差棒、显著性判断、噪声鲁棒性)。本节完成第一步中的环境准备,并跑通第一个量子态模拟示例。

为什么需要“算”而不是只“读”

贝尔不等式的核心是一个不等式:|S| ≤ 2(CHSH 形式,局域隐变量上限)。量子力学对最大纠缠态在最优测量方向下给出 S = 2√2 ≈ 2.828。这个差距看似只有 0.828,但它不是靠单次测量能看出来的——单次测量只能得到 ±1 的结果,必须通过大量重复实验统计出关联期望值 E(a,b),再组合成 S = E(a,b) − E(a,b′) + E(a′,b) + E(a′,b′)。因此,实验验证本质上是一个统计估计问题:样本量、测量方向精度、态制备保真度都会影响最终 S 的估计值。用代码把这条链路走一遍,才能真正理解“违背”意味着什么、需要多少数据、误差有多大。

从量子态到 CHSH 判定的实验链路 ① 态制备 |Φ⁺⟩ = (|00⟩+|11⟩)/√2 QuTiP: tensor(bell, bell) 维度 4×4 密度矩阵 ρ ② 测量方向 a=0°, a′=45° b=22.5°, b′=67.5° 算符 A=cosθ·σz+sinθ·σx ③ 关联期望值 E(a,b)=Tr[ρ·A⊗B] 理论值 −cos(θa−θb) 四个组合 E₁…E₄ ④ CHSH 量 S=E₁−E₂+E₃+E₄ 量子上限 2√2≈2.828 局域上限 2 有限采样统计(实验视角) 按概率 p(±1,±1) 抽样 N 次 → 估计 Ê(a,b) 统计误差 ≈ 1/√N,N=10000 时约 0.01 量级 判断:Ŝ 与 2 的差距是否显著大于误差 判定逻辑:Ŝ ≤ 2 → 与局域隐变量一致;Ŝ > 2 且超出统计误差 → 违背贝尔不等式 理想纠缠态 + 最优角度 → Ŝ ≈ 2.828;噪声与角度偏差会拉低 Ŝ

环境配置:把工具链装好

本课程使用 Python 3.10 及以上版本。推荐用 conda 或 venv 建立独立环境,避免与系统包冲突。核心依赖有四个:NumPy 负责数组与矩阵运算,SciPy 提供优化与统计工具,Matplotlib 用于绘制关联曲线与误差棒,QuTiP 负责量子态、算符与张量积的便捷构造。安装命令如下:

# 创建并激活虚拟环境(以 conda 为例)
conda create -n bell-lab python=3.11 -y
conda activate bell-lab

# 安装核心库
pip install numpy scipy matplotlib qutip

# 验证版本
python -c "import numpy, scipy, matplotlib, qutip; \
print('numpy', numpy.__version__); \
print('scipy', scipy.__version__); \
print('matplotlib', matplotlib.__version__); \
print('qutip', qutip.__version__)"

若 QuTiP 安装较慢,可先装 NumPy 与 SciPy,再单独安装 QuTiP;QuTiP 5.x 对 Python 版本有要求,若报错可回退到 4.7.x。安装完成后,建议在 Jupyter Notebook 中工作,便于分步观察矩阵与图形输出。

第一个量子态模拟示例

下面这段代码构造贝尔态 |Φ⁺⟩,并计算在四个测量方向组合下的关联期望值,最后得到 CHSH 量 S。测量方向采用 XZ 平面内的角度约定:算符为 A(θ) = cosθ·σz + sinθ·σx,两方分别使用 a=0°、a′=45°、b=22.5°、b′=67.5°,这是使 |Φ⁺⟩ 达到最大违背的标准角度组。

import numpy as np
import qutip as qt

# 1. 构造贝尔态 |Φ⁺⟩ = (|00⟩ + |11⟩)/√2
ket0 = qt.basis(2, 0)
ket1 = qt.basis(2, 1)
phi_plus = (qt.tensor(ket0, ket0) + qt.tensor(ket1, ket1)).unit()
rho = phi_plus * phi_plus.dag()

# 2. 测量算符:A(θ) = cosθ·σz + sinθ·σx
def meas_op(theta_deg):
    t = np.deg2rad(theta_deg)
    return np.cos(t) * qt.sigmaz() + np.sin(t) * qt.sigmax()

# 3. 关联函数 E(a,b) = Tr[ρ · A(a)⊗B(b)]
def correlation(theta_a, theta_b):
    A = meas_op(theta_a)
    B = meas_op(theta_b)
    return qt.expect(qt.tensor(A, B), rho)

angles = {"a": 0, "a2": 45, "b": 22.5, "b2": 67.5}
E1 = correlation(angles["a"],  angles["b"])
E2 = correlation(angles["a"],  angles["b2"])
E3 = correlation(angles["a2"], angles["b"])
E4 = correlation(angles["a2"], angles["b2"])
S = E1 - E2 + E3 + E4

print(f"E(a,b)   = {E1:+.4f}")
print(f"E(a,b')  = {E2:+.4f}")
print(f"E(a',b)  = {E3:+.4f}")
print(f"E(a',b') = {E4:+.4f}")
print(f"CHSH S   = {S:+.4f}   (量子上限 2.8284, 局域上限 2)")

运行后应看到四个关联值约为 −0.7071、+0.7071、+0.7071、+0.7071,S ≈ +2.8284。这个结果说明:在理想态与理想测量下,量子力学给出的 S 明显超过 2。需要强调的是,这是数值计算得到的理论期望值,不是实验采样结果;真实实验还要经过有限样本统计,S 的估计会围绕 2.828 波动,并受态保真度与测量精度影响。

建议在第一次运行时把角度改成 a=0°、a′=90°、b=45°、b′=135°,观察 S 是否降到接近 0,从而体会“测量方向选择”对违背程度的决定性作用。这是后续实验设计章节的重要伏笔。

本节要建立的三点认识

  • 贝尔不等式是可计算的判据:S 是一个由四个关联期望值组合而成的标量,局域隐变量要求 |S| ≤ 2,量子力学允许到 2√2。
  • 理论值与实验估计要分开:QuTiP 算出的是期望值,实验得到的是有限样本估计;判断“违背”必须把统计误差纳入考虑。
  • 工具链已就绪:NumPy 做矩阵与抽样,SciPy 做拟合与统计检验,Matplotlib 画关联曲线,QuTiP 管理量子态与算符,后续章节将逐层加深使用。

环境跑通、第一个 S 值算出来之后,你已经具备继续深入的基础。接下来要做的,是把“期望值计算”扩展为“带噪声、带采样、带误差棒的完整实验分析”,并理解为什么真实实验中的 S 往往低于 2.828,以及低到什么程度仍然可以宣称违背了贝尔不等式。