计算传播器
有时候单一状态的演化是不够的,需要完整的传播器。QuTiP 提供了 propagator 函数来计算它们:
>>> H = sigmaz() + np.pi *sigmax()
>>> psi_t = sesolve(H, basis(2, 1), [0, 0.5, 1]).states
>>> prop = propagator(H, [0, 0.5, 1])
>>> print((psi_t[1] - prop[1] @ basis(2, 1)).norm())
2.455965272327082e-06
>>> print((psi_t[2] - prop[2] @ basis(2, 1)).norm())
2.0071900004562142e-06
第一个参数是哈密顿量,接受任何时间依赖的系统格式。该函数还接受一个可选的c_ops参数用于崩溃操作符。当使用时,会计算密度矩阵的传播子: \(\rho(t) = U(t)(\rho(0))\):
>>> rho_t = mesolve(H, fock_dm(2, 1), [0, 0.5, 1], c_ops=[sigmam()]).states
>>> prop = propagator(H, [0, 0.5, 1], c_ops=[sigmam()])
>>> print((rho_t[1] - prop[1](fock_dm(2, 1))).norm())
7.23009476734681e-07
>>> print((rho_t[2] - prop[2](fock_dm(2, 1))).norm())
1.2666967766644768e-06
传播器函数也可以作为一个类使用:
>>> U = Propagator(H, c_ops=[sigmam()])
>>> state_0_5 = U(0.5)(fock_dm(2, 1))
>>> state_1 = U(1., t_start=0.5)(state_0_5)
>>> print((rho_t[1] - state_0_5).norm())
7.23009476734681e-07
>>> print((rho_t[2] - state_1).norm())
8.355518501351504e-07
Propagator 可以接受 options 和 args 作为求解器实例。
使用求解器计算传播器
许多求解器接受一个操作符作为初始状态。当传递一个单位矩阵作为初始状态时,传播子被计算出来。这可以用于计算Bloch-Redfield或Floquet方程的传播子:
>>> delta = 0.2 * 2*np.pi
>>> eps0 = 1.0 * 2*np.pi
>>> gamma1 = 0.5
>>> H = - delta/2.0 * sigmax() - eps0/2.0 * sigmaz()
>>> def ohmic_spectrum(w):
>>> if w == 0.0: # dephasing inducing noise
>>> return gamma1
>>> else: # relaxation inducing noise
>>> return gamma1 / 2 * (w / (2 * np.pi)) * (w > 0.0)
>>> prop = brmesolve(H, qeye(2), [0, 1], a_ops=[[sigmax(), ohmic_spectrum]]).final_state