2009-11-14

Mac mini に Maxima をインストール

ふと思い立って、Maxima をインストールしてみることにした。 まずは Mac mini (Server) でやってみた。

ちなみに、Maxima っていうのは GPL で配布されているフリーな数式処理システムだ。「はじめてのMaxima」によれば、

Maxima は 1960 年代の MIT の MACSYMA プロジェクトで開発された「MACSYMA」(MAC's SYmbolic Manipulation system) の「DOE(エネルギー省)版」を、Texas 大学のシェルター氏 (Schelter) が「Common Lisp: The language 第一版」に対応した「gcl」に移植したものです。

ということだ。手元にあるかなり古い雑誌(「インターフェイス」増刊の「archive」No.12) によれば、Maxima の前身である Macsyma の作成が開始されたのが 1966 年。1972 年に ARPA ネット(!) を通じて全米で使用可能となって、さらに一般で購入可能となったのが 1982 年だとのこと(ちなみに、同誌によれば現在数式処理ソフトとして有名な Mathematica の最初の版ができたのが 1988 年だそうな)。なかなかに歴史のあるソフトだ。

インストールを始める前はつまづくとは思っていなかった。MacPorts でインストールできるだろうと思っていたから。sudo port install maxima で後は待つだけ、そう高をくくっていた。世の中、そうそう甘くない。

Common Lisp 処理系が必要

Maxima は Common Lisp 上に構築されたシステムなので、インストールおよび実行には Common Lisp の処理系が必要。MacPorts で提供されている Maxima の構成では SBCL か CLisp が使える。Wikibooks:Maximaを見て検討した結果、SBCL をベースとして使うことにした。

特に理由はなかったんだけど、まずは SBCL だけをインストールすることにした。sudo port install sbcl +threads だ。で、いきなりここでつまづいた。何やらエラーが出てビルドが進まない(↓)。

[macmini:~] mnbi% time sudo port install sbcl +threads
(...中略...)
--->  Building sbcl
Error: Target org.macports.build returned: can't read "host_lisp": no such variable
Error: Status 1 encountered during processing.

MacPorts の問題だった

困ったときはグーグル先生に訊け。ぐぐってみると、すでに MacPorts の trac に ticket が上がっていることがわかった(→ #20904 - sbcl 1.0.29 fails to build on 10.6)。どうやら、Snow Leopard 用の対応が必要だった模様。幸い、すでに解決されているようで、patch も添付されていた。SBCL インストールのための具体的な手順は以下の通り:

  1. 上記 ticket に添付れている(Attachements) Portfile-sbcl.diff をダウンロード。
  2. SBCL の port が置かれているディレクトリ(標準なら /opt/local/var/macports/sources/rsync.macports.org/release/ports/lang/sbcl) にある Portfile に↑の patch を適用する。
  3. 同様に patch-posix-tests.diff もダウンロード。
  4. この patch ファイルは Portfile と同じ場所にある files ディレクトリに置く。
  5. sudo port install sbcl を実行。

結果はこうなった。

[macmini:~] mnbi% time sudo port install sbcl +threads
--->  Computing dependencies for sbcl
--->  Fetching sbcl
--->  Attempting to fetch sbcl-1.0.29-x86_64-darwin-binary-r2.tar.bz2 from http://internap.dl.sourceforge.net/sbcl
--->  Verifying checksum(s) for sbcl
--->  Extracting sbcl
--->  Applying patches to sbcl
--->  Configuring sbcl
--->  Building sbcl
--->  Staging sbcl into destroot
--->  Installing sbcl @1.0.32_0+darwin_10+html+threads
--->  Activating sbcl @1.0.32_0+darwin_10+html+threads
--->  Cleaning sbcl
361.050u 83.442s 8:01.20 92.3% 0+0k 57+1724io 1pf+0w

time で実行時間も測ってみた。8分だったらしい。そうそう、この記事は 2009-11-13 に実施した結果をまとめている。そのうち、上記の patch は ports 本体に取り込まれるはず。そうなれば対処は不要になる。

残りはまとめて

後は一気にまとめてインストール。こうなった。

[macmini:~] mnbi% time sudo port install maxima
--->  Computing dependencies for maxima
(...中略...)
--->  Fetching maxima
--->  Attempting to fetch maxima-5.19.2.tar.gz from http://voxel.dl.sourceforge.net/maxima
--->  Verifying checksum(s) for maxima
--->  Extracting maxima
--->  Configuring maxima
--->  Building maxima
--->  Staging maxima into destroot
--->  Installing maxima @5.19.2_0
--->  Activating maxima @5.19.2_0
--->  Cleaning maxima
800.643u 400.765s 19:18.66 103.6% 0+0k 1504+10813io 0pf+0w

約20分。大部分は依存関係のビルドとインストールだった。

実行してみよう

数式処理システムっていうのは、その名の通り、数式を処理(計算)するためのもの。数値じゃない、数式ってとこが大事。コンピュータの名の由来である「計算(compute)」はもともと数値計算のこと。一方、数式を計算するっていうのは、中学や高校や大学の数学でおなじみの式の変形(展開や因数分解)、微分や不定積分のようなもの。

最初は中学レベルの式の展開と因数分解をやらせてみよう。

[macmini:~] mnbi% maxima
Maxima 5.19.2 http://maxima.sourceforge.net
Using Lisp SBCL 1.0.32
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1) expand((x + 1)^2);
                                  2
(%o1)                            x  + 2 x + 1
(%i2) expand((x + 1)^3);
                               3      2
(%o2)                         x  + 3 x  + 3 x + 1
(%i3) factor(x^2 - 1);
(%o3)                           (x - 1) (x + 1)
(%i4) factor(x^3 - 1);
                                       2
(%o4)                        (x - 1) (x  + x + 1)

2次や3次の方程式ぐらい楽勝。

(%i5) solve(x^2 + 2*x + 1, x);
(%o5)                              [x = - 1]
(%i6) solve(3*x^2 + 2*x + 1, x);
                         sqrt(2) %i + 1      sqrt(2) %i - 1
(%o6)             [x = - --------------, x = --------------]
                               3                   3
(%i7) solve(x^3 - 1);
                    sqrt(3) %i - 1        sqrt(3) %i + 1
(%o7)          [x = --------------, x = - --------------, x = 1]
                          2                     2

中学生の頃に欲しかったょ。

グラフはいかが

Maxima は外部ツールと連動してさまざまなグラフを描くこともできる。MacPorts を使うと Gnuplot もインストールされる。

(%i21) plot2d(sin(x),[x,-2*%pi, 2*%pi]);

これ(↑)が、こうなる(↓)。

送信者 Macをプログラムする

関連リンク


0 件のコメント:

コメントを投稿