以编程方式优化表达式(通过删除冗余计算)

时间:2010-06-25 00:28:48

标签: actionscript-3 optimization math function redundancy

我有一个非常大的等式,我需要用它来解决给定的变量。所以我使用了一个能够根据给定变量重写方程的在线工具。它给了我一些巨大的700字符方程式。我测试了它,它确实有效。

我可以在等式中看到一些非常明显的冗余,它重新计算一个可以保存为临时变量的值。我可以通过整个方程并自己进行优化,但是我可能不得不用更多的方程来做这个,所以我想要自动化这个过程。

有哪些有助于优化数学冗余的优秀工具?
(这只是个人项目,所以我真的更喜欢免费的东西)

对于所有我认识的人都会问这个问题真的是必要的:这是性能关键代码,根据我的经验,AS3编译器不会对它自己做这些优化。删除冗余也会使代码更具可读性。

4 个答案:

答案 0 :(得分:10)

编辑>表达式从低于700到20个字符减少

尝试在Wolfram Alpha或Mathematica中使用FullSimplify。

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

修改 - >

再次思考,Mathematica不需要简化你的一个var方程来解决它...... Solve命令(或FindRoot,或FindInstance ......)就可以做到。

试试例子

WolframAlpha Solve(x^2+2*x+1=0 , x)

编辑 - > 只是为了从ideone.com中找到没有依赖关系的答案,经过一些简化之后,你的700 char方程变为

   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) ¦
  ¦                                   ¦
  +-----------------------------------+

简短而甜蜜......:)

答案 1 :(得分:5)

我使用过wxMaxima。让它做替换是相当容易的,它是免费的。我不得不进行大量拉普拉斯变换,并进行部分分数扩展。一旦我学会了如何使用它,它就很快了。

答案 2 :(得分:3)

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))

不是必须更具可读性,但它不包含更多常见的子表达式。

答案 3 :(得分:2)

正如belisarius建议的那样,将等式放入数学编程语言(如 matlab,mathematica或maple )可以让您使用简化和缩减工具来帮助您。

如果您不想为matlab许可证支付高价,这里有一个免费的matlab程序列表http://www.dspguru.com/dsp/links/matlab-clones