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()
或任何其他方法都不可能找到一个。
我有一个矩阵 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()
或任何其他方法都不可能找到一个。