最近,我不得不处理很多长符号表达式的算法,比如这个
upperside = ( e * e * n * p * tn * tn +
2 * e * e * n * p * tn * tp +
e * e * n * p * tp * tp +
2 * e * n * n * p * te * tn +
2 * e * n * n * p * te * tp +
N * e * n * n * tp * tp +
2 * e * n * p * p * te * tn +
2 * e * n * p * p * te * tp -
2 * N * e * n * p * tn * tp +
N * e * p * p * tn * tn +
n * n * n * p * te * te +
2 * n * n * p * p * te * te +
n * p * p * p * te * te)
重新格式化
^{pr2}$这些表达式是经过简化后由MATLAB符号程序导出的。很明显,在这种情况下,不可能通过合并因子来简化代数表达式。然而,似乎很有可能简化这个表达式,从而大大减少实际操作的数量。不幸的是,我在MATLAB或Python中找不到这样的选项。在
感谢任何帮助。在
编辑 我们的目标是最小化CPU需要为这些表达式执行的操作。因为运算只涉及加法和乘法,所以我希望像(e+tn)*(te+tp)+n+。。。。我试过对表达式进行因子分解,但不幸的是,表达式不能分解。在
公共子表达式消除(或sympy cse)计算乘积,如:ee和ep和加法。这有助于找到一个非常优化的表达式。我看到一个巨大的表达式,有三种不同的数学方法,计算时间有很大的不同。使用cse后,3种配方在计算时间上几乎相同。而且一些大的因素更快,比最快的非优化算法。在
如果有任何python包可以提供帮助,那么它可能是Sympy:
It输出:
^{pr2}$在page中描述的所有方法中,
collect
看起来最有希望。在这里有一种快速而肮脏的方法来迭代所有符号组合并显示找到的最短表达式:
It输出:
相关问题 更多 >
编程相关推荐