理系ジン

しばらくPythonに力を入れる予定です。

Maximaについて

概要

Maximaは、微分積分微分方程式多項式・行列などの計算ができる数式処理システムであり、高精度の数値計算もできます。2Dや3Dのグラフも描けます。GPLWindows/Mac/Linux等で動作します。Maxima on Androidもあります。

Maximaは1960年代後半にMITで開発されたMacsymaを移植したもので、商用の数式処理システムのMathematica等もMacsymaに刺激されて作られました。Maximaは、様々なLisp上で動作し、そのため様々な環境で動作するそうです。

MaximaGUIフロントエンドとして、wxMaxima、TeXmacs、imaximaがあります。wxMaximaは、メニューから簡易にコマンドを呼び出したり、結果の数式がそれなりに奇麗に表示され、グラフも簡単に描けます。ターミナルで利用するMaximaからは標準ではグラフが表示できません。Maximaのグラフはgnuplot等で描画されています。理系ジンはwxMaximaを使います。

以下、簡単にMaximaの説明をします。詳細は参考文献のDocumentationMaxima日本語ドキュメント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のウィンドウ内にグラフを出力する場合は、それぞれ、wxplot2dwxplot3d関数になります。

xの値が$[-\pi,\pi]$の範囲で$\cos(x)$を描く場合は次のようになります。

plot2d(cos(x),[x,-%pi,%pi]);

詳しくは、日本語マニュアル 12.Plotting等を見て下さい。

パッケージ

パッケージにより高度な機能が使えます。Maxima日本語ドキュメントonline等を参考にして下さい。

バッチ処理

バッチ処理は、インストーラを利用してインストールした場合は、次のように行えます。

Windows

>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)
>

Mac

$ exec '/Applications/Maxima.app/Contents/Resources/maxima.sh' --very-quiet --batch-string="diff(cos(x),x);"
diff(cos(x),x)
                                   - sin(x)

[プロセスが完了しました]

これだと、JavaRuby等からMaximaを呼び出して、微分積分等を繰り返すプログラミングは難しいように思います。そもそも数式をコンピュータで扱うのが難しいですね。結局は、TeXで入出力できると便利かも知れません。MaximaのプログラミングはMaximaで閉じて行う方が良いかもしれません。いい方法が見つかれば紹介したいと思います。

理系ジンの意見

Maximaは勉強にも研究にも十分に使えそうです。数式処理を利用した本格的なシステム開発には、理論の深い理解から発生する動機が必要だと思います。数式処理のプログラミングは数式処理内で閉じて行う方が良さそうです。Mathematicaの本が参考になると思われます。

記事はどうも長くなり過ぎてなかなか更新できません。

参考資料