如何让maxima有效简化日志

如何让maxima有效简化日志,maxima,Maxima,我有一个生成术语的maxima脚本,在运行logcontract之后,我会得到一个表达式,其中包含许多类型的术语 log((A^n)/(B^n)) 其中A和B都是非平凡表达式 如何让maxima将其重新排列为n*log(A/B),以便我可以根据log(A/B)执行变量替换和因子 我明确地需要它的形式是log(A/B),而不是log(A)-log(B) A和B可能被假定为正。我发现以下logexpand(带有super选项)和logcontract的组合似乎可以完成这项工作 (%i1) log(

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

log((A^n)/(B^n))
其中A和B都是非平凡表达式

如何让maxima将其重新排列为
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(…)
表达式,甚至在复杂表达式中应用规则(不仅仅是顶级运算符为
log
的表达式)


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

嗯,只是尝试了一下,它适用于一般情况n,但是如果n是一个整数,它会恢复到不希望出现的行为,嗯,是的,你是对的。根据
logcontract
的文档,这正是它应该做的;它为
n
工作只是一个愉快的意外。我尝试了
logconcoeffp
选项,但什么都没用。此时,我认为模式匹配解决方案(通过
tellsimp
tellsimpafter
defrule
defmatch
)是可能的。让我想想,这很有效。log(aa^nn/bb^nn)vs log(bb^nn/aa^nn)似乎是表达式a和B的函数,但这可以在后面用另一个替换来处理。