線性方程組(7)-最小殘差法
在上一節中,從共軛梯度法得到啟發,取 ,我們得到了阿諾爾迪演算法。通過證明蘭佐斯演算法與共軛梯度法的等價性,找到了變分原理與伽遼金原理之間的某種聯繫。
我們重新考慮變分原理並選取函數
廣義最小殘差法(Generalized minimal residual method, GMRES)
若
由阿諾爾迪過程
則有
其中
所以,求 的最小值等價於用最小二乘法求解超定方程
設 和 有QR分解
若
矩陣分塊乘法可得
令
再進行一次吉文斯旋轉(Givens rotation)即可完成QR分解
則有
方程變為
最小二乘解相當於解前 行。
令 的前 行為 ,和阿諾爾迪演算法一樣,可以令
得到的解和殘差
同樣得到
初值
和 的初值可統一為
有限存儲空間的廣義最小殘差法
和阿諾爾迪演算法一樣,GMRES也需要保存前面所有的 。為了限制存儲空間的增長,也有重啟法和截斷法兩種變種。
這裡再說說截斷法。當 時,
有
即 的最後一列比 的最後一列多一個非零元素 ,對 也只需要存儲
和 。
最小殘差法(Minimal residual method, MINRES)
在這裡我們先講廣義最小殘差法,然後將狹義的最小殘差法作為特殊情況。和蘭佐斯演算法一樣,對於對稱的 , 變為三對角矩陣 ,有
令
有
以及前面以及推導的
用MATLAB代碼描述
function [x, iter, e] = minres_solve(A, b, x0, epsilon, iter_max) iter = 0; n = size(A, 1); % 循環隊列 p = zeros(n, 2); c = ones(2, 1); s = zeros(2, 1); v = zeros(n, 2); beta = zeros(2, 1); x = x0; w = b - A * x0; eta = norm(w); v(:, 1) = w / eta; while abs(eta) >= epsilon && iter < iter_max iter = iter + 1; e(iter) = abs(eta); i_0 = mod(iter + 1, 2) + 1; % k i_1 = mod(iter, 2) + 1; % k - 1, k + 1 i_2 = i_0; % k - 2 w = A * v(:, i_0) - beta(i_0) * v(:, i_1); alpha = dot(w, v(:, i_0)); w = w - alpha * v(:, i_0); beta(i_1) = norm(w); % eta_{k+1} v(:, i_1) = w / beta(i_1); % v_{k+1} r_2 = s(i_2) * beta(i_0); t_1 = c(i_2) * beta(i_0); r_1 = c(i_1) * t_1 + s(i_1) * alpha; t_0 = - s(i_1) * t_1 + c(i_1) * alpha; r_0 = sqrt(t_0 ^ 2 + beta(i_1) ^ 2); c(i_0) = t_0 / r_0; s(i_0) = beta(i_1) / r_0; p(:, i_0) = (v(:, i_0) - r_2 * p(:, i_2) - r_1 * p(:, i_1)) / r_0; xi = c(i_0) * eta; eta = - s(i_0) * eta; x = x + xi * p(:, i_0); endend
惡性中斷?
要優化的函數的梯度
因為
所以
即
相當於伽遼金原理中, , 。GMRES相當於求解方程
當 可逆時
即 可逆。故GMRES不存在惡性中斷。
而阿諾爾迪演算法中
沒有這個性質。
數值實驗
分別對正定和不定矩陣用蘭佐斯演算法和MINRES求解,記錄每一步殘差的範數
對於正定矩陣來說,MINRES的收斂速度和蘭佐斯演算法相差不大,由於其計算開銷略大,所以實際求解速度可能還不如蘭佐斯演算法。
而對於不定矩陣來說,蘭佐斯演算法不能滿足
其收斂曲線不穩定,MINRES則沒有這個問題。在這種情況下MINRES將優於蘭佐斯演算法。
推薦閱讀: