• 検索結果がありません。

行列に関連する函数

ドキュメント内 Maxima c (2007),,,,,. (ページ 171-179)

第 2 章 Maxima のデータとその操作 73

2.8 行列

2.8.3 行列に関連する函数

rmxcharは行列の(右)の括弧として表示する文字を設定します. 左側はlmxcharで指定します.

matrix element変数一族

³

変数名 初期値 概要

matrix element add +行列の和の演算子を指定

matrix element mult * 行列の成分間の積の演算子を指

matrix element transpose false 転置の際に作用させる函数を設

µ ´

matrix element addは行列同士の和を計算する際に用いる演算子を設定します.函数名やlambda

式であっても構いません.

matrix element multは行列の成分同士の積を計算する際に用いる演算子を設定します.函数名

やlambda式であっても構いません.

matrix element transposeは上記の大域変数と同様に,転置行列を計算する際に,作用させる函数

やlambda式をを指定します.

行列の成分に函数を作用させる函数

³

matrixmap(h函数i,h行列i)

µ ´

matrixmap函数は,行列hmi の各成分に h函数iを作用させる函数です.リストに対するmap 函数の行列版です.

(%i11) A:ident(3)*3;

[ 3 0 0 ]

[ ]

(%o11) [ 0 3 0 ]

[ ]

[ 0 0 3 ]

(%i12) matrixmap(lambda([x],cos(x)*exp(-x)),A);

[ - 3 ]

[ %e cos(3) 1 1 ]

[ ]

(%o12) [ - 3 ]

[ 1 %e cos(3) 1 ]

[ ]

[ - 3 ]

[ 1 1 %e cos(3) ]

行や列の取り出しと追加を行う函数

³

col(h行列i,hii) row(h行列i,hii)

addcol(h行列i,hリスト1i,hリスト2i,· · ·,hリストni) addrow(h行列i,hリスト1i, hリスト2i,· · ·,hリストni) copymatrix(h行列i)

setelmx(hxi,hii,hji,h行列i)

µ ´

col函数とrow函数は,h行列iに対し,hiiで指定される列と行を各々行列の形式で返す函数です.

(%i17) m1;

[ x 0 - 3 x 0 0 ]

[ ]

[ 0 x 0 - 3 x 0 ]

[ ]

[ 0 0 x 0 - 3 x ]

(%o17) [ ]

[ y - 3 0 y 0 0 ]

[ ]

[ 0 y - 3 0 y 0 ]

[ ]

[ 0 0 y - 3 0 y ]

(%i18) row(m1,1);

(%o18) [ x 0 - 3 x 0 0 ]

(%i19) col(m1,1);

[ x ]

[ ]

[ 0 ]

[ ]

[ 0 ]

(%o19) [ ]

[ y ]

[ ]

[ 0 ]

[ ]

[ 0 ]

addcol函数は列として,addrow函数は行として,複数の複数のリストや行列をh行列iに追加し

ます.尚,追加するリストや行列は,行列の大きさに矛盾しないものでなければなりません.

copymatrix函数はh行列iの複製を行います. この命令は h行列iを成分毎に再生成する時だ

けに使います.

setelmx函数はh行列iの(hii,hji)成分をhxiで置換します.

(%i13) A;

[ 4 0 0 0 ]

[ ]

[ 0 4 0 0 ]

(%o13) [ ]

[ 0 0 4 0 ]

[ ]

[ 0 0 0 4 ] (%i14) setelmx(4,2,3,A);

[ 4 0 0 0 ]

[ ]

[ 0 4 4 0 ]

(%o14) [ ]

[ 0 0 4 0 ]

[ ]

[ 0 0 0 4 ]

尚,setelmx函数を使わなくても,行列成分を直接指定して置換える事も可能です. この場合, A[i,j]:x

で行列Aの(i,j)成分をxで置換します.但し,この場合の返却値はxになります.

小行列を生成する函数

³

minor(h正方行列i,hii,hji)

