Во-первых, я не совсем уверен, что это правильное сообщество для обмена стеками. Я также разместил на форуме по математике, я предполагаю, что все должно быть в порядке, так как люди, рассматривающие вопрос, должны иметь разные точки зрения на переполнение и математику, но просто скажите мне, если это плохо, и я удалю один из постов. :
У меня есть ряд формул (многие из них, как правило, 100), которые я получаю из вычислений с CAS (Python Sympy). Эти формулы будут переведены на C ++, и они должны эффективно оцениваться на микроконтроллере. Многие из вычислений, выполняемых для оценки каждой формулы, являются избыточными между различными формулами. Есть ли способ найти с помощью алгоритма в Sympy «оптимальный» или, по крайней мере, «разумный» способ группировки вычислений, чтобы уменьшить количество операций и выполнять их систематическим образом? Или я должен позволить компилятору сделать это (но есть много формул …)?
Например, если многие формулы включают термин
$ \ cos \ left (\ frac {dt} {2} \ sqrt {w_x ^ 2 + w_y ^ 2 + w_z ^ 2} \ right) $
, Я должен сначала вычислить его и сохранить в переменной, скажем, $ cn $, и использовать $ cn $ для последующих оценок. Конечно, я могу пройтись по коду и сделать эту эвристику «вручную», но она не очень масштабируема, определенно «некрасива» и, вероятно, не оптимальна. Я полагаю, теоретически, «идеальный» компилятор C ++ должен быть в состоянии выполнить эту задачу, но я думаю, что если уравнения много и достаточно сложны, они не смогут приблизиться к оптимальному.
редактировать: Я, конечно, знаю о простых упрощениях, например, с помощью sympy http://docs.sympy.org/latest/modules/simplify/simplify.html#module-sympy.simplify.cse_main или факторизовать, упрощать и т. д. Сложность в том, что я хочу «скрестить» упрощения между несколькими уравнениями.
cse
может принимать список выражений и давать общие подвыражения, которые встречаются во всех из них.
>>> cse([x**2+1, exp(x**2+1), 1/(x**2 + 1)])
([(x0,x2+1)],[x0,exp(x0),1/x0])
Других решений пока нет …