通过自动引入时间变量或以任何其他方式简化非常长的符号表达式

时间:2012-01-29 23:51:46

标签: matlab wolfram-mathematica maple symbolic-math

在尝试解决符号数学问题后,我得到了一个大约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 ....

是否有一种自动方法可以使用时间变量进行逐步简化?此外,您可以想到的任何其他方法都是合理的。

2 个答案:

答案 0 :(得分:6)

可以尝试常见的子表达式消除(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 :(得分:2)

正如我在评论中所写,似乎Mathematica的简化工具比Matlab中的类似命令更有效。 由于您似乎是Matlab用户,因此我在此向您详细说明如何使用Mathematica中的两个简化命令。 如果将长表达式定义为

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

然后你可以使用

Simplify[longExpression]  
and 
FullSimplify[longExpression]

最后一个产生一个漂亮而清晰的表达式,它只有1535个字符(听起来很多,但没有那么多变量)。 也许这足以简化您的问题。如果没有,请告诉我们。