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