【问题标题】:Why does SymPy give me the wrong answer when I row-reduce a symbolic matrix?当我对符号矩阵进行行归约时,为什么 SymPy 会给我错误的答案?
【发布时间】:2013-10-05 01:06:18
【问题描述】:

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

【问题讨论】:

  • 请注意,这现在可以在 SymPy 的开发版本中正常工作。

标签: python matrix sympy


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多