2017-07-30 42 views
0

我有一个矩阵A = Matrix([[1, 0, 0, 20], [-1, 1, 0, 0], [-2, 1, 0, 0], [0, -1, 1, 0]]),一个sympy对象。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找到冲突的行?

回答

0

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 

其中,当然,已经完全没有解决方案,这要归功于最后一个方程。

此外,您似乎对减少行数可能会产生误解。你问:“我如何使用sympy找到冲突的行?”和“如果有冲突的行”。行还原找不到哪一行发生冲突,它找到如果行一起出现冲突。 rref进程无法显示冲突的行,因为如果需要在适当位置获得非零的主键值,它会交换行,所以起始矩阵和结束矩阵的行不相对应。另外,一行与其他行不一致也是不正确的,只是所有行一起发生冲突。在你的矩阵中,你可以删除前3行中的任何一行,结果将是非冲突的。 (删除最后一行仍然有一个冲突的矩阵。)那么哪一行可以说冲突?通常没有一个冲突的行,所以rref()或任何其他方法不可能找到一个。