submatrix(h1i,· · ·,hmi,h行列i,h1i,· · ·,hni) submatrix(h1i,· · ·,hmi,h行列i)

submatrix(h行列i,h1i,· · ·,hni)

µ ´

minor函数は与えられたh正方行列ihii,hji成分の小行列,つまり,h正方行列iからhii行 と hji列を抜いた行列を返します.

submatrix函数はhii行とhji列が削除された新しい行列を生成します.submatrix函数は

minor函数よりも多くの行と列が削除出来ます.

転置,上三角,共役な行列を計算する函数

³

transpose(h行列i) triangularize(h行列i)

µ ´

transpose函数はh行列iの転置行列を生成します.

(%i9) A:matrix([1,2,3],[4,3,1]);

[ 1 2 3 ]

(%o9) [ ]

[ 4 3 1 ] (%i10) transpose(A);

[ 1 4 ]

[ ]

(%o10) [ 2 3 ]

[ ]

[ 3 1 ]

triangularize函数は h行列iの上三角行列形式を生成します. 尚,行列が正方行列である必要は

ありません.

(%i6) A:matrix([1,2,3,4],[3,4,5,1],[2,3,1,5]);

[ 1 2 3 4 ]

[ ]

(%o6) [ 3 4 5 1 ]

[ ]

[ 2 3 1 5 ] (%i7) triangularize(A);

[ 1 2 3 4 ]

[ ]

(%o7) [ 0 - 2 - 4 - 11 ]

[ ]

[ 0 0 6 - 5 ]

階数と対角和を計算する函数

³

rank(h行列i) mattrace(h行列i)

µ ´

rank函数はh行列iの階数を求めます.行列の階数は行列から求めた小行列式で,零にならない 小行列式で,最大のものの大きさです. 尚,rankは行列成分の値が非常に零に近い場合には誤った答 を返す事があります.

mattrace函数は,h行列i が正方行列の場合,対角和,即ち,行列の主対角成分の総和を計算しま す.この函数は,ncharpolyで利用されています. ncharpolyはMaximaのcharpolyの代りに使える 函数です.尚,mattrace函数を利用する為には,予めload(”nchrpl”); を実行する必要があります.

(%i14) load(nchrpl)$

(%i15) A:matrix([1,2,3],[4,3,1],[-2,0,-2]);

[ 1 2 3 ]

[ ]

(%o15) [ 4 3 1 ]

[ ]

[ - 2 0 - 2 ] (%i16) mattrace(A);

(%o16) 2

余因子行列の計算に関連する函数

³

adjoint(h正方行列i) invert(h正方行列i)

µ ´

adjoint函数はh正方行列iの余因子行列を計算します.

invert函数は逆行列を余因子行列を用いた方法で計算します. これはbfloat値成分や浮動小数点

を係数とする多項式を成分とする行列の逆行列をCRE形式に変換せずに計算出来ます.determinant 命令は余因子の計算で利用されるので,ratmxがfalseならば,その逆行列は成分表現を変更せずに 計算されます. 現行の実装は高い次数の行列に対して効率的なものではありません. 尚,大域変数

detoutがtrueの場合,行列式の部分は逆行列の外側に出されたままとなります.

invertが返した結果は展開されていません.最初から多項式成分を持つ行列の場合,

expand(invert(mat)) ,detout; で生成された出力は見栄えが良くなります.

(%i28) A:matrix([t,1,t-2],[1,t,0],[t+1,1,t-1]);

[ t 1 t - 2 ]

[ ]

(%o28) [ 1 t 0 ]

[ ]

[ t + 1 1 t - 1 ] (%i29) adjoint(A);

[ (t - 1) t - 1 - (t - 2) t ]

[ ]

(%o29) [ 1 - t (t - 1) t - (t - 2) (t + 1) t - 2 ]

[ ]

[ 2 ]

[ 1 - t (t + 1) 1 t - 1 ]

