共轭梯度法不适用于非对称系统,因为如 Voevodin (1983) 以及 Faber 和 Manteuffel (1984) 所证明的那样,残差向量无法通过短递推关系保持正交性。广义最小残差法通过使用长递推关系来保持残差的正交性,但代价是需要更大的存储空间。双共轭梯度法 (BCG) 采用了另一种方法,用两个相互正交的序列代替残差的正交序列,但代价是不再提供最小化。
双共轭梯度法中,残差的更新关系在共轭梯度法的基础上进行了扩充,使用了类似的关系,但基于 而不是
。因此,我们更新两个残差序列
(1)
| |||
(2)
|
以及两个搜索方向序列
(3)
| |||
(4)
|
选择
(5)
| |||
(6)
|
确保正交关系
(7)
|
如果 。
关于双共轭梯度法的收敛性,已知的理论结果很少。对于对称正定系统,该方法产生与共轭梯度法相同的结果,但每次迭代的成本是其两倍。对于非对称矩阵,研究表明,在该过程残差范数显著减小的阶段,该方法在迭代次数方面或多或少与完整的广义最小残差法相当(Freund 和 Nachtigal 1991)。在实践中,这通常得到证实,但也观察到收敛行为可能非常不规则,并且该方法甚至可能崩溃。由于可能发生的事件导致的崩溃情况
(8)
|
可以通过所谓的超前策略来规避(Parlett et al. 1985)。另一种崩溃情况,
(9)
|
当 LU 分解 失败时发生(参见 共轭梯度法),并且可以通过使用另一种分解来修复。例如,在 准最小残差法 的一些版本中就是这样做的。
有时,可以通过在(接近)崩溃步骤之前的迭代步骤处重新启动来令人满意地避免崩溃或接近崩溃的情况。另一种可能性是切换到更稳健(但可能更昂贵)的方法,例如广义最小残差法。
双共轭梯度法 (BCG) 需要计算矩阵向量积 和转置乘积
。在某些应用中,后一个乘积可能无法执行,例如,如果矩阵不是显式形成的,并且常规乘积仅以运算形式给出,例如作为函数调用求值。
在并行环境中,理论上可以同时执行两个矩阵向量积;但是,在分布式内存环境中,根据 的存储方案,与两个矩阵向量积之一相关的通信成本会增加。矩阵的重复副本将缓解此问题,但代价是矩阵的存储需求加倍。
在选择预处理器时也必须谨慎,因为在涉及预处理矩阵的两次求解过程中也会出现类似的问题。
很难对广义最小残差法 (GMRES) 和双共轭梯度法 (BCG) 进行公平的比较。广义最小残差法 (GMRES) 确实最小化了残差,但代价是为了保持所有残差正交而增加了工作量,并增加了对内存空间的需求。双共轭梯度法 (BCG) 不最小化残差,但通常其精度与广义最小残差法 (GMRES) 相当,代价是每次迭代步骤的矩阵向量积量是其两倍。然而,基向量的生成相对便宜,并且内存需求适中。已经提出了双共轭梯度法 (BCG) 的几种变体(例如,共轭梯度平方方法 和 双共轭梯度稳定方法),这些变体在某些情况下提高了此类方法的有效性。