这两种方法有什么区别?一个问题能用一种方法解决,就可以用另一种方法解决吗?两者/或其中之一可以与 OpenMP 和/或 MPI 并行吗?
共轭梯度法和双共轭梯度法有什么区别
共轭梯度法是可证明最快的迭代求解器,但仅适用于对称的正定系统。如果有一种迭代方法对不定或非对称矩阵具有相似的属性,那将非常方便。
CG方法在每一步都寻求近似解在 Krylov 子空间内
.
双共轭梯度法的本质思想是保持第二个 Krylov 子空间
并寻求具有与 CG 相似的正交特性的递归,但没有求解的稳定性问题.
不幸的是,如果你天真地应用它,那将失败。然而,通过在每个 BiCG 步骤之后执行一个广义最小残差 (GMRES) 算法,得到的迭代是稳定的;这通常称为 BiCG-Stab。
因此,BiCG-Stab(原则上)是比 CG 更通用的求解器,但在应用于 CG 所要解决的问题时效率更低。BiCG 或 BiCG-stab 需要更多的矩阵向量乘法和更多的点积,因此如果您通过分布式内存多处理将它们并行化,您将产生更多的通信开销,但尽管如此,它们仍可以随心所欲地扩展。
这里有两件事值得注意,它们比我刚才所说的其他垃圾更重要:
对于每一种迭代方法(BiCG、GMRES、QMR...),都有一个矩阵会使其无法在有限精度算术中收敛。
因此,为您的特定矩阵提出一个好的预处理器可能比使用最优的外层迭代求解器更重要。
编辑:对于开源库,最受欢迎的两个是PETSc和Trilinos。我强烈建议您还获得 Python 绑定,分别是 petsc4py 和 PyTrilinos。您也可以尝试Eigen。一方面,它没有很多功能,但另一方面,它只有你需要的,没有更多;如果您打算阅读代码而不是仅仅使用它,Eigen 可能是最简单的。
另见:Yousef Saad,稀疏线性系统的迭代方法;Nachtigal 等人,非对称矩阵迭代有多快?
共轭梯度法仅适用于求解系统
如果是对称且正定的(也适用于负定)。它必须是对称的原因是共轭梯度通过最小化(或最大化)函数来工作
请注意,导数是
而如果是对称的所以上面减少到
至少,和是您系统的解决方案。最后一步应该清楚为什么必须是对称的。正/负确定属性更微妙,但它是必需的,以便存在极值。
双共轭梯度法适用于任何系统。它通过解决这两个问题来做到这一点
随着
同时。具体细节我不熟悉,就不假装知道了。知道双共轭梯度是两者中更一般的就足够了。它确实存在稳定性问题,如果是对称的,那么共轭梯度将执行较少的工作来获得解决方案。
就并行性而言,如果您的系统很大,则可以在求解器迭代中涉及的线性代数中获得大量并行性,因此没有理由并行线性代数库不会带来性能提升。