gpt4 book ai didi

scipy - 不正确的特征值 SciPy 稀疏 linalg.eigs,非对角 M 矩阵的 eigsh

转载 作者:行者123 更新时间:2023-12-01 11:34:44 24 4
gpt4 key购买 nike

为什么下面使用的 scipy.sparse.linalg 中的 eigheigsh 在求解广义特征值问题 A * x = lambda * M * x 时给出不正确的结果,如果 M 是非对角线的?

import mkl
import numpy as np
from scipy import linalg as LA
from scipy.sparse import linalg as LAsp
from scipy.sparse import csr_matrix

A = np.diag(np.arange(1.0,7.0))
M = np.array([[ 25.1, 0. , 0. , 17.3, 0. , 0. ],
[ 0. , 33.6, 16.8, 8.4, 4.2, 2.1],
[ 0. , 16.8, 3.6, 0. , 11. , 0. ],
[ 17.3, 8.4, 0. , 4.2, 0. , 9.5],
[ 0. , 4.2, 11. , 0. , 2.7, 8.3],
[ 0. , 2.1, 0. , 9.5, 8.3, 4.4]])

Asp = csr_matrix(np.matrix(A,dtype=float))
Msp = csr_matrix(np.matrix(M,dtype=float))

D, V = LA.eig(A, b=M)

eigno = 4
Dsp0, Vsp0 = LAsp.eigs(csr_matrix(np.matrix(np.dot(np.linalg.inv(M),A))),
k=eigno,which='LM',return_eigenvectors=True)
Dsp1, Vsp1 = LAsp.eigs(Asp,k=eigno,M=Msp,which='LM',return_eigenvectors=True)
Dsp2, Vsp2 = LAsp.eigsh(Asp,k=eigno,M=Msp,which='LA',return_eigenvectors=True,
maxiter=1000)

从 LA.eig 和 MatLab 检查这个带有测试矩阵 A 和 M 的小广义特征值问题的特征值应该是:

D = [ 0.7208+0.j,  0.3979+0.j, -0.3011+0.j, -0.3251+0.j,  0.0357+0.j,  0.0502+0.j]

我想使用稀疏矩阵,因为实际涉及的 A 和 M 矩阵约为 30,000 x 30,000。 A 始终是正方形、实数和对角线,M 始终是正方形、实数和对称。当 M 是对角线时,我得到正确的结果。但是,在求解非对角 M 矩阵的广义特征值问题时,eigseigsh 都会给出不正确的结果。

Dsp1 = [-1.6526+2.3357j, -1.6526-2.3357j, -0.6243+2.7334j, -0.6243-2.7334j]

Dsp2 = [ 2.01019097, 3.09248265, 4.06799498, 7.01216316]

当我将问题转换为标准特征值形式 M^-1 * A * x = lambda * x 时,eigs 给出了正确的结果 (Dsp0)。对于大型矩阵,这不是一种选择,因为计算 M 的倒数需要很长时间。

我注意到使用或不使用 mkl 也会产生不同的 Dsp1 和 Dsp2 特征值。这个特征值问题可能是由我的 Python 安装问题引起的吗?我在 Mac OS 10.10.2 上运行 Python 2.7.8 anaconda 和 SciPy 0.15.1 - np19py27_p0 [mkl]。

最佳答案

两者都是eigseigsh要求 Mpositive definite (有关详细信息,请参阅文档字符串中对 M 的描述)。

您的矩阵 M 不是正定矩阵。注意负特征值:

In [212]: M
Out[212]:
array([[ 25.1, 0. , 0. , 17.3, 0. , 0. ],
[ 0. , 33.6, 16.8, 8.4, 4.2, 2.1],
[ 0. , 16.8, 3.6, 0. , 11. , 0. ],
[ 17.3, 8.4, 0. , 4.2, 0. , 9.5],
[ 0. , 4.2, 11. , 0. , 2.7, 8.3],
[ 0. , 2.1, 0. , 9.5, 8.3, 4.4]])

In [213]: np.linalg.eigvals(M)
Out[213]:
array([ 45.92443169, 33.92113421, -13.12639751, -10.6991868 ,
5.34183619, 12.23818222])

关于scipy - 不正确的特征值 SciPy 稀疏 linalg.eigs,非对角 M 矩阵的 eigsh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28469682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com