ジョルダン標準形のイメージをつかむ
今回は「ジョルダン標準形のイメージをつかむ」です。
「標準形」というと型にはめるものというイメージがありますが、
ジョルダン標準形は正方行列のルールの1種ですが、わりと緩いです。
ジョルダンブロック(細胞)というミニ正方形のパーツ、略してJBと呼ぼう。
いろんなサイズのJBを対角線に並べるだけで、標準形の出来上がり!
直和分解のイメージがあれば想像できますね。
<なぜジョルダン標準形?>
「固有方程式で対角化すればいいじゃん。
なんで、ジョルダン標準形なんて必要なの?」
という声が聞こえてきそうです。
確かに行列Aの固有値をtとするとdet(A-tE)=0となることから、
tの2次方程式の解tを求めて固有値t=α,βなら、(A-αE)v1=Oと(A-βE)v2=O
に対する固有ベクトルv1,v2が出る。
それから、P=[v1,v2]とすることで、Aと相似な行列D=P^{-1}APを求め、
A^n=PD^nP^{-1}でAのn乗が代数的に出せる。
そんな知識があると、それで安心してしまうのでしょう。
しかし、固有方程式で対角化できるのは、狭い世界なのです。
固有方程式の解がかぶらずに、バラバラのときしか対角化できません。
実用上、行列の対角化で済むことが多いので、ジョルダン標準形は特殊な世界と
思われがちです。
しかし、ジョルダン標準形が、名前の通りスタンダード、標準です。
どんな行列AでもPをみつけて、Aと相似な行列D=P^{-1}APを求めて、Dが
ジョルダン標準形になるようにする課題を、「標準化問題」といいます。
標準化ができると、対角化のように、応用上の恩恵が莫大なのです。
では、
標準化のイメージ(意味)、
標準化のコスト(手順)、
標準化のメリット(応用例)
という3つの視点で調べていこう。
<ジョルダン標準化のイメージ>
ジョルダン標準形はJBで直和分解した形だ。
n次のジョルダン標準形=
JB1⊕JB2⊕...⊕JBk
(すべてJBの次数の和=nとなる)
前回、直和分解したときにわかったことは、
分解した箱V1からW1への関数f1と箱V2からW2への関数f2は
独立しているのでバラバラに動くということだった。
だから、ジョルダン標準形の特徴はJB自体の特徴を見れば済むね。
<JBの特徴>
ということで、JB行列の特徴を探ろう
1つのJBは対角成分に同じスカラーkが並び、その1つとなり(i行i+1列)が1で、他ゼロの正方行列だ。
だから、kと正方行列のサイズnがわかると決まるので、
J(k,n)
などと書くと一発で決まる。
JBの例をあげよう。
J(3,1)={{3}}1行1列の行列で要素が3
J(3,2)={{3,1},{0,3}} 2行2列の行列で、対角成分が3で、1行2列が1.
J(3,3)={{3,1,0},{0,3,1},{0,0,3}} 3行3列の単位行列の3倍に,3のとなり(i行i+1列)に1がある。
......
J(3,k)= k行k列の単位行列の3倍に、3のとなり(i行i+1列)が1。
.....
J(j,n)=n行n列の単位行列Enのj倍に、jのとなり(i行i+1列)が1.
…
つまり、
JBは単位行列のj倍の行列(S)と単位行列を1つずらした行列(N)の和と言える。
JB=S+N
・行列Sは「伸ばす」Scale
固有ベクトルの方向への伸び縮み量を表します。
これって、N=Oで考えると、
固有方程式を立てて固有値と固有ベクトルを求めて相似な行列に直してできた行列と同じだとわかるね。
Sは軸を定数倍しているので、軸そのものはぶれないからJBの骨格ともいえるものだね。
・行列Nは「ずらす」Sheer
1つとなりの成分が染み出す、割り込む。
これが実は、現実の現象(雑音、データの測定誤差)につながる大切な行列だ。
染み出しは、1つとなりの情報が伝播するものといえる。
Nだけかけると、対角成分が0のためにどんどん0が増えて
そのうちゼロ行列になるから、ベキゼロ行列というものだ。
さて、ここで、Nの1の位置に着目してください。
2次のNは{{0,1},{0,0}}です。t[x1,x2]をかけた結果をt[y1,y2]とすると、y1=x2,y2=0です。
x2の情報がy1に流れます。
3次のNは{{0,1,0},{0,0,1},{0,0,0}}です。t[x1,x2,x3]をかけた結果をt[y1,y2,y3]とすると、
y1=x2,y2=x3,y3=0です。
x2の情報はy1に、x3の情報はx2に流れます。
つまり、
情報の流れ、横ずれの方向が1方向だということです。
だから、1方向のずれなので、
情報の染み出し、情報の伝播ともいえるのです。
JBの反射神経です。
入った情報が次々ととなりに伝わっていきます。
行列JBはずらして伸ばすから、空間をねじる。
JBを連続すると、ずれ・横揺れが縮小して伸びだけになっていく。
そのようすをみてみよう。
<Geogebraでコード化>
geogebraのオブジェクトの命名規約は独自のものがあります。
同名だと勝手にアンダーバーで連番がついたします。
アンダーバーのあとに2文字以上入れると、1文字だけ小文字で2文字目からは添え字でなくなります。
とても見にくいので、アンダーバーはできるだけ使わない方がよいでしょう。
オブジェクト名を長くすると、長いオブジェクト名のまま、画面に点や図形に名前がつき、
名前だらけになって見にくくなります。
その2つの理由から、geogebraのオブジェクト名は短くすることです。
固有値 lam と 繰り返し回数 nとしてスライダーで可変にした上で初期値を設定しましょう。
基底ベクトルにあたる2点と入力点の3点E1、E2、Pを設定します。
JB行列 J = S + N による n 回変換の計算の視覚化です。
Jのn乗はS部分のn乗とN部分のn乗の和で lam^n * I + n * lam^(n-1) * Nなので、
J^n={{a11,a12}{a21,122}}とすると、
a11 = lam^n
a12 = n * lam^(n - 1)
a21 = 0
a22 = lam^n
になりますね。
これを使って、変換後の3点E1p,E2p,Ppを計算します。
原点,E1,E2,Pをつなぐ正方形が
原点とE1p,E2p,Ppをつなぐ四角形に変形されます。(空間のゆがみ骨格変形)
Ppはn回計算後ですが、P1,P2,...Pnと点列にすることで、JB効果が見えます(神経伝達経路)
「作成」ボタンのクリック時のスクリプトに貼り付けます。
うまくいったらこのボタンは削除していいです。
lam = Slider(0.1, 2, 0.05)
n = Slider(1, 10, 1)
SetValue(lam , 0.8)
SetValue(n, 1)
E1 = Point({1, 0})
E2 = Point({0, 1})
P = Point({1, 1})
a11 = lam^n
a12 = n * lam^(n - 1)
a21 = 0
a22 = lam^n
E1p = Point({a11 * x(E1) + a12 * y(E1), a22 * y(E1)})
E2p = Point({a11 * x(E2) + a12 * y(E2), a22 * y(E2)})
Pp = Point({a11 * x(P) + a12 * y(P) , a22 * y(P)})
g1 = Segment((0,0), E1p)
g2 = Segment((0,0), E2p)
moto = Polygon((0,0), E1, P, E2)
bend = Polygon((0,0), E1p, Pp, E2p)
Ps = Sequence(Point({lam^k * x(P) + k * lam^(k - 1) * y(P), lam^k * y(P)}), k, 0, 10)
nerve= PolyLine(Ps)
u=Vector((0,0),Ep1)
v=Vector((0,0),Ep2)
タイトルは「ジョルダンブロックのねじりと伝播」
u,vのラベルは非表示がいいですね。
motoとbendは好きな色にして、変形前と変形後が対照的に見えるようにしよう。
lam,n,E1,E2,P,E1p,E2p,Pp,moto,bend,u,v以外は非表示にすると、画面がすっきりします。
nをアニメーションにすると、JB効果が生き生きと目に見えるでしょう。