2017-02-09 34 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

相關問題