【问题标题】:Maxima: how to replace common subexpressions with symbolsMaxima:如何用符号替换常见的子表达式
【发布时间】:2014-03-27 11:11:59
【问题描述】:

假设我有一个类似的表达式(实际上我的要复杂得多,有数千个字符)

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

?

【问题讨论】:

    标签: replace expression symbols maxima


    【解决方案1】:

    看看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
    

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

    【讨论】:

    • 这正是我想要的,但不幸的是它在平方根下不起作用。如果将b*c*d 放在平方根下,letsimp 无法将b*c 替换为k。我怎样才能让它无处不在?
    • @mmj 试试scanmap(letsimp, expr)
    • 这很好,但在很多情况下似乎不起作用,例如,expr : %e^-1*x; let(%e^-1*x,y); scanmap(letsimp, expr); 不起作用,但如果我将 %e^-1 替换为 2,它确实起作用。
    • @BenCrowell 事实证明,您需要启用 letrat 标志 (q.v.) 以简化负幂。例如。 letrat:true; letsimp(...);。请记住,商表示为分子乘以分母乘以负 1 的乘积。
    • 它似乎一次只进行一次替换,因此,例如,这有效:letrat:true; let(x*x,u); let(sin(u),y); scanmap(letsimp,scanmap(letsimp, sin(x*x)));,但如果你不将扫描图函数嵌套两深,它就不起作用。
    【解决方案2】:

    你可以试试优化

    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
    

    【讨论】:

    • 不错!但是假设你想避免冗长的替换(主观),比如%2 : x^2,你怎么能得到呢?事实上,在我的真实表达中,我实际上只对optimize 建议的 16 个替换中的 2 个感兴趣。
    • 如果您事先知道您需要的替换(如我的问题中所示),并且您只想让 Maxima 将它们应用于复杂的表达式,该怎么办?
    • 在这种情况下@RobertDodier 给出了更好的建议。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2020-09-12
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多