第 8 章 行列と線形代数について
8.3 関連する函数
54 第8章 行列と線形代数について
copymatrix
copymatrix (h行列i)
h行列iの複製を行います.この命令はmを成分毎に再生成する時だけに使われます. 行列の複
製ではsetmelmxを使うと便利です.
determinant
determinant(h行列i)
gaussの消去法と似た方法でh行列iの行列式を計算します. 計算結果の書式は大域変数ratmx
の設定に依存します.
疎行列の行列式を計算する特別な方法もあり,ratmx:trueとsparse:trueと設定した場合に使え ます.
diagmatrix
diagmatrix(hni,h行列i)
n行n列の対角行列を返します.ここで対角成分は全てh行列iのものです. 尚,diagmatrix(n,1)
はident(n)と同じn次元の単位行列を生成します.
echelon
echelon(h行列i)
h行列iのechelon形式を生成します.これは初等的な行操作で各々の行の最初の非零元を1,そ
の元を含む列に対してはその元を含む行よりも下の成分を全て零となる様に変形するものです(上 三角行列).
[2 1 - a -5 b ]
(d2) [ ]
[a b c ]
(c3) echelon(d2);
[ a - 1 5 b ]
[1 - --- - --- ]
[ 2 2 ]
(d3) [ ]
[ 2 c + 5 a b ]
[0 1 ---]
[ 2 ]
[ 2 b + a - a]
56 第8章 行列と線形代数について eigenvalues
eigenvalues (h行列i)
shareディレクトリ上のパッケージです.eigenvaluesとeigenvectorsと関連する行列の計算を行 う函数が含まれています.
eigenvaluesは引数に一つの行列を取り,リストを返します.このリストの最初の副リストは固有
値リストで,その他の副リストは固有値の順番に対応した重複度のリストとなります.尚,Maxima
の函数solveが,行列の特性多項式の根の計算で利用されていいます.solveは多項式の根を見付け損
なう事がありますが, conjugate,innerproduct,univector,columnvectorとgramschmidt以外は使え ず,これらだけが固有値が判らなくても使えます.幾つかの状況で,solveは非常にいい加減な固有値 を生成する事があります.
処理を続ける前に答を簡易化しても構いません.この為の予測があり,それらは以下で説明され ています.(これはsolveが実数と予測されるが,それ程明確でない実数式を返す場合に生じます.)
eigenvalue函数はMaximaから直接使える.この他の函数を利用する為にはeigenパッケージの
読み込みが必要となり,事前にeigenvaluesを実行するか, load(”eigen”)を実行しましょう.
eigenvectors
eigenvectors (h行列i)
引数として行列を取り,リストを返します.リストに含まれる最初の副リストにはeigenvalues函 数の出力,他の副リストには行列の各々の固有値に対応する固有ベクトルが含まれています.この
函数はMaximaから直接使えますが,以下の大域変数の設定を有効にしたければ,eigenパッケージ
の読込が必要となります.
• nondiagonalizable[false]は,eigenvectors命令の実行後に, 行列が対角化不可能か否かによっ てtrueかfalseのどちらかが設定されます.
• hermitianmatrixがtrueならば,Gram-Schmidt のアルゴリズムを用いて行列を対角化し,Her-mite行列の固有ベクトルを削減します.
• knowneigvalsが,trueに設定されていれば,行列の固有値は既知であって,大域変数のlisteigvals に保存されているとeigenパッケージが仮定します. その為,listeigvalsにeigenvalues函数の 出力と同じリストが設定されている必要があります.尚,algsys函数が固有ベクトルの計算で 使われています. 固有値が不確かな場合,algsysが解を生成する事が出来ない事があります.
この場合,eigenvalues函数を使って最初に見つけた固有値の簡易化を行う事を勧めます.
ematrix
ematrix (hmi,hni,hxi,hii,hji)
hmi行hni列の行列でhii行hji列成分のみがhxi,他が全て零となる行列を生成します.
entermatrix
entermatrix (hmi,hni)
Maximaの要求に従ってhmi × hni個の成分を入力して行列を生成します.
(c1) entermatrix(3,3);
is the matrix 1. diagonal 2. symmetric 3. antisymmetric 4. general
answer 1, 2, 3 or 4 1;
row 1 column 1: a;
row 2 column 2: b;
row 3 column 3: c;
matrix entered.
[ a 0 0 ]
[ ]
(d1) [ 0 b 0 ]
[ ]
[ 0 0 c ]
genmatrix
genmatrix(h配列i,hi2i,hj2i,hi1i,hj1i)
配列から行列を生成します.ここで配列array(hi1i,hj1i)は最初(左側上)の元array(hi2i,hj2i)が 残り(左下)の元となります. hj1i=hi1iであれば,hj1iは削除されます. hj1i= hi1i= 1ならば, hi1iとhj1iの両方が省略される事もあります.
配列の元が不足した場合には,記号的な元が使われます.
(c1) h[i,j]:=1/(i+j-1)$
(c2) genmatrix(h,3,3);
[ 1 1]
[1 - -]
[ 2 3]
[ ]
[1 1 1]
(d2) [- - -]
[2 3 4]
[ ]
[1 1 1]
[- - -]
[3 4 5]
58 第8章 行列と線形代数について gramschmidt
gramschmidt([hリスト1i,· · ·,hリストni])
eigenパッケージに含まれる函数です.予めload(eigen)を実行して利用します. gramschmidtは 引数にリストの列で構成されるリストを取ります. ここでhリストiiは全て長さが等しくなければ なりませんが,直交している必要はありません.
gramschmidtは互いに直交したリストで構成されたリストを返します. 尚、返ってきた結果には
因子分解された整数が含まれる事があります. これはMaximaのfactor函数がgram-schmidtの処 理の過程で使われた為です. こうする事で式が複雑なものになる事を回避し,生成される変数の大 きさを減らす助けにもなっています.
hach
hach (a,b,m,n,l)
Hacijanの線型プログラミングアルゴリズムの実装.予めload(kach)で読込む必要があります.
ident ident (hni)
hni行hni列の単位行列を生成します.
innerproduct
innerproduct (hxi,hyi)
eigenパッケージに含まれる函数です.使う為には予めload(eigen)を実行します. innerproduct は同じ長さの二つのリストhxiとhyiを引数として取り, (hxiの複素共役) .hyiで定義されていま す.ここで,dot演算子は通常のベクトルの内積演算子と同じものです.
invert
invert (h行列i)
逆行列を余因子行列を用いた方法で計算します.これはbfloat値成分や浮動小数点を係数とする 多項式を成分とする行列の逆行列をCRE形式に変換せずに計算出来ます.determinant命令は余 因子の計算で利用されるので,ratmxがfalseならば,その逆行列は成分表現を変更せずに計算され ます.
現行の実装は高い次数の行列に対して効率的なものではありません.
detoutフラグがtrueであれば行列式の部分は逆行列の外側に出されたままとなります.
invertが返した結果は展開されていません.最初から多項式成分を持つ行列の場合,expand(invert(mat)),detout で生成された出力は見栄えが良くなります.
行列式で割られた方が望ましい場合,xthru(%)を併用したり, expand(adjoint(h行列i))/expand(determinant(h行 列i))で計算すると良いでしょう.
matrix
matrix (h行1i,· · ·,h行ni)
指定した行を持つ行列を定義します.
matrixmap
matrixmap (h函数i,h行列i)
行列hmiの各成分にh函数iを作用させます.
matrixp
matrixp (h式i)
h式iが行列であればtrue,そうでなければfalseを返します.
mattrace
mattrace (h行列i) h行列iが正方行列の場合,対角和(行列の主対角成分の総和)を計算しま
す. これはncharpolyで利用されます.ncharpolyはMaximaのcharpolyの代りに用いられていま す.load(”nchrpl”)を実行する必要があります.
minor
minor (h行列i,hii,hji)
h行列iのhii,hji成分の小行列,つまり,h行列iからhii行とhji列を抜いた小行列を計算します.
ncexpt
ncexpt(h行列1i,h行列2i)
h行列1i^^h行列2iを(非可換)指数式で表示する際に,大き過ぎれば ncexpt(h行列1i,h行列2i)が用いられます.
ncharpoly
ncharpoly (h行列i,h変数i)
h変数iに対するh行列iの特性多項式を計算します.これはMaximaのcharpolyとは別物です.
ncharpolyでは与えられた行列の羃乗の対角和を計算しますが,対角和は特性多項式の根の羃乗
の総和に等しいものです.これらの諸量から根の対称式の計算が可能ですが,それらは特性多項式 の係数です.charpolyはvar*ident[n]-aの行列式を計算している.そんな訳でncharpolyは優れてい る. 例えば,整数成分の非常に大きな行列の場合は算術的に多項式の計算を避ける為です.
予めload(”nchrpl”): で読込む必要があります.
newdet
newdet (hmi,hni)
hmiの行列式を計算します.この際に,Johnson-Gentleman tree minor アルゴリズムを用いま す.hmiは行列か配列の何れかで,hniは行列の大きさになります,これはhmiが行列であればオプ ションになります.
nonscalarp
nonscalarp (h式i)
h式iが非スカラ,つまり,原子を含み,非スカラと宣言されたリストや行列であればtrueを返し ますが,スカラの場合はfalseを返します.
60 第8章 行列と線形代数について permanent
permanent (h行列i,hni)
h行列iのpermanentを計算する.permanentは行列式に似ていますが, 符号の変化のないもの
です.
rank
rank (h行列i)
h行列iの階数を求めます.行列の階数は,行列から求めた小行列式で,零にならない小行列式で, 最大のものの大きさです. 尚,rankは行列成分の値が非常に零に近い場合には誤った答を返す事が あります.
row
row (h行列i,hii)
h行列iのhii番目の行を出力します.
scalarp
scalarp (h式i)
trueとなるのは,h式iが数,定数やスカラーとして宣言された変数,数,定数,そしてその様な変 数の合成で行列やリストを含まない場合です.
setelmx
setelmx (hxi,hii,hji,h行列i
h行列iのhii行hji列成分をhxiで置換えます.置換えられた行列が返却されます.尚,直接行列 の成分を指定して置換える事も可能です. この場合,A[i,j]:xで行列Aの(i,j)成分をXで置換しま す.但し,この場合の返却値はxになります.
similaritytransform
similaritytransform (h行列i)
eigenパッケージに含まれる函数です.予め, load(eigen) で読込む必要があります.
h行列iを引数とし,uniteigenvectors命令の出力結果のリストを返します.
大域変数nondiagonalizableがfalseであれば,二つの行列leftmatrixとrightmatrixが生成され ます.このleftmatrixとrightmatrixは, leftmatrix .h行列i. rightmatrixが対角行列となり,h行 列iの固有値が対角成分に現れるものです.
nondiagonalizableがtrueであれば,これらの行列は生成されません.
大域変数hermitianmatrixがtrueであれば,leftmatrixはrightmatrixの複素共役の転置となり ます.その他で,leftmatrixはrightmatrixの逆行列になります. rightmatrixはh行列iの正規化し た固有ベクトルを列とする行列になります.
submatrix
submatrix (h行1i,· · ·,h行mi,h列1i,· · ·,h列ni)
h行ii行とh列ji列が削除された新しい行列を生成すします.
transpose
transpose (h行列i)h行列iの転置行列を生成します.
triangularize
triangularize (h行列i)
h行列iの上三角行列形式を生成します.但し,行列が正方行列である必要はありません.
uniteigenvectors
uniteigenvectors (h行列i)
eigenパッケージの函数.利用する為には予め load(eigen)を実行します. uniteigenvaluesは与え られたh行列iの固有値と固有ベクトルで構成されたリストを返します.出力リストの第一成分の リストにはeigenvalues函数の出力があり,第二成分の副リストには正規化した固有ベクトルが,第 一成分のリストの固有値に対応する順番で並んでいます.
eigenvectors函数の詳細で述べた大域変数はここでも同様の影響を与えます.
unitvector
unitvector (hリストi)
eigenパッケージに含まれる函数.予めload(eigen) を実行して読込む必要があります.
unitvectorはhリストiを正規化したリスト,即ち,その大きさを1にしたリストを返します.
vectorsimp
vectorsimp (hベクトルi)
この函数は和の簡易化で様々な大域変数の設定と共に用います. ここで式は以下の大域変数の設 定に関連するものです.
expandall, expanddot, expanddotplus, expandcross, expandcrossplus, expandcrosscross, expandgrad, expandgradplus, expandgradprod,
expanddiv, expanddivplus, expanddivprod, expandcurl, expandcurlplus, expandcurlcurl, expandlaplacian, expandlaplacianplus,
expandlaplacianprod.
全てのこれらの大域変数はデフォルト値としてfalseを持ちます.
後にplusの付く大域変数は加法性と被演算子の分配性に関連します.
同様に,後にprodの付く大域変数はあらゆる種類の積演算に対する被演算子への分配性に関連 するものです.
expandcrosscrossはp (q r)を(p,r)*q-(p.q)*rで置換するかどうかを決めます.
expandcurlcurlはcurl curl pをgrad div p + div grad pで置換するかどうかを決定します.
expandcrossがtrueの場合,expandcrossplusとexpandcrosscrossがtrueと同じ効果があります.
二つの大域変数expandplusとexpandprodは似た名前の大域変数にtrueに設定した場合と同効 果です.これらが,trueであれば,他の大域変数, expandlaplaciantodivgradはlaplace演算子をdiv gradで置換えます.
尚,簡便の為にこれら全ての大域変数はevflagとして宣言されています.