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 的估计值。用代码把这条链路走一遍,才能真正理解“违背”意味着什么、需要多少数据、误差有多大。
环境配置:把工具链装好
本课程使用 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 波动,并受态保真度与测量精度影响。
本节要建立的三点认识
- 贝尔不等式是可计算的判据:S 是一个由四个关联期望值组合而成的标量,局域隐变量要求 |S| ≤ 2,量子力学允许到 2√2。
- 理论值与实验估计要分开:QuTiP 算出的是期望值,实验得到的是有限样本估计;判断“违背”必须把统计误差纳入考虑。
- 工具链已就绪:NumPy 做矩阵与抽样,SciPy 做拟合与统计检验,Matplotlib 画关联曲线,QuTiP 管理量子态与算符,后续章节将逐层加深使用。
环境跑通、第一个 S 值算出来之后,你已经具备继续深入的基础。接下来要做的,是把“期望值计算”扩展为“带噪声、带采样、带误差棒的完整实验分析”,并理解为什么真实实验中的 S 往往低于 2.828,以及低到什么程度仍然可以宣称违背了贝尔不等式。