Maxima
数式処理システム Maxima
Maximaの3D Plot Window  注意: このページは2001年以降,進化していません. ぽんぽこ様 の記事をお勧めします.

 Maxima は MIT の Macsyma system を William F.Schelter さんが Common Lisp で実装したもので, Mathematica や Maple と同様,非常に本格的な数式処理システムです. Macsyma system は 数式処理システムの中では歴史ある汎用数式処理システムの1つで, 非常に長い期間メンテナンスされてきており Mapleと同様 高い評価を得ています. Maxima は GNU Public License(GPL)のもとにリリースされており, 汎用数式処理システムでは 数少ない非商用(無料)・オープンソースのもので, その完成度は商用のものに劣りません.
 このソフトウェアは非常に優秀であるにもかかわらず, なぜか,日本ではあまり知られていません. 検索エンジンで検索しても,ほとんどひっかかりません. このままではもったいなすぎると思い, この Maxima をここで紹介することにしました. 数式処理システムが高くて買えない方, 現在,数式処理システムを1つしか使えない方など, ぜひお試しになってください.


■Maxima News

XMaxima
Maxima-5.9 が公開されています.

 Linux+glibc2対応, Maxima-ML の発足, XとWindows両対応のGUI(右の取り込み画像はX上のもの)など, Maximaの開発は想像以上に精力的のようです. Version-5.6 で Plotting のバグもいくつか修正され,以下のように様々な 3dプロットができる事を確認しました. 今後の拡張に期待したいところです.
 なお,Maxima-5.4のマニュアルのほとんどが ぽんぽこ様 によって 和訳 されています.これはとてつもなく大きな前進です.

Maxima は http://maxima.sourceforge.net/ で開発されています.  Maximaはソースコード,Windows用バイナリ, GCL,Clisp,CMUCLのソースコードがダウンロードできます.



■Maximaで何ができる?

 数式の展開,因数分解に始まって,微分,積分,線型方程式や3次方程式, 非線型方程式を解いたり,テンソルも当然扱えます. プログラムを組むことで, Numericalな計算もこなします(いくつか数値計算パッケージが用意されています). また,2D,3Dのプロットもできます. …というか,私はまだ全然Maximaの機能を把握できていません. マニュアルを印刷したら,数センチの厚みになったくらいですから…. より詳しく知りたい方は, こちら を見てください.ポストスクリプトのマニュアルは こちら(maxima.ps)です(200ページ以上あります). あぁ,はてしない…


■GUIはあるの?

 特に最近のパソコンユーザにとって重要なGUI. Version 5.4 まではグラフ作成ウィンドウの簡単なGUIしか ありませんでしたが, Version 5.5 になって xmaxima という GUI がつくようになりました. 全体的にGUIデザイン(見た目も操作性も)はまだまだこれから という感じで, メニューも非常に貧弱 かつ バグ付きだったりします. しかし,マウスでダブルクリックするだけでデモンストレーションが実行できたり, 簡単なWebブラウザが付属するなど, 数式処理システムとは思えないほど, 非常に入門しやすいものになりました. これはすばらしい事だと思います.


■インストール

 以下では Maxima 5.6 の, 主に Linux でのインストールの方法を述べています. gclとMaximaを完全な形でインストールするには, tcl/tkとwish8.0が必要です. Linuxの場合,ほどんどのディストリビューションで tcl/tkとwishは入っていると思われるので気にしなくていいでしょう.
 Maximaはgcl上で動くので,gcl,Maximaの順にインストールしていきます. 最近のEmacsがインストールされている環境では, おそらくパッチ
gcl-2.4.0_configure_emacs.patch が必須だと思います. Linuxにインストールする場合は 私の用意したlinuxパッチをあてる事をおすすめします(以下からダウンロードで きます.以下のパッチがなくても問題なく動作するようです).
ポストスクリプト出力のデフォルトを A4縦 に変更するパッチを用意しました.
gclは,こちらから, Maximaは,こちら からとってこれます(以下のリンクからもgetできます).
 以下のようにインストールしてみてください.
・gcl
% tar zxvf gcl-2.4.0.tgz
% cd gcl-2.4.0
% patch -p1 <../gcl-2.4.0_linux.patch
% patch -p1 <../gcl-2.4.0_readline_v1.patch
% patch -p1 <../gcl-2.4.0_configure_emacs.patch
% sh configure
% make
% su
# make install

・Maxima
% tar zxvf maxima-5.6.tgz
% cd maxima-5.6
% patch -p1 < ../maxima-5.6_plotjp_v0.0.patch
% vi configure
ここのパッチは Plot Window でのポストスクリプト出力のデフォルトを A4縦 に変更するパッチです.
 ここで,configureGCLDIRMAXDIREMACS_SITE_LISP を書き換えます.前2つはそれぞれgcl,Maximaのソースを展開したディレクトリ, EMACS_SITE_LISP/usr/share/emacs/site-lisp にします.
