maxima接受a^b
和a**b
作为取幂的输入,并始终使用插入符^
输出指数。
是否也可以将输出作为函数获取,例如pow(a,b)
?
答案 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/c
是c^(-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文档中查看defrule
和matchdeclare
。