線性方程組(4)-變分原理與共軛梯度法
上一節講到了靜態迭代法。因為收斂太慢,更常用的還是非靜態迭代法。
這裡先從變分原理入手。考慮函數
若 對稱,則函數的梯度
若 對稱正定,則解方程 等價於求函數 的最小值。方程的殘差 即為函數 的負梯度。
一維優化問題
假設已經得到了 步迭代的解 ,在第 步中,沿 方向搜索最優解,即
代入函數表達式可得
最優的 取值應是
得到新的解後,新的殘差
最速下降法(Steepest descent method)
搜索方向的最簡單的取法就是取 ,即負梯度方向,這就是優化問題中很常用的最速下降法。用MATLAB代碼描述
function [x, iter] = sd_solve(A, b, x0, epsilon, iter_max) iter = 0; x = x0; r = b - A * x0; rr = dot(r, r); while sqrt(rr) >= epsilon && iter < iter_max iter = iter + 1; Ar = A * r; alpha = rr / dot(r, Ar); x = x + alpha * r; r = r - alpha * Ar; rr = dot(r, r); endend
注意提取出了 和 兩個公共表達式,避免了重複計算。
每一步迭代需要計算一次矩陣向量乘,兩次向量內積,兩次向量線性組合。
注意到 的計算可能有誤差積累,干擾迭代終止條件的判斷,使得迭代在達到要求的精度之前終止。可能的解決方法有:用 來計算更精確的殘差,引入一次額外的矩陣向量乘;或用更小的 ;或用其它迭代終止條件。
假設精確解為 ,則有結論
共軛梯度法(Conjugate gradient method, CG)
假設前 步使用的搜索方向是線性無關的向量 ,而且前 步得到的 滿足
且希望第 步得到的結果
滿足
將 和 在子空間中展開
有
對於
由前面的條件
得到
這就是共軛梯度法,即選擇兩兩 共軛的一系列搜索方向。僅有這個約束還不足以確定 ,為了得到一個確定的搜索方向,我們選擇將 對 正交化
其中 是使得 最小的係數(垂線最短)。
為了下面的推導,先提出一個引理,證明留作練習(提示:數學歸納法)
由
可知 正交於 ,再根據引理可以推出下面的推導中所需要的所有正交關係。
因為
所以
由正交性
第二項在 時取最小值,所以
又因為我們只關心 的方向,不關心其大小,可以寫成
的計算式可以繼續簡化
因為
所以
經過上面一大段推導,共軛梯度法終於呈現在我們眼前,用MATLAB代碼描述
function [x, iter] = cg_solve(A, b, x0, epsilon, iter_max) iter = 0; x = x0; r = b - A * x0; p = r; rr_prev = dot(r, r); % 上一步得到的解的殘差平方和 while sqrt(rr_prev) >= epsilon && iter < iter_max iter = iter + 1; Ap = A * p; alpha = rr_prev / dot(p, Ap); x = x + alpha * p; r = r - alpha * Ap; rr_curr = dot(r, r); % 這一步得到的解的殘差平方和 beta = rr_curr / rr_prev; p = r + beta * p; % 下一步的p rr_prev = rr_curr; endend
每一步迭代需要計算一次矩陣向量乘,兩次向量內積,三次向量線性組合。
注意,因為要求
所以初值
如果能找到一個更接近精確解的非零初值 ,則等價於解 中的 ,最後得到原方程的解 ;由於 只涉及加法,根據加法交換律和結合律,這個累加放在開頭還是結尾不影響結果,於是可以取 。
按照前面的理論,共軛梯度法迭代到第 步時
即得到精確解。也就是說,共軛梯度法是一種理論上的直接解法。
但是和LU分解法一樣,在實際計算中,由於浮點誤差的積累,理論上的精確解沒有意義。我們只需要把共軛梯度法看成迭代法即可,達到迭代終止條件之前的迭代步數小於 或者大於 都沒關係。這個現象在之後還會再遇到。
共軛梯度法的收斂性
對於條件數較大的矩陣,共軛梯度法的收斂速度比最速下降法快很多。
共軛梯度法要求係數矩陣正定,因為只有正定才存在最小值;實際上對於不定矩陣,共軛梯度法也很有可能收斂到梯度為零所對應的鞍點,不過不能從理論上保證收斂性。
共軛梯度法的變種
將共軛梯度法推廣到非對稱矩陣,最簡單的辦法是把方程
轉換為
由於 對稱正定,可以使用共軛梯度法解該方程。這就是正規方程的共軛梯度法。由於
所以收斂較慢。
雙共軛梯度法(Bi-conjugate gradient method)也可以應用於非對稱矩陣。計算兩組 和
其中
維護 的雙正交性和 的雙共軛性,對於
雙共軛梯度法有數值不穩定的現象,在迭代一定步數後,由於浮點誤差積累,雙正交性和雙共軛性不再保持。穩定雙共軛梯度法(Bi-conjugate gradient stablilized method)通過將一維搜索擴增到高維來修正這一誤差,當搜索維數高時收斂速度提升,但單步迭代計算量和消耗的存儲空間也將提升。
推薦閱讀: