MAXIMA 是完全可以跟 Mathematica 和 Maple 比美的 CAS。實際上 Mathematica 和 Maple 的很多優點都是從 MACSYMA 身上學來的。
-
嚴密的邏輯
Maple 和 Mathematica 經常做錯的東西,MACSYMA 經常會給你一個合理的答複。當然它也會做錯。小心!計算機代數系統給出的答案都有可能是錯誤的,不能完全依賴它們。
你可以試試積分: integrate(x^i,x) 和 Integrate 1/sqrt(2-2*cos(x)) from x=-pi/2 to pi/2。 Mathematica 4.1 會立即給你一個不完全正确甚至錯誤的答案。
在這種情況下,MAXIMA 的表現要聰明的多,因為它畢竟有幾十年的經驗。MAXIMA 預設是一個非常嚴密的系統,如果你要積分:
MAXIMA 會問你:
這是因為現在我們不知道 i 是否等于 -1。如果 i=-1, 那麼這個積分應該等于 LOG(x),其中 LOG 是 MAXIMA 的自然對數符号。如果 i 不等于 -1,那麼積分應該等于
i + 1 x ------ i + 1
這樣每次都要問你有時很麻煩,你也可以告訴它,沒有特殊指明的情況下,假設積分裡的符号都是正數:
它以後遇到 integrate(x^i,x); 就會直接給你
而不會再問你問題了。i + 1 x ------ i + 1
-
友善的推理
不僅嚴密,而且 MAXIMA 有比 Mathematica 和 Maple 友善的推理系統。你跟 MAXIMA 就像在對話:
看看這個例子: 如果A>=B, B>=C, C>=A, 那麼 A=C 嗎?
另一個例子: 如果 x>y, 那麼x^2 >y^2 嗎?(C1) ASSUME(A>=B, B>=C); (D1) [A >= B, B >= C] (C2) ASSUME(C>=A); (D2) [C >= A] (C3) IS(EQUAL(A,B)); (D3) TRUE
MAXIMA 不能回答你,因為 x,y 的符号未知。 現在你告訴它 x 和 y 都是正數:(C4) ASSUME(x>y); (D4) [x > y] (C5) IS(x^2>=y^2); MACSYMA was unable to evaluate the predicate: 2 2 x >= y -- an error. Quitting. To debug this try DEBUGMODE(TRUE);)
(C6) assume(x>0, y>0); (D6) [x > 0, y > 0] (C7) is(x^2>y^2); (D7) TRUE
這下它告訴你答案了。
它可以根據一些事實來化簡式子。我們有這樣一個複雜的式子:
我們還有兩個簡單的事實:(C11) EXP:-K^2*L^2*M^2*N^2-K^2*L^2*N^2+K^2*M^2*N^2+K^2*N^2 2 2 2 2 2 2 2 2 2 2 2 2 (D11) - K L M N + K M N - K L N + K N
讓它根據這兩個事實化簡第一個式子: 得到一個很簡單的答案:(C12) EQ1:L^2+K^2 = 1 2 2 (D12) L + K = 1 (C13) EQ2:N^2-M^2 = 1 2 2 (D13) N - M = 1
4 4 (D14) K N
-
抽象代數
在你還沒有函數的定義時,你就可以聲明這個函數的一些性質。這樣你可以在很多時候大大簡化結果。比如,你可以聲明一個函數是奇函數:
F(-A) 以後簡化時就可以被當成 -F(A)。你再聲明 F(X) 是 OUTATIVE:(C1) DECLARE(F,ODDFUN); (D1) DONE (C2) F(-A); (D2) -F(A)
這樣,F(3a) 可以被當成 3F(a)。綜合以上兩個事實,我們可以得到:(C5) DECLARE(F,OUTATIVE); (D5) DONE (C6) F(3*A); (D6) 3 F(A)
如果你告訴 MAXIMA,n 是一個整數,那麼它就知道 sin(n pi) = 0.(C7) F(-A)+F(2*A)-F(A); (D7) 0
你甚至可以定義自己的操作符,它可以有中綴,字首,字尾,nary等各種方式,可以有任意的優先級,可以設定它是左結合還是右結合。比如我們來定義一個NARY操作 "&",它的優先級是180(預設),它是右結合的。(C1) declare(n,integer); (D1) DONE (C2) sin(n*%pi); (D2) 0
(C6) NARY("&"); (D6) "&" (C7) declare("&",RASSOCIATIVE); (D7) DONE (C8) x&y&a&b; (D8) x & (y & (a & b))
-
超強的擴充能力
另外,MAXIMA 是可以用自己的語言或者 LISP 進行擴充的。比如你可以用 recur 包來推導遞推關系:
現在我們來解一個“快速排序”的時間複雜度分析裡出現的簡單的遞推關系:(C8) load(recur); (D8) /usr/share/maxima/5.9.0rc3/share/algebra/recur.mac
這樣輸入到 MAXIMA:T(0)=0 T(N)=2*T(N-1)+1
(C14) CHAR(T(N+1)-2*T(N),1,T,N,1,[T(0)=0]); N (D14) T(N) = 2 - 1
這個 recur 實際上隻是一個200多行的小程式,就可以幫你處理線性遞推關系, 生成函數……
MAXIMA 有函數式的程式語言,它比通常的過程式語言要強大的多。你甚至可以接觸到它底層的 LISP。Mathematica 的文法就是跟 MACSYMA 學來的。
MAXIMA 完全是用 LISP 語言寫的,是以它繼承了 LISP 語言天生的特征。它分為上下兩層,上面一層叫做 MAXIMA level,下面一層叫做 LISP level。上下兩層是相通的,如果你懂得 LISP,你可以随時按 Ctrl-C 進入到 LISP 的環境,定義一個函數,然後退回到 MAXIMA 層調用那個函數。當然在 LISP level 還有很多工作可以做。你也可以在 MAXIMA level 定義了函數,然後在 LISP level 進行調用。
摘自:http://docs.huihoo.com/homepage/shredderyin/maxima.html