Python中scipy.linalg.eigvalsh的奇怪行为

时间:2015-12-11 15:09:48

标签: python numpy scipy

我想比较scipynumpy用于计算厄米特矩阵(eigvalsh)特征值的例程,并遇到一些意想不到的行为。

特别是,scipy的{​​{1}}例程返回与eigvalsh的{​​{1}}例程几乎相同的特征值,但仅适用于维度小于2000 x 2000的矩阵Spyder 2.3.7(Python 3.5)的例子:

numpy

事实上,如果eigvalsh,特征值数组In [1]: import scipy In [2]: import numpy as np In [3]: H = np.random.rand(1999,1999) + np.random.rand(1999,1999) * 1j ...: H = H + H.conj().T ...: Es = scipy.linalg.eigvalsh(H) ...: En = np.linalg.eigvalsh(H) ...: sum(abs(En - Es)) Out[3]: 1.85734656821257e-10 In [4]: H = np.random.rand(2000,2000) + np.random.rand(2000,2000) * 1j ...: H = H + H.conj().T ...: Es = scipy.linalg.eigvalsh(H) ...: En = np.linalg.eigvalsh(H) ...: sum(abs(En - Es)) Out[4]: 89786.239714130075 只包含零,除了最后一个元素,它等于数组长度的24倍:

H.shape >= (2000,2000)

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

对于*.linalg.eigvalsh例程,numpy调用LAPACK -EVD例程,这些例程基于分而治之算法。 scipy调用LAPACK -EVR,它使用不同的算法。

对于LAPACK文档,see here。这解释了你在2000年以下案例中看到的微小数字差异。

“全零”情况确实看起来像一个错误,但我无法在scipy == '0.17.1'np == '1.11.0'上复制。升级后问题是否仍然存在?