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

时间:2017-02-09 14:48:23

标签: cas maxima

maxima接受a^ba**b作为取幂的输入,并始终使用插入符^输出指数。

是否也可以将输出作为函数获取,例如pow(a,b)

2 个答案:

答案 0 :(得分:1)

好的,正如你所说,你想为Javascript输出Math.pow(a,b)。我在这里建议的方法是用a^b表达式替换Maxima中的Math.pow(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表示非交换乘法,但这并没有在这里发挥作用,所以很好。默认情况下,它会在点的两侧显示一个空格,但如果您愿意进行少量的Lisp黑客操作,我们可以删除该空间。 (我想这与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))

好的,现在我们可以输出表达式。

(%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

这是预期的输出吗?

答案 1 :(得分:1)

OP询问有关将%e^x转换为exp(x)的问题。这很容易做到,但要坚持下去,我们必须禁用简化,即Maxima用于查找表达式的一般表示的身份的应用。默认情况下,Maxima将exp(x)简化为%e^x。我们可以将%e^x替换为exp(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