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 阶立方计算,因此甚至可以用于非常大的矩阵。
然而,这样的因式分解(有点)不准确;原始矩阵不会完全等于乘积。因此行列式也很可能有点不准确。
我有一个问题,要求我证明矩阵 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 阶立方计算,因此甚至可以用于非常大的矩阵。
然而,这样的因式分解(有点)不准确;原始矩阵不会完全等于乘积。因此行列式也很可能有点不准确。