| name | alterlab-qutip |
| description | Simulates open quantum systems with QuTiP, the Quantum Toolbox in Python, solving Lindblad master equations (mesolve), Monte Carlo trajectories (mcsolve), and unitary dynamics (sesolve). Use when studying master-equation or Lindblad dynamics, decoherence, dissipation, quantum optics, cavity QED, or open-system time evolution. NOT for circuit-based quantum computing or hardware execution — for IBM Quantum circuits prefer alterlab-qiskit, for Google Quantum AI or NISQ circuits prefer alterlab-cirq, and for gradient-trained quantum ML prefer alterlab-pennylane. Part of the AlterLab Academic Skills suite. |
| license | MIT |
| allowed-tools | Read Write Edit Bash(python:*) |
| compatibility | No API key required. Runs locally via `uv run python`; requires the qutip Python package. |
| metadata | {"skill-author":"AlterLab","version":"1.1.0"} |
QuTiP: Quantum Toolbox in Python
Overview
QuTiP provides comprehensive tools for simulating and analyzing quantum mechanical systems. It handles both closed (unitary) and open (dissipative) quantum systems with multiple solvers optimized for different scenarios.
Installation
uv pip install qutip
This skill targets QuTiP 5.x (verified against 5.3.0). Key v5 API changes from v4: solver options are a plain dict (the old Options/solver.Options class is gone), stochastic solvers use heterodyne=True/False instead of a noise code, and progress_bar takes a string ('text'/'tqdm'/'') rather than True.
Optional packages for additional functionality:
uv pip install qutip-qip
uv pip install qutip-qtrl
Quick Start
from qutip import *
import numpy as np
import matplotlib.pyplot as plt
psi = basis(2, 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()
Core Capabilities
1. Quantum Objects and States
Create and manipulate quantum states and operators:
psi = basis(N, n)
psi = coherent(N, alpha)
rho = thermal_dm(N, n_avg)
a = destroy(N)
H = num(N)
sx, sy, sz = sigmax(), sigmay(), sigmaz()
psi_AB = tensor(psi_A, psi_B)
See references/core_concepts.md for comprehensive coverage of quantum objects, states, operators, and tensor products.
2. Time Evolution and Dynamics
Multiple solvers for different scenarios:
result = sesolve(H, psi0, tlist, e_ops=[num(N)])
c_ops = [np.sqrt(0.1) * destroy(N)]
result = mesolve(H, psi0, tlist, c_ops, e_ops=[num(N)])
result = mcsolve(H, psi0, tlist, c_ops, ntraj=500, e_ops=[num(N)])
Solver selection guide:
sesolve: Pure states, unitary evolution
mesolve: Mixed states, dissipation, general open systems
mcsolve: Quantum jumps, photon counting, individual trajectories
brmesolve: Weak system-bath coupling
fmmesolve: Time-periodic Hamiltonians (Floquet)
See references/time_evolution.md for detailed solver documentation, time-dependent Hamiltonians, and advanced options.
3. Analysis and Measurement
Compute physical quantities:
n_avg = expect(num(N), psi)
S = entropy_vn(rho)
C = concurrence(rho)
F = fidelity(psi1, psi2)
D = tracedist(rho1, rho2)
corr = correlation_2op_1t(H, rho0, taulist, c_ops, A, B)
w, S = spectrum_correlation_fft(taulist, corr)
rho_ss = steadystate(H, c_ops)
See references/analysis.md for entropy, fidelity, measurements, correlation functions, and steady state calculations.
4. Visualization
Visualize quantum states and dynamics:
b = Bloch()
b.add_states(psi)
b.show()
xvec = np.linspace(-5, 5, 200)
W = wigner(psi, xvec, xvec)
plt.contourf(xvec, xvec, W, 100, cmap='RdBu')
plot_fock_distribution(psi)
hinton(rho)
matrix_histogram(H.full())
See references/visualization.md for Bloch sphere animations, Wigner functions, Q-functions, and matrix visualizations.
5. Advanced Methods
Specialized techniques for complex scenarios:
T = 2 * np.pi / w_drive
f_modes, f_energies = floquet_modes(H, T, args)
result = fmmesolve(H, psi0, tlist, c_ops, T=T, args=args)
from qutip.solver.heom import HEOMSolver, BosonicBath
bath = BosonicBath(Q, ck_real, vk_real, ck_imag, vk_imag)
hsolver = HEOMSolver(H_sys, [bath], max_depth=5)
result = hsolver.run(rho0, tlist)
from qutip.piqs.piqs import dicke, jspin
psi = dicke(N, j, m)
Jz = jspin(N, 'z')
See references/advanced.md for Floquet theory, HEOM, permutational invariance, stochastic solvers, superoperators, and performance optimization.
Common Workflows
Simulating a Damped Harmonic Oscillator
N = 20
omega = 1.0
kappa = 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.xlabel('Time')
plt.ylabel('⟨n⟩')
plt.title('Photon Number Decay')
plt.show()
Two-Qubit Entanglement Dynamics
psi0 = bell_state('00')
gamma = 0.1
c_ops = [
np.sqrt(gamma) * tensor(sigmaz(), qeye(2)),
np.sqrt(gamma) * tensor(qeye(2), sigmaz())
]
tlist = np.linspace(0, 10, 100)
result = mesolve(qeye([2, 2]), psi0, tlist, c_ops)
C_t = [concurrence(state) for state in result.states]
plt.plot(tlist, C_t)
plt.xlabel('Time')
plt.ylabel('Concurrence')
plt.title('Entanglement Decay')
plt.show()
Jaynes-Cummings Model
N = 10
wc = 1.0
wa = 1.0
g = 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 = 0.1
gamma = 0.05
c_ops = [np.sqrt(kappa) * a, np.sqrt(gamma) * sm]
n_cav = a.dag() * a
n_atom = sm.dag() * sm
tlist = np.linspace(0, 50, 200)
result = mesolve(H, psi0, tlist, c_ops, e_ops=[n_cav, n_atom])
fig, axes = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
axes[0].plot(tlist, result.expect[0])
axes[0].set_ylabel('⟨n_cavity⟩')
axes[1].plot(tlist, result.expect[1])
axes[1].set_ylabel('⟨n_atom⟩')
axes[1].set_xlabel('Time')
plt.tight_layout()
plt.show()
Tips for Efficient Simulations
- Truncate Hilbert spaces: Use smallest dimension that captures dynamics
- Choose appropriate solver:
sesolve for pure states is faster than mesolve
- Time-dependent terms: String format (e.g.,
'cos(w*t)') is fastest
- Store only needed data: Use
e_ops instead of storing all states
- Adjust tolerances: Balance accuracy with computation time via the
options dict (atol/rtol/nsteps)
- Parallel trajectories:
mcsolve automatically uses multiple CPUs
- Check convergence: Vary
ntraj, Hilbert space size, and tolerances
Troubleshooting
Memory issues: Reduce Hilbert space dimension, use store_final_state option, or consider Krylov methods
Slow simulations: Use string-based time-dependence, increase tolerances slightly, or try method='bdf' for stiff problems
Numerical instabilities: Decrease time steps (nsteps option), increase tolerances, or check Hamiltonian/operators are properly defined
Import errors: Ensure QuTiP is installed correctly; quantum gates require qutip-qip package
References
This skill includes detailed reference documentation:
references/core_concepts.md: Quantum objects, states, operators, tensor products, composite systems
references/time_evolution.md: All solvers (sesolve, mesolve, mcsolve, brmesolve, etc.), time-dependent Hamiltonians, solver options
references/visualization.md: Bloch sphere, Wigner functions, Q-functions, Fock distributions, matrix plots
references/analysis.md: Expectation values, entropy, fidelity, entanglement measures, correlation functions, steady states
references/advanced.md: Floquet theory, HEOM, permutational invariance, stochastic methods, superoperators, performance tips
External Resources