sympy - 在矩阵中找到冲突的行

sympy - find conflicting row in matrix

我有一个矩阵 A = Matrix([[1, 0, 0, 20], [-1, 1, 0, 0], [-2, 1, 0, 0], [0, -1, 1, 0]]),一个 sympy 对象。

我想知道是否存在冲突行 - 意思是在我减少矩阵后,除了最右边的一项外,该行中的所有项均为零。

这在纸面上似乎很容易做到,但我想我误解了 sympy。 基本上 rref 方法的输出不是我所期望的。

注意,如果我们用笔和纸对A进行行归约,我们应该在某个点得到Matrix([[1, 0, 0, 20], [0, 1, 0, 20], [0, 0, 0, 20], [0, 0, 1, 20]])

所以第 2 行是一个冲突行。

然而,当我使用 A.rref() 时,我得到了完全不同的东西。我得到 Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) 并列出 <class 'list'>: [0, 1, 2, 3]

我不明白他们是如何得出这个结果以及如何插入列表的。如何使用 sympy 找到冲突的行?

sympy 的回答是正确的。你手动减少得到的矩阵不是行减少过程的结束,这解释了你的答案和sympy的答案之间的区别。

要继续从矩阵中减少行,请交换第 2 行和第 3 行(第三行和第四行),然后得到

matrix([
 [ 1, 0, 0, 20],
 [ 0, 1, 0, 20],
 [ 0, 0, 1, 20],
 [ 0, 0, 0, 20]])

现在从其他每一行中减去第 3 行(最后一行),然后将最后一行除以 20,我们得到

matrix([
 [ 1, 0, 0, 0],
 [ 0, 1, 0, 0],
 [ 0, 0, 1, 0],
 [ 0, 0, 0, 1]])

这是 sympy 的回答。

有多种方法可以解释这个结果。一种方法是考虑一个包含 3 个变量的 4 个线性方程组——矩阵的最后一列包含方程右侧的常数,而其他列是可变系数。您的原始矩阵代表方程

   x            = 20
-  x + y        =  0
- 2x + y        =  0
     - y + z    =  0

并且 sympy 的行减少表明该系统具有与

相同的解决方案
   x            =  0
       y        =  0
           z    =  0
              0 =  1

当然,由于最后一个等式,它根本没有解。

另外,您似乎对行归约的作用有误解。你问,"How can I find the conflicting rows using sympy?"和"if there is a conflicting row."行归约不找哪一行冲突,找如果行一起冲突. rref 过程无法显示冲突行,因为它会在需要时交换行以在适当位置获得非零主元值,因此起始矩阵和结束矩阵的行不对应。此外,一行与其他行冲突并不是真的,只是所有行一起冲突。在您的矩阵中,您可以删除前 3 行中的任何一行,结果将不冲突。 (删除最后一行仍然有一个冲突矩阵。)那么你可以说哪一行冲突?通常没有一个冲突行,因此 rref() 或任何其他方法都不可能找到一个。