对称正定矩阵 可以分解为 ,这种分解被称为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([4, 6, 7.25])
cls = LinerSolver(A, b) #创建一个求解器的实例cls
x = cls.CholeskiSolver() #调用Choleski法求解
print(x)
与高斯消去法相比,LL分解的优点在于,一旦A被分解,我们就可以对任意多个常量向量b求解Ax=b。每个附加解决方案的成本相对较小,因为前向和后向替换操作比分解过程花费的时间少得多.