求复对称三对角矩阵的特征值

计算科学 Python 矩阵 特征值
2021-12-21 06:37:06

我试图找到一个大型复杂对称三对角矩阵(至少 10000x10000,理想情况下更大)的特定特征值和 - 向量。我大致知道我在寻找哪些特征值,所以我一直在使用 scipy.linalg.sparse.eigs(真的是 ARPACK)来找到它们。不幸的是,这对于大型矩阵来说很慢 - 求解 7000x7000 矩阵大约需要 30 分钟。

我觉得必须有某种方法可以使用我正在处理的矩阵的对称属性——它不仅仅是任何稀疏的复杂矩阵。作为比较,当我使用相同大小的厄米特矩阵时,linalg.sparse.eigsh 允许我将求解时间减少大约 2 倍。

是否有任何免费可用的特征求解器可以实现有效的算法来对我正在处理的矩阵类型进行对角化?这样的算法是否存在?

2个回答

您可以应用带状cholesky 算法来生成L*L.',尽管稳定性是有问题的,因为您无法限制枢轴增长(与LL' 正定情况不同,后者表现良好)。所以也许一个移位反转策略(因为你知道你想要哪些特征值)可能会给你一个答案。如果您必须通过一个集群来查找您选择的移位附近的特定特征向量,您可以利用这样一个事实,即复对称矩阵的不同特征向量 (vi,vj) 在古怪的非厄米“内积”下是正交的", vi.'*vj = 0。您可以使用该事实来设置一个外部循环,通过 gram-schmidt 将您的 arpack 残差缩小到收敛但不需要的特征向量。请注意,这部分也很狡猾,因为那个“内在产品”<vi,vi>可以是负数/零,因此您的通货紧缩/投影/归一化克施密特系数也可能失控。归根结底,复对称是一个很好的节省存储的属性,但并没有真正赋予与真实/厄米对称相同的鲁棒性。

有很多警告,但是 FWIW 我已经基于此编写了工作软件-否则不会建议。

对于这种情况,LAPACK 似乎有几种方法但是,您必须使用 f2py 包装 fortran 代码。无论哪种方式,算法肯定存在,LAPACK 文档提供了对相关文章的参考。

稍有不同,请确保您使用的是新版本的 gfortran 或(更好的)英特尔的 fortran 编译器 ifort。它可能会为您节省 20% 或更多(在运行时)。