(%i30) invert(A),expand,detout;

[ 2 2 ]

[ t - t - 1 2 t - t ]

[ ]

[ 1 - t 2 t - 2 ]

[ ]

[ 2 2 ]

[ - t - t + 1 1 t - 1 ] (%o30)

---2 t - 1

尚,行列式を行列の中に入れる場合, adjoint(h行列i)/determinant(h行列i)を計算した結果を

expandで展開したり,有理数係数の多項式が行列の成分に現われる場合は,ratsimpを用いると良

いでしょう.

(%i35) adjoint(A)/determinant(A),expand;

[ 2 2 ]

[ t t 1 2 t t ]

[ --- - --- - --- --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 ]

[ ]

[ 1 t 2 t 2 ]

(%o35) [ --- - --- --- --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 ]

[ ]

[ 2 2 ]

[ t t 1 1 t 1 ]

[ - --- - --- + --- --- --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 2 t - 1 ]

(%i36) adjoint(A)/determinant(A),ratsimp;

[ 2 2 ]

[ t - t 1 t - 2 t ]

[ --- - --- - --- ] [ 2 t - 1 2 t - 1 2 t - 1 ]

[ ]

[ t - 1 2 t - 2 ]

(%o36) [ - --- --- --- ]

[ 2 t - 1 2 t - 1 2 t - 1 ]

[ ]

[ 2 2 ]

[ t + t - 1 1 t - 1 ]

[ - --- --- --- ] [ 2 t - 1 2 t - 1 2 t - 1 ]

行列式を計算する函数

³

determinant(h行列i) newdet(h行列i)

newdet(h配列i,h整数i) permanent(h行列i,h整数i)

µ ´

determinant函数は,Gaussの消去法と似た方法で h行列iの行列式を計算します.計算結果の書

式は大域変数ratmxの設定に依存します.

疎行列の行列式を計算する特別な方法もあり,ratmx:trueとsparse:trueに設定した場合に使え ます.

newdet函数は h行列ih配列i の行列式を計算します.この際に,Johnson-Gentleman tree minorアルゴリズムを用います. 尚h整数iを指定した場合,1行からh整数i行と1列からh整数i 列の正方行列を取出し,その行列式を計算します. この整数値が無指定の場合,h行列iが正方行列 であればそのまま行列式を計算し,h行列iが正方行列で無ければ, 余分な末尾の行,或いは列を削 除した正方行列の行列式を返します.

(%i23) A;

[ 1 2 3 4 ]

[ ]

(%o23) [ 3 4 5 1 ]

[ ]

[ 2 3 1 5 ] (%i24) newdet(A,3);

(%o24)/R/ 6

permanent函数は,h行列iのpermanentを計算します. 尚h整数iを指定した場合,1行からh整 数i行と1列からh整数i列の正方行列を取出し,その行列式を計算します. ここで,permanentは 行列式に似ていますが,符号の変化のないものです.

特性多項式の生成に関連する函数

³

charpoly(h行列i,h変数i) ncharpoly(h行列i,h変数i)

µ ´

charpoly函数はh行列iの特性多項式det (<変数>I− h行列i)を計算します.

determinant (h行列i −diagmatrix (length (h行列i),h変数i))と同じ結果を返します.

ncharpoly函数はh変数iに対するh行列iの特性多項式を計算します.これはMaximaのcharpoly とは別物です.

ncharpolyでは与えられた行列の羃乗の対角和を計算しますが,対角和は特性多項式の根の羃乗

の総和に等しいものです.これらの諸量から根の対称式の計算が可能ですが,それらは特性多項式 の係数です.charpolyはvar*ident[n]-aの行列式を計算している.そんな訳でncharpolyは優れて いる. 例えば,整数成分の非常に大きな行列の場合は算術的に多項式の計算を避ける為です.予め

load(”nchrpl”);で読込む必要があります.

ドキュメント内 Maxima c (2007),,,,,. (ページ 171-179)