让 maxima 将求幂显示为函数而不是插入符号
let maxima display an exponentiation as a function instead of a caret
maxima 接受 a^b
和 a**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/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
表示非交换乘法,但这在这里没有用,所以没关系。默认情况下,它在点的两侧显示 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 文档中的 defrule
和 matchdeclare
。
maxima 接受 a^b
和 a**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/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
表示非交换乘法,但这在这里没有用,所以没关系。默认情况下,它在点的两侧显示 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 文档中的 defrule
和 matchdeclare
。