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



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

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

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

我如何获得最大值,将其重新排列为n*log(A/B),这样我就可以根据log(A/B)执行变量替换和因子?

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

A和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(...)表达式并应用该规则,即使在复杂表达式中也是如此(而不仅仅是顶级运算符为log的表达式(。

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

我发现以下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

最新更新