数学の具体的な計算にMaximaを使って、数学もMaximaも同時に学んでしまいましょう。今回はMaximaを使って行列の計算をしてみたいと思います。行列の固有値・固有ベクトルを求め、対角化する方法、Jordan標準形を求める方法をみてみます。
本記事はMaximaで行列の固有値・固有ベクトルを求めて対角化する方法を解説した過去記事
の続編という位置付けになりますので、あわせて読んでみてください。
行列の対角化
さて、過去記事でもみたように、 次正方行列 の固有値 に対する固有ベクトル が線形独立である場合には、行列 を
によって導入すると、この行列 は正則であることがわかり、また が行列 の固有ベクトルであることから
より、これに左から行列 を作用させて
という対角行列を作ることができます。このような対角行列を作ることのご利益ですが、行列 の累乗が
によって簡単に計算できるということがあげられます。
具体例:2次正方行列の場合
を考えてみます。行列をMaximaに入力するには
kill(all)$ A:matrix([1,2],[3,2]);
とします。
固有方程式 は行列式
D:determinant(A-lambda*ident(2));
をゼロとして lambda について方程式を解きます:
L:solve(D=0, lambda);
により、固有値は
と求まります。実際、Maximaの組み込み関数を使って
eigenvalues(A);
により、固有値とその縮重度を知ることができます(いまの場合、固有値は4と−1でその縮重度はどちらも1です)。さらに
eigenvectors(A);
では、固有値とその縮重度に加え、それらに対応する固有ベクトルを出力します:
そこで行列
を導入して を計算すると
P:matrix([1,1],[3/2,-1])$ invert(P).A.P;
より
となることがわかります。以上により行列が対角化できました。
行列が対角化できない場合
以上みたように 次正方行列に対し、線型独立な固有ベクトルが 個ある場合には行列を対角化することができますが、一般には線形独立な固有ベクトルの個数は より小さくなります。
例えば
という行列は
B:matrix([1,2],[-2,5])$ eigenvectors(B);
により、固有値3(縮重度は2)を持ちますが、固有ベクトルが(定数倍の自由度を除いて)ただ一つしかありません:
このような場合には、上で議論したような正則行列が作れず、行列を対角化することができません。
Jordan標準形
上の例でみている行列 は、対角化はできませんが、Jordan標準形と呼ばれる次の形
に、適当な正則行列 を使って変形することができます:
このようなJordan標準形と呼ばれる形をした行列を考えることのメリットとして、その累乗が
と計算できることがあげられます(これは数学的帰納法で簡単に示せますね)。すると、対角行列の場合と同様に、行列 の累乗を
として簡単に計算することができます。
また、Jodran標準形の対角部分と非対角部分を
と分けてみましょう()。このとき対角部分の累乗が
である一方、非対角部分は2乗するとゼロになります:
実際
JN:matrix([0,1],[0,0])$ JN^^2;
また、対角部分と非対角部分は交換します:
具体的に確かめてみましょう。
JS:matrix([3,0],[0,3])$ JS.JN-JN.JS;
以上の性質を合わせると、行列 の累乗が
で与えられることがわかります。これは当然ながら上で与えた一般式と一致します。このような行列の分解をJordan分解といい、 を行列 の半単純成分、 を冪零成分といいます。行列の作用の線形性から、これまでの議論を逆にたどって、行列 の半単純成分、冪零成分がそれぞれ
で与えられることがわかります。
Maximaには与えられた行列のJordan標準形を求める組み込みがあって
load("diag")$ B1:jordan(B); J:dispJordan(B1);
とします。さいごに、行列 をJordan標準形に変形する変換行列 ですが
Q:matrix([q11,q12],[q21,q22])$ solve([determinant(Q)=1, (invert(Q).B.Q-J)[1,1]=0, (invert(Q).B.Q-J)[1,2]=0, (invert(Q).B.Q-J)[2,1]=0, (invert(Q).B.Q-J)[2,2]=0],[q11,q12,q21,q22]);
から( を任意定数として)
と求まります。いま簡単のために として を計算すると
q:matrix([sqrt(2),0],[sqrt(2),1/sqrt(2)])$ invert(q).B.q;
より
となることがわかります。以上により行列をJordan標準形に変形できました。そして行列 の半単純成分、冪零成分はそれぞれ
q: matrix([sqrt(2),0],[sqrt(2),1/sqrt(2)])$ BS: q.JS.invert(q); BN: q.JN.invert(q);
より
であることがわかります。