矩陣的 Modified Gram Schmidt 方法
矩陣的 QR 分解在電腦運算中可能造成誤差,本文探討一下一種改進版本的 Gram-Schmidt 正交化方法。
經典的 Gram-Schmidt 方法可能造成數值不穩定性。在電腦中,舍入誤差可能會累積,造成得到的正交基並不具有正交性。
經典的 Gram-Schmidt
我們先來回顧一下經典的 Gram-Schmidt 方法:
1 | for j = 1 : n |
最終我們將 vj 歸一化得到標準正交基 qj = (vj)/(|vj|) 。
注意:CGS 始終使用原始向量 xj 與之前的基向量計算投影
數學證明
簡單進行數學證明
定義第 j 步生成的向量 vj
$$v_j = x_j - \sum_{k=1}^{j-1} ( (v_k^T x_j) / (v_k^T v_k) ) v_k$$
選取任意一個之前的基向量 vm(其中 1 ≤ m < j),計算它與 vj 的內積 vmTvj: $$v_m^T v_j = v_m^T ( x_j - \sum_{k=1}^{j-1} ((v_k^T x_j) / (v_k^T v_k)) v_k )$$
利用內積的線性性質,將 vmT 乘進去:
$$v_m^T v_j = v_m^T x_j - \sum_{k=1}^{j-1} ((v_k^T x_j) / (v_k^T v_k)) (v_m^T v_k)$$
由於前提假設 v1, …, vj − 1 是兩兩正交的,所以在求和符號 ∑ 中:
- 當 k ≠ m 時,vmTvk = 0 。
- 當且僅當 k = m 時,vmTvk = vmTvm ≠ 0 。
因此,求和項中只剩下 k = m 這一項:
vmTvj = vmTxj − ((vmTxj)/(vmTvm))(vmTvm)
分子分母中的標量 vmTvm 相互抵消:
vmTvj = vmTxj − vmTxj
vmTvj = 0
證畢
誤差分析
如果在 CGS(經典格拉姆-施密特正交化)中計算 q2 時發生誤差,導致 q1Tq2 = δ 是一個很小但非零的數值,這個誤差將不會在隨後的任何計算中被修正:
v3 = x3 − (q1Tx3)q1 − (q2Tx3)q2
q2Tv3 = q2Tx3 − (q1Tx3)δ − (q2Tx3) = −(q1Tx3)δ
q1Tv3 = q1Tx3 − (q1Tx3) − (q2Tx3)δ = −(q2Tx3)δ
我們可以看出 v3 與 q1 或 q2 都不正交。
改進的 Gram-Schmidt (MGS)
1 | for j = 1 : n |
最終我們將 vj 歸一化得到標準正交基 qj = (vj)/(|vj|) 。
區別在於,一旦算出來一個向量 q,立即用它去更新後面所有的向量(減去向量在 q 上的投影),使得後面所有的向量與這個向量 q 正交。
誤差分析
假設 MGS 出現:q1Tq2 = δ 很小但非零。
對於第三個向量 v3 :
- 初始狀態:v3(0) = x3
- j = 1 : v3(1) = v3(0) − (q1Tv3(0))q1
- j = 2 : v3 = v3(1) − (q2Tv3(1))q2
此時 v3 是第三個向量在歸一化之前的最終形式。
讓我們檢查正交性,假設不再產生其他誤差:
q2Tv3 = q2Tv3(1) − (q2Tv3(1)) = 0
所以,我們保留了對 q2 的正交性。
接下來看 q1:
q1Tv3 = q1Tv3(1) − (q2Tv3(1))δ
q2Tv3(1) = q2Tv3(0) − (q1Tv3(0))δ
q1Tv3(1) = q1Tv3(0) − (q1Tv3(0)) = 0
由此可得: q1Tv3 = −(q2Tv3(0) − (q1Tv3(0))δ)δ = −q2Tv3(0)δ + q1Tv3(0)δ2
由於 δ 非常小,δ2 就更小了。因此 q1Tv3 中的誤差和 CGS 差不多,但我們消除了 q2Tv3 中的誤差,使得誤差更小。
總結
在電腦中,由於浮點運算的特殊性,有許多數學方法需要重新考慮,儘量提高數值穩定性。這使得我們有必要重新審視我們學習過的數學知識,針對電腦的特殊性進行重新設計與優化。