программно оптимизирующие выражения (путем удаления избыточных вычислений)

У меня было довольно большое уравнение, которое я должен был использовать для решения для данной переменной. Таким образом, я использовал сетевой инструмент, который был способен к перезаписи уравнения с точки зрения данной переменной. Это дало мне некоторых огромные 700 символьных уравнений. Я протестировал его, и это действительно работает.

Я вижу некоторые довольно очевидные дублирования в уравнении, где оно повторно вычисляет значение, которое могло быть сохранено как временная переменная вместо этого. Я мог пройти все уравнение и оптимизировать его сам, но мне придется, вероятно, сделать это со значительно большим количеством уравнений, таким образом, я хотел бы автоматизировать процесс вместо этого.

Каковы некоторые хорошие инструменты, которые помогут оптимизировать математические дублирования?
(Это только для персонального проекта, таким образом, я действительно предпочел бы что-то свободное),

Всем тем людям, которых я знаю, спросит об этом действительно быть необходимым: Это - производительность критический код, и на основе моего опыта, компилятор AS3 не сделает подобной оптимизации на своем собственном. Удаление дублирований также сделает код более читаемым.

9
задан Ponkadoodle 29 June 2010 в 00:43
поделиться

4 ответа

В Maxima есть полезная функция под названием optimize :

Функция: optimize (expr )

Возвращает выражение, которое дает то же значение и побочные эффекты, что и expr, но делает это более эффективно, избегая повторного вычисления общих подвыражений. optimize также имеет побочный эффект «сворачивания» своего аргумента, так что все общие подвыражения являются общими. Сделайте пример (оптимизируйте) для примеров.

Это упростило бы выражение, которое вы загрузили в Ideone, до:

block(
[%1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11,%12,%13,%14],
  %1:a^2,
  %2:b^2,
  %3:c^2,
  %4:d^2,
  %5:-%4+2*b*d-%2,
  %6:-%3+2*a*c-%1,
  %7:2*a-2*c,
  %8:2*c-2*a,
  %9:
  %8*d+b*%7,
  %10:%7*d+b*%8,
  %11:i^2,
  %12:j^2,
  %13:-2*%12-4*i*j-2*%11,
  %14:%12+2*i*j+%11,(-sqrt(%4*%14+%3*%14+%2*%14+%1*%14+b*d*%13+a*c*%13+%6*h^2+    (%9*g+2*%3-4*a*c+2*%1)*f+%10*e)*h+%5*g^2+f*(%10*g+%9*e)+(2*%4-4*b*d+2*%2)*e*g+%6*f^2+%5*e^2)-(d-b)*h-(c-a)*g-(b-d)*f-(a-)*e)/(%4-2*b*d+%3-2*a*c+%2+%1))

Не обязательно более читабельным, но оно больше не содержит общих подвыражений.

3
ответ дан 4 December 2019 в 10:30
поделиться

Я использовал wxMaxima . Заставить его делать замены довольно легко, и это бесплатно. Мне пришлось выполнить множество масштабных преобразований Лапласа с расширением частичных дробей. Как только я научился им пользоваться, это произошло довольно быстро.

5
ответ дан 4 December 2019 в 10:30
поделиться

Как предложил belisarius, перевод уравнения на математический язык программирования, такой как matlab, mathematica или maple, позволит вам использовать их инструменты упрощения и сокращения.

Вот список бесплатных программ типа matlab http://www.dspguru.com/dsp/links/matlab-clones, если вы не хотите платить высокую цену за лицензию matlab.

2
ответ дан 4 December 2019 в 10:30
поделиться

Правка> Выражение сокращено с 700 до 20 символов ниже

Попробуйте использовать FullSimplify в Wolfram Alpha или Mathematica.

WolframAlpha FullSimplify (x ^ 2 + 2 x +1)

Edit ->

Если подумать еще раз, Mathematica не нуждается в упрощении вашего уравнения с одной переменной для его решения ... команда Решить ( или FindRoot, или FindInstance ...) сделает это.

Попробуйте, например,

WolframAlpha Решить (x ^ 2 + 2 * x + 1 = 0, x)

РЕДАКТИРОВАТЬ -> Чтобы ответ не зависел от ideone.com, ваше уравнение для 700 символов после некоторых упрощений становится

   t= -((E*A+B*F+ Sqrt(2*A*E*F*B+ A^2*(I^2-F^2) + B^2*(I^2-E^2))) /(A^2 + B^2))

Где

   E = e - g
   A = a - c
   B = b - d
   F = f - h
   I = i + j

Пожалуйста, проверьте, является ли аргумент Sqrt идеальным квадратом, основываясь на других «геометрических» соображениях ... лает и держит хвост ... это собака?

РЕДАКТИРОВАТЬ -> Предположения:

У меня нет никаких доказательств , но симметрия уравнения предполагает, что в вашей задаче

  E^2 = (I^2-F^2)  => (e-g)^2 = (i+j)^2 - (f-h)^2

Если это так ( проверьте это ), ваше уравнение станет

  t= -((E*A+B*F+ Abs(E*A+B*F)) /(A^2 + B^2))

Если A E + B F> 0 (и я предполагаю, что это так, потому что если не t === 0)

  +-----------------------------------+
  ¦  Your 700 chars equation comes to ¦
  ¦                                   ¦
  ¦ t= -2 * (A*E + B*F) / (A^2 + B^2) ¦
  ¦                                   ¦
  +-----------------------------------+

коротко и мило ... :)

10
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: