EigenValues.mw

Matrix Inverse

Examples

まず,Mを造る.
M := <<1,2,0>|<2,3,2>|<0,2,1>>;

M := Matrix([[1, 2, 0], [2, 3, 2], [0, 2, 1]])

対応する3元連立方程式

> v := <5,4,2>;
xx:=<x,y,z>;

M.xx=v;

v := Vector[column]([[5], [4], [2]])

xx := Vector[column]([[x], [y], [z]])

Vector[column]([[x+2*y], [2*x+3*y+2*z], [2*y+z]]) = Vector[column]([[5], [4], [2]])

逆行列(Matirx Inverse)を求めて,vに作用すると,{x,y,z}が求まる.

> with(LinearAlgebra):
MatrixInverse(M).M.xx=MatrixInverse(M).v;

Vector[column]([[x], [y], [z]]) = Vector[column]([[1], [2], [-2]])

ガウス消去法を試せるJava

> with(Student[LinearAlgebra]):
GaussianEliminationTutor( M );

GaussianEliminationTutor( M, v );

LU decomposition

> #1
restart;

with(LinearAlgebra):

行列Mと数値ベクトルbを定義.

> #2
AA[1]:=Matrix(1..4,1..4,[[4,3,2,1],[2,5,-3,-2],

[1,-4,8,-1],[-3,2,-4,5]]);

b:=Vector([20,-5,13,9]);

AA[1] := Matrix([[4, 3, 2, 1], [2, 5, -3, -2], [1, -4, 8, -1], [-3, 2, -4, 5]])

b := Vector[column]([[20], [-5], [13], [9]])

行列の[1,1]対角成分からAA[2,1],[3,1],[4,1]を消去する変換行列T1を求める.

> #3
T[1]:=Matrix(1..4,1..4,[[1,0,0,0],[-1/2,1,0,0],

[-1/4,0,1,0],[-(-3/4),0,0,1]]);

T[1] := Matrix([[1, 0, 0, 0], [(-1)/2, 1, 0, 0], [(-1)/4, 0, 1, 0], [3/4, 0, 0, 1]])

T1をAA[1]に作用させる.

> #4
AA[2]:=MatrixMatrixMultiply(T[1],AA[1]);

AA[2] := Matrix([[4, 3, 2, 1], [0, 7/2, -4, (-5)/2], [0, (-19)/4, 15/2, (-5)/4], [0, 17/4, (-5)/2, 23/4]])

> #5
T[2]:=Matrix(1..4,1..4,[[1,0,0,0],[0,1,0,0],

[0,-AA[2][3,2]/AA[2][2,2],1,0],[0,-AA[2][4,2]/AA[2][2,2],0,1]]);

T[2] := Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 19/14, 1, 0], [0, (-17)/14, 0, 1]])

> #6
AA[3]:=MatrixMatrixMultiply(T[2],AA[2]);

AA[3] := Matrix([[4, 3, 2, 1], [0, 7/2, -4, (-5)/2], [0, 0, 29/14, (-65)/14], [0, 0, 33/14, 123/14]])

> #7
T[3]:=Matrix(1..4,1..4,[[1,0,0,0],[0,1,0,0],

[0,0,1,0],[0,0,-AA[3][4,3]/AA[3][3,3],1]]);

T[3] := Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, (-33)/29, 1]])

> #8
AA[4]:=MatrixMatrixMultiply(T[3],AA[3]);

AA[4] := Matrix([[4, 3, 2, 1], [0, 7/2, -4, (-5)/2], [0, 0, 29/14, (-65)/14], [0, 0, 0, 408/29]])

行列を三角行列に分解するために用意されているLUDecompositionコマンド

> #9
(P,L,U):=LUDecomposition(AA[1]);

