Krylov 求解器
介绍
Krylov子空间方法是近似量子动力学的标准方法。 设\(\left|\psi\right\rangle\)为一个在\(D\)维 复希尔伯特空间中的状态,该状态在时间无关的哈密顿量\(H\)下演化。 那么,与该状态和哈密顿量相关的\(N\)维Krylov子空间由下式给出:
其中维度 \(N
其中 \(T_{N}=\mathbb{V}_{N} H \mathbb{V}_{N}^{\dagger}\) 是缩减到Krylov子空间的哈密顿量(它采用三对角矩阵形式),而 \(\mathbb{V}_{N}^{\dagger}\) 是包含Krylov基向量作为列的矩阵。
通过上述近似,时间演化仅使用所需大小的较小方阵进行计算。因此,当哈密顿量的维度非常大时,Krylov方法在短时间演化的计算中提供了巨大的加速,此时在完整子空间上进行精确计算实际上是不可能的。
这种方法最大的问题之一是误差的控制。 经过很短的时间后,误差开始呈指数增长。然而,当误差达到某个阈值时,通过重新启动子空间可以轻松纠正这个问题。因此,一系列\(M\) Krylov子空间时间演化提供了完整时间演化的准确解。在这个方案中,Krylov的魔力不仅在于它能够从非常大的希尔伯特空间中捕捉复杂的时间演化,而且在于它提供的计算加速。
在特殊情况下,Lanczos算法可能会在维度\(M_{hb}
QuTiP中的Krylov求解器
在QuTiP中,Krylov子空间演化是通过函数krylovsolve实现的。
参数与sesolve函数几乎相同,用于主方程
演化,除了哈密顿量不能依赖于时间,初始状态
必须始终是一个ket向量(不能用于计算传播子),并且需要
一个额外的参数krylov_dim。krylov_dim定义了
允许的最大Krylov子空间维度。
让我们通过使用QuTiP中的算法来解决一个简单的例子,以熟悉该方法。
>>> dim = 100
>>> jx = jmat((dim - 1) / 2.0, "x")
>>> jy = jmat((dim - 1) / 2.0, "y")
>>> jz = jmat((dim - 1) / 2.0, "z")
>>> e_ops = [jx, jy, jz]
>>> H = (jz + jx) / 2
>>> psi0 = rand_ket(dim, seed=1)
>>> tlist = np.linspace(0.0, 10.0, 200)
>>> results = krylovsolve(H, psi0, tlist, krylov_dim=20, e_ops=e_ops)
>>> plt.figure()
>>> for expect in results.expect:
>>> plt.plot(tlist, expect)
>>> plt.legend(('jmat x', 'jmat y', 'jmat z'))
>>> plt.xlabel('Time')
>>> plt.ylabel('Expectation values')
>>> plt.show()