LISPUSER

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

(Top Page) (Lisp Memo)

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 $