我正在尝试制作一个递归程序来计算Cholesky factorization,但输出不是低三角形。如何更改此项以正确计算?
def cholesky(A):
n = np.shape(A)[0]
A[0,0] = math.sqrt(abs(A[0,0]))
if n == 1:
return A
else:
A[1:,0] /= A[0,0]
A[1:,1:] -= np.dot(A[1:,0], (A[1:,0]).T)
cholesky(A[1:,1:])
答案 0 :(得分:1)
我确信有一种更漂亮的方式(特别是numpy.linalg.cholesky
),但这似乎对合理的测试数据没问题。我遵循维基百科文章中的符号,并将他们的示例用作测试数据。
import numpy as np
def cholesky_reduce(A):
pivot = A[0, 0]
b = np.mat(A[1:, 0])
B = A[1:, 1:]
return B - (b.T * b) / pivot
def L(A):
n = A.shape[0]
if n == 1:
return np.sqrt(A)
b = np.mat(A[1:, 0])
pivot = np.sqrt(A[0, 0])
return np.bmat([
[np.mat(pivot), np.zeros((1, n - 1))],
[b.T / pivot, L(cholesky_reduce(A))]
])
def __main():
A = np.array([[4, 12, -16], [12, 37, -43], [-16, -43, 98]])
print(L(A))
if __name__ == '__main__':
__main()