2017-02-09 63 views
0

maxima接受a^ba**b作为取幂函数的输入,并将始终输出带有插入符号的指数^让maxima作为函数显示指数而不是插入符

是否有可能获得输出作为功能,如pow(a,b)

+0

这里你的大目标是什么?偶然,你是否试图为另一个系统(Python,C,其他系统)生成代码?你说exponents是用'^'输出的 - 你的意思是你正在看'grind'或'string'或'display2d:false'的结果吗?或者你的意思是你想在你使用的任何用户界面中看到'pow(a,b)'?如果是这样,您使用的是哪个用户界面?感谢您的任何信息。 –

+0

事实上,我们正试图为另一个系统生成语法,在这种情况下是javascript(它是Math.pow(a,b))。我们目前使用grind函数来输出。我们不需要pow(a,b)以最大值工作,它仅用于输出。感谢Robert – mmzc

回答

1

好吧,正如您所说的,您要为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)) 

千里马认为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)) 

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 

是预期产出?

+0

感谢Robert,这真棒。现在,我只需要第一部分,但其余部分也非常有趣! – mmzc

+0

嗨罗伯特。接下来,我们现在想要一种方法来将%e ^(任何东西)更改为exp(任何东西)。我看到maxima有办法从exp()转到%e ^,但这也有可能吗?谢谢 – mmzc

+0

是的,我会为此添加另一个答案。 –

1

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而不是。

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

相关问题