Maxima:如何用符号替换常见的子表达式

时间:2014-03-27 11:11:59

标签: replace expression symbols maxima

假设我有一个表达式(实际上我的更复杂,成千上万的字符)

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

我希望用符号替换内部子表达式(有助于避免重新计算常见的子表达式),比如k代替b*c

subst(b*c=k,expr);

返回

k+b*c*d+a

如何让Maxima计算“正确”的替换以便返回(除了obviuos简化,这里)

k+k*d+a

2 个答案:

答案 0 :(得分:10)

查看letletsimp。 E.g:

(%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

letsimpsubsttellsimpdefrule的不同之处在于,这些其他函数仅进行正式替换,即替换与某些模式完全相同的子表达式。

答案 1 :(得分: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