Imported from one-step-beh1nd/skillbank (
skills/findscripter_everything_skills__qutip-open-quantum-systems__09-verticals__qutip-open-quantum-systems/SKILL.md). Install upstream withnpx skills add one-step-beh1nd/skillbank --skill findscripter_everything_skills__qutip-open-quantum-systems__09-verticals__qutip-open-quantum-systems. Copyright stays with the author (MIT).
何时使用
当任务涉及开放(耗散)量子系统或闭合系统的数值仿真时使用本技能,典型场景:
- 主方程 / Lindblad 动力学、退相干、弛豫
- 量子光学、腔 QED(如 Jaynes-Cummings 模型)
- 阻尼谐振子、纠缠演化、稳态、关联函数与谱
- Bloch 球、Wigner 函数等量子态可视化
- 高级方法:Floquet(周期驱动)、HEOM(非马尔可夫/强耦合)、置换不变性(全同粒子)
不该用边界:电路型量子计算、量子算法与真机执行不属于本技能——改用 qiskit / cirq / pennylane。门电路相关功能需额外的 qutip-qip 包。
步骤 / 指令
- 安装:
uv pip install qutip(门电路另装qutip-qip,控制脉冲另装qutip-qtrl)。 - 建态与算符:用
basis/coherent/thermal_dm建态,destroy/num/sigmax/sigmay/sigmaz建算符,多体系统用tensor张量积。 - 写哈密顿量与坍缩算符:耗散通过坍缩算符
c_ops(如np.sqrt(kappa)*destroy(N))引入。 - 选求解器(关键决策):
sesolve:纯态、幺正(闭合)演化,最快mesolve:混合态、耗散、一般开放系统(默认首选)mcsolve:量子跳跃、光子计数、单条轨迹;自动多核并行,调ntraj收敛brmesolve:弱系统-浴耦合(Bloch-Redfield)fmmesolve:时间周期哈密顿量(Floquet)
- 演化并取观测量:传
e_ops=[...]只存期望值(省内存),tlist用np.linspace定义。 - 分析:
expect、entropy_vn、concurrence、fidelity、tracedist、steadystate、correlation_2op_1t+spectrum_correlation_fft。 - 可视化:
Bloch()、wigner、plot_fock_distribution、hinton、matrix_histogram。
示例
最小闭合系统(自旋进动):
from qutip import *
import numpy as np, matplotlib.pyplot as plt
psi = basis(2, 0) # |0⟩
H = sigmaz() # 哈密顿量
tlist = np.linspace(0, 10, 100)
result = sesolve(H, psi, tlist, e_ops=[sigmaz()])
plt.plot(tlist, result.expect[0]); plt.xlabel('Time'); plt.ylabel('⟨σz⟩'); plt.show()
阻尼谐振子(开放系统,光子数衰减):
N, omega, kappa = 20, 1.0, 0.1
H = omega * num(N)
c_ops = [np.sqrt(kappa) * destroy(N)] # 坍缩算符
psi0 = coherent(N, 3.0)
tlist = np.linspace(0, 50, 200)
result = mesolve(H, psi0, tlist, c_ops, e_ops=[num(N)])
plt.plot(tlist, result.expect[0]); plt.ylabel('⟨n⟩'); plt.show()
Jaynes-Cummings 模型(腔 QED,RWA + 双通道耗散):
N, wc, wa, g = 10, 1.0, 1.0, 0.05
a = tensor(destroy(N), qeye(2)) # 腔模
sm = tensor(qeye(N), sigmam()) # 原子
H = wc*a.dag()*a + wa*sm.dag()*sm + g*(a.dag()*sm + a*sm.dag())
psi0 = tensor(coherent(N, 2), basis(2, 0)) # 腔相干态 + 原子基态
kappa, gamma = 0.1, 0.05
c_ops = [np.sqrt(kappa)*a, np.sqrt(gamma)*sm]
tlist = np.linspace(0, 50, 200)
result = mesolve(H, psi0, tlist, c_ops, e_ops=[a.dag()*a, sm.dag()*sm])
纠缠衰减(用 result.states 逐帧算 concurrence):
psi0 = bell_state('00')
gamma = 0.1
c_ops = [np.sqrt(gamma)*tensor(sigmaz(), qeye(2)),
np.sqrt(gamma)*tensor(qeye(2), sigmaz())]
result = mesolve(qeye([2, 2]), psi0, np.linspace(0,10,100), c_ops)
C_t = [concurrence(s.proj()) for s in result.states]
高级方法骨架(Floquet / HEOM / Dicke):
# Floquet 周期驱动
T = 2*np.pi / w_drive
f_modes, f_energies = floquet_modes(H, T, args)
# HEOM 非马尔可夫 / 强耦合
from qutip.nonmarkov.heom import HEOMSolver, BosonicBath
bath = BosonicBath(Q, ck_real, vk_real)
hsolver = HEOMSolver(H_sys, [bath], max_depth=5)
result = hsolver.run(rho0, tlist)
# 置换不变性(全同粒子)
psi = dicke(N, j, m); Jz = jspin(N, 'z')
注意事项
- 截断希尔伯特空间:取能捕捉动力学的最小维度
N;维度过大导致内存爆炸与变慢。 - 求解器选择影响性能:纯态优先
sesolve(比mesolve快);只在需要耗散时用mesolve。 - 时变项用字符串格式(如
'cos(w*t)')最快。 - 只存所需数据:用
e_ops而非保存全部states。 - 收敛检查:对
mcsolve改变ntraj、希尔伯特维度与容差验证收敛。 - 故障排查:
- 内存问题 → 降维、用
store_final_state选项或 Krylov 方法。 - 仿真慢 → 字符串时变、略放宽容差、刚性问题试
method='bdf'。 - 数值不稳 → 减小步长(
nsteps)、放宽容差、检查算符定义。 - 导入错误 → 确认 QuTiP 安装正确;量子门需
qutip-qip。
- 内存问题 → 降维、用
互见
- 官方文档:https://qutip.readthedocs.io/
- 教程:https://qutip.org/qutip-tutorials/
- API:https://qutip.readthedocs.io/en/stable/apidoc/apidoc.html
- 源仓库各
references/模块(core_concepts / time_evolution / visualization / analysis / advanced)含更详尽的对应主题说明。
采编自 K-Dense-AI/scientific-agent-skills 的 qutip 技能(原协议 BSD-3-Clause;仓库整体 MIT)。