maximaでは行列も扱うことが出来ます。 行列の操作はいろいろとあります。気をつけるべきなのは行列の積とべきでしょう。 行列の積はドットです。*を使ってしまうと 成分ごとに掛け算をするという、行列らしからぬ積の計算がなされます。 同様にべきも^を使ってしまうと成分ごとにべきがとられてしまいます。 後で解説するinvert関数を使って逆行列が求まるのですが 行列のべきに-1を指定することでも逆行列も求めることが出来ます。 また、行列には通常、名前をつけて操作することになります。 これは、通常の変数と同じようにコロン(:)で設定出来ます。 一度名前をつけると、インデックスアクセスにより 行や要素が取り出せます。 インデックスは1から始まります。 他のプログラミング言語のように0からは始まりません。 また、要素を更新することも加能です。 細かい部分としては、インデックス経由で取り出したものは maxima的にはリストとして扱われますが row(A,i)で取り出したものは行列として扱われるという違いがあります。 では具体的な例をあげてみます。行列の基本操作
行列の作成 matrix([数値リスト],[数値リスト],...) 行列の和 + 行列の差 - 行列の積 . 行列の成分の積 * 行列のべき ^^ 行列の成分のべき ^ 行列の行 A[i] 行列の行 row(A,行番号) 行列の列 col(A,列番号) 行列の要素 A[行,列] 行列の要素 A[行][列]行列を操作する関数も多くあります。これですべてではありません。 さらなる関数を見つけたい場合はマニュアルをサーチしてみてください行列の基本操作
(%i1) mat1:matrix([1,2],[3,4]); (%o1) matrix([1,2],[3,4]) (%i2) mat2:matrix([1,1],[2,2]); (%o2) matrix([1,1],[2,2]) (%i3) mat1 + mat2; (%o3) matrix([2,3],[5,6]) (%i4) mat1 - mat2; (%o4) matrix([0,1],[1,2]) (%i5) mat1 . mat2; (%o5) matrix([5,5],[11,11]) (%i6) mat1^^2; (%o6) matrix([7,10],[15,22]) (%i7) mat1 . mat1; (%o7) matrix([7,10],[15,22]) (%i8) mat1 * mat2; (%o8) matrix([1,2],[6,8]) (%i9) mat1^2; (%o9) matrix([1,4],[9,16]) (%i10) mat1[1]; (%o10) [1,2] (%i11) row(mat1,1); (%o11) matrix([1,2]) (%i12) mat1[2,2]; (%o12) 4 (%i13) mat1[2][2]; (%o13) 4 (%i14) mat1[2][2]:5; (%o14) 5 (%i15) mat1; (%o15) matrix([1,2],[3,5]) (%i16) mat1[2,1]:6; (%o16) 6 (%i17) mat1; (%o17) matrix([1,2],[6,5])ちょっと解説が必要なのは行列のコピーでしょう。 次の例を見てください。行列を操作する関数たち
行列のコピー copymatrix(A) 転地行列 transpose(A) 係数行列 coefmatrix([式リスト],[変数リスト]) 拡大係数行列 augcoefmatrix([式リスト],[変数リスト]) 行列の階数 rank(A) 逆行列 invert(A) 対角行列 diagmatrix(階数,要素) 単位行列 ident 行列生成 genmatrix(関数またはラムダ式,i,j) 階段行列 echelon(A) 余因子行列 adjoint(A)別名をつけると、元の変数への修正が 別名をつけた変数にも影響するのですが copymatrixを使うと、この動作を回避することが出来ます。 では、その他の関数の使用例です。copymatrixの使い方
(%i1) a:matrix([1,1],[1,1]); (%o1) matrix([1,1],[1,1]) (%i2) b:a; (%o2) matrix([1,1],[1,1]) (%i3) c:copymatrix(a); (%o3) matrix([1,1],[1,1]) (%i4) a[1,1]:10; (%o4) 10 (%i5) a; (%o5) matrix([10,1],[1,1]) (%i6) b; (%o6) matrix([10,1],[1,1]) (%i7) c; (%o7) matrix([1,1],[1,1])最後のgenmatrixではまだ解説していない機能を2つ使っています。 関数定義とラムダ式です。 これらは関数定義の項で解説しますのでそちらを参照ください。行列を操作する関数
(%i1) a:matrix([1,2],[3,4]); (%o1) matrix([1,2],[3,4]) (%i2) transpose(a); (%o2) matrix([1,3],[2,4]) (%i3) rank(a); (%o3) 2 (%i4) invert(a); (%o4) matrix([−2,1],[3/2,−1/2]) (%i5) diagmatrix(3,5); (%o5) matrix([5,0,0],[0,5,0],[0,0,5]) (%i6) ident(3); (%o6) matrix([1,0,0],[0,1,0],[0,0,1]) (%i7) equation:[x+y+z=7,2*x+y+3*z=16,x+y-z=-1]; (%o7) [z+y+x=7,3*z+y+2*x=16,−z+y+x=−1] (%i8) coefmatrix(equation,[x,y,z]); (%o8) matrix([1,1,1],[2,1,3],[1,1,−1]) (%i9) augcoefmatrix(equation,[x,y,z]); (%o9) matrix([1,1,1,−7],[2,1,3,−16],[1,1,−1,1]) (%i10) echelon(%); (%o10) matrix([1,1,1,−7],[0,1,−1,2],[0,0,1,−4]) (%i11) solve(equation,[x,y,z]); (%o11) [[x=1,y=2,z=4]] (%i12) adjoint(a); (%o12) matrix([4,−2],[−3,1 (%i13) f[i,j]:=i*i+j$genmatrix(f,3,3); (%o13) matrix([2,3,4],[5,6,7],[10,11,12]) (%i14) genmatrix(lambda([i,j],i*i+j),3,3); (%o14) matrix([2,3,4],[5,6,7],[10,11,12])