7

如果我要求 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”时,我得到了正确的答案。我仍然不知道为什么会这样。

4

1 回答 1

3

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

于 2013-09-30T03:23:37.413 回答