天天看點

Maxima的一些進階功能

    MAXIMA 是完全可以跟 Mathematica 和 Maple 比美的 CAS。實際上 Mathematica 和 Maple 的很多優點都是從 MACSYMA 身上學來的。

  1. 嚴密的邏輯

    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
    
    
          
    而不會再問你問題了。
  2. 友善的推理

    不僅嚴密,而且 MAXIMA 有比 Mathematica 和 Maple 友善的推理系統。你跟 MAXIMA 就像在對話:

    看看這個例子: 如果A>=B, B>=C, C>=A, 那麼 A=C 嗎?

    (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
    
    
          
    另一個例子: 如果 x>y, 那麼x^2 >y^2 嗎?
    (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);)
    
    
          
    MAXIMA 不能回答你,因為 x,y 的符号未知。 現在你告訴它 x 和 y 都是正數:
    (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
    
    
          
  3. 抽象代數

    在你還沒有函數的定義時,你就可以聲明這個函數的一些性質。這樣你可以在很多時候大大簡化結果。比如,你可以聲明一個函數是奇函數:

    (C1) DECLARE(F,ODDFUN);
    
    
    
    
    
    (D1)                                 DONE
    
    
    (C2) F(-A); 
    
    
    (D2)                                -F(A)
    
    
          
    F(-A) 以後簡化時就可以被當成 -F(A)。你再聲明 F(X) 是 OUTATIVE:
    (C5) DECLARE(F,OUTATIVE);
    
    
    
    
    
    (D5)                                 DONE
    
    
    (C6) F(3*A);
    
    
    
    
    
    (D6)                                3 F(A)
    
    
          
    這樣,F(3a) 可以被當成 3F(a)。綜合以上兩個事實,我們可以得到:
    (C7)  F(-A)+F(2*A)-F(A);
    
    
    
    
    
    (D7)                                   0
    
    
          
    如果你告訴 MAXIMA,n 是一個整數,那麼它就知道 sin(n pi) = 0.
    (C1) declare(n,integer);
    
    
    (D1) 			    DONE
    
    
    (C2) sin(n*%pi);
    
    
    (D2) 			     0
    
    
          
    你甚至可以定義自己的操作符,它可以有中綴,字首,字尾,nary等各種方式,可以有任意的優先級,可以設定它是左結合還是右結合。比如我們來定義一個NARY操作 "&",它的優先級是180(預設),它是右結合的。
    (C6) NARY("&");
    
    
    
    
    
    (D6)                                  "&"
    
    
    (C7) declare("&",RASSOCIATIVE);
    
    
    
    
    
    (D7)                                 DONE
    
    
    (C8) x&y&a&b;
    
    
    
    
    
    (D8)                          x & (y & (a & b))
    
    
          
  4. 超強的擴充能力

    另外,MAXIMA 是可以用自己的語言或者 LISP 進行擴充的。比如你可以用 recur 包來推導遞推關系:

    (C8) load(recur);
    
    
    
    
    
    (D8)          /usr/share/maxima/5.9.0rc3/share/algebra/recur.mac
    
    
          
    現在我們來解一個“快速排序”的時間複雜度分析裡出現的簡單的遞推關系:
    T(0)=0
    
    
    T(N)=2*T(N-1)+1
    
    
          
    這樣輸入到 MAXIMA:
    (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

繼續閱讀