2017-06-20 56 views
1

首先,我不完全确定这是正确的stackexchange社区。我也发布了数学论坛,我认为它应该没问题,因为看着这个问题的人应该对溢出与数学有不同的观点,但是告诉我,如果这是不好的,我会删除其中一个帖子:减少用Sympy评估一系列公式的计算负担

https://math.stackexchange.com/questions/2330004/reducing-the-computational-burden-in-evaluating-a-series-of-formula

我有一系列式(其中许多是,通常为100),我从与CAS(Python的Sympy)计算得到的。这些公式将被转换为C++,并且应该在微控制器上进行有效评估。执行许多计算来评估每个公式在不同公式之间是多余的。有没有办法通过Sympy中的算法找到'最优'或至少'合理'的方法来对计算进行分组,从而减少要执行的操作的数量,并以系统的方式进行操作?或者我应该让编译器这样做(但有很多公式...)?

例如,如果许多式包括术语

$ \ COS \左(\压裂{DT} {2} \ SQRT {w_x^2 + w_y^2 + w_z^2} \右)$

,我应该首先计算它并将其存储在一个变量中,让我们说$ cn $,并使用$ cn $进行后续评估。当然,我可以通过代码来完成这项工作,但这并不是真正的可扩展性,绝对'丑陋',并且可能不是最优的。理论上来说,我认为一个“完美”的C++编译器应该能够完成这项任务,但是我想如果这些方程很多并且足够复杂,它将无法接近最佳状态。

编辑:我当然知道使用sympy简单的简化,例如http://docs.sympy.org/latest/modules/simplify/simplify.html#module-sympy.simplify.cse_main或比化,简化等。这里的困难是,我想“十字”几个方程之间的简化。

+0

它看起来就像你有错误的假设,C++编译器只是能神奇地优化你的东西,因为它是一个低层次的语言什么的。 – VTT

+0

@VTT:我不这么认为。我知道C++编译器可以在某种程度上优化代码[inling函数,识别代码/公式的重复代码,一次执行计算以及多次使用,就像我在这里等等],这就是为什么我说'完美'编译器应该是能够做到这一点。但我知道编译器并不完美,因此我想在Sympy中进行优化。所以我想在Sympy中优化的事实实际上是因为我不认为编译器可以做魔法;) – Zorglub29

回答

2

cse能够接受表达式列表并给出在所有表达式中出现的公共子表达式。

>>> cse([x**2+1, exp(x**2+1), 1/(x**2 + 1)]) 
([(x0,x2+1)],[x0,exp(x0),1/x0]) 
+0

这真的很好。我的糟糕之处在于,我之前曾经用过单一表达方式的cse,并且应该通过文档再次阅读更多细节。 – Zorglub29