数式処理ソフトMaximaを使ってみる
by K.I
2011/12/2
Index
- 数式の変形をするのが面倒なので、なんか楽する方法ないかな〜と思って探していた。
- 数式処理ソフトっていうらしいんだけど、フリーではMaximaというのが良いらしい。
- ってことで、使ってみたら思ったより簡単に使えるし、もの凄く楽チンだ。
- プログラムっていうより、単にソフトの紹介なんだけど。
- 用語については、一般的な言い方と違う処が多いので、注意。
- SourceForgeの Maximaのページから、Windows版をダウンロードする。
- 自分はとりあえず、 5.25.1-Windosをダウンロード
- 普通のWindowのインストーラなので、簡単にインストール出来る。3種類のMaximaがインストールされる。
- Command line Maxima →コマンドプロンプトから実行する。Windowsのコマンドプロンプトなので、Cut&Pasteが面倒くさい
- XMaxima →これの方が、コマンドプロンプトより使いやすいと思う
- wxMaxima →ちょっとグラフィカルに表示される。
- 基本的には、どれを選んでも同じように使える。
- Windowsなら、wxMaximaが式が見やすいけど、これは好みかなぁ。
- 次に、TexMacsのインストール。これは、TeXが表示できるワープロのようなもの
- TexMacsを起動したら、挿入→セッション→Maximaで、Maximaのフロントエンドとして使えるようになる
- でも、バージョンが違う所為か、Lispのエラーが出る
- こちらに、インストールしたバージョンの対応策があったので、
- これで、綺麗に式が表示されるようになる。
- でも、最初の起動がちょっと面倒なので、まぁ、使わなくても良いかな。
[top]
- Maximaの簡単な使い方
- wxMaximaの場合、デフォルトではEnterキーで入力じゃなくて、Shift-Enterで入力になっている。
- ちょっと、面倒なので編集メニューの設定から、Enterでセルを評価にしておいても良い。
- でもEnterで何行か入力してから、Shift-Enterでまとめて評価する方が楽なのかもしれない。
- とりあえず、以下はEnterキーで評価されるものとして説明する。
- 普通に数式を入れて、Enterキーを押すと数式が評価される。
- 分数は、基本的に割り算のまま保持されるので、誤差が最小限に抑えられている。
(%ixx) 1/2+1/3; →分数の計算は
(%oxx) 5/6 →有理数のまま計算されるので、誤差が抑えられる
(%ixx) float(%); →少数で表示したい場合は、floatやbfloatを使う
(%oxx) 0.833333333333333
- ':'(コロン)で、値や式に名前を付けて定義することが出来る。
- 何故か代入と呼ばれることが多いけど、これは式の定義だと思う。
- でも、式と呼ぶと文章的にごっちゃになるし、関数定義が式定義という感じもするので、
- とりあえず以降は、これを変数定義と呼ぶ1ことにする。
(%ixx) ABC:A+B*C+D;
(%oxx) D+359907;
定義した時点で、定義されている変数は展開されるが、定義されていない変数はそのまま。
- 後で、未定義の変数が定義されても、それは展開されないので注意!
- 例えばAという変数を削除するには、'remvalue(A);'のように入力する。
- 全部の変数を削除する場合は、'remvalue(all);'とする。
- つまり、allという変数は定義できない。これ以外にも予約された名称は使えないと思う。
- sublisでは、複数の変数を同時に代入することも出来る。
(%ixx) ABC:A+B*C+D;
(%oxx) D + B C + A
(%ixx) sublis([A=1,B=2,C=3,D=4],ABC);
(%oxx) 11
2つ以上の変数を同時に指定する場合、[]で括る。
f(x,y) := (x^2+x*y)/y;
ABCD() := A+B*C+D;
- 関数を削除する場合は、'remfunction'を使う。
- defineを使って、関数の定義をすることも出来る
f(x):=diff(sin(x),x); →これはうまく行かない
define(f(x),diff(sin(x),x));
同じようだが、diffのような関数を含む場合に、普通の関数定義ではうまくいかないが、defineなら出来る
- もう1つ、':=='を使ったマクロ定義は、C言語等のマクロ定義と同様のものらしい。
- 単なる置き換えなので、関数を引数にするような場合に使えるようだ。
(%ixx) solve(3*x^2+2*x-1,x);
(%oxx) [x=1/3,x=-1]
連立方程式の場合
(%ixx) solve([x^2+3*y=4,x+2*y=1],[x,y]);
(%oxx) [[x=-1,y=1],[x=5/2,y=-3/4]]
siki2 : a*x^2+b*x+c=0;
solve(siki2,x);
[x=-(sqrt(b^2-4*a*c)+b)/(2*a),x=(sqrt(b^2-4*a*c)-b)/(2*a)]
1あくまで自己流の呼び方。一般的には代入と言われてるみたいだ。
2':'が代入という説明が多いけど、自分的にはsubstの方が代入に思えるので。
[top]
x' = ax + by + c
y' = dx + ey + f
- 元の3点(x1,y1),(x2,y2),(x3,y3)と、変換後の3点(xx1,yy1),(xx2,yy2),(xx3,yy3)の座標から、変換行列を求める。
- 6つの連立方程式を定義する
af:[xx1=a*x1+b*y1+c,yy1=d*x1+e*y1+f,xx2=a*x2+b*y2+c,yy2=d*x2+e*y2+f,xx3=a*x3+b*y3+c,yy3=d*x3+e*y3+f];
solve(af,[a,b,c,d,e,f]);
[[a=(xx1*(y3-y2)-xx2*y3+xx3*y2+(xx2-xx3)*y1)/(x1*(y3-y2)-x2*y3+x3*y2+(x2-x3)*y1),b=(x1*(xx3-xx2)-x2*xx3+x3*xx2+(x2-x3)*xx1)/(x1*(y3-y2)-x2*y3+x3*y2+(x2-x3)*y1),c=-
(x1*(xx3*y2-xx2*y3)+xx1*(x2*y3-x3*y2)+(x3*xx2-x2*xx3)*y1)/(x1*(y3-y2)-x2*y3+x3*y2+(x2-x3)*y1),d=(y2*yy3+y1*(yy2-yy3)-y3*yy2+(y3-y2)*yy1)/(x1*(y3-y2)-x2*y3+x3*y2+(x2-x3)*y1),e=-
(x2*yy3+x1*(yy2-yy3)-x3*yy2+(x3-x2)*yy1)/(x1*(y3-y2)-x2*y3+x3*y2+(x2-x3)*y1),f=(x1*(y3*yy2-y2*yy3)+y1*(x2*yy3-x3*yy2)+(x3*y2-x2*y3)*yy1)/(x1*(y3-y2)-x2*y3+x3*y2+(x2-x3)*y1)]]
- Maximaで、続けていろいろな式を計算していると、以前の式が残っていて結果がおかしくなることがある
- そのため最初に必ず、以前の計算内容を消しておいた方が良い
kill(all)$
- ちなみに、$ は結果を表示しない場合に、; の代わりに使う
[top]
[top]
[プログラムの部屋に戻る]
⇒ Disqusの広告がうるさすぎるので基本は非表示にしました