尽管在用于查找逆矩阵的函数中没有零可以除以 numpy 中的零警告

division by zero warning in numpy despite there being no zeros to divide in a function for finding inverse matrix

我正在为矩阵 class 创建一个函数,用于使用高斯消去法查找逆矩阵,该函数在大多数情况下工作正常,它会有成对出现的 运行dom 警告看起来像这样

RuntimeWarning: invalid value encountered in double_scalars
RuntimeWarning: divide by zero encountered in double_scalars

问题出在我将同一行中的所有内容除以一个常数的行。但是,函数的第一部分已经确保矩阵中的所有主元都不会为零。我也有 运行 很多测试,问题不在于主元为零,主元是唯一用于除法的元素,所以我不明白错误来自哪里

def inverse(self):
        if self.row != self.col:
            raise ValueError("Inverse Matrices only possible with square matrices")
        det = self.determinant()
        if det == 0:
            raise ValueError("The provided matrix does not have an Inverse")

        # Makes sure that the pivot elements are not zero
        inverse = Matrix.identity(self.row)
        placeHolder = [[self.matrix[i, j] for j in range(self.col)] for i in range(self.row)]
        for i in range(self.col):
            if self.matrix[i, i] == 0:
                for j in range(self.row):
                    if self.matrix[j, i] != 0:
                        for k in range(self.col):
                            self.matrix[i, k] += self.matrix[j, k]
                            inverse.matrix[i, k] += inverse.matrix[j, k]
                        break

        # Row operations
        for i in range(self.row):
            constant = self.matrix[i, i]
            for j in range(self.col):
                self.matrix[i, j] /= constant
                inverse.matrix[i, j] /= constant

            row = i
            while row != 0:
                constant = self.matrix[row-1, i]
                for j in range(self.col):
                    self.matrix[row-1, j] -= self.matrix[i, j] * constant
                    inverse.matrix[row-1, j] -= inverse.matrix[i, j] * constant
                row -= 1

            row = i
            while row != self.row - 1:
                constant = self.matrix[row+1, i]
                for j in range(self.col):
                    self.matrix[row+1, j] -= self.matrix[i, j] * constant
                    inverse.matrix[row+1, j] -= inverse.matrix[i, j] * constant
                row += 1

        self.set(placeHolder)
        return inverse

虽然最初您检查矩阵的对角线元素是 non-zero,但这些元素在您执行行操作时会被修改,并且它们可能变为零。矩阵行缩减的一个常见步骤是在使用它之前检查枢轴位置的元素是否为 non-zero 是否修改其他行,因为这无法事先确定。

作为旁注,我不知道计算行列式的函数是如何实现的,但由于浮点运算不精确,通常行列式的计算可以给出 non-zero 值,即使矩阵是单数的。同样的问题也适用于矩阵的行缩减:由于舍入误差,这些计算可能会给出错误的结果,奇异矩阵看起来是 non-singular,反之亦然。在数值分析中,有很多处理此类问题的考虑因素和方法。