为什么EIGS无法复现EIG在广义特征值问题中的结果?

1 投票
1 回答
44 浏览
提问于 2025-04-14 17:46

我有一个通用的特征值问题:

A**q = alpha**B*q

这里的 AB 是复杂的方阵。

使用 eig 函数,我可以很容易地找到给定的 AB 矩阵的正确答案:

from scipy import linalg
alpha, q = linalg.eig(A,B)

如果我把得到的特征值 alpha 在一个复平面上画出来,其中 alpha_r 是特征值的实部,alpha_i 是特征值的虚部:

enter image description here

现在我想用 Scipy 的 `eigs` 稀疏算法来解决同样的问题,但出现了一些奇怪的情况:

from scipy.linalg.sparse import eigs
alpha, q = eigs(A,k=40,B,sigma=1.0+0.0J)

enter image description here

我知道这可能和矩阵 AB 的特性有关,但我不太清楚具体是什么。使用 eigs 本来应该更高效,特别是当矩阵是稀疏的时候。

这里你可以找到 AB 的数据,还有 eigeigs 的解:

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

撰写回答