% ./configure
% make
% make test
% su
# make install
# cp share/* /usr/local/lib/maxima-5.6/share/.
# cp share1/* /usr/local/lib/maxima-5.6/share1/.
# cp share2/* /usr/local/lib/maxima-5.6/share2/.
# cp sharem/* /usr/local/lib/maxima-5.6/sharem/.
 xmaxima 上で quit(); を入力せずに終了すると, まず100% saved_maxima が居残り,暴走してくれます. これを防止するため,このように /usr/local/bin/xmaxima に 親プロセスを失ったsaved_maxima を殺すスクリプトを入れます.

 Maxima-5.6 はどの Linux でも問題なく動作するようです.
 Maxima-5.4 時代には 多くの方々から動作報告をいただきました. 報告していただいたみなさまに,感謝いたします.


■ Maxima を使ってみよう.

■展開と因数分解.

 では,GUI版の XMaxima を kterm などの端末から起動しましょう. xmaxima & と入力してください.
hoge@hoge% xmaxima &
 立派なウィンドウが開き,以下のようなメッセージが表示されているはずです.
Maxima 5.6 2001年 6月16日 (土) 23:50:05 JST (with enhancements by W. Schelter).
Licensed under the GNU Public License (see file COPYING)
(C1)
 試しに数式の展開をやらせてみましょう. 受験時代,よくやりましたよね^^; 数式の展開には expand(なんたらかんたら); とします.最後に『;』(セミコロン)をつける事に注意してください. Maximaは『;』が入力されるまで,処理を行わないので, 複数行にわたって記述が可能です.最後に『;』をつけ忘れても 次の行でセミコロンを書けばOKです.
(C1) expand((x+y)^6);

           6        5       2  4       3  3       4  2      5      6
(D1)      y  + 6 x y  + 15 x  y  + 20 x  y  + 15 x  y  + 6 x  y + x
(C2)
ここで (x+y)^6 は (x+y)の6乗を意味します. 結果(D1)
という事です.
 (C1) とか (D1) というのは,その行に対する 「ラベル」で,Maxima が勝手に生成してくれるもので, このラベルは次回からの計算に使う事ができます.
 それでは,今度は因数分解してみましょう. 因数分解は,factor(ほげほげ); とします.次の例は(D1)の結果を元に戻しています.
(C2) factor(d1);

                                          6
(D2)                               (y + x)
(C3) 
括弧の中に d1 のように書く事で, 前回入力した式や結果を参照できます.
 【重要】
 Maximaは致命的なエラーが起きると, 以下のように TOP-LEVEL を抜けるようになっています. わざとエラーを起こしてみましょう.
(C3) save("~/");


Error: Cannot create the file ~/.
Fast links are on: do (si::use-fast-links nil) for debugging
Error signalled by CATCH.
Broken at MACSYMA-TOP-LEVEL.  Type :H for Help.
MAXIMA>>
こういう時は,:Q と入力します.
MAXIMA>>:Q

(C4) 
 一旦,Maxima を終了してみましょう.終了は quit(); と入力します.
(C4) quit();


■微分,積分.

 次は,微分と積分をさせてみましょう. 微分は,diff(数式,微分したい文字); , 積分は,integrate(数式,積分したい文字); とします.
(C1) expand((x+y)^6);

           6        5       2  4       3  3       4  2      5      6
(D1)      y  + 6 x y  + 15 x  y  + 20 x  y  + 15 x  y  + 6 x  y + x
(C2) diff(%,x);

                5         4       2  3       3  2       4        5
(D2)         6 y  + 30 x y  + 60 x  y  + 60 x  y  + 30 x  y + 6 x
(C3) integrate(1/(1+x^3),x);

                                         2 x - 1
                       2            ATAN(-------)
                  LOG(x  - x + 1)        SQRT(3)    LOG(x + 1)
(D3)            - --------------- + ------------- + ----------
                         6             SQRT(3)          3
(C4) 
ここで,(C2) のところで % と していますがこれは「前回の結果を参照せよ」 という意味で,ここでは d1 としたのと同じことです.
 さて,ここで少し表示方法を変更してみましょう. 人によっては肩の数字を右上に表したり,分数を ------ で表すのは好みでないかもしれません.そういう時は, 以下のようにして 変数 DISPLAY2D FALSE にします. また,数式をFORTRAN形式に変換する事もできます(もちろん,FORTRANの 桁数制限を考慮したプリントがなされます).
(C4) DISPLAY2D:FALSE;

(D4) FALSE
(C5) d3;

