Python cholesky分解浮点错误
在Python中实现Choleky分解而不使用numpy.linalg.*(是的,这是一个赋值)我遇到了一个关于使用浮点数的问题。我的算法适用于正则整数:Python cholesky分解浮点错误,python,numpy,floating-point,matrix-decomposition,Python,Numpy,Floating Point,Matrix Decomposition,在Python中实现Choleky分解而不使用numpy.linalg.*(是的,这是一个赋值)我遇到了一个关于使用浮点数的问题。我的算法适用于正则整数: for i in range(n): for k in range(i + 1): sum = 0 for j in range(k): sum += L[i, j] * L[k, j] if i == k:
for i in range(n):
for k in range(i + 1):
sum = 0
for j in range(k):
sum += L[i, j] * L[k, j]
if i == k:
if M[i, i] - sum < 0:
raise ValueError("Matrix is non-positive definite")
L[i, i] = np.sqrt(M[i, i] - sum)
else:
if np.isclose(L[k, k] * (M[i, k] - sum), 0):
raise ValueError("Matrix is non-positive definite")
L[i, k] = (L[k, k] * (M[i, k] - sum)) ** (-1)
像这样声明矩阵,然后从这里开始:
M = np.zeros((n, n), dtype=float)
将M[i,k]保存在一个变量中,然后用减法而不是求和来解决问题:
for i in range(n):
for k in range(i + 1):
val = M[i, k]
for j in range(k):
val -= L[i, j] * L[k, j]
if i == k:
if val < 0:
raise ValueError("Matrix is non-positive definite")
L[i, k] = np.sqrt(val)
else:
if np.isclose(L[k, k], 0):
raise ValueError("Matrix is non-positive definite")
L[i, k] = val / L[k, k]
范围(n)内的i的:
对于范围(i+1)内的k:
val=M[i,k]
对于范围(k)内的j:
val-=L[i,j]*L[k,j]
如果i==k:
如果val<0:
raise VALUE ERROR(“矩阵非正定”)
L[i,k]=np.sqrt(val)
其他:
如果np.isclose(L[k,k],0):
raise VALUE ERROR(“矩阵非正定”)
L[i,k]=val/L[k,k]
for i in range(n):
for k in range(i + 1):
val = M[i, k]
for j in range(k):
val -= L[i, j] * L[k, j]
if i == k:
if val < 0:
raise ValueError("Matrix is non-positive definite")
L[i, k] = np.sqrt(val)
else:
if np.isclose(L[k, k], 0):
raise ValueError("Matrix is non-positive definite")
L[i, k] = val / L[k, k]