密集病态矩阵的对角化

计算科学 线性代数 并行计算 本征系统 精确 密集矩阵
2021-12-24 06:09:11

我正在尝试对一些密集的病态矩阵进行对角化。在机器精度方面,结果不准确(返回负特征值,特征向量不具有预期的对称性)。我切换到 Mathematica 的 Eigensystem[] 函数以利用任意精度,但计算速度非常慢。我愿意接受任何数量的解决方案。是否有非常适合病态问题的包/算法?我不是预处理方面的专家,所以我不确定这有多大帮助。否则,我能想到的只是并行的任意精度特征值求解器,但我不熟悉 Mathematica、MATLAB 和 C++ 之外的任何东西。

为了提供有关该问题的一些背景知识,矩阵很大,但不是很大(最多 4096x4096 到 32768x32768)。它们是实数、对称的,特征值在 0 和 1 之间(不包括),许多特征值非常接近 0,没有一个接近 1。矩阵本质上是一个卷积算子。我不需要对所有矩阵进行对角化,但我可以走的越大越好。我可以访问具有许多处理器和分布式计算能力的计算集群。

谢谢

2个回答

计算 SVD 代替谱分解。结果在精确算术中是相同的,因为您的矩阵是对称正定矩阵,但在有限精度算术中,您将获得更准确的小特征值。

编辑:参见 Demmel 和 Kahan,双对角矩阵的准确奇异值,SIAM J. Sci。统计。计算。11 (1990), 873-912。
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

编辑2;请注意,没有任何方法能够解析小于所用机器精度的标准倍的特征值,因为将单个条目更改一个 ulp 可能已经将一个小的特征值更改了这么多。因此,用零特征值代替非常小的特征值是合适的,并且没有任何方法(除了以更高的精度工作)将解开相应的特征向量,而只是返回公共数字零空间的基础。

谢谢你的建议。我尝试了 Mathematica 的 SVD 命令,但没有得到明显的改进(仍然缺少适当的对称性,“特征值”错误地为零,而之前错误地出现负数)。也许我需要实现您上面描述的算法之一,而不是内置函数?我可能希望避免使用这种特定方法的麻烦,除非我提前确定它会提供显着的改进。

@JackPoulson,我浏览了有关您引用的 Jacobi 方法的论文,它看起来很有希望。您或任何人能否推荐一种实施 Jacobi 寻找特征系统方法的好方法?我猜如果我自己编写代码(在 MATLAB 中),它会非常慢。