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 $