SuperAPI AI 工具集

qutip

数据与分析

查看项目

更新于 10-16 04:23

技能介绍

QuTiP(Quantum Toolbox in Python)是一个灵活且高效的量子力学模拟框架,用于模拟开放量子系统的动力学。它便于创建量子对象,并提供强大的求解器来追踪这些对象在封闭和开放环境中的演化。

用途

QuTiP 适用于以下场景:

  • 模拟量子系统的时间演化(薛定谔方程或主方程)
  • 计算开放量子系统的稳态(例如受驱动和耗散的腔)
  • 分析纠缠、Wigner 函数和量子关联
  • 研究光与物质相互作用(Jaynes-Cummings 模型、Rabi 振荡)
  • 脉冲序列优化与量子控制
  • 计算光谱和多时关联函数
  • 跨多个 CPU 并行化量子模拟

主要能力

量子对象(Qobj)

Qobj 是核心数据结构,可表示态(ket 或 bra)、算符或超算符。它自动处理维度并校验运算(例如阻止 ket 与算符相加)。

复合系统

QuTiP 使用 Kronecker 积(tensor)表示由多个子系统组成的系统(例如与谐振腔耦合的量子比特)。

求解器工作流

  1. 定义哈密顿量(H)
  2. 定义耗散的坍缩算符(C_n)
  3. 设置初始态(ρ₀)
  4. 定义时间序列(t)
  5. 运行求解器(mesolve、sesolve 等)

动力学求解器

  • 主方程(开放系统):使用 mesolve 配合坍缩算符建模退相干
  • 薛定谔方程:使用 sesolve
  • 含时哈密顿量:使用 [H0, [H1, 'sin(w*t)']] 列表格式以获得速度
  • 稳态与关联:qt.steadystate、qt.spectrum、qt.correlation_2op_1t

可视化

  • Wigner 函数:qt.wigner(state, xvec, yvec)
  • Bloch 球:qt.Bloch()

性能优化

  • 默认使用 Scipy 稀疏矩阵;N > 10 时稀疏矩阵基本是必需的
  • 使用 qt.parallel_map 进行参数扫描以利用多 CPU

使用方式

安装:

pip install qutip

标准导入:

import qutip as qt
import numpy as np
import matplotlib.pyplot as plt

基本模式——Rabi 振荡:

import qutip as qt
import numpy as np

# 1. 定义哈密顿量: H = h_bar * omega * sigma_x / 2
omega = 1.0 * 2 * np.pi
H = 0.5 * omega * qt.sigmax()

# 2. 初始态: 自旋向下 (|1>)
psi0 = qt.basis(2, 1)

# 3. 时间点
times = np.linspace(0.0, 10.0, 100)

# 4. 求解薛定谔方程
result = qt.sesolve(H, psi0, times, [qt.sigmaz()])

# 5. 获取期望值
sz_expt = result.expect[0]

量子对象创建与属性:

# Kets 和 Bras
psi = qt.basis(5, 0) # 5 能级系统中的 Ket |0>
bra = psi.dag()      # 伴随 (Bra)

# 算符
a = qt.destroy(10) # 湮灭算符(大小 10)
n = a.dag() * a    # 粒子数算符
sz = qt.sigmaz()   # Pauli Z

# 属性
print(psi.type)    # 'ket'
print(sz.dims)     # [[2], [2]]
print(n.eigenstates()) # 获取本征值和本征向量

复合系统(张量积):

# 量子比特 (2) + 腔 (10)
sz = qt.sigmaz()
a = qt.destroy(10)

# 仅作用于量子比特的算符
sz_total = qt.tensor(sz, qt.qeye(10))

# 相互作用项: sigma_x * (a + a_dag)
H_int = qt.tensor(qt.sigmax(), a + a.dag())

主方程(开放系统):

# 参数
kappa = 0.1 # 腔衰减率
H = qt.tensor(qt.sigmax(), qt.qeye(10)) # 哈密顿量
c_ops = [np.sqrt(kappa) * qt.tensor(qt.qeye(2), a)] # 衰减列表
psi0 = qt.tensor(qt.basis(2, 0), qt.basis(10, 0))
times = np.linspace(0, 50, 200)

# 求解
result = qt.mesolve(H, psi0, times, c_ops, [qt.tensor(qt.sigmaz(), qt.qeye(10))])

# 访问期望值
exp_z = result.expect[0]

含时哈密顿量:

# 使用基于字符串的语法(最快)
H0 = qt.sigmax()
H1 = qt.sigmaz()
args = {'w': 0.5}
H_t = [H0, [H1, 'sin(w * t)']]

result = qt.sesolve(H_t, qt.basis(2, 0), times, args=args)

稳态与关联:

# 驱动-耗散系统的稳态
rho_ss = qt.steadystate(H, c_ops)

# 稳态下的期望值
avg_n = qt.expect(a.dag() * a, rho_ss)

# 发射光谱
w_list = np.linspace(0, 10, 100)
spec = qt.spectrum(H, w_list, c_ops, a.dag(), a)

可视化:

# Cat 态的 Wigner 函数
cat = (qt.coherent(20, 2) + qt.coherent(20, -2)).unit()
xvec = np.linspace(-5, 5, 100)
W = qt.wigner(cat, xvec, xvec)

# Bloch 球
b = qt.Bloch()
b.add_states(qt.basis(2, 0))
b.add_states((qt.basis(2,0) + qt.basis(2,1)).unit())
# b.show()

适用场景

  • Jaynes-Cummings 模型(量子比特-腔)模拟
  • 量子态层析分析(使用 qt.fidelity 计算两个量子态之间的保真度)
  • 计算 G2 关联函数(使用 qt.correlation_2op_1t)
  • 参数扫描(使用 qt.parallel_map)

限制与注意事项

  • 求解器假设 H 是厄米的;若含时代码导致非厄米 H,sesolve 会产生非物理态(范数 ≠ 1)
  • 对于无限系统(如谐振子),需确保 Fock 空间大小(N)足够大以收敛;若光子数分布触及 N 上限,结果无效
  • 张量积时顺序必须一致,否则出现“维度不匹配”错误
  • 避免手动提取数据(state.data.toarray()),除非绝对必要;Qobj 针对稀疏数学进行了优化
  • 不要忽略求解器警告,数值不稳定通常意味着时间步长过大或希尔伯特空间过早截断
  • 不要混用不同维度的希尔伯特空间,除非通过正确的张量积

最佳实践

  • 始终使用内置构造器(basis、coherent 等)而非手动创建数组
  • 在执行张量积前用 .dims 验证维度
  • 将算符传给求解器以计算期望值,而非手动计算
  • 使用适当的 Fock 空间截断(N),检查布居数是否饱和
  • 对含时哈密顿量使用基于字符串的格式以获得最佳性能
  • 监控求解器警告,它们通常指示数值问题
  • 对 N > 10 的系统使用稀疏矩阵(默认)
  • 时间演化后检查态归一化,尤其是自定义求解器
  • 使用 parallel_map 进行参数扫描以利用多 CPU
  • 使用 Wigner 函数和 Bloch 球可视化量子态以获得更深入的洞察

参考文档

  • 官方文档:https://qutip.org/docs/latest/
  • 教程:https://qutip.org/tutorials.html
  • 搜索模式:qutip.Qobj, qutip.mesolve, qutip.wigner, qutip.expect, qutip.basis