Jes*_*ica 6 python matrix sympy
如果我让SymPy行减少奇异矩阵
nu = Symbol('nu')
lamb = Symbol('lambda')
A3 = Matrix([[-3*nu, 1, 0, 0],
[3*nu, -2*nu-1, 2, 0],
[0, 2*nu, (-1 * nu) - lamb - 2, 3],
[0, 0, nu + lamb, -3]])
print A3.rref()
Run Code Online (Sandbox Code Playgroud)
然后它返回单位矩阵
(Matrix([
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]]), [0, 1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
它不应该这样做,因为矩阵是单数的.为什么SymPy给了我错误的答案,我怎么能让它给我正确的答案?
我知道SymPy知道矩阵是单数的,因为当我要求A3.inv()时,它给出了
raise ValueError("Matrix det == 0; not invertible.")
Run Code Online (Sandbox Code Playgroud)
此外,当我从矩阵中删除lamb(相当于设置lamb = 0)时,SymPy给出了正确的答案:
(Matrix([
[1, 0, 0, -1/nu**3],
[0, 1, 0, -3/nu**2],
[0, 0, 1, -3/nu],
[0, 0, 0, 0]]), [0, 1, 2])
Run Code Online (Sandbox Code Playgroud)
这让我相信这个问题只发生在一个以上的变量上.
编辑:有趣的是,当我传递rref()参数"simplify = True"时,我得到了正确的答案.我仍然不知道为什么会这样.
rref 算法从根本上要求能够判断矩阵的元素是否全为零。在 SymPy 中,该simplify=True选项指示 SymPy 首先在算法的相关阶段简化条目。对于符号条目,这是必要的,因为您可以轻松地拥有完全为零但不会自动简化为这样的符号表达式,例如x*(x - 1) - x**2 + x. 默认情况下该选项处于关闭状态,因为通常这种简化可能会很昂贵,因此可以通过传递比simplify(对于有理函数,使用cancel)不太通用的简化函数来控制。这里的默认值可能会更聪明。