|
1 |
2 |
#gapについてはMyブックマークも参照してください。連立1次方程式の掃出法(高校生向け)もあります。 #固有値を求めるコマンド Eigenvalues(Rationals, * ), * へ行列をいれる #4番目の行列については Eigenvalues(GaussianRationals,mats[4]); #固有ベクトルを求めるコマンド Eigenvectors(Rationals, * ) ただし、左からかける横 ベクトル。 #TransposedMat( * ) で転置を利用すれば右からかける列ベクトルが得られる。 #Tabキーでコマンドなどの補完機能あり。 gap> Read("det"); #ファイル det を読み込む gap> Print(det); #次の様に関数detを定義すると使える様になります。detというファイル名にこれを書いておき、上の様にReadで読込むこともできます。 gap> det:= >function ( m ) > local i, j, k, n; > if Length( m ) = 1 then > return m[1][1]; > fi; > n := 0; > for i in [ 1 .. Length( m ) ] do > k > := Concatenation( [ 1 .. i - 1 > ], > [ i + 1 .. Length( m ) ] ); > n > := n + (-1) ^ (i - 1) * m[1][i] > * det( > m{[ 2 .. Length( m ) ]}{k > } ); > od; > return n; >end; gap> x:=Indeterminate(Rationals,"x"); x gap> A:=[[-2,-1,-2,1], > [5,3,4,-1],[1,0,1,-1],[-3,-1,-2,2]]; [ [ -2, -1, -2, 1 ], [ 5, 3, 4, -1 ], [ 1, 0, 1, -1 ], [ -3, -1, -2, 2 ] ] gap> PrintArray(A); [ [ -2, -1, -2, 1 ], [ 5, 3, 4, -1 ], [ 1, 0, 1, -1 ], [ -3, -1, -2, 2 ] ] gap> x*IdentityMat(4); [ [ x, 0, 0, 0 ], [ 0, x, 0, 0 ], [ 0, 0, x, 0 ], [ 0, 0, 0, x ] ] gap> PrintArray(last); [ [ x, 0, 0, 0 ], [ 0, x, 0, 0 ], [ 0, 0, x, 0 ], [ 0, 0, 0, x ] ] gap> F:=ShallowCopy(x*IdentityMat(4)-A); [ [ 2+x, 1, 2, -1 ], [ -5, -3+x, -4, 1 ], [ -1, 0, -1+x, 1 ], [ 3, 1, 2, -2+x ] ] gap> PrintArray(F); [ [ 2+x, 1, 2, -1 ], [ -5, -3+x, -4, 1 ], [ -1, 0, -1+x, 1 ], [ 3, 1, 2, -2+x ] ] gap> det(F); 1-4*x+6*x^2-4*x^3+x^4 gap> Factors(det(F)); [ -1+x, -1+x, -1+x, -1+x ] gap> F[2]:=F[2]+F[1]; [ -3+x, -2+x, -2, 0 ] gap> PrintArray(F); [ [ 2+x, 1, 2, -1 ], [ -3+x, -2+x, -2, 0 ], [ -1, 0, -1+x, 1 ], [ 3, 1, 2, -2+x ] ] gap> F[3]:=F[3]+F[1]; [ 1+x, 1, 1+x, 0 ] gap> PrintArray(F); [ [ 2+x, 1, 2, -1 ], [ -3+x, -2+x, -2, 0 ], [ 1+x, 1, 1+x, 0 ], [ 3, 1, 2, -2+x ] ] gap> F[4]:=F[4]+F[1]*(-2+x); [ -1+x^2, -1+x, -2+2*x, 0 ] gap> PrintArray(F); [ [ 2+x, 1, 2, -1 ]\ , [ -3+x, -2+x, -2, 0 ]\ , [ 1+x, 1, 1+x, 0 ]\ , [ -1+x^2, -1+x, -2+2*x, 0 ]\ ] ########################################### ##この部分誤り。正しくは ##det(F)=(-1)*(-1)*det(F{[2,3,4]}{[1,2,3]}; ##で行列式の展開が得られる。誤りは固有多項式の定数倍なので、固有値を ##求めるときには、正しい解が出てくる。 #gap> G:=(-1)*(-1)*F{[2,3,4]}{[1,2,3]}; #[ [ -3+x, -2+x, -2 ], [ 1+x, 1, 1+x ], # [ -1+x^2, -1+x, -2+2*x ] ] #gap> PrintArray(G); #[ [ -3+x, -2+x, -2 ], # [ 1+x, 1, 1+x ], # [ -1+x^2, -1+x, -2+2*x ] ] #gap> det(G); #1-4*x+6*x^2-4*x^3+x^4 #gap> Factors(last); #[ -1+x, -1+x, -1+x, -1+x ] ########################################### gap> A1:=ShallowCopy(IdentityMat(4)*1-A); [ [ 3, 1, 2, -1 ], [ -5, -2, -4, 1 ], [ -1, 0, 0, 1 ], [ 3, 1, 2, -1 ] ] gap> PrintArray(A1); [ [ 3, 1, 2, -1 ], [ -5, -2, -4, 1 ], [ -1, 0, 0, 1 ], [ 3, 1, 2, -1 ] ] gap> A1[4]:=A1[4]-A1[1]; [ 0, 0, 0, 0 ] gap> PrintArray(A1); [ [ 3, 1, 2, -1 ], [ -5, -2, -4, 1 ], [ -1, 0, 0, 1 ], [ 0, 0, 0, 0 ] ] gap> A1[1]:=A1[1]-A1[3]*(-3); [ 0, 1, 2, 2 ] gap> PrintArray(A1); [ [ 0, 1, 2, 2 ], [ -5, -2, -4, 1 ], [ -1, 0, 0, 1 ], [ 0, 0, 0, 0 ] ] gap> A1[2]:=A1[2]-A1[3]*(5); [ 0, -2, -4, -4 ] gap> PrintArray(A1); [ [ 0, 1, 2, 2 ], [ 0, -2, -4, -4 ], [ -1, 0, 0, 1 ], [ 0, 0, 0, 0 ] ] gap> A1[2]:=A1[2]-A1[1]*(-2); [ 0, 0, 0, 0 ] gap> PrintArray(A1); [ [ 0, 1, 2, 2 ], [ 0, 0, 0, 0 ], [ -1, 0, 0, 1 ], [ 0, 0, 0, 0 ] ] gap> A1[3]:=(-1)*A1[3]; [ 1, 0, 0, -1 ] gap> PrintArray(A1); [ [ 0, 1, 2, 2 ], [ 0, 0, 0, 0 ], [ 1, 0, 0, -1 ], [ 0, 0, 0, 0 ] ] gap> PrintArray(A1{[3,1,2,4]}); [ [ 1, 0, 0, -1 ], [ 0, 1, 2, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ] gap> x1:=[1,0,0,1]; [ 1, 0, 0, 1 ] gap> A*x1; [ -1, 4, 0, -1 ] gap> x1:=[1,-2,0,1]; [ 1, -2, 0, 1 ] gap> A*x1; [ 1, -2, 0, 1 ] gap> x2:=[0,-2,1,0]; [ 0, -2, 1, 0 ] gap> A*x2; [ 0, -2, 1, 0 ] gap> X12:=TransposedMat([x1,x2]); [ [ 1, 0 ], [ -2, -2 ], [ 0, 1 ], [ 1, 0 ] ] gap> PrintArray(X12); [ [ 1, 0 ], [ -2, -2 ], [ 0, 1 ], [ 1, 0 ] ] gap> PrintArray(A*X12); [ [ 1, 0 ], [ -2, -2 ], [ 0, 1 ], [ 1, 0 ] ] |
2 |
3 |
LAST |
目次 前回 次回 |