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

Pon*_*dle 9 math optimization redundancy function actionscript-3

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

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

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

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

Dr.*_*ius 10

编辑>表达式缩小为700到20个字符

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

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

编辑 - >

再想一想,Mathematica不需要简化你的一个var方程来解决它...... Solve命令(或FindRoot,或FindInstance ......)会做到这一点.

试试这个例子

WolframAlpha求解(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))
Run Code Online (Sandbox Code Playgroud)

哪里

   E = e - g
   A = a - c
   B = b - d
   F = f - h
   I = i + j
Run Code Online (Sandbox Code Playgroud)

请检查Sqrt论证是否是一个完美的正方形,基于其他"几何"考虑因素......它吠叫并且有一条尾巴...它是一条狗吗?

编辑 - >猜测:

我没有任何证据,但方程的对称性表明你的问题

  E^2 = (I^2-F^2)  => (e-g)^2 = (i+j)^2 - (f-h)^2
Run Code Online (Sandbox Code Playgroud)

如果是这样(请核实),你的等式就变成了

  t= -((E*A+B*F+ Abs(E*A+B*F)) /(A^2 + B^2))
Run Code Online (Sandbox Code Playgroud)

如果A E + B F> 0(我猜是这样,因为如果不是t === 0)

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

简短又甜蜜...... :)


Mik*_*vey 5

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


Nik*_*iki 3

Maxima 有一个有用的函数,称为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))
Run Code Online (Sandbox Code Playgroud)

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