我如何获得最大值以有用地简化日志

How do I get maxima to simplify logs usefully

我有一个 maxima 脚本,它在 logcontract 之后生成术语 运行 我得到一个包含许多类型术语的表达式

log((A^n)/(B^n))

其中 A 和 B 都是非平凡表达式

我怎样才能让最大值重新排列成 n*log(A/B) 这样我就可以根据 log(A/B) 执行变量替换和因子?

我明确需要它的形式是 log(A/B) 而不是 log(A)-log(B)

A 和 B 可以假定为正。

我发现 logexpand(带有 super 选项)和 logcontract 的以下组合似乎可以完成这项工作。

(%i1) log((A^n)/(B^n)), logexpand=super;
(%o1)                  log(A) n - log(B) n
(%i2) %, logcontract;
                                A
(%o2)                       log(-) n
                                B

好的,拿两个。这是通过模式匹配的另一种方法。

(%i1) matchdeclare ([aa, bb, nn], all);
(%o1)                         done
(%i2) defrule (mylogrule, log((bb^nn)/(aa^nn)), nn*log(bb/aa));
                                 nn
                               bb           bb
(%o2)          mylogrule : log(----) -> log(--) nn
                                 nn         aa
                               aa
(%i3) log(A^4/B^4);
                                  4
                                 A
(%o3)                        log(--)
                                  4
                                 B
(%i4) apply1 (%o3, mylogrule);
                                  A
(%o4)                       4 log(-)
                                  B
(%i5) log(A^k/B^k);
                                  k
                                 A
(%o5)                        log(--)
                                  k
                                 B
(%i6) apply1 (%o5, mylogrule);
                                A
(%o6)                       log(-) k
                                B

请注意,apply1 会找到 log(...) 表达式并应用规则,即使在复杂的表达式中(不仅仅是 top-level 运算符为 log 的表达式)。

我把规则写成 log(bb^nn/aa^nn) 因为 log(aa^nn/bb^nn) 结果是 -nn*log(bb/aa) ... 这没有错,但很不方便。可能与参数匹配的顺序有关;我没有调查。