我有一个广义特征值问题:
A**q = 阿尔法**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']
我们更正导入和语法错误后:
from scipy.sparse.linalg import eigs
alpha, q = eigs(A, 40, B, sigma=1.0+0.0J)
您的代码可以正常工作。根据要求,您会在
sigma
附近获得 40 个特征值。
array([0.99993559-6.02277730e-04j, 0.99986439-5.92891387e-04j,
0.99984541-5.82508178e-04j, 1.00060288-5.54493240e-05j,
1.00060185+8.78867080e-06j, 1.00060228+3.45125669e-05j,
1.00059443+8.31001392e-05j, 1.00057832+1.50555166e-04j,
1.00055579+2.22482930e-04j, 1.00053452+2.72854744e-04j,
1.00052089+3.02154060e-04j, 1.00048812+3.44265642e-04j,
1.00047857+3.79635475e-04j, 1.00044081+4.06980723e-04j,
1.00038241+4.59795947e-04j, 1.00032251+5.04692481e-04j,
1.00028255+5.31513341e-04j, 1.00025619+5.53819872e-04j,
1.0002222 +5.67191736e-04j, 1.00015771+5.87069257e-04j,
1.00004671+6.05910511e-04j, 0.99984943+5.35140391e-04j,
0.99997949+6.04750831e-04j, 0.99992759+6.01713086e-04j,
0.99987301+5.81525426e-04j, 0.99966821+4.46327203e-04j,
0.99961854+4.56911384e-04j, 0.99956986+4.23305158e-04j,
0.99953443+3.81722342e-04j, 0.99945911-2.71575368e-04j,
0.99949376+3.27515008e-04j, 0.9994566 +2.71569533e-04j,
0.99944039+2.24490632e-04j, 0.99943237-1.82314379e-04j,
0.99942089+1.57459951e-04j, 0.99941313-1.15507981e-04j,
0.999405 +8.73089164e-05j, 0.99940182-4.55513495e-05j,
0.99939719+3.80410988e-05j, 0.99939794+5.99174621e-06j])
请参阅 sigma
参数的
文档。
使用移位反转模式查找
附近的特征值。sigma
如果您想要最接近不同点的
k
特征值,请将该点指定为 sigma
。如果你想要最大幅度、最小幅度等特征值,不要指定sigma
;请参阅 which
的文档。如果您想要除最小特征值之外的所有特征值,请指定 k = A.shape[0] - 1
并准备等待!