今天介紹數值計算和優化方法中非常有效的一種數值解法,共軛梯度法。我們知道,在解大型線性方程組的時候,很少會有一步到位的精確解析解,一般都需要通過迭代來進行逼近,而 PCG 就是這樣一種迭代逼近算法。
我們先從一種特殊的線性方程組的定義開始,比如我們需要解如下的線性方程組:
Ax=b
這里的
A(n×n)
是對稱,正定矩陣,
b(n×1)
同樣也是已知的列向量,我們需要通過
A
和
b
來求解
x(n×1)
, 這其實是我們熟知的一些線性系統的表達式。
直接求解
首先,我們來看一種直觀的解法,我們定義滿足如下關系的向量為關於 矩陣
A
的共軛向量,
uTAv=0
因為矩陣
A
是對稱正定矩陣,所以矩陣
A
定義了一個內積空間:
⟨u,v⟩A:=⟨Au,v⟩=⟨u,ATv⟩=⟨u,Av⟩=uTAv
基於此,我們可以定義一組向量
P
P={p1,…,pn}
其中的向量
p1
,
p2
, … ,
pn
都是互為共軛的,那么
P
構成了
Rn
空間的一個基,上述方程的解
x∗
可以表示成
P
中向量的線性組合:
x∗=∑i=1nαipi
根據上面的表達式,我們可以得到:
Ax∗=∑i=1nαiApipTkAx∗=∑i=1nαipTkApi(Multiply left by pTk)pTkb=∑i=1nαi⟨pk,pi⟩A(Ax∗=b and ⟨u,v⟩A=uTAv)⟨pk,b⟩=αk⟨pk,pk⟩A(uTv=⟨u,v⟩ and ∀i≠k:⟨pk,pi⟩A=0)
這意味着:
αk=⟨pk,b⟩⟨pk,pk⟩A
所以,如果我們要直接求解的,可以先對矩陣
A
進行特征值分解,求出一系列的共軛向量,然后求出系數,最后可以得到方程的解
x∗
迭代求解
上面的方法已經說明,
x∗
是一系列共軛向量
p
的線性組合,學過 PCA 的都知道,可以用前面占比高的向量組合進行逼近,而不需要把所有的向量都組合到一起,PCG 也是用到了這種思想,通過仔細的挑選共軛向量
p
來重建方程的解
x∗
。
我們先來看下面的一個方程:
f(x)=12xTAx−xTb,x∈Rn
對上面的方程求導,我們可以得到:
D2f(x)=A
Df(x)=Ax−b
可以看到,方程的一階導數就是我們需要解的線性方程組,令一階導數為 0,那么我們需要解的就是這樣一個線性方程組了。
假設我們隨機定義
x
的一個初始向量為
x0
,那么我們可以定義第一個共軛向量為
p0=b−Ax0
, 后續的基向量都是和梯度共軛的,所以稱為共軛梯度法。
下面給出詳細的算法流程:

而 preconditioned conjugate gradient method 與共軛梯度法的不同之處在於預先定義了一個特殊矩陣
M
:

參考來源:wiki 百科
https://en.wikipedia.org/wiki/Conjugate_gradient_method#The_preconditioned_conjugate_gradient_method