使用 sympy 的矩阵秩和行列式与列向量的线性组合
Matrix rank and determinant vs. linear combinations of column vectors using sympy
如果一个方阵不是满秩的,它的行列式为零,它的列向量是线性相关的,我们可以得到一个列向量作为其他列向量的线性组合。下面是一个矩阵,根据 sympy,它没有满秩,行列式为 0。
但是,sympy 似乎无法找到等于第三列向量的任意两个列向量的线性组合。这是为什么?
输入:
x = sympy.symbols('x')
D = Matrix([[1,1+x,(1-x)*(1+3*x)],[1, 1-x, (1-x)**2],[1,1,(1-x**2)]])
print(D)
print('rank', D.rank())
print('det', D.det())
D[:,[1,2]].LUsolve(D[:,0]) # gives same result as D[:,[0,1]].LUsolve(D[:,2]) and D[:,[0,2]].LUsolve(D[:,1])
输出:
Matrix([[1, x + 1, (1 - x)*(3*x + 1)], [1, 1 - x, (1 - x)**2], [1, 1, 1 - x**2]])
rank 2
det 0
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-330-4d4f8f3e2cc0> in <module>
5 print('det', D.det())
6
----> 7 D[:,1:].LUsolve(D[:,0])
~\anaconda3\envs\symbolic\lib\site-packages\sympy\matrices\matrices.py in LUsolve(self, rhs, iszerofunc)
2152
2153 def LUsolve(self, rhs, iszerofunc=_iszero):
-> 2154 return _LUsolve(self, rhs, iszerofunc=iszerofunc)
2155
2156 def QRsolve(self, b):
~\anaconda3\envs\symbolic\lib\site-packages\sympy\matrices\solvers.py in _LUsolve(M, rhs, iszerofunc)
357 for j in range(b.cols):
358 if not iszerofunc(b[i, j]):
--> 359 raise ValueError("The system is inconsistent.")
360
361 b = b[0:n, :] # truncate zero rows if consistent
ValueError: The system is inconsistent.
这可能是 lusolve 中的错误。
您可以通过linsolve
得到答案:
In [10]: linsolve((D[:,[1,2]], D[:,0]))
Out[10]:
⎧⎛ -2 -1 ⎞⎫
⎪⎜─────, ────────────⎟⎪
⎨⎜x - 1 2 ⎟⎬
⎪⎝ x - 2⋅x + 1⎠⎪
⎩ ⎭
如果一个方阵不是满秩的,它的行列式为零,它的列向量是线性相关的,我们可以得到一个列向量作为其他列向量的线性组合。下面是一个矩阵,根据 sympy,它没有满秩,行列式为 0。 但是,sympy 似乎无法找到等于第三列向量的任意两个列向量的线性组合。这是为什么?
输入:
x = sympy.symbols('x')
D = Matrix([[1,1+x,(1-x)*(1+3*x)],[1, 1-x, (1-x)**2],[1,1,(1-x**2)]])
print(D)
print('rank', D.rank())
print('det', D.det())
D[:,[1,2]].LUsolve(D[:,0]) # gives same result as D[:,[0,1]].LUsolve(D[:,2]) and D[:,[0,2]].LUsolve(D[:,1])
输出:
Matrix([[1, x + 1, (1 - x)*(3*x + 1)], [1, 1 - x, (1 - x)**2], [1, 1, 1 - x**2]])
rank 2
det 0
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-330-4d4f8f3e2cc0> in <module>
5 print('det', D.det())
6
----> 7 D[:,1:].LUsolve(D[:,0])
~\anaconda3\envs\symbolic\lib\site-packages\sympy\matrices\matrices.py in LUsolve(self, rhs, iszerofunc)
2152
2153 def LUsolve(self, rhs, iszerofunc=_iszero):
-> 2154 return _LUsolve(self, rhs, iszerofunc=iszerofunc)
2155
2156 def QRsolve(self, b):
~\anaconda3\envs\symbolic\lib\site-packages\sympy\matrices\solvers.py in _LUsolve(M, rhs, iszerofunc)
357 for j in range(b.cols):
358 if not iszerofunc(b[i, j]):
--> 359 raise ValueError("The system is inconsistent.")
360
361 b = b[0:n, :] # truncate zero rows if consistent
ValueError: The system is inconsistent.
这可能是 lusolve 中的错误。
您可以通过linsolve
得到答案:
In [10]: linsolve((D[:,[1,2]], D[:,0]))
Out[10]:
⎧⎛ -2 -1 ⎞⎫
⎪⎜─────, ────────────⎟⎪
⎨⎜x - 1 2 ⎟⎬
⎪⎝ x - 2⋅x + 1⎠⎪
⎩ ⎭