線性方程組(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)