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

8
尝试解决一个符号数学问题后,我得到了一个大约有17000个字符的表达式。我正在使用Matlab的符号工具箱,但我也愿意听取任何建议(Mathematica等)。
出于显而易见的原因,我不会直接将表达式复制粘贴到问题中。这里是链接
运行Matlab命令simplify和simple,甚至尝试collect并没有改善情况(有些情况变得更糟了)。
但我想知道,如果表达式可以按步骤进行评估,并带有时间参数,那么我就不在意。
 z1 = a^2*y1;
 %Now the expression can be simplified by using z1 as alias!
 z1+z1^2 ....

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


1
@Mr. Wizard同意。我差点给你买了一个,直到我看了价格标签(他们抬高了一切...) - Daniel Lichtblau
@Daniel 我还没有决定是要感谢你还是要起诉你。O_o - Mr.Wizard
我无法直接与Matlab进行比较(我没有这个程序),但似乎Mathematica的Simplify和FullSimplify命令比Matlab中类似的命令更有效。在使用Simplify命令后,您的表达式有2192个字符,在使用FullSimplify命令后只有1535个字符。也许这已经足够简化了,或者它可以成为进一步简化尝试的良好起点。 - partial81
感谢您的反馈!您的问题主要关于时间变量的简化。在我的回答中,我完全忽略了这一点。因此,在我看来,我的评论仅仅是一个评论,而不是一个答案。但也许您可以用一些论据说服我;-) 如果您的表达式经过Mathematica的简化后足够简单,那么我的评论就会成为一个(随机)答案。 - partial81
2个回答

6

可以尝试使用常见子表达式消除(CSE)优化技术。以下是从这里借鉴的示例。

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]]

有没有办法将这些变量Compile**设置为像c1、c3、c4、c5等简单的变量? - BabaYaga

2

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

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

然后您可以使用


Simplify[longExpression]  
and 
FullSimplify[longExpression]

最后得到了一个简洁清晰的表达式,只有1535个字符(听起来很多,但变量并不多)。也许这已经足够简化你的问题了。如果不是,请告诉我们。


请问在Maple中是否有相应的函数,您能否给予建议? - Rohithsai Sai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接