2012-01-29 33 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個字符(聽起來很多,但目前還沒有這麼多的變數)。 也許這對於你的問題來說已經足夠簡化了。如果沒有,請告訴我們。

相關問題