LISPUSER

MaximaLisp isn't a language, it's a building material.

Table of Contents

Maxima とは

数式処理システムの元祖.LISP で書かれていますが,普通の中置記法な数式を 扱えるので,使うだけならそんな事はほとんど気にしなくていいでしょう.使 い方はとても簡単なので,微積分のできる電卓としても使えます.数学嫌い, 数学が苦手,Lisp 嫌いという人でも安心.

Maxima を構築する

最近は Windows 用にはインストーラの配布もされているので,使うだけなら簡 単でしょう.Linux 向けにもパッケージがありますが,今回は CVS のソースか らビルドする手順を示しておきます.GCL がデフォルトらしいので,それ以外の ものでトライしてみました.

CLISP で構築

GNU CLISP (CVS - 2.36 2005-12-04) での構築履歴.

% ./configure --with-clisp
[...]
Summary:
clisp enabled. Executable name: "clisp"
clisp runtime is ""
default lisp: clisp
wish executable name: "wish"
% make
[...]
% ./maxima-locak
Maxima 5.9.2.2cvs http://maxima.sourceforge.net
Using Lisp CLISP 2.36 (2005-12-04)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1)
Using Lisp CLISP 2.36 (2005-12-04)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1) 1+1;
(%o1)                                  2
(%i2) x = 2;
(%o2)                                x = 2
(%i3) x^100;
                                      100
(%o3)                                x
(%i4) (x+y)^15;
                                          15
(%o4)                              (y + x)
(%i5) expand(%o4);
       15         14        2  13        3  12         4  11         5  10
(%o5) y   + 15 x y   + 105 x  y   + 455 x  y   + 1365 x  y   + 3003 x  y
         6  9         7  8         8  7         9  6         10  5
 + 5005 x  y  + 6435 x  y  + 6435 x  y  + 5005 x  y  + 3003 x   y
         11  4        12  3        13  2       14      15
 + 1365 x   y  + 455 x   y  + 105 x   y  + 15 x   y + x
(%i6) 'diff(N,t)=-a*N;
                                  dN
(%o6)                             -- = - a N
                                  dt

(%i7) ode2('diff(N,t)=-a*N, N, t);
                                         - a t
(%o7)                           N = %c %e
(%i8) quit();
%

SBCL で構築

SBCL での構築ログ.

% ./configure --with-sbcl
[...]
Summary:
clisp enabled. Executable name: "sbcl"
clisp runtime is ""
default lisp: clisp
wish executable name: "wish"
% make
[...]
% ./maxima-local
Maxima 5.9.2.2cvs http://maxima.sourceforge.net
Using Lisp SBCL 0.9.7.28
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1) 1+2;
(%o1)                                  3
(%i2) 2^100;
(%o2)                   1267650600228229401496703205376
(%i3) (x+y)^3;
                                          3
(%o3)                              (y + x)
(%i4) expand(%o3);
                            3        2      2      3
(%o4)                      y  + 3 x y  + 3 x  y + x
(%i5) ode2('diff(N,t)=-a*N, N, t);
                                         - a t
(%o5)                           N = %c %e
(%i6) quit();
%

簡単ですねー.わざわざ載せるまでもないかも.

Maxima 入門 (コンソール版)

ちまちま Maxima のドキュメント Introduction を読みながら翻訳していく予定.

まずプロンプトから maxima を起動します.CVS 版を使っていて,いちいちイ ンストールするのが面倒な人は,ビルドしたディレクトリの maxima-local を 呼び出すシェルスクリプトでも書いておくと便利でしょう.

% maxima

すると下記のような画面とともに maxima が起動します::

Maxima 5.9.2.2cvs http://maxima.sourceforge.net
Using Lisp SBCL 0.9.9.38
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1)

`(%i1)` は "ラベル" です.全ての入力と出力にはラベルがつき,以降のセッ ションでラベルを通じてアクセスできます.ラベル名の i はユーザーが入力し た命令をあらわし,o はコンピュータの出力をあらわします. 変数名に %i1 や %o5 といったラベルと混同するような名前を使ってはいけません

Maxima は大文字小文字を区別します.全ての組み込み関数は小文字のみから構 成されています(例: sin, cos, save, load など).組み込みの定数も小文 字のみの名前です(%e, %pi, inf など).もし, SIN(x) や Sin(x) とタイプ したならば,Maxima は組み込みの sin でない何かを意図しているのだと推測 します.ユーザー定義の関数や変数名は大文字,小文字,もしくは両方混在し た名前を持つことができます.foo(XY), Foo(Xy), FOO(xy) はすべて異なりま す.

特殊なキーとシンボル

  1. Maxima との対話セッションを終了するには `quit();` とタイプします.
  2. Maxima を終了せずに,計算を中断するには C をタイプします(^ はコント ロールキーを表します: つまり C はコントロールキーを押した状態で,C のキーをタイプするという事です).これは,たとえば非常に長い計算を行 う場合に重要なノウハウです.例えば

    (%i1) sum (1/x^2, x, 1, 10000);
    
    Maxima encountered a Lisp error:
    
    interrupted at #X1029545
    
    Automatically continuing.
    To reenable the Lisp debugger set *debugger-hook* to nil.
    (%i2)
    

  3. Maxima にコマンドの終りを告げるにはセミコロン (;) ,続いて改行キーを 押します.ただ改行キーを押すだけでは入力の完了を意味しません.
  4. 入力の終端記号 (;) の代替品としてドル記号 ($) がありますが,これは maxima の計算結果表示を省略します.これは長い中間の計算結果を表示す る時間を節約するのに有用でしょう.
  5. もし,既に (%i5) で入力した命令を繰り返したいなら,それを再びタイプ するかわりにラベルを二つのシングルクォート ('') に続けてタイプしま す.''i%5 のようになります.(注意:ただ %i5 とするだけでは望みの結果 は得られないでしょう – 試してみてください)
  6. もし直前の Maxima の計算結果を利用したいならば,o ラベルを使うよりも 単純にパーセント記号 (%) を使うことができます.
  7. 標準的な値 e (自然対数の底), i (-1 の平方根),π (3.14159…) はそ れぞれ %e, %i, %pi として参照できます.(注意:この変数名の % は,直 前の値を参照する % とは全く関係がありません)
  8. 変数に値を代入するにはコロン (:) を使います.等号記号ではありません. 等号記号は方程式の記述に使用されます.