(D5) -LOG(x^2-x+1)/6+ATAN((2*x-1)/SQRT(3))/SQRT(3)+LOG(x+1)/3
(C6) fortran((d3)*(d1));

      (-LOG(x**2-x+1)/6.0+ATAN((2*x-1)/SQRT(3))/SQRT(3)+LOG(x+1)/3.0)*(y
     1   **6+6*x*y**5+15*x**2*y**4+20*x**3*y**3+15*x**4*y**2+6*x**5*y+x*
     2   *6)
(D6) DONE


■方程式を解かせる.

 線型方程式,3次方程式を解かせてみましょう.
(C7) DISPLAY2D:TRUE;

(D7)                                 TRUE
(C8) linsolve( [ 3*x + 4*y = 7, 2*x + a*y = 13], [x,y]);

                               7 a - 52        25
(D8)                      [x = --------, y = -------]
                               3 a - 8       3 a - 8
(C9) solve( x^3 - 3*x^2 + 5*x = 15, x);

(D9)               [x = - SQRT(5) %I, x = SQRT(5) %I, x = 3]
(C10) 
 次は非線型の方程式です. 方程式は 式名: 式a=式b と書いて定義します.なお,行の終わりに ; ではなく $ を使うと,その行の結果は表示しません.
(C10) eq1: x^2 + 3*x*y + y^2 = 0$

(C11) eq2: 3*x + y = 1$

(C12) solve([eq1, eq2],[y,x]);

              3 SQRT(5) + 7      SQRT(5) + 3
(D12) [[y = - -------------, x = -----------], 
                    2                 2

                                             3 SQRT(5) - 7        SQRT(5) - 3
                                        [y = -------------, x = - -----------]]
                                                   2                   2
(C13) 


■セーブとロード,プレイバック.

 今までの入力した式と結果をすべてセーブして終了しましょう. セーブは, save("ファイル名",セーブしたい行ラベル); とします.save("ファイル名",ALL); とすると(必ずALLは大文字で!!), 今までをすべて記録します.
(C13) save("test.lsp",ALL);

(D13)                              test.lsp
(C14) quit();
 では,もう一度 Maxima を起動して作業を再開しましょう.
Maxima 5.6 2001年 6月16日 (土) 23:50:05 JST (with enhancements by W. Schelter).
Licensed under the GNU Public License (see file COPYING)
(C1) load("test.lsp");

Loading ./test.lsp
Finished loading ./test.lsp
(D13)                             ./test.lsp
(C14) 
 うーん,これでは前回何をやったかわかりませんね. そういう時は playback(行数); を使います.今の場合,入力13行+出力13行ですから,26行を指定すると すべて表示されることになります.
(C14) playback(26);


(C1) EXPAND((x+y)^6);

           6        5       2  4       3  3       4  2      5      6
(D1)      y  + 6 x y  + 15 x  y  + 20 x  y  + 15 x  y  + 6 x  y + x

(C2) DIFF(%,x);

                5         4       2  3       3  2       4        5
(D2)         6 y  + 30 x y  + 60 x  y  + 60 x  y  + 30 x  y + 6 x

(C3) INTEGRATE(1/(1+x^3),x);
                                  :
                                 (略)
                                  :
              3 SQRT(5) + 7      SQRT(5) + 3
(D12) [[y = - -------------, x = -----------], 
                    2                 2

                                             3 SQRT(5) - 7        SQRT(5) - 3
                                        [y = -------------, x = - -----------]]
                                                   2                   2

(C13) SAVE("test.lsp",ALL);

(D13)                             ./test.lsp
(D14)                                DONE
(C15) 

■TeXのソースに変換.

  tex(式); とすると,TeXの数式ソースを出力してくれます.
(C15) tex(d1);

$$-{{\log \left(x^{2}-x+1\right)}\over{6}}+{{\arctan {{2\>x-1}\over{
 \sqrt{3}}}}\over{\sqrt{3}}}+{{\log \left(x+1\right)}\over{3}}\leqno{\tt (D1)}$$
(D15)                                 (D1)

■バッチ処理.

 Maximaでは当然ながら,命令をファイルに書いておいて 一気に実行する事もできます.以下のようなファイル batch.bat (名前がMS的でヤだけど--;)
を実行させてみましょう. バッチ処理を行うには, batch("ファイル名"); を使います.
Maxima 5.4 2001年 2月16日 (金) 08:27:12 JST (with enhancements by W. Schelter).
Licensed under the GNU Public License (see file COPYING)
(C1) batch("batch.bat");


batching #/home1/kitty/src/maxima/tmp/batch.bat
(C2) 
                                  2            2
(C2)                       eq1 : y  + 3 x y + x  = 0
                               2            2
