gsp*_*spr 5 symbolic-math sympy
我有一个4x4矩阵A,在每个条目中都有相当长但很简单的符号表达式。涉及大约30个不同的符号。“简单”是指仅使用加/减,乘/除和整数幂来组合这些符号。“长”是指如果我打印出矩阵,它将覆盖三到四个屏幕。
我需要这个矩阵的行列式。或者,更具体地说,我知道行列式是一个特定符号中的四阶多项式,并且我需要该多项式的系数。A.det()经过数小时的运行不会终止,因此我需要一种不同的方法。有任何想法吗?到目前为止,我已尝试simplify在每个元素上抛出各种功能,A但均未成功。
我可以采用某种策略让SymPy知道表达式的简单结构,还是知道结果是其中一个符号的多项式?
也许它可以为 4x4 行列式创建一般表达式
In [30]: A = Matrix(4, 4, symbols('A:4:4'))
In [31]: A
Out[31]:
?A?? A?? A?? A???
? ?
?A?? A?? A?? A???
? ?
?A?? A?? A?? A???
? ?
?A?? A?? A?? A???
In [32]: A.det()
Out[32]:
A???A???A???A?? - A???A???A???A?? - A???A???A???A?? + A???A???A???A?? + A???A???A???A?? - A???A???A???A?? - A???A???A???A?? + A???A???A???A?? + A???A???A???
A?? - A???A???A???A?? - A???A???A???A?? + A???A???A???A?? + A???A???A???A?? - A???A???A???A?? - A???A???A???A?? + A???A???A???A?? + A???A???A???A?? - A???A?
??A???A?? - A???A???A???A?? + A???A???A???A?? + A???A???A???A?? - A???A???A???A?? - A???A???A???A?? + A???A???A???A??
Run Code Online (Sandbox Code Playgroud)
然后用类似的东西替换条目
A.det().subs(zip(list(A), list(your_matrix)))
Run Code Online (Sandbox Code Playgroud)
不过,SymPy 生成 4x4 行列式的速度很慢是一个错误。您应该在https://github.com/sympy/sympy/issues/new报告它。
编辑(这不适合评论)
看起来像是Matrix.det在调用一个简化函数。对于 3x3 和更小的矩阵,行列式公式被明确写出,但对于更大的矩阵,它是使用 Bareis 算法计算的。您可以看到在此处cancel调用了简化函数 ( ) 的位置,这在计算中是必需的,但最终会做很多工作,因为它试图简化您的非常大的表达式。仅进行取消行列式本身的项所需的简化可能会更明智。我为此开了一个问题。
另一种加快速度的可能性(我不确定是否可行)是选择不同的行列式算法。选项是Matrix.det(method=alg)wherealg是"bareis"(默认值)"berkowitz"、 或 之一"det_LU"。