8

在尝试解决一个符号数学问题后,我得到了一个大约 17000 个字符的表达式。我正在使用 Matlab 的符号工具箱,但我愿意接受任何建议(Mathematica 等)。

出于显而易见的原因,我不会将表达式直接复制粘贴到问题中。这是一个链接

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

但我想知道,我不在乎表达式是否使用时间参数分步进行评估。就像是:

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

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

4

2 回答 2

6

可能会尝试常见的子表达式消除(CSE)。这是一个抄袭的例子

获取mathematica 用另一个方程简化表达式

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]]
于 2012-01-30T01:58:53.297 回答
2

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

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

然后你可以使用

Simplify[longExpression]  
and 
FullSimplify[longExpression]

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

于 2012-01-30T14:43:02.997 回答