我有一个非常大的等式,我需要用它来解决给定的变量。所以我使用了一个能够根据给定变量重写方程的在线工具。它给了我一些巨大的700字符方程式。我测试了它,它确实有效。
我可以在等式中看到一些非常明显的冗余,它重新计算一个可以保存为临时变量的值。我可以通过整个方程并自己进行优化,但是我可能不得不用更多的方程来做这个,所以我想要自动化这个过程。
有哪些有助于优化数学冗余的优秀工具?
(这只是个人项目,所以我真的更喜欢免费的东西)
对于所有我认识的人都会问这个问题真的是必要的:这是性能关键代码,根据我的经验,AS3编译器不会对它自己做这些优化。删除冗余也会使代码更具可读性。
答案 0 :(得分:10)
尝试在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。