假設我有一個像表達式(其實我的要複雜得多,成千上萬個字符)千里馬:如何與符號
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
?
假設我有一個像表達式(其實我的要複雜得多,成千上萬個字符)千里馬:如何與符號
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
?
看看let
和letsimp
。例如爲:
(%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
不同之處在於subst
和tellsimp
或defrule
那些其它功能使得僅正規的取代,即,替換子表達式它們是完全一樣的一些圖案。
您可以嘗試優化
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
這正是我正在尋找的東西,但不幸的是它在平方根下不起作用。如果將'b * c * d'放在平方根下,'letsimp'不能用'k'替換'b * c'。我怎樣才能使它在任何地方工作? – mmj
@mmj嘗試'scanmap(letsimp,expr)'。 –
就是這樣!謝謝! – mmj