让 maxima 将求幂显示为函数而不是插入符号

let maxima display an exponentiation as a function instead of a caret

maxima 接受 a^ba**b 作为求幂的输入,并且总是输出带插入符 ^ 的指数。

是否也可以像pow(a,b)一样将输出作为函数获取?

OK,正如你所说,你要为Javascript输出Math.pow(a,b)。我在这里建议的方法是用 Math.pow(a,b) 表达式替换 Maxima 中的 a^b 表达式并输出它。

(%i1) e : sqrt(a) + b^(3/2) + 1/c + exp(d^f);
                              f
                             d    1    3/2
(%o1)                      %e   + - + b    + sqrt(a)
                                  c
(%i2) subst ("^"=lambda([a, b], Math.pow(a, b)), e);
                                         3                  1
(%o2) Math . pow(c, - 1) + Math . pow(b, -) + Math . pow(a, -)
                                         2                  2
                                             + Math . pow(%e, Math . pow(d, f))

好的,这就是那里的大部分工作。某些表达式表示为 "^" 表达式,即使它们看起来是其他表达式,例如,sqrt(a)a^(1/2)1/cc^(-1)。如果您需要将它们保留为 sqrt(a)1/c,那么我们将不得不进行处理。

我猜最好使用浮点值而不是整数比率。此外,我们将用其数值替换 %e。如果您希望 %e^x 呈现为 Math.exp(x),我们可以解决这个问题。或者你想要Math.pow(Math.E, x),那也比较简单;只需评估 subst(%e = Math.E, <your expression>).

(%i3) float (%);
(%o3) Math . pow(c, - 1.0) + Math . pow(b, 1.5) + Math . pow(a, 0.5)
                              + Math . pow(2.718281828459045, Math . pow(d, f))

Maxima 认为 x . y 表示非交换乘法,但这在这里没有用,所以没关系。默认情况下,它在点的两侧显示 space,但如果您愿意进行少量 Lisp 修改,我们可以删除 space。 (我想 Javascript 没关系吧?Math . pow 等同于 Math.pow,不是吗?)

(%i4) :lisp (setf (get 'mnctimes 'dissym) '(#\.))
(.)
(%i4) %o3;
(%o4) Math.pow(c, - 1.0) + Math.pow(b, 1.5) + Math.pow(a, 0.5)
                                  + Math.pow(2.718281828459045, Math.pow(d, f))

OK,现在我们可以输出表达式了。

(%i5) grind (%o3);
Math.pow(c,-1.0)+Math.pow(b,1.5)+Math.pow(a,0.5)
                +Math.pow(2.718281828459045,Math.pow(d,f))$
(%o5)                                done

这是预期的输出吗?

OP 询问有关将 %e^x 转换为 exp(x) 的问题。这很容易做到,但要让它坚持下去,我们必须禁用简化,即应用 Maxima 用来找到表达式的一般表示的恒等式。默认情况下,Maxima 将 exp(x) 简化为 %e^x。我们可以用 exp(x) 替换 %e^x 但我们需要禁用简化以防止它再次返回。

(%i1) simp:false $
(%i2) matchdeclare (xx, all) $
(%i3) defrule (to_exp, %e^xx, Math.exp(xx));
                                   xx
(%o3)                   to_exp : %e   -> Math . exp(xx)
(%i4) apply1 (1 + %e^(x + %e^y), to_exp);
(%o4)                  1 + Math . exp(x + Math . exp(y))

可能您只想在准备好输出表达式时禁用简化(即 simp:false)。但我可以想象你会禁用它的情况,例如如果准确地按照输入的方式输出表达式很重要,例如x + x 而不是 2*x.

我在这里使用了不同的机制来进行替换,即 defrule,它定义了模式匹配规则。模式匹配非常有用,我鼓励您查看 Maxima 文档中的 defrulematchdeclare