如何使用 PETSc 估计大型稀疏矩阵的条件数?

计算科学 宠物 线性代数
2021-12-23 23:19:03

我有一个 PETSc Mat,想估计它的条件编号。

1个回答

对于小矩阵,可以使用奇异值分解可靠地计算条件数。对矩阵执行 aKSPSolve()并使用-pc_type svd -pc_svd_monitor.

对于较大的矩阵,您可以使用 Krylov 方法估计条件数。例如,GMRES 执行的 Arnoldi 迭代增量计算 Hessenberg 分解。Hessenberg 矩阵的极值奇异值和特征值很好地近似于原始矩阵。要让 PETSc 以这种方式估计特征值,请运行

-ksp_monitor_singular_value -ksp_type gmres -ksp_gmres_restart 1000 -pc_type none

这些选项表示在每次 Krylov 迭代中估计极值奇异值。GMRES 用于计算 Krylov 空间(您也可以使用 CG),并重新启动。在重新启动时,GMRES 会丢弃当前的 Krylov 空间,因此奇异值估计的所有进度都会在重新启动时丢失。最后一个选项-pc_type none表示在未预处理的矩阵上执行此迭代。默认情况下,前置条件运算符 (P1A或者AP1) 将被使用,因此您最终会得到预处理运算符的估计值。

这对于最大奇异值通常是准确的,但可能会高估最小奇异值,除非该方法已经收敛。如果您有矩阵的求解器(例如使用KSPSolve()),那么您可以估计 的最小奇异值A使用相同的程序应用于A1.

如果您需要更准确地估计最小奇异值(以及所有其他特征值和奇异值问题),请使用SLEPc 。