P, L, U := Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]), Matrix([[1, 0, 0, 0], [1/2, 1, 0, 0], [1/4, (-19)/14, 1, 0], [(-3)/4, 17/14, 33/29, 1]]), Matrix([[4, 3, 2, 1], [0, 7/2, -4...

変換行列の積

> #10
T[3].T[2].T[1];

Matrix([[1, 0, 0, 0], [(-1)/2, 1, 0, 0], [(-13)/14, 19/14, 1, 0], [70/29, (-80)/29, (-33)/29, 1]])

下三角行列(L)の逆行列

> #11
MatrixInverse(L);

Matrix([[1, 0, 0, 0], [(-1)/2, 1, 0, 0], [(-13)/14, 19/14, 1, 0], [70/29, (-80)/29, (-33)/29, 1]])

LとUの積はもとの行列AA[0]に一致する.

> #12
L.U;

Matrix([[4, 3, 2, 1], [2, 5, -3, -2], [1, -4, 8, -1], [-3, 2, -4, 5]])

変換行列を一度に数値ベクトルbに作用させると,ガウス消去法に対応した行列になる.

> #13
T[3].T[2].T[1].b;

LUDecomposition(<AA[1]|b>,output='U');

Vector[column]([[20], [-15], [(-173)/14], [1632/29]])

Matrix([[4, 3, 2, 1, 20], [0, 7/2, -4, (-5)/2, -15], [0, 0, 29/14, (-65)/14, (-173)/14], [0, 0, 0, 408/29, 1632/29]])

'R'を指定すると対角化した行列,あるいは連立方程式の解

> #14
LUDecomposition(<AA[1]|b>,output='R');

Matrix([[1, 0, 0, 0, 1], [0, 1, 0, 0, 2], [0, 0, 1, 0, 3], [0, 0, 0, 1, 4]])

Partial Pivoting

> #1
restart;with(LinearAlgebra):

> #2
AA[1]:=Matrix(1..4,1..4,[[2,-4,3,-1],[1,-2,2,1],

[1,-5,4,-3],[3,2,-2,-2]]);

b:=Vector([-2,1,-8,1]);

AA[1] := Matrix([[2, -4, 3, -1], [1, -2, 2, 1], [1, -5, 4, -3], [3, 2, -2, -2]])

b := Vector[column]([[-2], [1], [-8], [1]])

1列目の消去をしたところ,同時にT[1].AA[1]の2行2列目の要素が0になってしまった.

> #3
t:=-1/AA[1][1,1];

T[1]:=Matrix(1..4,1..4,[[1,0,0,0],[t*AA[1][2,1],1,0,0],

[t*AA[1][3,1],0,1,0],[t*AA[1][4,1],0,0,1]]);

T[1].AA[1];

t := (-1)/2

T[1] := Matrix([[1, 0, 0, 0], [(-1)/2, 1, 0, 0], [(-1)/2, 0, 1, 0], [(-3)/2, 0, 0, 1]])

Matrix([[2, -4, 3, -1], [0, 0, 1/2, 3/2], [0, -3, 5/2, (-5)/2], [0, 8, (-13)/2, (-1)/2]])

Partial pivoting, P[1]行列を左から作用すると,2行目と3行目が入れ替わる.この操作は変数の並びは変わらず単に方程式の順番を変更しただけである.

> #4
P[1]:=Matrix(1..4,1..4,[[1,0,0,0],[0,0,1,0],

[0,1,0,0],[0,0,0,1]]);

AA[2]:=P[1].T[1].AA[1];

P[1] := Matrix([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]])

AA[2] := Matrix([[2, -4, 3, -1], [0, -3, 5/2, (-5)/2], [0, 0, 1/2, 3/2], [0, 8, (-13)/2, (-1)/2]])

> #5
n:=2;

t:=-1/AA[n][n,n]:

T[n]:=Matrix(1..4,1..4,[[1,0,0,0],[0,1,0,0],

[0,t*AA[n][3,n],1,0],[0,t*AA[n][4,n],0,1]]):

AA[n+1]:=T[n].AA[n];

n := 2

AA[3] := Matrix([[2, -4, 3, -1], [0, -3, 5/2, (-5)/2], [0, 0, 1/2, 3/2], [0, 0, 1/6, (-43)/6]])

> #6
n:=3;

t:=-1/AA[n][n,n];

T[n]:=Matrix(4,4):

for i from 1 to 4 do

 T[n][i,i]:=1;

end do:

T[n][n+1,n]:=t*AA[n][n+1,n];

AA[n+1]:=T[n].AA[n];

n := 3

t := -2

T[3][4, 3] := (-1)/3

AA[4] := Matrix([[2, -4, 3, -1], [0, -3, 5/2, (-5)/2], [0, 0, 1/2, 3/2], [0, 0, 0, (-23)/3]])

上三角行列にした後も,対角の規格化,ならびに上三角の非対角成分を後ろ側から消去していく操作(後退代入)を引き続き作用させることで行列Aが対角化される

> #7
S[0]:=Matrix(4,4):

for i from 1 to 4 do

 S[0][i,i]:=1/AA[4][i,i];

end do:

AA[5]:=S[0].AA[4];

AA[5] := Matrix([[1, -2, 3/2, (-1)/2], [0, 1, (-5)/6, 5/6], [0, 0, 1, 3], [0, 0, 0, 1]])

> #8
n:=3;

S[n]:=Matrix(4,4):

S[n][4,4]:=1;

for m from n to 1 by -1 do

 S[n][m,m]:=1;

 S[n][m,4]:=-AA[5][m,4];

end do:

AA[6]:=S[n].AA[5];

n := 3

S[3][4, 4] := 1

AA[6] := Matrix([[1, -2, 3/2, 0], [0, 1, (-5)/6, 0], [0, 0, 1, 0], [0, 0, 0, 1]])

> #9
n:=2;

S[n]:=Matrix(4,4):

S[n][4,4]:=1:

S[n][3,3]:=1:

for m from n to 1 by -1 do

 S[n][m,m]:=1;

 S[n][m,3]:=-AA[6][m,3];

end do:

AA[7]:=S[2].AA[6];

n := 2

AA[7] := Matrix([[1, -2, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])

> #10
n:=1;

S[n]:=Matrix(4,4):

S[n][4,4]:=1:

S[n][3,3]:=1:

S[n][2,2]:=1:

for m from n to 1 by -1 do

 S[n][m,m]:=1;

 S[n][m,2]:=-AA[7][m,2];

end do:

S[1].AA[7];

n := 1

Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])

逆行列(Z)

> #11
Z:=S[1].S[2].S[3].S[0].T[3].T[2].T[1].P[1];

Z.AA[1];

Z := Matrix([[2/23, 6/23, (-2)/23, 5/23], [(-42)/23, 35/23, 19/23, 10/23], [(-47)/23, 43/23, 24/23, 9/23], [8/23, 1/23, (-8)/23, (-3)/23]])

Matrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])

