eigsh#
- scipy.sparse.linalg.eigsh(A, k=6, M=None, sigma=None, which='LM', v0=None, ncv=None, maxiter=None, tol=0, return_eigenvectors=True, Minv=None, OPinv=None, mode='normal')[源代码]#
查找实对称方阵或复共轭埃尔米特矩阵 A 的 k 个特征值和特征向量。
求解
A @ x[i] = w[i] * x[i]
,即 w[i] 特征值及其对应的特征向量 x[i] 的标准特征值问题。如果指定了 M,则求解
A @ x[i] = w[i] * M @ x[i]
,即 w[i] 特征值及其对应的特征向量 x[i] 的广义特征值问题。请注意,当 A 是复共轭埃尔米特矩阵时,没有专门的例程。 在这种情况下,
eigsh()
将调用eigs()
并返回由此获得的特征值的实部。- 参数:
- Andarray、稀疏矩阵或 LinearOperator
表示运算
A @ x
的方阵运算符,其中A
是实对称或复共轭埃尔米特矩阵。对于屈曲模式(见下文),A
还必须是正定的。- kint,可选
所需的特征值和特征向量的数量。k 必须小于 N。不可能计算矩阵的所有特征向量。
- 返回:
- warray
k 个特征值的数组。
- varray
表示 k 个特征向量的数组。列
v[:, i]
是与特征值w[i]
对应的特征向量。
- 其他参数:
- M一个 N x N 矩阵、数组、稀疏矩阵或线性运算符,表示
广义特征值问题的运算
M @ x
A @ x = w * M @ x。
如果 A 是实数,则 M 必须表示实对称矩阵;如果 A 是复数,则必须表示复共轭埃尔米特矩阵。 为了获得最佳结果,M 的数据类型应与 A 的数据类型相同。此外
如果 sigma 为 None,则 M 是对称正定矩阵。
如果指定了 sigma,则 M 是对称半正定矩阵。
在屈曲模式下,M 是对称不定矩阵。
如果 sigma 为 None,则 eigsh 需要一个运算符来计算线性方程
M @ x = b
的解。这在内部通过显式矩阵 M 的(稀疏)LU 分解来完成,或通过通用线性运算符的迭代求解器来完成。 或者,用户可以提供矩阵或运算符 Minv,它给出x = Minv @ b = M^-1 @ b
。- sigma实数
使用移位-逆模式查找接近 sigma 的特征值。 这需要一个运算符来计算线性系统
[A - sigma * M] x = b
的解,如果未指定,则 M 为单位矩阵。 这在内部通过显式矩阵 A 和 M 的(稀疏)LU 分解来计算,如果 A 或 M 是通用线性运算符,则通过迭代求解器计算。 或者,用户可以提供矩阵或运算符 OPinv,它给出x = OPinv @ b = [A - sigma * M]^-1 @ b
。 请注意,当指定 sigma 时,关键字“which”是指移位的特征值w'[i]
,其中如果 mode == ‘normal’,则
w'[i] = 1 / (w[i] - sigma)
。如果 mode == ‘cayley’,则
w'[i] = (w[i] + sigma) / (w[i] - sigma)
。如果 mode == ‘buckling’,则
w'[i] = w[i] / (w[i] - sigma)
。(详见下文“mode”中的讨论)
- v0ndarray,可选
迭代的起始向量。默认值:随机
- ncvint,可选
生成的 Lanczos 向量的数量,ncv 必须大于 k 且小于 n; 建议
ncv > 2*k
。默认值:min(n, max(2*k + 1, 20))
- whichstr [‘LM’ | ‘SM’ | ‘LA’ | ‘SA’ | ‘BE’]
如果 A 是复共轭埃尔米特矩阵,则 “BE” 无效。要查找的 k 个特征向量和特征值
“LM”:最大(幅度)特征值。
“SM”:最小(幅度)特征值。
“LA”:最大(代数)特征值。
“SA”:最小(代数)特征值。
“BE”:来自频谱每一端的一半 (k/2)。
当 k 为奇数时,从高端返回多一个 (k/2+1)。 当 sigma != None 时,“which” 是指移位的特征值
w'[i]
(请参阅上面的“sigma”中的讨论)。 ARPACK 通常更擅长查找较大的值,而不是较小的值。 如果需要较小的特征值,请考虑使用移位-逆模式以获得更好的性能。- maxiterint,可选
允许的最大 Arnoldi 更新迭代次数。默认值:
n*10
- tolfloat
特征值的相对精度(停止标准)。默认值 0 表示机器精度。
- MinvN x N 矩阵、数组、稀疏矩阵或 LinearOperator
请参阅上面的 M 中的注释。
- OPinvN x N 矩阵、数组、稀疏矩阵或 LinearOperator
请参阅上面的 sigma 中的注释。
- return_eigenvectorsbool
除了特征值之外,是否返回特征向量(True)。此值决定了特征值的排序方式。排序方式也取决于 which 变量。
- 对于 which = ‘LM’ 或 ‘SA’
如果 return_eigenvectors 为 True,则特征值按代数值排序。
如果 return_eigenvectors 为 False,则特征值按绝对值排序。
- 对于 which = ‘BE’ 或 ‘LA’
特征值始终按代数值排序。
- 对于 which = ‘SM’
如果 return_eigenvectors 为 True,则特征值按代数值排序。
如果 return_eigenvectors 为 False,则特征值按绝对值递减排序。
- mode字符串 [‘normal’ | ‘buckling’ | ‘cayley’]
指定用于移位反演模式的策略。此参数仅适用于实值 A 且 sigma != None 的情况。对于移位反演模式,ARPACK 内部求解特征值问题
OP @ x'[i] = w'[i] * B @ x'[i]
并将得到的 Ritz 向量 x’[i] 和 Ritz 值 w’[i] 转换为问题A @ x[i] = w[i] * M @ x[i]
的所需特征向量和特征值。模式如下:- ‘normal’
OP = [A - sigma * M]^-1 @ M, B = M, w’[i] = 1 / (w[i] - sigma)
- ‘buckling’
OP = [A - sigma * M]^-1 @ A, B = A, w’[i] = w[i] / (w[i] - sigma)
- ‘cayley’
OP = [A - sigma * M]^-1 @ [A + sigma * M], B = M, w’[i] = (w[i] + sigma) / (w[i] - sigma)
模式的选择将影响关键字 ‘which’ 选择哪些特征值,也可能影响收敛的稳定性(参见 [2] 中的讨论)。
- 引发:
- ArpackNoConvergence
当未获得请求的收敛时。
当前已收敛的特征值和特征向量可以在异常对象的
eigenvalues
和eigenvectors
属性中找到。
说明
此函数是 ARPACK [1] SSEUPD 和 DSEUPD 函数的包装器,它们使用隐式重启 Lanczos 方法来查找特征值和特征向量 [2]。
参考文献
[1]ARPACK 软件, opencollab/arpack-ng
[2]R. B. Lehoucq, D. C. Sorensen, and C. Yang, ARPACK USERS GUIDE: Solution of Large Scale Eigenvalue Problems by Implicitly Restarted Arnoldi Methods. SIAM, Philadelphia, PA, 1998.
示例
>>> import numpy as np >>> from scipy.sparse.linalg import eigsh >>> identity = np.eye(13) >>> eigenvalues, eigenvectors = eigsh(identity, k=6) >>> eigenvalues array([1., 1., 1., 1., 1., 1.]) >>> eigenvectors.shape (13, 6)