1. 课程导入与仿真环境搭建

自旋压缩态增强测量,是把量子计量学中“用纠缠换精度”的思想落到具体测量任务上的一类方法。要理解它,先要抓住三个关键词:自旋、压缩、增强。自旋在这里通常指由 N 个二能级粒子(原子、离子或等效自旋)构成的集体自旋,其宏观取向可用总自旋矢量 J = (Jx, Jy, Jz) 描述;压缩指在某个与平均自旋垂直的方向上,通过粒子间相互作用把该方向的自旋涨落压到标准量子极限以下,代价是共轭方向涨落被放大;增强则指这种涨落重分配使相位估计的灵敏度突破散粒噪声极限,逼近甚至达到海森堡极限。

为什么这件事值得专门做仿真?因为真实实验中,压缩态的制备、保持与读出都极其脆弱:探测噪声、原子损耗、探测效率不足、退相干都会把压缩“吃掉”。在动手搭光路或调射频之前,用数值方法把哈密顿量、演化时间、测量算符和估计量串起来跑一遍,能快速判断参数区间是否合理、压缩度能到多少、相位灵敏度是否真的改善。本课程后续章节会依次展开压缩态制备、探测、参数估计与误差分析,而本章的任务是把概念框架立起来,并把可复现的仿真环境跑通。

从标准量子极限到海森堡极限

设集体自旋沿 x 方向极化,即 <Jx> = N/2,在 z 方向做相位积累。对相干自旋态,横向自旋分量 Jy 的涨落满足 ΔJy = √(N)/2,相位不确定度约为 Δφ = 1/√N,这就是标准量子极限(SQL)。若能把 Jy 的涨落压缩到 ξ² = 2(ΔJy)²/(N/2) < 1(以相干态为参考的压缩参数),则相位灵敏度可改善为 Δφ ≈ ξ/√N。理想的海森堡极限是 1/N,对应最大纠缠态。仿真中我们关心的核心指标就是压缩参数 ξ² 与相位估计方差,二者构成从“态”到“测量结果”的因果链。

自旋压缩态增强测量的信号链与仿真对象 初态制备 相干自旋态 ΔJy = √N/2 压缩演化 H = χ Jz² 单轴扭曲 / OAT 相位积累 U = e^{-iφ Jy} 待测相位 φ 测量与估计 投影 Jy 或宇称 估计量 φ̂ 相干态涨落圆 ΔJy 未压缩 压缩态涨落椭圆 ΔJy 被压缩 仿真核心指标 压缩参数 ξ² = 2(ΔJy)² / (N/2),ξ² < 1 表示压缩 相位灵敏度 Δφ ≈ ξ/√N,对比 SQL 的 1/√N 可观测量:⟨Jy⟩、Var(Jy)、宇称 ⟨Π⟩ 随 φ 的振荡 注意:损耗与探测效率会削弱压缩,需在模型中体现

上图把整条链路摊开:初态、压缩演化、相位积累、测量估计四个环节,以及每个环节对应的数学对象。仿真时我们并不需要一次把全部物理都塞进去,而是按这条链逐段验证——先确认相干态的涨落是否等于 √N/2,再确认压缩哈密顿量确实让 Jy 方差下降,最后看相位估计方差是否低于 SQL。这种“分段对齐”的习惯能避免一上来就调复杂模型却不知道错在哪。

仿真工具选型与安装

本课程以 Python 为主语言,核心库是 QuTiP(Quantum Toolbox in Python)。QuTiP 提供自旋算符、张量积、时间演化、主方程与蒙特卡洛求解器,正好覆盖从理想幺正演化到含噪开放系统的需求。配套使用 NumPy 做数值运算、Matplotlib 做可视化。建议使用 conda 创建独立环境,避免与系统包冲突:

conda create -n spin_squeeze python=3.11 -y
conda activate spin_squeeze
conda install -c conda-forge qutip numpy matplotlib -y
python -c "import qutip; print(qutip.__version__)"

若使用 pip,可执行 pip install qutip numpy matplotlib。安装完成后务必打印版本号,因为 QuTiP 4 与 5 在求解器接口上有差异,本课程示例以 QuTiP 5 为准;若你的环境是 4.x,qutip.sesolve 的参数顺序与部分返回结构略有不同,遇到报错先核对版本。此外,QuTiP 首次运行会编译 Cython 扩展,耗时较长属正常现象。

