Maximaについて
概要
Maximaは、微分・積分・微分方程式・多項式・行列などの計算ができる数式処理システムであり、高精度の数値計算もできます。2Dや3Dのグラフも描けます。GPLでWindows/Mac/Linux等で動作します。Maxima on Androidもあります。
Maximaは1960年代後半にMITで開発されたMacsymaを移植したもので、商用の数式処理システムのMathematica等もMacsymaに刺激されて作られました。Maximaは、様々なLisp上で動作し、そのため様々な環境で動作するそうです。
MaximaのGUIフロントエンドとして、wxMaxima、TeXmacs、imaximaがあります。wxMaximaは、メニューから簡易にコマンドを呼び出したり、結果の数式がそれなりに奇麗に表示され、グラフも簡単に描けます。ターミナルで利用するMaximaからは標準ではグラフが表示できません。Maximaのグラフはgnuplot等で描画されています。理系ジンはwxMaximaを使います。
以下、簡単にMaximaの説明をします。詳細は参考文献のDocumentationやMaxima日本語ドキュメントonlineや各種PDFをご覧下さい。
インストール
Windows/Mac/Linuxは、Sourceforge download pageのバイナリで簡単にインストールできます。Maxima、wxMaxima、gnuplotがインストールされます。
他のフロントエンド等のインストールは参考資料を参考にして下さい。理系ジンは使った事がありません。
コマンド操作
wxMaximaではメニュー操作もできますが、コマンド操作が基本です。起動後に、キー入力すると-->
が表示されコマンドを入力できます。
基礎
コマンドの末に;
を付け、[shift]+[return]
で実行します。;
が無い場合は、実行すると自動で追加されます。
コマンドを実行すると、-->
が(%in)
に置き換わり、結果が(%on)
の後に出力されます。入力や出力は、%in
や%on
により参照できます。直前の出力は%
で参照できます。
コマンドの末に、;
の代わりに$
を付けると、実行しても結果が表示されません。無駄な出力をしないために使います。
コメントは/*コメント*/
でできますが、コメントを付けると以後、正常に入力できなくなります。
また、コマンド中に日本語を使うと暴走します。
(%i1) (1+2)3-4*5/4;
(%o1) 22
(%i2) %i1 - %o1 - %;
(%o2) -22
(%i3) 2+3$
(%i4) %;
(%o4) 5
コマンドは? コマンド名
により説明を表示できます。説明はマニュアルと同内容のようです。
? plot2d;
TeX出力
tex
関数により結果がTeX出力されます。load("mactex-utilities.lisp")
すると、tex
関数の出力がLaTeXのものになります。
wxMaximaの結果の出力表示は、TeX風ですがTeXではありません。imaximaではTeXにより結果が表示されるそうです。
(%i1) tex(22/14);
$${{11}\over{7}}$$
(%o1) false
(%i2) load("mactex-utilities.lisp")$
(%i3) tex(22/14);
$$\frac{11}{7}$$
(%o3) false
理系ジンでは以下でTeX風の結果表示をMathJaxで行います。また、二重括弧やベキや強調がMarkdownやはてな記法に置き換わるのを防ぐためにcode記法を部分的に使っています。
数値の扱い
数値結果を得るにはfloat
関数を使います。
Maximaでは式のまま計算すると誤差が出ませんが、数値で計算すると誤差が生じます。
(%i1) sqrt(3);
(%o1) $\sqrt{3}$
(%i2) %^2;
(%o2) 3
(%i3) float(sqrt(3));
(%o3) 1.732050807568877
(%i4) %^2;
(%o4) 3.0
(%i5) %-3;
(%o5) $−4.440892098500626\,10^{−16}$
プログラミング
代入は、:
で行い、関数の定義は:=
またはdefine
関数で行います。
(%i1) p:%pi;
(%o1) $\pi$
(%i2) c(x):=cos(x);
(%o2) $c(x):=\cos(x)$
(%i3) define(sc(x),sin(x)+cos(x));
(%o3) $sc(x):=\sin(x)+\cos(x)$
(%i4) sc(p);
(%o4) -1
文字出力はprint
関数を使います。日本語を使うと暴走します。
(%i5) print("Text");
Text
(%o5) Text
複数のコマンドは(コマンド1,コマンド2)
の様にします。
条件で処理を分けるif文は次のようになります。
(%i1) v:5$
(%i2) if 0<=v and v<=10 then (print(v,":0<=v<=10"),v:v+10) else (print(v,":v<0 or 10<v"),v:v-10)$
5 :0<=v<=10
(%i3) v;
(%o3) 15
処理を繰り返すfor文は次のようになります。
(%i1) s:0$
(%i2) for i:1 thru 100 do( s:s+i )$
(%i3) print(s)$
5050
block([ローカル変数],コマンド,...)$
(%i1) plus120(i):=block([s:100,ss:20], i:i+s+ss, return(i) )$
(%i2) print(plus120(3))$
123
基礎的関数
(%i1) abs(-1);
(%o1) 1
(%i2) random(100);
(%o2) 12
(%i3) expand(
(a+b)^3
);(%o3) $b^{3}+3\,a\,b^{2}+3\,a^{2}\,b+a^{3}$
(%i4) factor(
b^3+3*a*b^2+3*a^2*b+a^3
);(%o4) $(a+b)^{3}$
(%i5) solve(
x^2-2*x-3=0,x
);(%o5) [x=3,x=−1]
(%i6) solve([x+y=-1,x-y=1], [x,y]);
(%o6)
[[x=0,y=−1]]
(%i7) trigexpand(cos(a+b));
(%o7) $\cos(a)\,\cos(b)−\sin(a)\,\sin(b)$
(%i8) trigsimp(
sin(x)^2+cos(x)^2
);(%o8) 1
(%i9) trigsimp(
2*cos(x)*sin(x)
);(%o9) $2\,\cos(x)\,\sin(x)$
(%i10) trigreduce(
2*cos(x)*sin(x)
);(%o10) $\sin(2\,x)$
(%i11) allroots(
x^2+x+1=0
);(%o11) [x=.8660254037844386 %i−0.5,x=−.8660254037844386 %i−0.5]
(%i12)
%e^(%i*x);
(%i12) ${\%e}^{\%i\,x}$
(%i13) rectform(%);
(%o13) $\%i\,\sin(x)+\cos(x)$
(%i14)
8^(-3/8)*sqrt(2)*8^(3);
(%o14) ${{2^{19/2}}\over{8^{3/8}}}$
(%i15)
radcan(8^(-3/8)*sqrt(2)*8^(3));
(%o15) $2^{67/8}$
(%i16) diff(cos(x),x);
(%o16) $-\sin(x)$
(%i17) integrate(-sin(x),x);
(%o17) $\cos(x)$
行列
(%i1) t[i,j]:=(i-2*j);
(%o1) $t_{i,j}:=i-2$ $j$
(%i2) m22:genmatrix(t,2,2);
(%o2) $\begin{bmatrix}-1 & -3 \\ 0 & -2 \\ \end{bmatrix}$
(%i3) %.%;
(%o3) $\begin{bmatrix}1 & 9 \\ 0 & 4 \\ \end{bmatrix}$
グラフ
グラフは、2Dがplot2d
関数で、3Dがplot3d
関数で描画します。wxMaximaのウィンドウ内にグラフを出力する場合は、それぞれ、wxplot2d
、wxplot3d
関数になります。
xの値が$[-\pi,\pi]$の範囲で$\cos(x)$を描く場合は次のようになります。
plot2d(cos(x),[x,-%pi,%pi]);
詳しくは、日本語マニュアル 12.Plotting等を見て下さい。
パッケージ
パッケージにより高度な機能が使えます。Maxima日本語ドキュメントonline等を参考にして下さい。
バッチ処理
バッチ処理は、インストーラを利用してインストールした場合は、次のように行えます。
>cd C:\Program Files (x86)\Maxima-5.28.0-2\bin >maxima.bat --very-quiet --batch-string="diff(cos(x),x);" diff(cos(x), x) - sin(x) >
$ exec '/Applications/Maxima.app/Contents/Resources/maxima.sh' --very-quiet --batch-string="diff(cos(x),x);" diff(cos(x),x) - sin(x) [プロセスが完了しました]
これだと、JavaやRuby等からMaximaを呼び出して、微分積分等を繰り返すプログラミングは難しいように思います。そもそも数式をコンピュータで扱うのが難しいですね。結局は、TeXで入出力できると便利かも知れません。MaximaのプログラミングはMaximaで閉じて行う方が良いかもしれません。いい方法が見つかれば紹介したいと思います。
理系ジンの意見
Maximaは勉強にも研究にも十分に使えそうです。数式処理を利用した本格的なシステム開発には、理論の深い理解から発生する動機が必要だと思います。数式処理のプログラミングは数式処理内で閉じて行う方が良さそうです。Mathematicaの本が参考になると思われます。
記事はどうも長くなり過ぎてなかなか更新できません。
参考資料
- Maxima, a Computer Algebra System
- Documentation:PDFは検索に便利
- FAQ
- Screenshots:各種Maximaの画像
- Sourceforge download page:バイナリもある。Win/Macは少し古い。
- Mac版ダウンロード
- XQuartz:MacにはX11が必要
- Related Projects:imaxima, LyX, Maxima on Android, TeXmacs, wxMaxima等へのリンク
- Maxima(Wikipedia):簡潔な説明
- Maxima(Wikibooks)
- はじめてのMaxima(PDF):高度
- 簡易Maximaマニュアル(PDF)
- マスクメロン:最新バイナリMaxima.appやPDF(Professional Maxima、Maxima Command Tour、Maxima Frontier)
- Maxima入門:基礎、グラフの例
- Maxima 普及委員会:リンク集、関数・変数、有用なテクニック、imaximaインストール
- imaxima(Macwiki):Macへのimaximaインストール
- Maxima で綴る数学の旅:Maxima on Android、imaximaの開発者の方のブログ
- 読み書きプログラミング ブログ:Maxima日本語マニュアルの作者の方のブログ
- man maxima:バッチ処理に必要なOPTIONの説明