線性方程組(8)-共軛殘差法
到了廣義最小殘差法。和蘭佐斯演算法一樣,最小殘差法利用了矩陣的對稱性,從而將遞推關係簡化到只與前兩步有關。而共軛梯度法則是蘭佐斯演算法在變分原理的觀點下推導出的等價演算法,因此我們也可以嘗試用變分原理的觀點去推導GMRES的等價演算法,即考慮函數
其梯度
一維優化問題
若前一步的解為 ,沿 方向搜索 的最小值
代入得
可知最佳的 為
廣義共軛殘差法(Generalized conjugate residual method, GCR)
假設前 步使用的搜索方向是線性無關的向量 ,而且前 步得到的 滿足
且希望第 步得到的結果
滿足
將 和 在對應子空間的基上展開,並對展開係數求偏導可知,對於
設
則有
也就是將 對 施密特正交化
於是就得到了廣義共軛殘差法。
當 不是 的特徵子空間時(如果是,那麼在第 步可求得精確解),可以證明
當 和 時容易驗證成立。假設當 和 時成立,那麼
即
又因為 ,所以 ;又因為 不是 的特徵子空間,所以 ,即
所以 的維度為 ,所以
由
可得
同理有
即當 時也成立。歸納可知對任意的 都成立。
由
可知
即
對 有
每一步的殘差與前面所有的殘差 共軛,這就是「共軛殘差」名字的來源。注意當 非對稱時,共軛關係也是非對稱的
的計算式可以進一步簡化
注意到與共軛梯度法不同的是,GCR中的 可以是任意可逆矩陣,且運算過程中仍然需要保存 。為了限制其增長,也有重啟和截斷兩種方法。
用MATLAB代碼描述截斷的GCR
function [x, iter] = gcr_solve(A, b, x0, m, epsilon, iter_max) iter = 0; n = size(A, 1); p = zeros(n, m); Ap = zeros(n, m); Ap_square = zeros(m, 1); x = x0; r = b - A * x0; Ar = A * r; p(:, 1) = r; Ap(:, 1) = Ar; Ap_square(:, 1) = dot(Ar, Ar); while norm(r) >= epsilon && iter < iter_max iter = iter + 1; i_curr = mod(iter - 1, m) + 1; i_next = mod(iter, m) + 1; alpha = dot(r, Ar) / Ap_square(i_curr); x = x + alpha * p(:, i_curr); r = r - alpha * Ap(:, i_curr); Ar = A * r; p_next = r; Ap_next = Ar; for prev = max(iter - m + 1, 1): iter i_prev = mod(prev - 1, m) + 1; beta = - dot(Ap_next, Ap(:, i_prev)) / Ap_square(i_prev); p_next = p_next + beta * p(:, i_prev); Ap_next = Ap_next + beta * Ap(:, i_prev); end p(:, i_next) = p_next; Ap(:, i_next) = Ap_next; Ap_square(i_next) = dot(Ap_next, Ap_next); endend
共軛殘差法(conjugate residual method, CR)
共軛殘差法可以視為廣義共軛殘差法在 對稱時的特殊情況。
因為
當 時,對於對稱的 ,有
於是遞推關係可簡化為
其中
用MATLAB代碼描述
function [x, iter] = cr_solve(A, b, x0, epsilon, iter_max) iter = 0; x = x0; r = b - A * x0; p = r; Ap = A * p; rAr_prev = dot(r, A * r); while norm(r) >= epsilon && iter < iter_max iter = iter + 1; alpha = rAr_prev / dot(Ap, Ap); x = x + alpha * p; r = r - alpha * Ap; Ar = A * r; rAr_curr = dot(r, Ar); beta = rAr_curr / rAr_prev; p = r + beta * p; Ap = Ar + beta * Ap; rAr_prev = rAr_curr; endend
GCR與GMRES的等價性
GCR與GMRES都是在 中最小化 ,所以理論上應是等價的。嚴格證明留作練習。
迭代停滯
對於一般的 ,在GCR中可能出現 ,則 ,導致迭代停滯。
在GMRES中同樣會出現迭代停滯,即
的最後一個元素為零時,會出現
推薦閱讀:
※深度學習讀書筆記 第一部分 線性代數
※線性方程組(3)-靜態迭代法
※線性方程組(2)-兩個令人腦殼疼的傢伙
※關於方陣的特徵值和特徵向量的思考
※求解零空間的思考