9

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

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

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

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

4

4 回答 4

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 字符方程变为

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

简短而甜蜜... :)

于 2010-06-25T00:34:58.227 回答
5

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

于 2010-06-25T13:15:34.110 回答
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))

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

于 2010-06-25T13:59:54.627 回答
2

正如belisarius建议的那样,将方程放入matlab、mathematica 或 maple等数学编程语言中,您可以使用它们的简化和简化工具来帮助您。

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

于 2010-06-25T00:40:19.213 回答