首页 文章

使用Sympy评估一系列公式时减少计算负担

提问于
浏览
1

首先,我不完全确定这是正确的stackexchange社区 . 我也在数学论坛上发帖,我认为它应该没问题,因为看问题的人应该对溢出与数学有不同的观点,但只是告诉我这是不是很糟糕我会删除其中一个帖子:

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

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

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

$ \ cos \ left(\ frac {2} \ sqrt {w_x ^ 2 w_y ^ 2 w_z ^ 2} \ right)$

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

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

1 回答

  • 2

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

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

相关问题