2014-03-27 63 views
5
代替普通的子表達式

假設我有一個像表達式(其實我的要複雜得多,成千上萬個字符)千里馬:如何與符號

expr:a+b*c+b*c*d; 

,我想用一個符號來代替內部的子表達式(有效避免常見的子表達式的重複計算),說k代替b*c

subst(b*c=k,expr); 

回報

k+b*c*d+a 

我怎樣才能讓千里馬計算「正確」的替代等等(從obviuos簡化開,在這裏)返回

k+k*d+a 

回答

8

看看letletsimp。例如爲:

(%i2) expr : a + b*c + b*c*d; 
(%o2) b*c*d+b*c+a 
(%i3) let (b*c, k); 
(%o3) b*c --> k 
(%i4) letsimp (expr); 
(%o4) d*k+k+a 

letsimp不同之處在於substtellsimpdefrule那些其它功能使得僅正規的取代,即,替換子表達式它們是完全一樣的一些圖案。

+0

這正是我正在尋找的東西,但不幸的是它在平方根下不起作用。如果將'b * c * d'放在平方根下,'letsimp'不能用'k'替換'b * c'。我怎樣才能使它在任何地方工作? – mmj

+3

@mmj嘗試'scanmap(letsimp,expr)'。 –

+0

就是這樣!謝謝! – mmj

4

您可以嘗試優化

http://maxima.sourceforge.net/docs/manual/en/maxima_6.html#IDX219

(%i14) example(optimize); 

(%i15) diff(exp(y+x^2)/(y+x),x,2) 
         2   2    2   2 
       2 y + x  y + x   y + x  y + x 
      4 x %e   2 %e   4 x %e   2 %e 
(%o15)  ------------- + ---------- - ------------ + ---------- 
       y + x   y + x    2    3 
              (y + x)  (y + x) 
(%i16) optimize(%) 
               2   y + %2  1 
(%o16) block([%1, %2, %3, %4], %1 : y + x, %2 : x , %3 : %e  , %4 : --, 
                     %1 
                   4 x %3 2 %3 
              4 %2 %4 %3 + 2 %4 %3 - ------ + ----) 
                    2  3 
                    %1  %1 
+0

不錯!但是,假設你想避免冗長的替換(主觀的),比如'%2:x^2',你怎麼獲得這個?的確,在我的真實表達中,我實際上只對'optimize'提出的16個替代品中的2個感興趣。 – mmj

+0

如果你事先知道你需要的替換(如我的問題),而你只是希望Maxima將它們應用於一個複雜的表達式呢? – mmj

+0

在這種情況下@RobertDodier給出了一個更好的建議。 – slitvinov