Python cholesky分解浮点错误

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:

在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:
                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]