1

嗨,大家好!!!

我想计算形式的广义特征分解:

Lf = λ Af

通过使用 scipy.sparse.linalg.eigs 函数,但得到这个错误:

/usr/local/lib/python2.7/dist-packages/scipy/linalg/decomp_lu.py:61:RuntimeWarning:对角线数 65 正好为零。奇异矩阵。RuntimeWarning) ** 进入 DLASCL 参数编号 4 时具有非法值

我正在传递三个参数,一个对角矩阵、一个正半定 (PSD) 矩阵和数值 K(前 K 个特征值)。Matlab 的 eigs 函数使用相同的输入参数表现良好,但在我理解的 SciPy 中,为了使用 PSD 进行计算,我还需要指定 sigma 参数。

所以,我的问题是:有没有办法避免设置 sigma 参数,就像在 MatLab 中一样,或者如果没有,如何获取 sigma 值?

期待得到建议或提示......提前谢谢你!

4

1 回答 1

1

该错误似乎意味着在您的广义特征问题中

L x = lambda A x

矩阵 A 不是正定的(检查 eigs 文档字符串——在你的情况下,矩阵可能是奇异的)。这是 ARPACK 模式 2 的要求。但是,您可以尝试指定sigma=0切换到 ARPACK 模式 3(但请注意,which在这种情况下参数的含义是相反的!)。

现在,我不确定 Matlab 做了什么,但可能是它计算的是伪逆而不是A. 要模拟这一点,请执行

from scipy.sparse.linalg import LinearOperator
from scipy.linalg import lstsq

Ainv = LinearOperator(matvec=lambda x: lstsq(A, x)[0], shape=A.shape)
w, v = eigs(L, M=A, Minv=Ainv)

检查结果——我不知道在这种情况下会发生什么。

或者,您可以尝试指定一个非零值sigma。您应该选择什么取决于所涉及的矩阵。它会影响所选择的特征值——例如which='LM'那些lambda' = 1/(lambda - sigma)较大的特征值。否则,它可能可以任意选择,当然如果lambda'您感兴趣的转换后的特征值与其他特征值很好地分离,对 Krylov 进展可能会更好。

于 2012-10-24T20:59:03.050 回答