共軛梯度法不適用於非對稱系統,因為如 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) 的幾種變體(例如,共軛梯度平方方法 和 雙共軛梯度穩定方法),這些變體在某些情況下提高了此類方法的有效性。