(D2)                          y  + 3 x y + x  = 0
(C3) 
(C3)                           eq2 : y + 3 x = 1
(D3)                              y + 3 x = 1
(C4) 
(C4)                           SOLVE([eq1, eq2])
             3 SQRT(5) + 7      SQRT(5) + 3
(D4) [[y = - -------------, x = -----------], 
                   2                 2

                                             3 SQRT(5) - 7        SQRT(5) - 3
                                        [y = -------------, x = - -----------]]
                                                   2                   2


■グラフの作成,編集.

 Maxima では gnuplot 3.8 ほど高機能ではありませんが, 2Dグラフ,3Dグラフが描け,ポストスクリプトの生成も可能です. 2Dのプロットは, plot2d([式a,式b,…,式z],[描画の範囲]); 3Dのプロットは, plot3d(式,[横方向の描画の範囲],[縦方向の描画範囲]); とします.
 それでは,プロットさせてみましょう.
(C5) plot2d([atan(x), erf(x), tanh(x)], [x,-5,5]);


(YMIN -3.0 YMAX 3.0 0.29999999999999999) 
(YMIN -3.0 YMAX 3.0 0.29999999999999999) 
(YMIN -3.0 YMAX 3.0 0.29999999999999999)
Plot Window でマウスを右ドラッグするとグラフの移動ができます. 左上にマウスカーソルを持っていくと, メニューが表示され,Zoom を選ぶと 左クリックで拡大, Shiftキー+左クリックで縮小ができます. Configを選ぶと,色の設定やPostScript出力の設定ができます.
 次は3次元プロットです.
(C6) plot3d(sin(sqrt(x^2+y^2))/sqrt(x^2+y^2),[x,-12,12],[y,-12,12]);
Plot Window で右クリックで移動, 左クリックでドラッグすると視点変更ができます.

Maximaの出力したグラフを編集  Maxima のプロットウィンドゥで,Saveボタン を押すと ポストスクリプトファイルが生成されます. デフォルトでは,ホームディレクトリに sdfplot.ps というファイル名で生成されます. このファイルを編集するには,
pstoedit を使ってドローツールのファイル形式に変換し, ドローツールで編集します.例えば,tgif で編集する場合は,
hoge@hoge% pstoedit -f tgif sdfplot.ps > sdfplot.obj
として,tgif の形式に変換し,
hoge@hoge% tgif sdfplot.obj &
で編集します.
  PlamoLinux 2.x用 pstoedit,tgif パッケージは こちらに用意してあります. sketch,xfig もあります.



 より詳しく知りたい方は, こちらを御覧ください.


■付属パッケージ動作確認一覧.

 以下の一覧は Maxima-5.4 のものです. 5.6 の方は時間がなくて確認できていません.
 Maxima の shareディレクトリには,それなりにパッケージが含まれていますが, 残念ながらまともに使えるパッケージはそれほど多くはないようです. 私の方でざっと確認をして,正常に動作したものだけを,以下に書いておきます. なお,これら以外にもうまく使うと正常に動作するものもあるかもしれません. もし,そういったものがあった場合はすぐにご連絡ください.
 各パッケージの使い方は,share ディレクトリにある ….usg というファイルに 書かれています.batch("….dem"); のようにすると, デモンストレーションを行います.

・ディレクトリ:share
パッケージ名ファイルデモファイル説明
EIGENeigen.mceigen.dem eigen.de1 高速・省メモリな固有値計算.縮退(?)固有値と固有ベクトルも扱える.
FUNCTSfuncts.mcfuncts.dem 特殊な数学関数を扱えるようにするパッケージ.
TRIGSIMPtrgsmp.mctrgsmp.dmo 三角関数,双曲線関数(sinh,cosh)の最適化.Maximaを起動するとすでにloadされている.

・ディレクトリ:share1
パッケージ名ファイルデモファイル説明
ABSIMPabsimp.mcabsimp.dem  
ASYMP?asymp.dm1 asymp.dm2 asymp.dm3 ファインマン・ダイアグラムの漸近的振舞いを計算するパッケージ.
DBLINTdblint.mcdblint.dem シンプソンの公式を使った方法で2重積分をする.
DIMENdimen.mcdimen.dem 自動で物理量の次元解析をする.
RNCOMBINErncomb.mcrncomb.dem 分数を通分する.
SUMCONTRACT?sumcon.dmo  

・ディレクトリ:share2
パッケージ名ファイルデモファイル説明
ANTIDantid.mcantid.dmo  
LRATSlrats.mclrats.dem  
PFAFFpfaff.mcpfaff.dem  


■Maximaリンク集.

http://www.ma.utexas.edu/users/wfs/maxima.html
  …御本尊
http://www.bekkoame.ne.jp/~ponpoko/Linux/Apps/LinuxApps.html#maxima
  …ponpoko様によるMaximaのインストール記事.



TOP (Since Feb.15,2001)