Cholesky和LU矩陣分解

1.Cholesky分解

在線性代數中,矩陣分解是將矩陣分解爲矩陣的乘積。有許多不同的矩陣分解。其中之一就是Cholesky分解。

Cholesky分解是將Hermitian正定矩陣分解爲下三角矩陣及其共軛轉置的乘積。在求解線性方程組時,Cholesky分解的效率大約是 LU分解的兩倍。

Hermitian正定矩陣 \boldsymbol{A}的Cholesky分解是形式爲\boldsymbol{A}=\boldsymbol{L}\boldsymbol{L}^{T}的分解,其中\boldsymbol{L}是具有實對角線和正對角線項的下三角矩陣,\boldsymbol{L}^{T}表示 \boldsymbol{L}的共軛轉置。每個Hermitian正定矩陣(以及每個實值對稱正定矩陣)都有唯一的Cholesky分解。

每個對稱\boldsymbol{A}的正定矩陣都可以分解成唯一的下三角矩陣\boldsymbol{L}及其轉置的乘積:  \boldsymbol{A}=\boldsymbol{L}\boldsymbol{L}^{T}

通過求解上述下三角矩陣及其轉置,可獲得以下公式。 這些是Cholesky分解算法的基礎:

  L_{jj}=\sqrt{A_{jj}-\sum_{k=0}^{j-1}(L_{jk})^{2}}

L_{ij}= \frac{1}{L_{jj}}\left( A_{jj} -\sum_{k=0}^{j-1}L_{ik}L_{jk}\right)

 

# Python3 program to decompose  
# a matrix using Cholesky  
# Decomposition 
import math 
MAX = 100; 
  
def Cholesky_Decomposition(matrix, n): 
  
    lower = [[0 for x in range(n + 1)]  
                for y in range(n + 1)]; 
  
    # Decomposing a matrix 
    # into Lower Triangular 
    for i in range(n):  
        for j in range(i + 1):  
            sum1 = 0; 
  
            # sum1mation for diagnols 
            if (j == i):  
                for k in range(j): 
                    sum1 += pow(lower[j][k], 2); 
                lower[j][j] = int(math.sqrt(matrix[j][j] - sum1)); 
            else: 
                  
                # Evaluating L(i, j) 
                # using L(j, j) 
                for k in range(j): 
                    sum1 += (lower[i][k] *lower[j][k]); 
                if(lower[j][j] > 0): 
                    lower[i][j] = int((matrix[i][j] - sum1) / 
                                               lower[j][j]); 
  
    # Displaying Lower Triangular 
    # and its Transpose 
    print("Lower Triangular\t\tTranspose"); 
    for i in range(n):  
          
        # Lower Triangular 
        for j in range(n): 
            print(lower[i][j], end = "\t"); 
        print("", end = "\t"); 
          
        # Transpose of 
        # Lower Triangular 
        for j in range(n): 
            print(lower[j][i], end = "\t"); 
        print(""); 
  
# Driver Code 
n = 3; 
matrix = [[4, 12, -16], 
          [12, 37, -43], 
          [-16, -43, 98]]; 
Cholesky_Decomposition(matrix, n); 
  
# This code is contributed by mits 

 

2.Doolittle 算法:LU分解

在數值分析和線性代數中,LU分解(其中 LU表示“ lower upper”,也稱爲LU因式分解)將矩陣分解爲下三角矩陣和上三角矩陣的乘積。 計算機通常使用LU分解求解線性方程組的平方系統,這也是求矩陣求逆或計算矩陣行列式時的關鍵步驟。 

A爲方陣。LU分解是指將具有適當的行/列排序,或置換的A分解爲兩個因子,即下三角矩陣L和上三角矩陣UA=LU  。

U_{ik}=A_{ik}-\sum_{j=0}^{i}\left( L_{ij}U_{jk} \right)

L_{ik}=\frac{\left( A_{ik}-\sum_{j=0}^{i}\left( L_{ij}U_{jk} \right) \right)}{U_{kk}} 

# Python3 Program to decompose  
# a matrix into lower and 
# upper traingular matrix 
MAX = 100; 
  
def luDecomposition(mat, n): 
  
    lower = [[0 for x in range(n)]  
                for y in range(n)]; 
    upper = [[0 for x in range(n)]  
                for y in range(n)]; 
                  
    # Decomposing matrix into Upper  
    # and Lower triangular matrix 
    for i in range(n): 
  
        # Upper Triangular 
        for k in range(i, n):  
  
            # Summation of L(i, j) * U(j, k) 
            sum = 0; 
            for j in range(i): 
                sum += (lower[i][j] * upper[j][k]); 
  
            # Evaluating U(i, k) 
            upper[i][k] = mat[i][k] - sum; 
  
        # Lower Triangular 
        for k in range(i, n): 
            if (i == k): 
                lower[i][i] = 1; # Diagonal as 1 
            else: 
  
                # Summation of L(k, j) * U(j, i) 
                sum = 0; 
                for j in range(i): 
                    sum += (lower[k][j] * upper[j][i]); 
  
                # Evaluating L(k, i) 
                lower[k][i] = int((mat[k][i] - sum) /
                                       upper[i][i]); 
  
    # setw is for displaying nicely 
    print("Lower Triangular\t\tUpper Triangular"); 
  
    # Displaying the result : 
    for i in range(n): 
          
        # Lower 
        for j in range(n): 
            print(lower[i][j], end = "\t");  
        print("", end = "\t"); 
  
        # Upper 
        for j in range(n): 
            print(upper[i][j], end = "\t"); 
        print(""); 
  
# Driver code 
mat = [[2, -1, -2], 
       [-4, 6, 3], 
       [-4, -2, 8]]; 
  
luDecomposition(mat, 3); 
  
# This code is contributed by mits 

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