1. 课程导入与仿真环境搭建
连续变量压缩光态是量子光学中最具工程价值的一类非经典光场。要理解它,先要抓住“连续变量”与“压缩”两个关键词。连续变量指我们用光场的正交振幅 X̂ 与正交相位 P̂ 这类连续取值的可观测量来描述光场,而不是用离散的光子数。二者满足对易关系 [X̂, P̂] = i/2(取 ħ=1 的约定),对应海森堡不确定性关系 ΔX·ΔP ≥ 1/4。真空态在相空间是一个以原点为圆心、方差均为 1/4 的圆形不确定斑;压缩态则把这个圆“挤”成椭圆——某个正交分量的噪声被压到散粒噪声极限以下,代价是共轭分量的噪声被放大,而面积(即不确定度乘积)仍满足下限。
在实验与仿真中,我们通常用分贝表示压缩度:若某正交分量的方差为 V,则压缩量 S = −10·log₁₀(V/Vvac) dB,其中 Vvac = 1/4。例如 V = 0.1 时约 4 dB 压缩,V = 0.05 时约 7 dB。这个换算贯穿整个课程,务必先建立直觉:压缩度越高,椭圆越扁,对损耗也越敏感。
本课程的目标不是推导繁复的算符代数,而是建立“模型—参数—可观测量—结果判读”的完整仿真能力:能写出压缩态的密度矩阵或协方差矩阵,能计算正交分量方差与光子数分布,能观察损耗、探测效率对压缩度的退化,并最终把仿真结果与理论预期对照。学习路径大致分三段:先掌握相空间与协方差矩阵描述,再进入算符与主方程层面的数值演化,最后做含损耗、含探测的端到端链路仿真。
环境搭建选用 Python + QuTiP。QuTiP 提供 squeeze、coherent、thermal_dm 等态构造函数,以及 wigner、expect 等分析工具,非常适合本课程。建议使用 conda 创建独立环境,避免与系统包冲突:
conda create -n cv_squeeze python=3.11 -y
conda activate cv_squeeze
conda install -c conda-forge qutip qutip-qip matplotlib numpy scipy -y
安装完成后必须做一次验证,确认版本与核心功能可用。下面这段脚本同时检查版本、构造一个压缩真空态,并计算其正交分量方差:
import qutip as qt
import numpy as np
print("QuTiP:", qt.__version__)
N = 40 # 截断光子数,压缩越强需要越大
r = 0.8 # 压缩参数,对应约 7 dB 理想压缩
psi = qt.squeeze(N, r) * qt.basis(N, 0) # 压缩真空态
X = (qt.destroy(N) + qt.create(N)) / 2 # X̂ = (a + a†)/2
P = (qt.destroy(N) - qt.create(N)) / (2j) # P̂ = (a - a†)/(2i)
vx = qt.variance(X, psi)
vp = qt.variance(P, psi)
print("Var(X) =", vx, " Var(P) =", vp)
print("压缩量(dB) =", -10*np.log10(vx/0.25))
若环境正常,应看到 Var(X) 明显小于 0.25、Var(P) 明显大于 0.25,且两者乘积接近 0.0625(即 1/16)。这里有一个容易踩的坑:截断维数 N 太小会让结果失真。压缩参数 r 越大,态在光子数空间的展宽越明显,若 N 不足,方差计算会被截断误差污染,表现为“压缩度上不去”或乘积明显偏离理论值。实践中可先固定 r=0.8,把 N 从 20 逐步加到 60,观察 Var(X) 是否收敛,再确定后续实验使用的 N。
还有两个约定必须一开始就统一,否则后续章节会反复出错。第一,算符定义:本课程统一取 X̂=(a+a†)/2、P̂=(a−a†)/(2i),真空方差为 1/4;若你改用 X̂=(a+a†)/√2 的约定,真空方差变为 1/2,所有 dB 换算的基准都要同步调整。第二,相位参考:压缩椭圆的朝向由压缩相位 φ 决定,平衡零拍探测测到的是 X̂θ=X̂cosθ+P̂sinθ,θ 为本振相对信号光的相位。仿真中先固定 φ=0、扫描 θ,就能看到方差随 θ 呈周期变化——这正是后续判断“是否对准压缩分量”的依据。
建议在正式进入建模前,先建立一个可复用的工程习惯:把截断维数、压缩参数、损耗系数、探测效率集中写在一个配置字典里,所有脚本从配置读取,而不是散落在各处硬编码。这样在后续对比不同损耗下的压缩退化时,只需改一个键值即可复现整条链路。环境就绪、约定统一、验证通过,接下来就可以放心地把物理模型交给数值计算了。