【发布时间】:2021-06-15 00:26:57
【问题描述】:
鉴于以下输入 numpy 2d-array A 可以通过文件 following link 检索到 hill_mat.npy,如果我可以使用像 @ 这样的迭代求解器仅计算其特征值的一个子集,那就太好了987654322@.
首先,有一点上下文。该矩阵A 是由大小为N 的二次特征值问题产生的,该问题已在双大小2*N 的等效特征值问题中线性化。 A 具有以下结构(蓝色为零):
plt.imshow(np.where(A > 1e-15,1.,0), interpolation='None')
以及以下功能:
A shape = (748, 748)
A dtype = float64
A sparsity ratio = 77.64841716949297 %
A 的真实尺寸比这个可重现的小例子要大得多。对于这种情况,我预计真实的稀疏率和形状接近 95% 和 (5508, 5508)。
A 的结果特征值是复数(以复共轭对的形式出现),我对模数中虚部最小的那些更感兴趣。
问题:使用直接求解器时:
w_dense = np.linalg.eigvals(A)
idx = np.argsort(abs(w_dense.imag))
w_dense = w_dense[idx]
计算时间很快变得令人望而却步。因此,我希望使用稀疏算法:
from scipy.sparse import csc_matrix, linalg as sla
w_sparse = sla.eigs(A, k=100, sigma=0+0j, which='SI', return_eigenvectors=False)
但似乎 ARPACK 没有以这种方式找到任何特征值。从scipy/arpack tutorial 中,当寻找像which = 'SI' 这样的小特征值时,应该使用所谓的移位反转模式,指定sigma kwarg,ie,以便算法知道在哪里它可以期望找到这些特征值。尽管如此,我所有的尝试都没有产生任何结果......
是否有对此功能更有经验的人帮我完成这项工作?
下面是完整的代码sn-p:
import numpy as np
from matplotlib import pyplot as plt
from scipy.sparse import csc_matrix, linalg as sla
A = np.load('hill_mat.npy')
print('A shape =', A.shape)
print('A dtype =', A.dtype)
print('A sparsity ratio =',(np.product(A.shape) - np.count_nonzero(A)) / np.product(A.shape) *100, '%')
# quick look at the structure of A
plt.imshow(np.where(A > 1e-15,1.,0), interpolation='None')
# direct
w_dense = np.linalg.eigvals(A)
idx = np.argsort(abs(w_dense.imag))
w_dense = w_dense[idx]
# sparse
w_sparse = sla.eigs(csc_matrix(A), k=100, sigma=0+0j, which='SI', return_eigenvectors=False)
【问题讨论】:
标签: python numpy scipy eigenvalue arpack