黑盒矩阵的特征向量

计算科学 线性代数 pde 特征值 矩阵方程
2021-11-29 00:13:43

考虑广义特征问题在数值求解偏微分方程时(特别是,我有兴趣在正交坐标中找到二维拉普拉斯算子的狄利克雷特征模态,即)这个问题的形式为Ax=λBx2u=λu

A1X+XA2T=λBX

其中是我们的特征向量(在网格点采样的特征函数),是微分矩阵,是雅可比行列式(在网格点处采样),符号表示逐元素乘法。我只对与最小特征值对应的特征模态感兴趣。XRm×nuA1Rm×mA2Rn×nBRm×n

在克罗内克积的帮助下,问题可以向量化如下:

(IA1+A2I)x=λdiag(B)x

其中的列堆叠形成的向量的列形成的对角矩阵xRmnXdiag(B)B

这样做的问题是,生成的矩阵不必要地稀疏并且大小为,当我尝试解决适度大的大小(比如 200)时,我的计算机内存不足。显然这不是办法。mn×mnmn

我知道现代特征值算法非常复杂,自己编码并不是最好的选择。所以我正在寻找一个迭代求解器,它只依赖于计算矩阵向量乘积与并允许用户将它们作为黑盒提供。AB

3个回答

我推荐ARPACK,它为广义特征值问题提供无矩阵例程,并在其文档中为此目的提供示例。此方法是使用最广泛的方法之一,特别是对于您只搜索几个特征值/向量(例如最小的,在您的情况下)的相对较大的问题。

此外,大小为的特征值问题并不是特别大,并且可能在任何现代工作站上都​​可以解决。但是,如果这个问题变得更大,黄金标准是SLEPc,它是一个包含许多特征值求解器的库,可以将您的问题分布在许多计算节点上。104

您是对的,为大型稀疏系统编写高效且强大的特征值求解器是一项艰巨的任务,只能作为最后的手段自己完成。Spencer 已经在他的回答中给出了主要参与者(用于单节点多线程计算的 ARPACK,它是 MATLAB 和 SciPy 的一部分,以及用于分布式计算的 SLEPc,可以通过slepc4py在 Python 中访问)。两者都解决了广义特征值问题,并且都可以采用计算矩阵向量乘积而不是矩阵的过程。

由于您对最小量级特征值感兴趣,您可能需要使用移位和反转策略(即,计算最小量级特征值A1. 当然,您永远不会真正计算逆矩阵。相反,每当您需要计算A1v对于一些向量v, 你解决Aw=v并使用w为了A1v. 有几种策略可以加速这一点,基于 ARPACK/SLEPc 也只需要一个提供逆向应用程序的过程(显而易见的那些应该已经在 ARPACK/SLEPc 中实现):

  1. 由于您需要重复求解线性系统,因此您需要计算矩阵的 LU 或 Cholesky 因式分解A提前并在迭代期间使用线性求解的(更快的)后向/前向替换部分。

  2. 在您的情况下,您可能一开始就不想构建大张量积矩阵;在这种情况下,使用迭代求解器(例如 CG)来求解Aw=v以及(特别是如果你能提供一个好的预处理器)。这样,整个特征值求解器只需要一个过程来执行矩阵向量乘法。(您可能必须稍微调整一下公差才能获得好的结果。)

我完全同意到目前为止发布的答案。我想指出矩阵

A=(IA1+A2I)

永远不需要明确地形成。正如其他答案正确指出的那样,只需要与 A 或其倒数形成矩阵向量积 (matvecs)。形式的 MatvecsAx可以使用身份完成

(BTC)x=vec(CXB),

在哪里vec(X)=x. 所以,在你的情况下

Ax=vec(A1X)+vec(XA2T).

要将逆运算符应用于向量(根据最小广义特征值的需要),您可以使用 Krylov 子空间方法。您可以对 matvecs 使用相同的技巧。