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

Actionscript 3 以编程方式优化表达式(通过删除冗余计算),actionscript-3,optimization,math,function,redundancy,Actionscript 3,Optimization,Math,Function,Redundancy,我有一个相当大的方程,我需要用它来解一个给定的变量。因此,我使用了一个在线工具,能够根据给定的变量重写一个方程。它给了我一些700个字符的巨大方程式。我测试了它,它确实有效 我可以在方程中看到一些非常明显的冗余,它重新计算了一个可以保存为临时变量的值。我可以遍历整个方程并自己优化它,但我可能要用更多的方程来实现这一点,所以我想把这个过程自动化 有哪些好的工具可以帮助优化数学冗余? (这只是一个个人项目,所以我更喜欢免费的) 我认识的所有人都会问:这是性能关键的代码,根据我的经验,AS3编译器不会

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

我可以在方程中看到一些非常明显的冗余,它重新计算了一个可以保存为临时变量的值。我可以遍历整个方程并自己优化它,但我可能要用更多的方程来实现这一点,所以我想把这个过程自动化

有哪些好的工具可以帮助优化数学冗余?
(这只是一个个人项目,所以我更喜欢免费的)

我认识的所有人都会问:这是性能关键的代码,根据我的经验,AS3编译器不会自行进行此类优化。删除冗余也将使代码更具可读性。

Edit>Expression将下面的700个字符缩减为20个字符

尝试在Wolfram Alpha或Mathematica中使用FullSimplify

编辑->

再想一想,Mathematica不需要简化一个var方程来求解它。。。Solve命令(或FindRoot或FindInstance…)将执行此操作

举个例子

编辑-> 为了使答案不受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))
在哪里

请检查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))
如果AE+BF>0(我猜是这样,因为如果不是t==0)

又短又甜……:)

正如建议的那样,将方程放入数学编程语言(如matlab、mathematica或maple)将允许您使用他们的简化和简化工具来帮助您


如果你不想为matlab许可证支付高昂的费用,这里有一个类似matlab的免费程序列表

我使用了
wxMaxima
。让它做替换相当容易,而且是免费的。我必须用部分分数展开来实现大量的拉普拉斯变换。一旦我学会了如何使用它,它就相当快了。

Maxima有一个有用的函数,名为
优化

功能:优化(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))

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

好主意。但是这个等式太大了,输入框无法接受它。因此,我将其直接编码到URL中以绕过此问题(使用python的urllib.urlencode)。但它把它简化为不正确的东西。也许它可以在Mathematica中正常工作,但我不认为它是免费软件:-(发布后,我会在Mathematica中尝试它。太长了!我会上传到某个地方…等等。[编辑,这里@belisarius:啊,括号不应该是url的一部分。所以这里又是:ideone.com/lV3Sx@wallacoloo请指定独立var和等式的另一边我个人更喜欢matlab,但我不是支付许可证的人:)@贝里萨里乌斯:如果你喜欢大规模屠杀共产主义者的照片,我想你有一个观点。阿凡达…@贝里萨里乌斯,哇教皇?我不知道你是怎么做到的:)我可以问哪位教皇吗?对于符号数学,你会想使用Maxima。Matlab和朋友是用于数值计算的。Maxima有很多函数用于分解和简化表达式ons。它甚至可以简化三角表达式。愿意分享这个问题中的方程吗?@Justin L。它在-见我回答中的评论。请编辑问题标题和文本。你不是在处理“方程”,因为没有自变量。你真正想优化的是一个“函数”此外,请考虑删除“等式”标签,虽然Mathematica似乎能够更好地简化方程,极大值是免费的,而且非常容易使用。所以我接受了这个答案。@ WalaCoLo你说“这是性能关键代码”,而不是“我想要最便宜的解决方案”。 :D@belisarius这是真的,我现在就去澄清;-)我不会从最终产品中获利,所以我宁愿不要在工具上花任何钱,不管它有多神奇。
  +-----------------------------------+
  ¦  Your 700 chars equation comes to ¦
  ¦                                   ¦
  ¦ t= -2 * (A*E + B*F) / (A^2 + B^2) ¦
  ¦                                   ¦
  +-----------------------------------+
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))