当我减少一个符号矩阵时,SymPy为什么给我错误的答案?

时间:2013-09-28 23:13:50

标签: 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()
然后它返回单位矩阵

(Matrix([
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]]), [0, 1, 2, 3])

它不应该这样做,因为矩阵是单数的。为什么SymPy给了我错误的答案?我怎样才能得到它给我正确答案?

我知道SymPy知道矩阵是单数的,因为当我要求A3.inv()时,它会给出

raise ValueError("Matrix det == 0; not invertible.")

此外,当我从矩阵中删除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])

这让我相信这个问题只发生在一个以上的变量上。

编辑:有趣的是,当我传递rref()参数“simplify = True”时,我得到了正确的答案。我仍然不知道为什么会这样。

1 个答案:

答案 0 :(得分:2)

rref算法从根本上要求能够判断矩阵的元素是否相同为零。在SymPy中,simplify=True选项指示SymPy在算法的相关阶段首先简化条目。对于符号条目,这是必要的,因为您可以轻松地使符号表达式相同为零,但不会自动简化为x*(x - 1) - x**2 + x。默认情况下该选项是关闭的,因为通常这种简化可能很昂贵,通过传递一个比simplify更简单的简化函数可以控制(对于有理函数,使用cancel)。这里的默认值可能更聪明。