線性方程組(6)-阿諾爾迪演算法
上一節講到了克雷洛夫子空間單位正交基的計算方法,和伽遼金原理。根據伽遼金原理,把共軛梯度法推廣到一般情況。對一般的矩陣 ,使得第 步的解
其殘差
即 ,這就是阿諾爾迪演算法(Arnoldi algorithm)。
根據伽遼金原理,要解得方程是
其中 得列是 的一組單位正交基,且 。則有
若 和 有LU分解
由於 是上海森堡陣,所以這裡的 只有主對角線和下次對角線非零。
矩陣分塊乘法可得
則有
最終得到的解
令
即
取最後一列,得到
令
即
取最後一行,得到
最終得到
初值
由阿諾爾迪過程的矩陣形式
右乘向量 得到
而
即
最後得到
與共軛梯度法一樣,由於 只涉及加法, 非零不影響結果,只要用 替換 即可。
有限存儲空間的阿諾爾迪演算法
阿諾爾迪演算法需要保存前面所有的向量 ,隨著迭代步數的增加,消耗的存儲空間不斷增加,每步的計算量也不斷增加。為了限制其增長,阿諾爾迪演算法有重啟法和截斷法兩種變種。
重啟法(restarted method)就是當進行到第 步時,將得到的 作為初值重新開始阿諾爾迪演算法。重啟法可以不用每一步都求出解 ,而是直接算出 和 並求解得到 ,而且這裡可以用豪斯霍爾德變換法求 和 。
截斷法(truncated method)又稱為不完全正交法(incomplete orthogonal method)。忽略 與 之間的正交性要求,使得當 時
同時
若
則
以及前面已經推導的
在實現中需要用到循環隊列(circular queue),有興趣的讀者可以嘗試。
蘭佐斯演算法(Lanczos algorithm)
當 對稱時, 變為對稱三對角矩陣 ,於是演算法可以得到簡化。有
令
則
分塊乘法可得
即
以及前面已經推導的
用MATLAB代碼描述(寫代碼的時候發現l不好看,把 換成了 )
function [x, iter] = lanczos_solve(A, b, x0, epsilon, iter_max) iter = 0; n = size(A, 1); x = x0; w = b - A * x0; r_norm = norm(w); v = w / r_norm; beta = 0; p = zeros(n, 1); while r_norm >= epsilon && iter < iter_max iter = iter + 1; if iter == 1 w = A * v; lambda = 0; xi = r_norm; else w = A * v - beta * v_prev; lambda = beta / u; % u == u_{k-1,k-1} xi = - lambda * xi; end v_prev = v; alpha = dot(w, v); % Modified Gram-Schmit u = alpha - lambda * beta; % u := u_{k,k} p = (v - beta * p) / u; x = x + xi * p; w = w - alpha * v; beta = norm(w); % beta := beta_{k+1} v = w / beta; % v := v_{k+1} r_norm = abs(beta * xi / u); endend
每一步仍然時一次矩陣向量乘和兩次內積,但有五次向量的線性組合(算上了 ),相比共軛梯度法多了兩次。
不考慮浮點誤差,蘭佐斯演算法與共軛梯度法得到的迭代結果是相等的。在推導蘭佐斯演算法的過程中,沒有預設 的正定性,這也說明共軛梯度法可以不局限於正定矩陣。但是當 不定時,蘭佐斯演算法與共軛梯度法都有數值不穩定的問題,收斂速度較慢。
下面證明蘭佐斯演算法與共軛梯度法的等價性。
首先,在蘭佐斯演算法中
注意到 和 均為下三角陣,所以 是下三角陣;又因為 對稱,所以 對稱。也就是說 是對角陣,這就證明了對於 ,有
又由
取最後一行最後一列,有
將共軛梯度法第 步的解、殘差和搜索方向分別記為 、 和 。
在第一步,初值相等, 與 均與 共線。
假設在蘭佐斯演算法的第 步得到了與共軛梯度法中相同的解, 且 與 共線。
由
和
可知 與 共線。
同時
注意上面用到了
可知 就是沿 方向搜索到的令 最小的點,所以
惡性中斷
對於可逆的 ,阿諾爾迪演算法無法保證 一定可逆。這時,演算法出現惡性中斷。具體到我們推導出的演算法中,出現了除以 這樣的計算,而這個 不一定非零。這是阿諾爾迪演算法的一個缺陷。
若 對稱正定,則有相似變換
可知 正定,由特徵值的交錯定理可知 正定。也就是說,用蘭佐斯演算法解對稱正定矩陣時不會出現惡性中斷。
同樣,共軛梯度法不出現惡性中斷的特性也依賴正定性。在共軛梯度法中
若 不定,則可能出現 而 的情況。
即使不出現嚴格等於零的情況, 很小時也會引起數值不穩定。
推薦閱讀:
※將線性代數形象化 總結篇
※SVD分解是對矩陣行空間與列空間的關聯
※求解零空間的思考
※線性方程組(4)-變分原理與共軛梯度法
※PRML筆記|線代拾遺(1)