2017-01-15 72 views
0

我有兴趣计算给定稀疏矩阵H的矩阵指数,然后将其与给定矢量v相乘。由于矩阵H的大小变为90.000的数量级,因此明确计算它,然后乘以v变得困难(它花费大量时间)。问题的关键是,我要计算状态v,其中H是哈密顿,对于给定的时间的时间演化:矩阵指数与python中的给定矢量的乘积

U = exp(-i*H*t) 

其中i是虚数单位和t是时间。然后我想在矢量v为了获得这种状态v

在另一只手的进化乘这个矩阵U,我发现了以下库在python:

scipy.sparse.linalg.expm_multiply 

这样:

scipy.sparse.linalg.expm_multiply(-(1j)*t*H,v) 

它来自https://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.sparse.linalg.expm_multiply.html。有了这个,我可以非常有效地计算,只有很短的时间。在很高的时间t它花了很多时间,我不知道为什么...

任何想法为什么会发生?如何解决?

我的目标是做一个表的多个时间点及其各自的发展状态

+0

http://stackoverflow.com/help/mcve –

+0

该函数的文档引用了一些科学计算论文。它也可能有助于阅读'scipy/sparse/linalg/_expm_multiply.py'中的代码。 – hpaulj

回答

1

你应该先对角化H,然后代表此基础上(量子力学的能量基础)诉。用这种形式表达v会使你很容易计算出后续的时间演变。

设e_i是H的本征向量由于H是哈密顿它是厄米特,因此任何矢量v,有一个完整的和独特的描述如在能量基础的线性叠加:

v = SUM(v_i * e_i) 

与v_i唯一常量。然后可以计算进化状态任意t为时间:

v(t) = SUM(exp(-i*t*lambda_i) * v_i *e _i) 

其中lambda_i是本征值H * e_i = lambda_i * e_i。由于这只是一堆标量乘法和总和,因此计算效率很高。

主要的减速将是对角化H,其在算法上的阶数为O(N^3)(对于N×N矩阵)。

对于小t,exp(-itH)约为1 - itH(你可以从泰勒展开中看到这一点),所以当然这会很快。

上面是,恐怕,几乎一样快,因为它会得到(除非系统有一些额外的特殊属性)。量子力学的模拟有一些非常现实的困难,并且是量子计算机的目的; P。

+0

好的谢谢,但由于哈密尔顿矩阵H有一个90阶的维数。000时,不可能获得系统的所有特征向量(仅仅是基态和激发态),所以根据系统的基础不可能表达状态v。 – Joe

+0

@Joe - 那么也许你应该做一些慢场近似。只计算前几个特征向量/特征值并使用它们来获得大致的时间演化。如果您只对动态的“缓慢”部分感兴趣并且高频模式确实可以忽略,这可能是可以接受的。如果你需要完整的解决方案,那么不幸的是,数学和计算实际将会施加一些相当严格的限制。 –

+0

@Joe - 也许还要研究重整化群体以及在特定问题域中系统地整合出高能模式的过程,以生成可以解决的有效低能哈密顿量。可能有一些软件包和/或论文可以帮助您以近似但计算可行的方式获得动态。但是,我们已经超出了stackoverflow的范围 - 这更适合物理板; P。 –