自定義求解器之Cholesky分解法

自定義求解器之Cholesky分解法的圖1

對稱正定矩陣 可以分解為 ,這種分解被稱為Cholesky分解,是LU分解的一個重要特例,可以顯著降低計算量。在計算機程序中常常用到這種方法解線性代數方程組。它的優點是節省存儲量,得到的L矩陣可以覆蓋原來的A矩陣。

對于方程組 ,可以寫成 ,令 ,則

考察一個3X3矩陣:

分解的算法:


import numpy as np
import math

class LinerSolver:
    def __init__(self, A, b):
        self.A = A
        self.b = b

    def CholeskiSolver(self):
        n = len(self.A)
        # 分解 [A] = [L] [L^T]
        for k in range(n):
            self.A[k,k] = math.sqrt(self.A[k,k] - np.dot(self.A[k,0:k], self.A[k,0:k]))
            for i in range(k+1,n):
                self.A[i,k] = (self.A[i,k] - np.dot(self.A[i,0:k], self.A[k,0:k])) / self.A[k,k]
        for k in range(1,n): 
            self.A[0:k,k] = 0.0
        
        # 求解 [L]{y} = {b} 
        for k in range(n):
            self.b[k] = (self.b[k] - np.dot(self.A[k,0:k], self.b[0:k])) / self.A[k,k]
        # 求解 [L^T]{x} = {y} 
        for k in range(n-1,-1,-1):
            self.b[k] = (self.b[k] - np.dot(self.A[k+1:n,k], self.b[k+1:n])) / self.A[k,k]
        
        return self.b



A = np.array([  [ 4,   -1,     1],
                [-1,  4.25,  2.75],
                [1,   2.75,   3.5] ])



b = np.array([467.25])

cls =  LinerSolver(A, b) #創建一個求解器的實例cls

x = cls.CholeskiSolver() #調用Choleski法求解
print(x)


與高斯消去法相比,LL分解的優點在于,一旦A被分解,我們就可以對任意多個常量向量b求解Ax=b。每個附加解決方案的成本相對較小,因為前向和后向替換操作比分解過程花費的時間少得多.

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

11
6
3