对于大型稀疏对称矩阵,SLEPc 特征求解器需要很长时间才能收敛

计算科学 线性代数 C++ 特征值 宠物 预处理
2021-11-28 10:22:06

我正在利用 SLEPc 库求解大小为 200,000 的矩阵的第一个(其中)特征值及其对应的向量。该矩阵是稀疏且对称的。打算在不使用 MPI 的情况下计算特征值,因此整个计算需要 2 分钟以上。我已经尝试过许多特征求解器,例如 Krylov-Schur、Jacobi-Davidson 和 Rayleigh Quotient CG,但完成它们每个的计算都需要大量时间。kk=34

相反,Lanczos/Krylov-Schur 非常快地返回频谱的极端特征值。如果我可以为光谱的内部值复制这种行为,那就太棒了。但到目前为止,我还没有遇到任何成功。

有什么方法可以使用单个 MPI 进程加速收敛?调整容差和最大迭代次数并没有帮助。

到目前为止,这些是我尝试过的大小为 51309 x 51309 的稀疏对称矩阵:

./RunPart -eps_type gd -st_type precond -st_pc_type ilu -eps_target 0.01 -eps_tol 1e-6 -eps_conv_abs -eps_nev 5

这需要 42.76 秒来产生 4 个特征值。

./RunPart -st_type sinvert -eps_target 0.001 -st_pc_type ilu -eps_tol 1e-5 -eps_conv_abs -eps_nev 4

这大约需要 13.49 秒,但特征值包含大量错误。

       k       ||Ax-kx||/||kx||
 -------------- ----------------
     0.087226       0.0797854
     0.088502       0.0947138
     0.089405       0.0702111
     0.091540       0.0483211

有人可以就这个问题提供一些指导吗?

1个回答

我已经尝试过许多特征求解器,例如 Krylov-Schur、Jacobi-Davidson 和 Rayleigh Quotient CG,但完成它们每个的计算都需要大量时间。

考虑使用Arnoldi 迭代它应该包含在您的 SLEPc 分布中,并且通常在只需要稀疏矩阵的最大特征值(或最小,如果您有可用的逆运算符)时使用。还要意识到您的矩阵在大多数指标上都有些大。

相反,Lanczos/Krylov-Schur 非常快地返回频谱的极端特征值。如果我可以为光谱的内部值复制这种行为,那就太棒了。但到目前为止,我还没有遇到任何成功。

我认为这个问题可能是虚假的。如果您的矩阵是对称的,那么计算第二大特征值(在计算第一个特征值之后)通常不会比计算第一个最大特征值更昂贵。这是因为一旦计算了对称矩阵,您就可以简单地从对称矩阵中删除任何特征模态

您的某些内部特征值可能条件不佳/高度敏感。此处详细讨论了有关此问题的一些讨论,并且可能会有所帮助。