如果我要求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.")
此外,当我从矩阵中删除羔羊时(等效于设置羔羊= 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”时,我得到了正确的答案。我仍然不知道为什么会这样。
从根本上说,rref算法需要具备判断矩阵元素是否完全为零的能力。在SymPy中,该simplify=True
选项指示SymPy首先在算法的相关阶段简化条目。对于符号条目,这是必需的,因为您可以轻松地使符号表达式等于零,但不会自动将其简化为此类x*(x - 1) - x**2 + x
。该选项默认情况下处于关闭状态,因为通常这样的简化可能会很昂贵,可以通过传入一个比simplify
(对于有理函数,请使用cancel
)不那么通用的简化函数来控制。这里的默认设置可能更聪明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句