自定義求解器之Cholesky分解法
瀏覽:2708 評論:6 收藏:3
對稱正定矩陣
可以分解為
,這種分解被稱為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。每個附加解決方案的成本相對較小,因為前向和后向替換操作比分解過程花費的時間少得多.
技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
11
6
3




















