假设我有一个表达式(实际上我的更复杂,成千上万的字符)
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
答案 0 :(得分:10)
查看let
和letsimp
。 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
letsimp
与subst
和tellsimp
或defrule
的不同之处在于,这些其他函数仅进行正式替换,即替换与某些模式完全相同的子表达式。
答案 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