我如何获得最大值以有用地简化日志
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)
... 这没有错,但很不方便。可能与参数匹配的顺序有关;我没有调查。
我有一个 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)
... 这没有错,但很不方便。可能与参数匹配的顺序有关;我没有调查。