QuTiP 5 量子系统模拟实战指南:从模型契约到求解器选型与收敛审计(scientific-agent-skills 项目 qutip 技能深度解析)
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
导读
本文以 skills/qutip/SKILL.md 为骨架,系统讲解如何用 QuTiP 5.3 对闭合与开放量子系统模型进行模拟与审计,覆盖确定性演化、量子跳跃轨迹、稳态与谱、相空间可视化等完整工作流。结合仓库中 5 篇参考文档与 6 个本地 CLI 脚本的源码实现,你将掌握"先立模型契约、再按物理选求解器、最后做收敛审计"的可复现科研模拟方法,并学会在物理假设、维度、数值收敛都必须显式交代的本地量子动力学任务中安全落地。
本文所有代码示例与 API 签名均以qutip==5.3.0为准(本技能于 2026-07-23 完成验证)。QuTiP 5.3 要求 Python 3.11 及以上,其必需依赖为 NumPy(>=1.23.2)、SciPy(>=1.9.2,排除1.16.0与1.17.0)以及packaging。
适用范围与边界
本技能适用于有限维量子力学、量子光学、Lindblad 动力学、量子跳跃轨迹、弱耦合 Bloch-Redfield 模型,以及 Floquet、HEOM、置换不变性(PIQS)等专用方法。需要明确的是:QuTiP 本身不是硬件执行 SDK,线路与量子控制功能已迁移到独立的 QuTiP 家族扩展包中,本地模拟绝不能被包装成量子硬件执行。
可复现的 uv 环境快照
技能要求为每次模拟创建独立环境并固定每个直接依赖版本。基础安装:
uv venv --python 3.11 uv pip install "qutip==5.3.0"需要绘图时安装 graphics 额外项:
uv pip install "qutip[graphics]==5.3.0"可选的 QuTiP 家族扩展包
扩展包独立版本化,不要与核心包混为一谈:
uv pip install "qutip-qip==0.4.2" uv pip install "qutip-qtrl==0.2.0" uv pip install "qutip-jax==0.1.1"各包的成熟度与迁移边界(依据仓库 skills/qutip/references/advanced.md 整理的 PyPI 元数据快照):
| 发行包 | 版本 | 状态 | 导入方式 | 说明 |
|---|---|---|---|---|
qutip | 5.3.0 | 生产/稳定 | import qutip | 核心模拟库,Requires-Python >=3.11 |
qutip-qip | 0.4.2 | 生产/稳定 | from qutip_qip.circuit import QubitCircuit | 线路、门与含噪声器件模拟,不要导入qutip.qip |
qutip-qtrl | 0.2.0 | PyPI 标为 pre-alpha | from qutip_qtrl import pulseoptim | GRAPE/CRAB 量子最优控制,不是轨迹查看器,替代旧的qutip.control |
qutip-jax | 0.1.1 | 明确 pre-alpha | import qutip_jax | JAX 数据后端,用于 GPU 与自动微分实验 |
qutip-cupy | 无 PyPI 发行 | 未正式发布 | — | 官方组织仓库但未发布,其 README 明确说明未正式发布,不要将未发布的 Git 安装放入可复现工作流 |
对于传递依赖也需要冻结的场景(尤其是 JAX/CuPy 堆栈),技能建议使用项目 lockfile 或uv pip compile哈希校验工作流。仓库脚本 skills/qutip/scripts/_common.py 中通过QUTIP_VERSION = "5.3.0"与PINNED_INSTALL = 'uv pip install "qutip==5.3.0"'把这一版本契约固化进了所有 CLI 脚本:load_qutip()会检查安装版本,若与 5.3.0 不符会直接报错,确保审计结果始终对应钉死的版本。
非协商的模型契约(Non-negotiable Model Contract)
动手求解之前,技能强制要求记录以下 7 项契约,这是整个技能"以审计为核心"方法论的地基:
- 单位与约定:QuTiP 方程通常设定 (\hbar=1),哈密顿量元素是角频率,速率具有倒数时间单位。循环频率需用 (2\pi f) 转换,绝不要混用 Hz 与 rad/s。参考文档 skills/qutip/references/core_concepts.md 进一步指出,若时间取 ns,则哈密顿量系数与速率取 ns⁻¹;HEOM 或热谱中的温度只有在显式选定 (k_B=1) 约定时才做相应换算。维度一致性是模型自身的属性,QuTiP 无法替你推断。
- 子系统顺序:
tensor(A, B, C)固定子系统索引0, 1, 2,这个顺序必须在每个态、算符、弛豫通道与偏迹中保持一致。obj.ptrace([0, 2])是保留这些子系统,不是把它们迹掉。 - 态的有效性:检查 ket 范数或密度矩阵的厄米性、迹为 1、以及高于给定负容差的本征值。微小负值可能是数值噪声;实质性的负性会使声称的态无效。
- 生成元含义:速率为
gamma的 Lindblad 通道用sqrt(gamma) * A表示,不是gamma * A。例如sqrt(gamma_phi / 2) * sigmaz()给出相干衰减 (\exp(-\gamma_\phi t))。参考文档给出更完整的速率约定:若耗散子写作 (\gamma,\mathcal{D}[A]\rho),就传 (C=\sqrt{\gamma}A);热振荡器占据数 (n_\mathrm{th}) 对应sqrt(kappa * (n_th + 1)) * a与sqrt(kappa * n_th) * a.dag()两个通道;时变速率 (\gamma(t)) 需要幅度正比于 (\sqrt{\gamma(t)}),因为系数乘的是幅度而非速率。 - 近似:无论哪里使用了旋转波、Born-Markov、久期(secular)、弱耦合、浴平衡、截断、对称性、初始可分离假设,都要显式声明。
- 数值方法:说明 Hilbert 截断、输出网格、积分方法、容差、轨迹数与随机种子,并报告
result.stats。 - 收敛性:扫描每一个人为截断量:Fock 维数、时间/频率窗口与间距、ODE 容差、轨迹数、Floquet 谐波、HEOM 深度与浴指数、PIQS 表示等。
Qobj、维度与张量序
优先使用显式导入,同时检查 shape 与结构化维度。仅凭矩阵形状是不够的:两个对象都可能是 6×6,但编码了不同的张量分解。动手构建复合、超算符或通道模型之前,请先通读 skills/qutip/references/core_concepts.md。
from qutip import basis, qeye, sigmaz, tensor psi = tensor(basis(2, 0), basis(3, 1)) z_on_first = tensor(sigmaz(), qeye(3)) assert psi.shape == (6, 1) assert psi.dims == [[2, 3], [1]] assert z_on_first.dims == [[2, 3], [2, 3]] rho_first = psi.proj().ptrace(0) # keep subsystem 0Qobj 核心 API 速查(来自 core_concepts.md)
| API | 含义 |
|---|---|
.dims | 结构化输入/输出 Hilbert 空间 |
.shape | 展平的矩阵形状 |
.type | ket、bra、oper、super、operator-ket、operator-bra |
.isket/.isoper/.issuper | 语义类型检查 |
.isherm/.isunitary | 缓存/计算的构型属性 |
.dag()/.tr()/.norm() | 共轭转置 / 迹 / 范数(ket 默认 L2,算符默认迹范数) |
.proj() | ket/bra 投影子 |
.ptrace(sel) | 保留选中子系统、迹掉其余 |
.full() | 展平形状的稠密矩阵 |
.full_tensor() | QuTiP 5.3 按张量维度重塑的稠密数组 |
关键细节:.ptrace中被选子系统即使以其他顺序传入,也保持原始顺序;需要显式重排时用permute。手动构造原始Qobj时,shape 正确但dims错误会令后续张量积、偏迹、超算符操作全部失效——参考文档对此有专门警告。
态的构造与物理性审计
import numpy as np from qutip import basis, coherent, thermal_dm qubit = (basis(2, 0) + basis(2, 1)).unit() oscillator = coherent(30, 1.5) assert abs(qubit.norm() - 1.0) < 1e-12 rho = thermal_dm(20, 0.7) tol = 1e-10 eigenvalues = np.asarray(rho.eigenenergies(), dtype=float) assert rho.isherm assert abs(complex(rho.tr()) - 1.0) < tol assert eigenvalues.min() >= -tol容差要与求解器误差和矩阵量级挂钩;应报告最小本征值而不是静默裁剪。常见构造器还包括fock、fock_dm、coherent_dm、maximally_mixed_dm。振荡器构造器使用有限截断——截断后归一化并不证明截断充分,必须扫描截断并监测边界占据、可观测量与态迹。
复合系统与偏迹
from qutip import basis, destroy, qeye, sigmaz, tensor N = 12 psi = tensor(basis(N, 2), basis(2, 0)) # cavity index 0, qubit index 1 a = tensor(destroy(N), qeye(2)) sz = tensor(qeye(N), sigmaz()) assert psi.dims == [[N, 2], [1]] assert a.dims == [[N, 2], [N, 2]] assert sz.dims == a.dims rho = psi.proj() rho_cavity = rho.ptrace(0) rho_qubit = rho.ptrace(1)李超算符与矢量化的正确姿势
QuTiP 使用按列堆叠的算符矢量化,务必用operator_to_vector/vector_to_operator,不要凭猜测复现 reshape 顺序:
from qutip import liouvillian, operator_to_vector, vector_to_operator L = liouvillian(H, c_ops) rho_vec = operator_to_vector(rho) derivative = L * rho_vec rho_roundtrip = vector_to_operator(rho_vec) assert L.issuper assert (rho_roundtrip - rho).norm() < 1e-12通道表示转换(choi_to_kraus、choi_to_super、kraus_to_super、super_to_choi、super_to_kraus等)用于检查通道的完全正性与迹保持性,对应属性包括iscp、istp、iscptp。
按物理选择求解器
技能的核心原则:不要仅仅因为某个更专用的求解器存在就去选它。按物理模型匹配:
| 模型 | 当前 API | 必须的合理性论证 |
|---|---|---|
| 闭合、纯态、幺正 | sesolve | 哈密顿量厄米;无耗散 |
| Lindblad/开放或混合态 | mesolve | 马尔可夫完全正定模型与通道速率 |
| 量子跳跃 | mcsolve | 拆解(unravelling)、轨迹收敛、种子 |
| 微观弱浴 | brmesolve | Born-Markov/弱耦合、谱、久期选择 |
| 扩散型测量 | ssesolve,smesolve | 被监测与未监测通道 |
| 周期驱动 | FloquetBasis,fsesolve,fmmesolve | 验证周期与 Floquet 收敛 |
| 结构化非马尔可夫浴 | qutip.solver.heom | 浴展开与层级收敛 |
| 对称自旋系综 | qutip.piqs | 置换对称性与基选择 |
参考文档 skills/qutip/references/time_evolution.md 补充了两条反模式警示:不要仅为了并行化一个确定性计算而使用mcsolve;不要把brmesolve当作 Lindblad 模型的通用替代品。
QuTiP 5.3 当前求解器签名
sesolve(H, psi0, tlist, *, e_ops=None, args=None, options=None) mesolve(H, rho0, tlist, c_ops=None, *, e_ops=None, args=None, options=None) mcsolve(H, state, tlist, c_ops=(), *, e_ops=None, ntraj=500, args=None, options=None, seeds=None, target_tol=None, timeout=None) brmesolve(H, psi0, tlist, a_ops=None, sec_cutoff=0.1, *, c_ops=None, e_ops=None, args=None, options=None) ssesolve(H, psi0, tlist, sc_ops=(), heterodyne=False, *, e_ops=None, args=None, ntraj=500, options=None, seeds=None, target_tol=None, timeout=None) smesolve(H, rho0, tlist, c_ops=(), sc_ops=(), heterodyne=False, *, e_ops=None, args=None, ntraj=500, options=None, seeds=None, target_tol=None, timeout=None)注意 5.3 中e_ops、args、options均为仅关键字参数;以任意求解器关键字传选项的旧方式已被移除,旧的qutip.Options导出也已消失,改为传普通字典。
确定性开放系统示例:mesolve
QuTiP 5.3 使用普通选项字典,旧的可变 options 对象已成为历史:
import numpy as np from qutip import basis, mesolve, sigmam, sigmaz omega = 2.0 gamma = 0.15 tlist = np.linspace(0.0, 20.0, 401) excited = basis(2, 0) result = mesolve( 0.5 * omega * sigmaz(), excited, tlist, c_ops=[np.sqrt(gamma) * sigmam()], e_ops={"sigma_z": sigmaz(), "excited": excited.proj()}, options={ "method": "adams", "atol": 1e-10, "rtol": 1e-8, "store_final_state": True, "progress_bar": "", }, ) population = np.asarray(result.e_data["excited"]) assert np.max(np.abs(population - np.exp(-gamma * tlist))) < 2e-6 assert isinstance(result.stats, dict)示例中的e_ops字典形式对应result.e_data键值访问。当c_ops为空且H不是超算符时,mesolve可能委托给sesolve;若H是显式李超算符,则要说明它是否为合法 Lindblad 形式或刻意近似(见 time_evolution.md)。
若问题刚性(stiff),应对比bdf或lsoda——换积分器必须重跑容差与不变量检查。QuTiP 5.3 还支持options={"matrix_form": True}(mesolve/MESolver的矩阵-矩阵乘法路径,可能降低内存),但在作为默认之前必须做基准与验证。
选项字典与积分器选择
options = { "method": "adams", "atol": 1e-10, "rtol": 1e-8, "nsteps": 10000, "store_states": False, "store_final_state": True, "progress_bar": "", }常用积分器:adams(许多确定性求解器的非刚性默认)、bdf(刚性系统)、lsoda(刚性/非刚性自动切换)、dop853/vern7/vern9(显式高阶)、diag(常数系统基于对角化)、krylov(适用场景下的 Krylov 演化)。参考文档明确警告:积分器标签不是精度证书,至少要对比两个容差级别并检查警告与 stats,对代表性刚性或困难算例再对比第二种方法。
时变系统与 QobjEvo
优先使用可信的 Pythonic 可调用对象或数值系数数组,绝不要从用户输入构造系数源字符串:
import numpy as np from qutip import QobjEvo, sigmax, sigmaz def envelope(t, amplitude, center, width): return amplitude * np.exp(-0.5 * ((t - center) / width) ** 2) H = QobjEvo( [0.5 * sigmaz(), [sigmax(), envelope]], args={"amplitude": 0.2, "center": 5.0, "width": 1.0}, ) instantaneous_H = H(5.0) H.arguments(amplitude=0.1)旧的f(t, args)系数签名在 5.3 中已弃用,计划在 5.5 移除;当前形式是f(t, parameter, ...)。参考文档还给出了采样系数形式:传tlist与order(order=0为左值阶梯函数,默认三次样条可能过冲),并提示采样时间必须有序且与系数长度匹配、系数采样的收敛要与求解器输出时间独立地验证。QuTiP 也接受表达式字符串并可能编译它们,但本技能绝不从配置或用户文本构造此类表达式。
轨迹与随机求解器
import numpy as np from qutip import basis, mcsolve, sigmam, sigmaz tlist = np.linspace(0.0, 10.0, 201) result = mcsolve( 0.5 * sigmaz(), basis(2, 0), tlist, [np.sqrt(0.2) * sigmam()], e_ops=[basis(2, 0).proj()], ntraj=400, seeds=20260723, options={"keep_runs_results": False, "progress_bar": ""}, )必须报告ntraj、result.seeds、不确定性或重复种子敏感性,以及是否保留了单次运行。seeds可以是单个整数/SeedSequence(用于派生各轨迹种子),也可以是每个轨迹一个种子的列表;QuTiP 会把实际使用的种子存入结果。seeds=previous_result.seeds的复用只应在有意做配对轨迹对比时进行——配对运行不是独立重复实验。
轨迹严谨性要点(time_evolution.md):
- 增大
ntraj并报告稳定化结果或目标不确定度; - 区分轨迹标准差与均值的标准误(简单独立样本下约
std / sqrt(ntraj)); - 只有确实需要单条轨迹时才开
keep_runs_results=True(内存随轨迹数×时间点数增长); target_tol可能提前于ntraj停止,需报告实际运行的轨迹数;- 混合初始条件会被采样,结果含初始态统计,需显式说明这一额外采样来源。
ssesolve与smesolve使用布尔型heterodyne参数(False为 homodyne,True为 heterodyne),而不是旧的整型噪声码。c_ops是未监测的确定性耗散通道,sc_ops是被监测的随机通道;测量记录可能远大于期望值摘要,按需才存;随机积分步长dt要与ntraj分开收敛。
Bloch-Redfield:brmesolve
import numpy as np from qutip import basis, brmesolve, sigmax, sigmaz def one_sided_spectrum(w): return 0.03 * w if w > 0.0 else 0.0 tlist = np.linspace(0.0, 30.0, 601) result = brmesolve( 0.5 * sigmaz(), basis(2, 0), tlist, a_ops=[(sigmax(), one_sided_spectrum)], e_ops={"z": sigmaz()}, sec_cutoff=0.1, options={"atol": 1e-10, "rtol": 1e-8, "progress_bar": ""}, )a_ops中的耦合算符通常要求厄米,谱函数是角频率的函数。必查项:弱耦合(Born)、浴记忆远短于系统动力学(Markov)、浴平稳且正/负频约定正确、久期选择(sec_cutoff=-1关闭久期近似可能恶化正定性)、以及全程的迹/厄米性/最小本征值检查。brmesolve可能违反正定性,尤其是未久期化时。
稳态、谱与相空间
import numpy as np from qutip import QFunc, liouvillian, operator_to_vector, qfunc, steadystate rho_ss = steadystate(H, c_ops, method="direct") residual = (liouvillian(H, c_ops) * operator_to_vector(rho_ss)).norm() assert residual < 1e-9 xvec = np.linspace(-5.0, 5.0, 151) Q_once = qfunc(rho_ss, xvec, xvec) q_many = QFunc(xvec, xvec) Q_again = q_many(rho_ss) assert Q_once.shape == (len(xvec), len(xvec))steadystate 签名与方法
steadystate(A, c_ops=[], *, method="direct", solver=None, **kwargs)A可以是哈密顿量或李超算符;高层方法包括direct、eigen、svd、power、propagator。必报项(analysis.md):残差范数与归一化误差、厄米性与最小本征值、方法与线性求解器、矩阵/数据表示与容差、零本征值是否唯一、以及需要唯一性时从多个初态做长时演化对比。小残差不能证明唯一性或物理性——简并稳态空间需要分析李超算符零空间与初态依赖。svd方法为稠密法、面向小系统。对周期驱动系统,静态steadystate一般不是想要的渐近对象;QuTiP 5.3 中steadystate_fourier是当前余弦驱动 Fourier 求解器的名称,steadystate_floquet已弃用。
谱的两条路径
spectrum(H, wlist, c_ops, a_op, b_op, solver="es")计算稳态相关的傅里叶变换,求解策略包括指数级数("es")、伪逆("pi")与通用线性求解("solve")。QuTiP 5 已移除公开的spectrum_ss与spectrum_pi。对有限相关函数的 FFT(spectrum_correlation_fft),必须显式检查尾部衰减、时间步混叠、频率分辨率、窗口敏感性与变换约定——这些检查清单完整列于 skills/qutip/references/analysis.md,包括:要求均匀严格递增的taulist、相关函数在窗口末端已衰减、加倍时间窗口检验频率分辨率、减半时间步检验混叠、对比窗口函数、用解析信号核对正/反变换符号与归一化、不要把零填充当成额外物理分辨率。
相空间数组的轴约定
对于wigner、qfunc与类式QFunc,返回数组元素[j, k]对应yvec[j], xvec[k](QuTiP 5.3 发布说明明确澄清了该顺序)。因此传xvec给横轴、yvec给纵轴:ax.pcolormesh(xvec, yvec, values, shading="auto")。不要凭习惯转置,用不等长 x/y 实测验证。在 QuTiP 5.3 中QFunc以固定坐标初始化后用态调用,没有.eval方法(该技能从不使用 Python 动态代码执行)。相空间默认缩放为 (a=\tfrac12 g(x+iy), g=\sqrt2),对应 (\hbar=2/g^2=1)。wigner的方法包括clenshaw(稳健默认,尤其高激发)、iterative、laguerre(稀疏高维态)、fft(内部计算 y 坐标、返回形式不同);5.3 新增的offset参数支持第一个表示数态非零的 Fock 表示。
更多可视化细节(plot_wigner、Bloch 球、Fock 分布、Hinton/矩阵直方图、result.plot_expect()、多轨迹不确定带、动画与导出规范)参见 skills/qutip/references/visualization.md。
高级方法边界
技能明确划分了专用方法的使用边界(详见 skills/qutip/references/advanced.md):
- HEOM:从
qutip.solver.heom导入(DrudeLorentzBath、HEOMSolver等),QuTiP 4 的 legacynonmarkovHEOM 命名空间已过时。HEOM 收敛需要对max_depth、浴展开数(Nk)、Matsubara 与 Padé 近似、ODE 容差/积分器、系统 Hilbert 截断、时间网格独立扫描。result.states是约化系统态;store_ados=True才存完整辅助密度层级且数据量很大。任意指数展开的构造器为BosonicBath(Q, ck_real, vk_real, ck_imag, vk_imag, combine=True, tag=None),不要省略虚部系数/频率列表(除非相关函数确实无虚部展开)。 - Floquet:QuTiP 5 的抽象是
FloquetBasis,使用前必须数值验证H(t+T)==H(t)、声明准能级分支约定、扫描 Hilbert 截断与预计算网格、检查近简并准能级、并与直接演化对比一个周期。fsesolve处理闭合周期动力学,fmmesolve处理 Floquet-Markov 构造——其耦合算符与谱回调按位置配对,不是普通 Lindblad 通道。5.x 结果态默认在实验室基,store_floquet_state选项控制额外存储。 - PIQS:用
from qutip import piqs访问。Dicke.pisolve只是对角态/对角哈密顿量的优化路径(不接受e_ops),一般 Dicke 基动力学用李超算符 +mesolve。使用前验证完全相同的二能级组元与置换对称动力学、区分局域与集体速率、保持dicke或uncoupled基一致、不要把 Dicke 基矩阵维数当作 (2^N),并在可行时与小全 Hilbert 空间模型对比。 - 非马尔可夫蒙特卡洛:
nm_mcsolve适用于速率可变为负的时间局域主方程,输入是算符/速率对集合,不是通用双时浴相关回调。它并不会让任意非马尔可夫模型变得合法。 - 超算符与通道:转换必须用官方函数(
choi_to_*、super_to_*等)而非手写 reshape;检查完全正定性与迹保持性。 - 性能边界:
mcsolve的并行(map、num_cpus)改变调度与成本,但不改变所需轨迹收敛;parallel_map只执行可信、静态定义的本地函数;大 HEOM、李超算符、稠密对角化与 PIQS/全空间转换可能快速膨胀,构造前先估算维度与内存。
安全本地 CLI:从"仿真"到"审计"的可执行化
技能将方法论固化为 6 个仅本地运行、输出严格 JSON、拒绝非有限 JSON 与未知键、从不加载 pickle 或可执行模型代码的 CLI。模拟相关导入是惰性的,因此每个--help在未安装 QuTiP 时也能工作(skills/qutip/scripts/_common.py 的load_qutip延迟导入并校验版本)。
| 脚本 | 用途 |
|---|---|
| skills/qutip/scripts/qobj_model_validator.py | 校验有界 Qobj 模型 JSON:维度、态、速率、角色兼容性 |
| skills/qutip/scripts/two_level_simulation.py | 运行有界二能级 Lindblad 或量子跳跃仿真 |
| skills/qutip/scripts/solver_config_planner.py | 选择当前求解器并生成选项/检查清单计划 |
| skills/qutip/scripts/convergence_sweep.py | 在合成模型上扫描容差/网格或轨迹数 |
| skills/qutip/scripts/result_audit.py | 不解序列化 Python 对象地审计 JSON 输出 |
| skills/qutip/scripts/steady_state_spectrum_planner.py | 规划有界稳态与 direct/FFT 谱检查 |
示例(从仓库根目录执行):
python skills/qutip/scripts/two_level_simulation.py --help python skills/qutip/scripts/two_level_simulation.py \ --decay-rate 0.2 --t-final 10 --time-points 201 \ --output two-level.json python skills/qutip/scripts/result_audit.py two-level.json源码级验证:边界与自检
从 skills/qutip/scripts/_common.py 可以看到技能的安全边界被硬编码为显式上限:输入/报告字节上限(1 MiB / 8 MiB)、Hilbert 维数积上限 64、最多 8 个子系统、最多 32 个模型对象、时间点 ≤5001、轨迹 ≤2000、单次扫描运行 ≤6、频率点 ≤10001、速率 ≤10000、时间 ≤100000。checked_input_file拒绝 URL 与符号链接、要求常规本地文件;strict_json_bytes用allow_nan=False与大小上限保证"严格 JSON";emit_json通过临时文件 +os.replace原子写入。load_json_object通过object_pairs_hook拒绝重复键、通过parse_constant拒绝非标准 JSON 常量。
two_level_simulation.py的运行逻辑可作为"审计式仿真"的样板:它校验求解器必须是mesolve/mcsolve、初态必须是excited/ground/plus、方法必须在{adams, bdf, lsoda, dop853, vern7, vern9}内、atol <= rtol、且mcsolve至少要求一个非零弛豫速率;模型为0.5 * omega * sigma_z + 0.5 * drive * sigma_x,通道为sqrt(decay_rate) * sigma_minus与sqrt(dephasing_rate / 2) * sigma_z,并在报告中给出解析参照(drive == 0时激发态布居精确为 (e^{-\gamma t}))、最大布居界违反量、终态审计(ket 归一化或密度矩阵厄米/迹/最小本征值)以及轨迹统计与种子清单。qobj_model_validator.py则要求模型恰好含一个哈密顿量、一个初态,所有对象维度兼容,collapse 速率非负,并为速率通道显式记录"scaling": "sqrt(rate) * operator"的生成元语义——这正是"模型契约"中第 4 条的可执行化。
solver_config_planner.py支持closed、lindblad、quantum-jump、bloch-redfield、diffusive、periodic-closed、periodic-open、heom、piqs共 9 类模型,并自动给出"刚性选bdf、否则adams"的方法建议(默认atol=1e-10, rtol=1e-8),使"按物理选求解器"可被脚本化为检查清单。
完成检查清单
- 记录单位、(\hbar)、张量顺序、初态、通道与模型假设。
- 验证厄米性、范数/迹、正定性、维度与生成元单位。
- 钉死 QuTiP 与直接扩展版本;记录平台、Python、NumPy、SciPy 版本。
- 检查结果 options 与 stats;不要假定态已被存储。
- 执行截断、网格、容差/积分器与随机收敛扫描。
- 将可移植的数值/配置摘要保存为 JSON 或文本。不要加载不可信的 QuTiP 对象/结果文件——对象序列化可能执行代码。
深入阅读指引
- skills/qutip/references/core_concepts.md — Qobj、维度、张量积、态、通道与单位约定
- skills/qutip/references/time_evolution.md — 当前求解器签名、选项、结果、QobjEvo、轨迹与数值控制
- skills/qutip/references/analysis.md — 物理态审计、稳态、相关函数、谱与收敛
- skills/qutip/references/visualization.md — Wigner、Q 函数、
QFunc、Bloch、结果与矩阵绘图 - skills/qutip/references/advanced.md — Bloch-Redfield、随机、Floquet、HEOM、PIQS 与 QuTiP 家族包边界
- skills/qutip/scripts/_common.py — 所有 CLI 共享的有界输入/输出与严格 JSON 基础设施
- skills/qutip/scripts/two_level_simulation.py — "审计式仿真"的完整可执行样例
本文涉及的版本与 API 事实均于 2026-07-23 依据 QuTiP 5.3.0 官方 PyPI 元数据、发布说明与 API 文档核实,并已在上述仓库文件中固化;运行与配置时请以当前仓库的钉死版本为准。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考