繁体   English   中英

使用 scipy.sparse.linalg.eigs 计算复杂特征值

[英]Complex eigenvalues computation using scipy.sparse.linalg.eigs

鉴于以下输入 numpy 二维数组A可以通过文件hill_mat.npy使用以下链接检索,如果我可以使用像scipy.sparse.linalg这样的迭代求解器仅计算其特征值的子集,那就太好了。 .

首先,一点上下文。 该矩阵A来自大小为N的二次特征值问题,该问题已在双大小2*N的等效特征值问题中线性化。 A具有以下结构(蓝色为零):

plt.imshow(np.where(A > 1e-15,1.,0), interpolation='None')

A_imshow.png

以及以下特点:

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 教程中,当寻找像which = 'SI'这样的小特征值时,应该通过指定sigma kwarg 来使用所谓的移位反转模式,为了让算法知道它可以在哪里找到这些特征值。 尽管如此,我所有的尝试都没有产生任何结果......

有没有对这个 function 更有经验的人帮我完成这项工作?

下面是一个完整的代码片段:

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)

问题终于解决了,我想我应该更仔细地阅读文档,但是,以下内容非常违反直觉,我认为可以更好地强调:

... ARPACK 包含一种允许快速确定非外部特征值的模式:移位反转模式 如上所述,这种模式涉及将特征值问题转换为具有不同特征值的等价问题。 在这种情况下,我们希望找到接近零的特征值,因此我们将选择sigma = 0 转换后的特征值将满足方程 ,所以我们的小特征值拉姆达 变大怒 特征值。

这样,当寻找小的特征值时,为了帮助 LAPACK 完成工作,应该通过指定适当的sigma值来激活移位反转模式,同时反转在which关键字参数中指定的所需指定子集。

因此,只需执行以下操作:

w_sparse = sla.eigs(csc_matrix(A), k=100, sigma=0+0j, which='LM', return_eigenvectors=False, maxiter=2000)
idx = np.argsort(abs(w_sparse.imag))
w_sparse = w_sparse[idx]

因此,我只能希望这个错误对其他人有所帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM