LU分解、LDLT分解和Cholesky分解

LU分解

概念:假定我們能把矩陣A寫成下列兩個矩陣相乘的形式:A=LU,其中L爲下三角矩陣,U爲上三角矩陣。這樣我們可以把線性方程組Ax= b寫成

Ax= (LU)x = L(Ux) = b。令Ux = y,則原線性方程組Ax = b可首先求解向量y 使Ly = b,然後求解 Ux = y,從而達到求解線性方程組Ax= b的目的。

LU分解的基本思想

將係數矩陣A轉變成等價的兩個矩陣L和U的乘積,其中L和U分別是下三角和上三角矩陣,而且要求L的對角元素都是1;

由LU = A及對L和U的要求可以得到分解的計算公式。根據下式(獨立特爾Doolittle分解):





在計算機程序中常常用到這種方法解線性代數方程組。它的優點是存儲量很省。L和U中的三角零元素都不必存儲,這樣只用一個n階仿真就可以把L和U存儲起來。

即:下三角存儲L各元素而上三角存儲U的元素。

再考察公式S會發現A中任一元素aij只在計算lij(j<=i)和uij(u>=j)中用到一次,以後就不再出現了,因爲完全可以利用原始數據A的單元,一個個逐次存儲L或U中

的相應元素,即:


當係數矩陣A完成了LU分解後,方程組Ax = b就可以化爲L(Ux) = b,等價於求解兩個方程組Ly = b和Ux = y;

具體計算公式爲


採用LU分解有如下特點:

(1)LU分解與右端向量無關。先分解,後回代,分解的運算次數正比於n^3,回代求解正比於n^2。遇到多次回代時,分解的工作不必重新做,這樣節省計算時間。

(2)分解按步進行,前邊分解得到的信息爲後邊所用。

(3)【A】矩陣的存儲空間可利用,節省存儲。


LDLT分解法

實際問題中,當求解方程組的係數矩陣是對稱矩陣時,則用下面介紹的LDLT分解法可以簡化程序設計並減少計算量。

從定理可知,當矩陣A的各階順序主子式不爲零時,A有唯一的Doolittle分解A= LU。矩陣U的對角線元素Uii 不等於0,將矩陣U的每行依次提出,


定理:若對稱矩陣A的各階順序主子式不爲零時,則A可以唯一分解爲A= LDLT,這裏


LT爲L的轉置矩陣。

當A有LDLT分解時,利用矩陣運算法則及相等原理易得計算ljk和dk的公式爲



Cholesky分解

Cholesky分解是一種分解矩陣的方法, 在線形代數中有重要的應用。Cholesky分解把矩陣分解爲一個下三角矩陣以及它的共軛轉置矩陣的乘積(那實數界來類比的話,此分解就好像求平方根)。與一般的矩陣分解求解方程的方法比較,Cholesky分解效率很高。

Cholesky分解的條件

 

一、Hermitianmatrix:矩陣中的元素共軛對稱(複數域的定義,類比於實數對稱矩陣)。Hermitiank意味着對於任意向量x和y,(x*)Ay共軛相等

二、Positive-definite:正定(矩陣域,類比於正實數的一種定義)。正定矩陣A意味着,對於任何向量x,(x^T)Ax總是大於零(複數域是(x*)Ax>0)

 

Cholesky分解的形式

 

可記作A = L L*。其中L是下三角矩陣。L*是L的共軛轉置矩陣。


可以證明,只要A滿足以上兩個條件,L是唯一確定的,而且L的對角元素肯定是正數。反過來也對,即存在L把A分解的話,A滿足以上兩個條件。

 

如果A是半正定的(semi-definite),也可以分解,不過這時候L就不唯一了。

 

特別的,如果A是實數對稱矩陣,那麼L的元素肯定也是實數。

 

另外,滿足以上兩個條件意味着A矩陣的特徵值都爲正實數,因爲Ax = lamda * x,

(x*)Ax = lamda * (x*)x > 0, lamda > 0

 

 

Cholesky分解的方式

.

可以使用高斯消元法分解矩陣。過程如下:

設A = | a11    w*|

         | w      K|

= (R1*) * | 1                 0 | * R1

| 0  K – w(w*)/a11|

其中,

R1* = | 1                   0|

| w/sqrt(a11)         I |

R1 = | 1   w/sqrt(a11)|

| 0              I |

如果K –w(w*)/a11大於零,那麼就可以一直分解下去。因爲它是一個正定矩陣的子矩陣,所以肯定可以滿足。

最後:

R* = (R1*)(R2*)…(Rm*)

R  =(Rm)…(R2)(R1)

 

因爲矩陣的一半元素很相似,所以算法只需要實現一半就可以了。數據也可以只用一半,這樣就節約了很多時間。同樣,輸出只需要一個上三角矩陣就可以了。

 

Cholesky分解的算法實現

 

R = A

For (k = 0, k < m; k++){

       For(j = k; j < m; j++){

       Rj,j:m = Rj,j:m – Rk,j:m Rkj / Rkk            -(1)

}

Rk,k:m = Rk,k:m/ sqrt(Rkk)

}

爲了節約數據空間,其中,A僅初始化爲上三角矩陣。Cholesky分解的效率分析, 由於(1) 式佔用了O(m)的時間,所以總計O(m^3 / 3)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章