算術演算

一般的な算術演算オペレータは

``+`` 加算

``-`` 減算

``*`` 乗算

``/`` 除算

^ もしくは `**` 階乗

``.`` 行列演算

sqrt(x) x の平方根

Maxima の出力は有理数を使った正確な演算であるという特徴があります::

(%i1) 1/100 + 1/101 201 (%o1) ----- 10100

計算に無理数が含まれていても,それらは記号的な表現のまま維持されます::

(%i2) (1 + sqrt(2))5; 5 (%o2) (sqrt(2) + 1) (%i3) expand(%); (%o3) 29 sqrt(2) + 41

しかし,結果を 10 進数表記で表示したい事もしばしばあります.これは ``",numer"`` で式を展開する事で可能です::

(%i4) %, numer; (%o4) 82.01219330881976

ここでは, % を使って直前の結果を参照しています.現在のバージョンの Maxima では, numer は 16 桁の数字を返します.最後の桁はときどき不 正確です. bloat 関数をつかって任意精度の有効桁数を使うこともできます::

(%i5) bloat(%) (%o5) 8.201219330881975B1

有効桁数の表示は Maxima の **fpprec** 変数によって制御されます.デフォルト値は 16 です.

(%i6) fpprec; (%o6) 16

fpprec を 100 に設定してやりなおしてみます.::

(%i8) ''%i5; Warning: Float to bigfloat conversion of 82.01219330881976 (%o8) 8.201219330881976076576049236862485250307753051672186164846310477827070\ 244349548350683851114422615155b1

``(%i8)`` 中の二つのシングルクォート ('') は ``(%i5)`` のコマンドを繰り 返すためのものです.Maxima は近似なしでも非常に大きな数を扱う事ができます.::

(%i9) 100!; (%o9) 933262154439441526816992388562667004907159682643816214685929638952175999\ 932299156089414639761565182862536979208272237582511852109168640000000000000000\ 00000000

代数

どのくらい代数を容易に扱えるのかを見れば, Maxima の解析計算のためのコ ンピューターツールとして重要な側面がよりはっきりするでしょう.ここに, 多項式を展開する例を示します::

(%i1) (x + 3*y + x^2*y)^3;
                                 2             3
(%o1)                          (x  y + 3 y + x)
(%i2) expand (%);
       6  3      4  3       2  3       3      5  2       3  2         2
(%o2) x  y  + 9 x  y  + 27 x  y  + 27 y  + 3 x  y  + 18 x  y  + 27 x y
                                                              4        2      3
                                                         + 3 x  y + 9 x  y + x

上の式に対して, ``x`` に ``5/z`` を代入してみましょう::

(%i3) %o2, x=5/z;
           2        3                 2               3                  2
      135 y    675 y    225 y   2250 y    125   5625 y    1875 y   9375 y
(%o3) ------ + ------ + ----- + ------- + --- + ------- + ------ + -------
        z         2       2        3       3       4         4        5
                 z       z        z       z       z         z        z
                                                                      3
                                                               15625 y        3
                                                             + -------- + 27 y
                                                                   6
                                                                  z

Maxima の **ratsimp** 関数を使って a common denominator (公分母?) を括り出してみます::

(%i4) ratsimp (%);
           3  6        2  5         3           4          2         3
(%o4) (27 y  z  + 135 y  z  + (675 y  + 225 y) z  + (2250 y  + 125) z
                                      3            2         2            3   6
                             + (5625 y  + 1875 y) z  + 9375 y  z + 15625 y )/z

また,式は **factor** 関数で因数分解できるかもしれません::

(%i5) factor (%);
                                  2              3
                            (3 y z  + 5 z + 25 y)
(%o5)                       ----------------------
                                       6
                                      z

Maxima は非線型方程式の正確な解を求める事ができます.この例では,3 つの 未知の変数 ``a`` , ``b``, ``c`` に対する 3 つの方程式を **solve** 関数 を使って解いてみます::

(%i6) a + b*c = 1;
(%o6)                             b c + a = 1
(%i7) b - a*c = 0;
(%o7)                             b - a c = 0
(%i8) a + b = 5;
(%o8)                              b + a = 5
(%i9) solve ([%o6, %o7, %o8], [a, b, c]);
            25 sqrt(79) %i + 25      5 sqrt(79) %i + 5      sqrt(79) %i + 1
(%o9) [[a = -------------------, b = -----------------, c = ---------------],
            6 sqrt(79) %i - 34       sqrt(79) %i + 11             10
            25 sqrt(79) %i - 25      5 sqrt(79) %i - 5        sqrt(79) %i - 1
       [a = -------------------, b = -----------------, c = - ---------------]]
            6 sqrt(79) %i + 34       sqrt(79) %i - 11               10

$Last Update: 2006/04/30 22:14:37 $