2012-01-29 59 views
6

尝试解决符号数学问题后,我得到一个约17000个字符的表达式。我正在使用Matlab的符号工具箱,但我愿意接受任何建议(Mathematica,无论如何)。通过自动引入时间变量或以任何其他方式简化很长的符号表达式

由于显而易见的原因,我不会将表达式直接复制粘贴到问题中。 Here is a link instead

运行Matlab命令simplifysimple,甚至试图collect没有改善情况(有些变得更糟)。

但我想知道,我不在乎表达式是否在步骤中用时间参数进行评估。类似于:

z1 = a^2*y1; 
%Now the expression can be simplified by using z1 as alias! 
z1+z1^2 .... 

是否有一种自动方法可以通过时间变量获得这种逐步简化?另外,你可以想到的任何其他方法都是合理的。

+1

@Mr。向导同意。我几乎买了你一个,直到我看着价格标签(他们夸大了一切......) – 2012-01-30 02:00:03

+0

@丹尼尔我还没有决定是否应该感谢你或者按费用。 O_o – 2012-01-30 04:15:27

+0

我无法直接与Matlab进行比较(我没有这个程序),但似乎Mathematica的Simplify和FullSimplify比Matlab中的类似命令更有效率。简化后的表达式有2192个,在FullSimplify之后它只有1535个字符。也许这对你来说已经足够简化了,否则这将是进一步尝试简化的一个很好的新起点。 – partial81 2012-01-30 09:53:36

回答

5

可能会尝试通用子表达式消除(CSE)。下面是一个例子,从

Get mathematica to simplify expression with another equation

InputForm[Experimental`OptimizeExpression[(3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] + 
     a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6]] 

==>

Out[206]//InputForm= 
Experimental`OptimizedExpression[Block[{Compile`$1, Compile`$3, Compile`$4, 
    Compile`$5, Compile`$6}, Compile`$1 = a^2; Compile`$3 = 6*a; 
    Compile`$4 = 5*Compile`$1; Compile`$5 = 5 + Compile`$3 + Compile`$4; 
    Compile`$6 = Sqrt[Compile`$5]; (3 + 3*Compile`$1 + Compile`$6 + 
    a*(4 + Compile`$6))/6]] 
1

那儿剽窃正如我在评论中写道,似乎Mathematica的简化工具是不是在Matlab类似的命令更有效。 由于您似乎是Matlab用户,因此我在此给您详细说明如何使用Mathematica的两个简化命令。 如果你定义你的长期表达

longExpression = (x3^2*(y2+y3-a*y1-a*y2-2*a*y3-... 

然后你可以使用

Simplify[longExpression] 
and 
FullSimplify[longExpression] 

最后产生了很好的和明确表达它只有1535个字符(听起来很多,但目前还没有这么多的变数)。 也许这对于你的问题来说已经足够简化了。如果没有,请告诉我们。

相关问题