Numpy 矩阵行列式未按预期工作?

Numpy Matrix Determinant Not Working as Expected?

我有一个问题,要求我证明矩阵 B 的行列式等于 0。矩阵 B 定义为:

import numpy as np
from numpy import linalg as m

B = np.array([[-1-3.j,-8-10.j,0-3.j], 
                [-7-3.j,-4-9.j,-3-2.j], 
                [11-3.j,-16-12.j,6-5.j] 
              ])
print(B)
[[ -1. -3.j  -8.-10.j   0. -3.j]
 [ -7. -3.j  -4. -9.j  -3. -2.j]
 [ 11. -3.j -16.-12.j   6. -5.j]]

使用numpy

行列式很简单
m.linalg.det(B)
(-8.126832540256171e-14-1.5987211554602298e-14j)

这显然不等于零。

我使用 https://www.symbolab.com/ 仔细检查了我的答案,行列式肯定为零。

我觉得我在做一些可笑的傻事,但不太明白是什么。有帮助吗?

您看到的是几乎等于零的非常小的数字。由于数值不准确,它们不完全等于零。

这就是为什么我们通常不测试它们的相等性而是接近性

np.allclose(np.linalg.det(B), 0). # True

稍微扩展一下 Nils 的回答:

有多种计算行列式的方法。代数中教授的方法 类 -- laplace expansion -- 对于小的(例如 3 x 3)矩阵来说是一种合理的方法,但很快就变得不可能了 -- 因为需要大量的计算 --对于更大的矩阵。

在您的情况下,所有实部和虚部都是小整数,这样的计算将准确计算行列式,如 0。

在 python linalg.det 中使用了不同的方法,您将矩阵分解为因子——三角矩阵和排列——其行列式可以很容易地计算出来,然后乘积的行列式是因素决定因素的乘积。这是一个 N 阶立方计算,因此甚至可以用于非常大的矩阵。

然而,这样的因式分解(有点)不准确;原始矩阵不会完全等于乘积。因此行列式也很可能有点不准确。