宮崎大学 >>
工学部 >>
情報システム工学科 >>
伊達 >>
講義で使う Octave >>
線形代数 >>
Last modified: Mon Nov 8 11:23:15 JST 2010
コンピュータを操作するだけで,以下の用語の概念、 概念どうしの関係に対する、直観的な理解をつかもう。
% octave GNU Octave, version 3.0.5 Copyright (C) 2008 John W. Eaton and others. This is free software; see the source code for copying conditions. There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'. . . For information about changes from previous versions, type `news'. octave:1>
octave:2> 1+2 ans = 3
octave:3> A=[1.0, -0.3; -0.7, 0.6]
A = 1.00000 -0.30000 -0.70000 0.60000
octave:4> x = [-3.0, 0.5]
x = -3.00000 0.50000
octave:5> A*x
error: operator *: nonconformant arguments (op1 is 2x2, op2 is 1x2) error: evaluating binary operator `*' near line 8, column 2こうすると怒られる.x は横ベクトルであるので、積 Ax が定義できない。こういう理由で怒られた.
横ベクトル x を転置して、縦ベクトルにしておく必要がある。
x' で、x の転置を作ることができる。(アポストロフィが転置を意味する.)
まず x を転置して,縦ベクトルにしておく.
octave:6> x = x'
x = -3.00000 0.50000こうすることで、確かに x が縦ベクトルになった.
octave:7> A*x
ans = -3.1500 2.4000手で計算した結果と一致している。
octave:8> A
A = 1.00000 -0.30000 -0.70000 0.60000
octave:9> det(A) ans = 0.39000
octave:10> inv(A) ans = 1.53846 0.76923 1.79487 2.56410
octave:11> B = inv(A) B = 1.53846 0.76923 1.79487 2.56410
octave:12> det(B) ans = 2.5641
octave:13> det(A)*det(B) ans = 1
octave:14> rank(A) ans = 2この行列 Aは、筋のいい行列。筋の悪いのも試しておこう。
octave:15> eig(A) ans = 1.30000 0.30000これは、行列Aの固有値は2つあって、1.3 と 0.3 ということを意味している。
数学的に勉強した人にはあたりまえだが、 実は、固有値は、固有ベクトルとペアになっている。 つまり、行列Aには、 固有値1.3 に対応する固有ベクトルが1つ、 固有値0.3 に対応する固有ベクトルが1つ存在する。 これをみてみよう。
octave:16> [V, LAMBDA] = eig (A)
V = 0.70711 0.39392 -0.70711 0.91915 LAMBDA = Diagonal Matrix 1.30000 0 0 0.30000行列 V は固有ベクトル(縦ベクトル)を2つ並べたものになっている。 教科書の問題を解くと、固有ベクトルの要素は簡単な整数で表現できる ようになっているが、コンピュータはそんなことは知らない。 実は、ここで表示された固有ベクトルは、 わざわざ大きさが1に正規化されている. (固有ベクトルの長さは、重要ではないこということ!)
さて、行列 V の第一列(固有ベクトル1)だけをとりだし,それを V1 とする.
octave:17> V1=V(:,1)
V1 = -0.70711 -0.70711ベクトル V1 の大きさ(ノルム、長さを一般化したもの)を計算する.
octave:18> norm(V1)
ans = 1
octave:19> A=[5,-1,-1; 1,2,0; 3,-1,1]
A = 5 -1 -1 1 2 0 3 -1 1
octave:20> [V, LAMBDA] = eig (A)
V = -5.7735e-01 5.7735e-01 -1.9025e-15 -5.7735e-01 5.7735e-01 -7.0711e-01 -5.7735e-01 5.7735e-01 7.0711e-01 LAMBDA = 3.00000 0.00000 0.00000 0.00000 3.00000 0.00000 0.00000 0.00000 2.00000【補足】 この -5.7735e-01 という数は何か.
octave: 21> 1.2345*0.00000000000000000001 ans = 1.2345e-20としてみれば何を意味しているかわかる. (10 の -20乗ということ)
octave:22> help eig
eig is the dynamically-linked function from the file /usr/libexec/octave/2.1.73/oct/i686-pc-linux-gnu/eig.oct -- Loadable Function: LAMBDA = eig (A) -- Loadable Function: [V, LAMBDA] = eig (A) The eigenvalues (and eigenvectors) of a matrix are computed in a several step process which begins with a Hessenberg decomposition, followed by a Schur decomposition, from which the eigenvalues are apparent. The eigenvectors, when desired, are computed by further manipulations of the Schur decomposition.英語を読もう。スペースキーで続きが読める。q でおしまい。
octave: > A=[3,2; 4,1]
octave: > A^100
ans = 5.2591e+69 2.6295e+69 5.2591e+69 2.6295e+69
octave: > M = randn(100,100);
octave: > [P, LAMBDA] = eig (M);
octave: > I = eye(3,3)
octave: > A=diag([1, 2, 3])ほかにも、zeros(3,3)、ones(3,4) などで、単純な構造をもつ行列が生成できる。
計算機を使うと,対角化などとは関係なく,簡単に結果が得られるが...
octave: > [P, LAMBDA] = eig (A)
P = 0.70711 -0.44721 0.70711 0.89443 LAMBDA = 5 0 0 -1
octave: > D = inv(P)*A*P
D = 5.0000e+00 3.4022e-16 -1.1471e-16 -1.0000e-00非対角成分が 0 にはなってない (限りなく0に近い,小さな値ではあるが). このあたりの事情は数値計算の講義で学ぶ(と思う).
octave: > P*(D^100)*inv(P)
ans = 5.2591e+69 2.6295e+69 5.2591e+69 2.6295e+69
octave: > A^100
ans = 5.2591e+69 2.6295e+69 5.2591e+69 2.6295e+69めでたし?
宮崎大学 >> 工学部 >> 情報システム工学科 >> 伊達 >> 講義で使う Octave >>