программно оптимизирующие выражения (удаляя лишние вычисления) - PullRequest
9 голосов
/ 25 июня 2010

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 25 июня 2010

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

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

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

Редактировать ->

Подумав еще раз, Mathematica не нужно упрощать ваше уравнение в одну переменную для его решения ... команда Solve (или 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) ¦
  ¦                                   ¦
  +-----------------------------------+

коротко и сладко ...:)

5 голосов
/ 25 июня 2010

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

3 голосов
/ 25 июня 2010

Maxima имеет полезную функцию, которая называется optimize:

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

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

Это упростило бы выражение, которое вы загрузили в 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))

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

2 голосов
/ 25 июня 2010

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

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

...