第一个可运行示例:相干态的涨落

在引入压缩之前,先建立一个“基准”。用自旋算符构造 N 个二能级粒子的集体自旋,取相干态并计算 Jy 的方差,验证它是否接近 N/4(即 ΔJy = √N/2)。下面这段代码可直接运行,输出用于确认环境与物理约定一致:

import numpy as np
import qutip as qt

N = 20
# 集体自旋算符:jmat 返回 (Jx, Jy, Jz),自旋 j = N/2
jx, jy, jz = qt.jmat(N/2, 'x'), qt.jmat(N/2, 'y'), qt.jmat(N/2, 'z')

# 相干态:沿 x 方向极化的自旋相干态
theta, phi = np.pi/2, 0.0
psi0 = qt.spin_coherent(N/2, theta, phi)

var_jy = qt.variance(jy, psi0)
print("N =", N)
print("Var(Jy) =", var_jy, " 理论值 N/4 =", N/4)
print("压缩参数 xi^2 =", 2*var_jy/(N/2))

预期输出中 Var(Jy) 约为 5.0,N/4 = 5.0,压缩参数 ξ² 约为 1.0。这一步的意义在于:它确认了自旋算符的归一化约定(jmat 使用 j = N/2,本征值范围为 -j 到 j)、相干态的构造方式,以及方差计算的调用形式。很多后续“压缩不明显”的问题,根源其实是这里 N 的取值或算符约定搞错了。若你的输出明显偏离,先检查 N/2 是否误写成 N。

建议把上述脚本保存为 check_env.py,每次新建仿真文件前先跑一遍。它同时充当环境自检与物理约定校准,比单纯 import qutip 更有价值。

把压缩演化接进来

基准通过后,加入单轴扭曲哈密顿量 H = χ Jz²,演化时间 t 后计算 Jy 方差。理想情况下,选择合适的 χt 可使方差降到基准以下。这里给出一个最小验证片段,用于观察压缩随演化时间的变化趋势:

chi = 0.1
times = np.linspace(0, 2.0, 41)
H = chi * jz**2

result = qt.sesolve(H, psi0, times, e_ops=[jy, jy**2])
var_t = result.expect[1] - result.expect[0]**2
xi2 = 2*var_t/(N/2)
print("最小 xi^2 =", xi2.min(), " 对应时刻 t =", times[xi2.argmin()])

运行后你会看到 ξ² 先下降后回升,存在一个最优演化时间。这正是压缩态制备的典型特征:压缩不是越久越好,过度演化会让态绕过最小不确定区域。示例参数 χ = 0.1、N = 20 下,最优 ξ² 大致落在 0.3~0.6 量级(具体数值随参数变化,属示例性结果,不作为实测结论)。若你的曲线单调下降或始终大于 1,优先检查 jz**2 是否被正确构造为算符平方,以及 sesolve 的 e_ops 是否包含 jy**2。

环境搭建中的常见坑

  • 维度不匹配:直接用 qt.tensor 拼 N 个二能级系统会得到 2^N 维空间,N = 20 时已不可行。集体自旋应使用 jmat(N/2, ...) 的 (N+1) 维表示,这是本课程全程采用的约定。
  • 算符平方的写法:jz**2 在 QuTiP 中返回算符乘积,不要误写成 NumPy 的逐元素平方。
  • 求解器选择:纯幺正演化用 sesolve;含损耗、退相干时改用 mesolve 并给出坍缩算符列表;需要模拟单次测量轨迹时用 mcsolve。
  • 单位与量纲:χ 与 t 的乘积才是无量纲演化量,调参时应固定其一、扫描其二,避免两个量同时变动导致结论混乱。

完成本章后,你应当拥有一个可运行的环境、一段能复现相干态涨落的基准脚本,以及一段能观察到压缩随演化时间先降后升的最小示例。这三样东西构成后续所有章节的起点:无论后面讨论探测效率、损耗建模还是相位估计,都可以回到这条“初态—压缩—相位—测量”的链路上,逐段替换或增加物理内容,而不必推倒重来。