方程式の根

> #12
Z.b;

Vector[column]([[1], [-1], [-2], [2]])

MapleのLUDecompositionコマンドをこの行列に適用すると,置換行列(permutation matrix)Pは単位行列ではなくなる.

> (P,L,U):=LUDecomposition(AA[1]);

P, L, U := Matrix([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]]), Matrix([[1, 0, 0, 0], [1/2, 1, 0, 0], [1/2, 0, 1, 0], [3/2, (-8)/3, 1/3, 1]]), Matrix([[2, -4, 3, -1], [0, -3, 5/2, (-5)/2]...

P.A=L.U

> P.AA[1];
L.U;

Matrix([[2, -4, 3, -1], [1, -5, 4, -3], [1, -2, 2, 1], [3, 2, -2, -2]])

Matrix([[2, -4, 3, -1], [1, -5, 4, -3], [1, -2, 2, 1], [3, 2, -2, -2]])

Jacobi method for solving simultaneous linear equations

> #1
restart;

n:=4:

AA:=Matrix(1..4,1..4,[[4,3,2,1],[2,5,-3,-2],

[1,-4,8,-1],[-3,2,-4,5]]);

b:=Vector([20,-5,13,9]);

AA := Matrix([[4, 3, 2, 1], [2, 5, -3, -2], [1, -4, 8, -1], [-3, 2, -4, 5]])

b := Vector[column]([[20], [-5], [13], [9]])

#2 Jacobi method

> x0:=[0,0,0,0]:
x1:=[0,0,0,0]:

for iter from 1 to 20 do

for i from 1 to n do

 x1[i]:=b[i];

 for j from 1 to n do

   x1[i]:=x1[i]-AA[i,j]*x0[j];

 end do:

 x1[i]:=x1[i]+AA[i,i]*x0[i];

 x1[i]:=x1[i]/AA[i,i];

end do:

x0:=evalf(x1);

print(iter,x0);

end do:

1, [5., -1., 1.625000000, 1.800000000]

2, [4.487500000, -1.305000000, .7250000000, 6.500000000]

3, [3.991250000, .2400000000, 1.224062500, 5.594500000]

4, [2.809343750, .3757375000, 1.945406250, 5.078000000]

5, [2.475993750, 1.074706250, 2.096450781, 4.891636250]

6, [1.922835860, 1.224127469, 2.464308438, 4.532874374]

7, [1.716531586, 1.522600469, 2.563318549, 4.435497278]

8, [1.467516055, 1.625577406, 2.726170946, 4.271533604]

9, [1.349848072, 1.757309587, 2.788290895, 4.211215426]

10, [1.235068505, 1.817521478, 2.861325714, 4.137617726]

11, [1.171791603, 1.877815117, 2.896579392, 4.103093084]

12, [1.117575696, 1.910468228, 2.930320244, 4.069212430]

13, [1.084685600, 1.938846840, 2.949188705, 4.050614322]

14, [1.058616937, 1.955884712, 2.965164510, 4.034623588]

15, [1.041848314, 1.969501367, 2.974943188, 4.024947886]

16, [1.029165408, 1.978205742, 2.982638131, 4.017262992]

17, [1.020710880, 1.984821911, 2.987615069, 4.012327452]

18, [1.014494169, 1.989215669, 2.991363026, 4.008589820]

19, [1.010259279, 1.992456077, 2.993869791, 4.006100654]

20, [1.007197882, 1.994658425, 2.995708210, 4.004268970]

#3 Gauss-Seidel method for matrix inverse.

> x0:=[0,0,0,0]:
for iter from 1 to 20 do

for i from 1 to n do

 x1:=b[i];

 for j from 1 to n do

   x1:=x1-AA[i,j]*x0[j];

 end do:

 x1:=x1+AA[i,i]*x0[i];

 x1:=x1/AA[i,i];

 x0[i]:=evalf(x1);

end do:

print(iter,x0);

end do;

1, [5., -3.000000000, -.5000000000, 5.600000000]

2, [6.100000000, -1.500000000, .8125000000, 6.710000000]

3, [4.041250000, .5550000000, 2.236093750, 5.791625000]

4, [2.017796875, 1.851187500, 3.022322265, 4.688060936]

5, [.9284330085, 2.317244530, 3.253575756, 4.033022598]

6, [.6270230760, 2.314545262, 3.208022571, 3.816813798]

7, [.7058763185, 2.169188534, 3.098461452, 3.834619540]

8, [.8652229900, 2.046835492, 3.019592315, 3.916073450]

9, [.9760588600, 1.987761225, 2.986382436, 3.979636774]

10, [1.021078668, 1.975252704, 2.982446115, 4.008503010]

11, [1.025211662, 1.982784209, 2.989303524, 4.013456134]

12, [1.014896047, 1.993006149, 2.996323085, 4.008793636]

13, [1.004885436, 1.999357130, 3.000167090, 4.003322082]

14, [.9995680880, 2.001601850, 3.001270174, 4.000116252]

15, [.9981344630, 2.001554820, 3.001025134, 3.999078858]

16, [.9985516040, 2.000825982, 3.000478899, 3.999183690]

17, [.9993451395, 2.000222760, 3.000091199, 3.999590940]

18, [.9998895950, 1.999935257, 2.999930296, 3.999903890]

19, [1.000107437, 1.999876759, 2.999912936, 4.000044106]

20, [1.000124936, 1.999915429, 2.999947611, 4.000066878]

Geometrical meaning of Eigenvalue
固有値の

A*x = lambda*x

幾何学的意味

#1
restart;

with(LinearAlgebra):with(plots):with(plottools):

Warning, the name changecoords has been redefined

Warning, the name arrow has been redefined

> #2
A:=Matrix(1..2,1..2,[[3,2/3],[2/3,2]]);

A := Matrix([[3, 2/3], [2/3, 2]])

> #3
N:=30;p1:=[];l1:=[];

for k from 0 to N-1 do

 x0:=Vector([sin(2*Pi*k/N),cos(2*Pi*k/N)]);

 x1:=MatrixVectorMultiply(A,x0);

 p1:=[op(p1),pointplot({x0,x1})];

 l1:=[op(l1),line( evalf(convert(x0,list)),evalf(convert(x1,list)) )];

end do:

N := 30

p1 := []

l1 := []

> #4
Eigenvectors(A);

Vector[column]([[5/3], [10/3]]), Matrix([[(-1)/2, 2], [1, 1]])

> #5
principal:=plot({1/2*x,-2*x},x=-4..4):

> #6
display([principal,op(p1),op(l1)],view=[-4..4,-4..4],axes=box);

[Plot]

Eigenvalue and Eigenvector

> restart;with(LinearAlgebra):

> A:=Matrix(4,4,[[5,4,1,1],[4,5,1,1],
[1,1,4,2],[1,1,2,4]]);

A := Matrix([[5, 4, 1, 1], [4, 5, 1, 1], [1, 1, 4, 2], [1, 1, 2, 4]])

固有値を列に持つベクトルEと対応する固有ベクトルxを列に持つ行列Vを返す.
(E,V):=Eigenvectors(A);

E, V := Vector[column]([[10], [1], [2], [5]]), Matrix([[2, -1, 0, (-1)/2], [2, 1, 0, (-1)/2], [1, 0, -1, 1], [1, 0, 1, 1]])

A.Vを取れば,A.x=lambda.xが成立していることが確認できる.

> A.V;

Matrix([[20, -1, 0, (-5)/2], [20, 1, 0, (-5)/2], [10, 0, -2, 5], [10, 0, 2, 5]])

Jacobi method for Eigenvalues

ヤコビ回転の導出

> #1
restart:

with(LinearAlgebra):

B:=Matrix(4,4,shape=symmetric,symbol=a);

B := Matrix([[a[1, 1], a[1, 2], a[1, 3], a[1, 4]], [a[1, 2], a[2, 2], a[2, 3], a[2, 4]], [a[1, 3], a[2, 3], a[3, 3], a[3, 4]], [a[1, 4], a[2, 4], a[3, 4], a[4, 4]]])

> #2
U:=Matrix(4,4,[[c,-s,0,0],[s,c,0,0],[0,0,1,0],[0,0,0,1]]);

U := Matrix([[c, -s, 0, 0], [s, c, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])

> #3
TT:=Transpose(U).B.U;

TT := Matrix([[(c*a[1, 1]+s*a[1, 2])*c+(c*a[1, 2]+s*a[2, 2])*s, -(c*a[1, 1]+s*a[1, 2])*s+(c*a[1, 2]+s*a[2, 2])*c, c*a[1, 3]+s*a[2, 3], c*a[1, 4]+s*a[2, 4]], [(-s*a[1, 1]+c*a[1, 2])*c+(-s*a[1, 2]+c*a[2...TT := Matrix([[(c*a[1, 1]+s*a[1, 2])*c+(c*a[1, 2]+s*a[2, 2])*s, -(c*a[1, 1]+s*a[1, 2])*s+(c*a[1, 2]+s*a[2, 2])*c, c*a[1, 3]+s*a[2, 3], c*a[1, 4]+s*a[2, 4]], [(-s*a[1, 1]+c*a[1, 2])*c+(-s*a[1, 2]+c*a[2...TT := Matrix([[(c*a[1, 1]+s*a[1, 2])*c+(c*a[1, 2]+s*a[2, 2])*s, -(c*a[1, 1]+s*a[1, 2])*s+(c*a[1, 2]+s*a[2, 2])*c, c*a[1, 3]+s*a[2, 3], c*a[1, 4]+s*a[2, 4]], [(-s*a[1, 1]+c*a[1, 2])*c+(-s*a[1, 2]+c*a[2...

> #4
TT[1,1];

expand(TT[1,1]);

(c*a[1, 1]+s*a[1, 2])*c+(c*a[1, 2]+s*a[2, 2])*s

c^2*a[1, 1]+2*c*s*a[1, 2]+s^2*a[2, 2]

> TT[2,2];
expand(TT[2,2]);

-(-s*a[1, 1]+c*a[1, 2])*s+(-s*a[1, 2]+c*a[2, 2])*c

s^2*a[1, 1]-2*c*s*a[1, 2]+c^2*a[2, 2]

> TT[1,2];
expand(TT[1,2]);

-(c*a[1, 1]+s*a[1, 2])*s+(c*a[1, 2]+s*a[2, 2])*c

-s*c*a[1, 1]-s^2*a[1, 2]+c^2*a[1, 2]+c*s*a[2, 2]

> TT[1,3];
expand(TT[3,1]);

c*a[1, 3]+s*a[2, 3]

c*a[1, 3]+s*a[2, 3]

> TT[2,3];
expand(TT[3,2]);

-s*a[1, 3]+c*a[2, 3]

-s*a[1, 3]+c*a[2, 3]

>