为什么EIGS无法复现EIG在广义特征值问题中的结果?
我有一个通用的特征值问题:
A**q = alpha**B*q
这里的 A
和 B
是复杂的方阵。
使用 eig
函数,我可以很容易地找到给定的 A
和 B
矩阵的正确答案:
from scipy import linalg
alpha, q = linalg.eig(A,B)
如果我把得到的特征值 alpha 在一个复平面上画出来,其中 alpha_r
是特征值的实部,alpha_i
是特征值的虚部:
现在我想用 Scipy 的 `eigs` 稀疏算法来解决同样的问题,但出现了一些奇怪的情况:
from scipy.linalg.sparse import eigs
alpha, q = eigs(A,k=40,B,sigma=1.0+0.0J)
我知道这可能和矩阵 A
和 B
的特性有关,但我不太清楚具体是什么。使用 eigs
本来应该更高效,特别是当矩阵是稀疏的时候。
这里你可以找到 A
和 B
的数据,还有 eig
和 eigs
的解:
https://drive.google.com/drive/folders/1p_3AZzRtFfF64P7Sh5tDEA-I-voRtfAi?usp=share_link
要加载数据:
import numpy as np
data = np.load('YourPath/matrix.npz')
A = data['A']
B = data['B']
data = np.load('YourPath/eig_result.npz')
alpha = data['alpha']
q = data['q']
data = np.load('YourPath/eigs_result.npz')
alpha = data['alpha']
q = data['q']
1 个回答
0
一开始,我觉得这里没什么奇怪的。经过修正语法和导入错误后:
from scipy.sparse.linalg import eigs
alpha, q = eigs(A, 40, B, sigma=1 + 0j)
alpha
包含了40
个接近指定sigma
的特征值。从你的图上看,这一点不太明显,但仔细一看,这些特征值似乎并不是通过scipy.linalg.eig
返回的。实际上,当我指定一个不同的sigma
,比如4+4j
时,alpha
会返回40
个接近sigma
的值——但这些值显然在你的图中并不存在。
我同意这不是一个理想的情况,但这可能是因为你的M
矩阵(B
)没有满足文档中规定的要求。
M:一个数组、稀疏矩阵或线性算子,表示广义特征值问题中的操作 M@x。
A @ x = w * M @ x。
如果 A 是实数,M 必须表示一个实对称矩阵;如果 A 是复数,M 必须表示一个复厄米矩阵。
A
是复数,但你的B
矩阵不是厄米的;所有非零的对角元素都是0 - 1j
。