[0] はじめに
対話型数式処理プログラムMAXIMAは、次からフリーで入手できます。
http://sourceforge.net/projects/maxima/files/
次のフォントが必要な場合があります。
TeX-fonts-25
[1] 基礎
1)次のコマンドを与えます。最後にshift+enterを押してください。
–> a:1;
こうすると変数aに値1を与えたことになります。MAXIMAでは,「:」は「定義によって等しい」を意味します。確認のため,次のコマンドを与えてみます。
–> a;
また,最後の「;」はコマンド行の区切りを示し(つけない場合は自動的に付加されます),MAXIMAは対応する処理を実行後,その結果を返します。もし,処理結果の表示が不要な場合は,最後に「$」を置きます。次を確かめてください。
–> a:1$
もし,変数aやすべての変数を消去したい場合は,それぞれ次のコマンドを与えます。
–> kill(a);
–> kill(all);
2)さて,四則演算の記法については,通常の言語処理系と同じように,次が用いられます。
–> x+y;
–> x-y;
–> x*y;
–> x/y;
–> x^y;
3)関数を定義するには,次のコマンドを与えます。
–> y: a*x^2;
yの値を,x=2について計算するときは,次のコマンドを与えます。
–> ev(y,x:2);
または
–> y, x:2
4)一方,のように関数を明示的に定義するには,次のコマンドを与えます。
–> f(x):=a*x^2;
ここで、x=2のときの値は,次のように参照できます。
–> f(2);
[2] 関数のグラフ
1)関数のグラフを描くときは,たとえば次のコマンドを与えます。
–> y1: x^2;
–> plot2d(y1,[x,-2,2]);
2)2つのグラフを重ねて描くときは,続けて次のコマンドを与えます。
–> y2: 2*x;
–> plot2d([y1,y2],[x,-2,2]);
[3] リスト
1)MAXIMAの基本的なデータ構造は,「リスト」と呼ばれるものです。たとえば,次のコマンドを与えます。
–> a1:[a11,a12];
これにより,a1は,2つの要素a11とa12からなるリストとして定義されます。また,要素の区切りは「,」であることに注意してください。
2)ある変数がリストであるかどうかを調べるためには,次のコマンドを与えます。
–> listp(a1);
リストの長さを調べるには,次のコマンドを与えます。
–> length(a1);
リストの要素へのアクセス,たとえば,第1番目の要素を調べるには,次のコマンドを与えます。
–> a1[1];
3)さて,リスト自身を要素にもつリストも定義できます。
–> a2:[a21,a22];
を定義して,次のコマンドを与えてください。
–> A:[a1,a2];
これが,サイズ2×2の行列Aを定義したことに相当します(行列データについては,あとで詳しく説明します)。たとえば,A[2]はa2を意味しますので,Aの(2,1)要素へのアクセスは次のようにします。
–> A[2][1];
[4] 関数
1)絶対値と平方根については,たとえば次のように得られます。
–> abs(-2);
–> sqrt(2);
2)円周率は,%piで参照することができます。
–> %pi;
–> %pi, numer;
三角関数の計算は,たとえば次の通り実行できます。
–> sin(%pi/4);
–> cos(%pi/4);
–> tan(%pi/4);
3)三角関数の逆関数の計算は,たとえば次の通り実行できます。
–> asin(1);
–> acos(-1);
–> atan(1);
–> atan2(1,-1);
ここで,x>0のときatan2(y,x)=atan(y/x)です。
4)次は,加法定理を示しています。
–> trigexpand(sin(x+y));
–> trigreduce(%)
–> trigexpand(cos(x+y));
–> trigreduce(%)
–> trigexpand(tan(x+y));
–> trigreduce(%)
5)指数関数の計算は,たとえば次の通り実行できます。
–> exp(0);
6) この逆関数(対数関数)の計算は,たとえば次の通り実行できます。
–> log(1);
この底はネイピア数eですが,10の場合は次の関数を定義して用います。
–> log10(x):=log(x)/log(10);
–> log10(1);
7)双曲線関数は,次式で定義されます。
これらの計算は,たとえば次の通り実行できます。
–> sinh(0);
–> cosh(0);
–> tanh(0);
8)双曲線関数の逆関数の計算は,たとえば次の通り実行できます。
–> asinh(0);
–> acosh(1);
–> atanh(0);
[5] 多項式
1)因数分解
を行うために,次のコマンドを与えてください。
–> factor(x^2-1);
2)また,式の展開
を行うために,次のコマンドを与えてください。
–> expand((a+1)*(x-1));
ここで,xだけについて整理して
としたいときには,次のコマンドを与えまず。
–> ratsimp(%,x);
ここで,「%」は直前の結果を参照しています。
3)さらに,部分分数展開
を行うために,次のコマンドを与えてみてください。
–> partfrac(1/(x^2+3*x+2),x);
[6] 方程式
1)2次方程式
を解くために,次のコマンドを与えてください。
–> solve(x^2+1=0,x);
ここで,出力結果における「%i」は虚数単位を表しています。解は2つの要素をもつリストとして得られていることに注意してください。第1番目の解は%[1],第2番目の解は%[2]でアクセスできます。
2)それでは,2次方程式
の解の公式を求めてみましょう。
–> sol: solve(a*x^2+b*x+c=0,x)
3)次に,連立1次方程式
を解くために,次のコマンドを与えてください。
–> solve([x+y=1,x+2*y=1],[x,y])
4)それでは,連立1次方程式
の解を求めてください。
–> sol: solve([a*x+b*y=e,c*x+d*y=f],[x,y])
解はリストのリストとして得られています。したがって,第1番目の解はsol[1][1],第2番目の解はsol[1][2]でアクセスできることに注意してください。
5)ちなみに,複素数
の実部と虚部は,次のように得られます。
–> realpart(1-%i)
–> imagpart(1-%i)
[7] 論理演算
1)論理和,論理積,否定はそれぞれ
のように表されます。たとえば
–> true and false;
–> true or false;
–> not true;
これらは,論理式と呼ばれ,trueかfalseのどちらかの値をとります。
2)真理値表を作ってみましょう。
–> [true and true, true and false, false and true, false and false];
–> [true or true, true or false, false or true, false or false];
–> [not true, not false];
3)次の等価な関係は,さまざまな論理展開に有用です。
右辺の真理値表を作ってみましょう。
–> [true and not true, true and not false, false and not true, false and not false];
4)さて,次のように入力してみてください。
–> is(1=1);
–> is(1#1);
これらも論理式です。次も同様です。
–> is(1>1);
–> is(1>=1);
–> is(1<1);
–> is(1<=1);
[8] 微分積分
1)まず極限の例を,いくつか挙げます。
–> limit(exp(-x),x,inf);
–> limit(exp(x),x,inf);
–> limit((1+1/x)^x,x,0);
–> limit(sin(x)/x,x,0);
2)微分の例を,いくつか挙げます。
–> diff(x^2,x);
–> diff(1/x,x);
–> diff(exp(x),x);
–> diff(log(x),x);
–> diff(sin(x),x);
–> diff(atan(x),x)
2)2階微分は,たとえば次のように行います。
–> diff(x^2,x,2);
3) 積分の例を,いくつか挙げます。
–> integrate(2*x,x);
–> integrate(-1/x^2,x);
–> integrate(exp(x),x);
–> integrate(1/x,x);
–> integrate(cos(x),x);
–> integrate(1/(x^2+1),x);
4)次のようにtaylor展開を行うことができます。
–> taylor(exp(x),x,0,10);
–> taylor(sin(x),x,0,10);
–> taylor(cos(x),x,0,10);
5)微分方程式
を解くために,次のコマンドを与えてください。
–> sol:desolve(’diff(x(t),t)=-x(t),x(t));
ここで,「’diff(x(t),t)」は,
を表しています。また,注意しなければないのは,solがリストとなっていないことです。たとえば,x(0)=1のとき,この解のグラフを描くには,次のように,コマンドを与えます。
–> s1:rhs(sol), x(0)=1;
–> plot2d(s1,[t,0,5]);
6)さらに,微分方程式
の解の構成要素を調べるために,次のコマンドを与えてください。
–> sol:desolve(’diff(x(t),t)=-x(t)+sin(10*t),x(t));
–> s2:rhs(sol), x(0)=1;
–> s3:rhs(sol), x(0)=0;
–> plot2d([s1,s2,s3],[t,0,5]);
[9] 行列計算
1)次のコマンドを与えてみましょう。
–> A:matrix([a11,a12],[a21,a22]);
–> B:ident(2);
–> C:zeromatrix(2,2);
–> D:apply(matrix,makelist(ident(2)[i]*[d1,d2][i],i,1,2));
行列Aの(2,1)要素へのアクセスは,A[2][1]またはA[2,1]として行います。
–> A[2,1];
2)行列の結合は次のように行います。
–> addcol(A,B);
–> addrow(A,C);
3)まず,要素ごとの四則演算は,次のように行えます。
–> A+B;
–> A-B;
–> A*B;
–> B/A;
–> A^2;
4)次に,行列としての演算は,次のように行います。
–> A.B;
–> A.invert(A);
–> A^^2;
–> transpose(A);
5)行列の階数,行列式,特性多項式、余因子行列は,次のように求められます。
–> rank(A);
–> determinant(A);
–> charpoly(A,s);
–> adjoint(A);
6)固有値と固有ベクトルは,次のように求められます。
–> Q:matrix([q1,q3],[q3,q2]);
–> eigenvalues(Q);
–> V:eigenvectors(Q);
この固有ベクトルが直交することは、次のように確かめられます。
–> V[2][1][1].V[2][2][1],ratsimp;