固有値と固有ベクトル#

固有値と固有ベクトル#

定義#

n次の正方行列Aに対して

Ax=λx

が成り立つとき、スカラーλA固有値(eigenvalue)といい、 n次元ベクトルx(0)Aλに対応する固有ベクトル(eigenvector)と呼ぶ。

線形変換を使う定義#

ベクトル空間Vから自分自身への線形写像を 線形変換 という。

「線形変換f:VVが与えられたとき、あるベクトルx0があって、fxxの定数倍λxに写すようにできるだろうか?」が固有値の議論の出発点となる

定義

線形変換 f:VV において

f(x)=λx,xV,x0,λR

をみたす λf固有値x を固有値 λ に属する 固有ベクトル という。

線形写像は具体的には行列で表すことができるため(線形写像の行列表現)、 f(x)=λxAx=λxと等しい。

固有空間#

定理

ベクトル空間 V の線形変換 f の固有値の 1 つを λ とする。 λ に 属する f の固有ベクトル全体とゼロベクトルからなる集合 V(λ) は集合

{xVf(x)=λx}

と一致し、 V の部分空間になる。なお、V(λ)fの固有値λに属する 固有空間 という。

証明

(1) 0V(λ)について

x=0も等式f(x)=λxを満たす

(2) 和について

x1,x2Vに対し

f(x1+x2)=f(x1)+f(x2)=λx1+λx2=λ(x1+x2)

より、

x1+x2V(λ)

(3) 定数倍について

xV,cRに対し、

f(cx)=cf(x)=cλx=λ(cx)

より

cxV(λ)

よって部分空間の3条件(1)~(3)を満たすため、V(λ)Vの部分空間である

固有空間は、fに対応するn次正方行列An次単位行列Iを用いて

Ker(AλI)={xV(AλI)x=0}

と表すこともできる。

広義固有空間#

ある自然数kに対して

(AλI)kx=0

を満たすxRnAの固有値λに対する 広義固有ベクトル (generalized eigenvector) という。

固有値λに対する広義固有ベクトル全体に0を加えた集合

W~(λ)={xRnkN,(AλI)kx=0}

λに対する 広義固有空間 (generalized eigenspace) という。

広義固有空間もRnの部分空間である

x,yW~(α),cC とする。このとき, (AαI)kx=0,(AαI)ly=0

となる自然数 k,l がとれる.すると。

(AαI)k+l(x+y)=0(AαI)k(cx)=c(AαI)kx=0

により、 x+y,cxW~(α) である. よって W~(α) は部分空間である。

固有値の必要十分条件#

定理

n 次正方行列 A が与えられたとき、 λA の固有値である必要十分条件は

det(AλI)=0

をみたすことである。 ここで In 次単位行列である。

固有方程式#

Ax=λx

は単位行列Iを用いて

(AλI)x=0

と表すことができる(もちろん(λIA)x=0も可)。

斉次連立一次方程式の解が非自明な解 x0を持つことと、行列式det(AλI)=0となることは同値であるので、固有ベクトルがx0であるためには

det(AλI)=0

でなければならない。この式を 固有方程式 あるいは 特性方程式 と呼び、固有値は固有方程式の解として求める。

固有多項式(特性多項式)#

n次正方行列Aに対し、

ϕA(λ)=det(AλI)=det(a11λa12a1na21a22λa2nan1annλ)

で定義される変数λについての多項式ϕA(λ)を、行列A固有多項式 または 特性多項式という。

固有値・固有ベクトルの求め方#

例題
A=(1122)

とする。

Aの固有値と、各固有値に属する1つの固有ベクトルと、固有空間V(λ)を求めよ

固有値を求める#

(AλE)x=0が非自明な解x0を持つためにはdet(AλE)=0である必要があるため、そのようなλを求める(固有方程式を解く)

(もしAが対角行列などの行列式を求めやすい形状の行列であった場合、この部分が少し楽になるので活用しよう)

det(AλI)=det(1λ122λ)=(1λ)(2λ)2=23λ+λ22=λ23λ=(λ3)λ=0

なので、λ=0,3

固有空間・固有ベクトルを求める#

固有値に対応するベクトルを求める

λ=0の場合:

Ax=λx

(1122)(x1x2)=λ(x1x2)

であり

{x1+x2=02x1+2x2=0

となる。

これを解くと

x1=x2x2=x1

つまり

x=(x1x1)

であるため、未知の数cRをもちいて

x=c(11)

と表すことができる。そのため、例えば (11)は固有値0に属する固有ベクトルのひとつになる。

固有空間は

V(0)={c(11)|cR}

となる。

λ=3の場合:

Ax=λx

{x1+x2=3x12x1+2x2=3x2

となる。

これを解くと

x2=2x1

であるため、

x=(x12x1)=c(12),cR

となり、例えば(12)が固有値3の固有ベクトルの一つである。

固有空間V(λ)

V(3)={c(12)|cR}

となる。

numpy#

numpyのnumpy.linalg.eig()の返り値はノルムが1になるように正規化されている

import numpy as np

A = np.array([
    [1, 1],
    [2, 2],
])

lambdas, vectors = np.linalg.eig(A)
print(f"""
λ={lambdas}
x1={vectors[:, 0].round(3)}
x1'={(vectors[:, 0].round(3) * -np.sqrt(2)).round(1)}
x2={vectors[:, 1].round(3)}
x2'={(vectors[:, 1].round(3) * -np.sqrt(5)).round(1)}
""")
λ=[0. 3.]
x1=[-0.707  0.707]
x1'=[ 1. -1.]
x2=[-0.447 -0.894]
x2'=[1. 2.]
np.array([1, -1]) / np.sqrt(2)
array([ 0.70710678, -0.70710678])

λ=0について、

x=15(12)(0.4470.894)

λ=3について、

x=12(11)(0.7070.707)

例1. 対角行列

対角行列の固有値は対角成分になる。

A=(4003)

なら

ϕA(λ)=det(4λ003λ)=0

より

(4λ)(3λ)=0

なので解は

λ=4,3
import numpy as np

A = np.array([
    [4, 0],
    [0, 3],
])

lambdas, vectors = np.linalg.eig(A)
print(f"""
λ={lambdas}
x1={vectors[:, 1].round(3)}
x2={vectors[:, 0].round(3)}
""")
λ=[4. 3.]
x1=[0. 1.]
x2=[1. 0.]

例2.

A=(3210)

なら

ϕA(λ)=det(3λ21λ)=0=(3λ)(λ)(2)1=λ23λ+2=(λ2)(λ1)

よってλ=2,1

import numpy as np

A = np.array([
    [3, -2],
    [1, 0],
])

lambdas, vectors = np.linalg.eig(A)
print(f"""
λ={lambdas}
x1={vectors[:, 1].round(3)}
x2={vectors[:, 0].round(3)}
""")
λ=[2. 1.]
x1=[0.707 0.707]
x2=[0.894 0.447]

固有ベクトルの計算#

固有値が求まれば、あとは定義にあうベクトルを求めるのみ。

例1.

A=(3210)

の場合、λ=1,2なので

まずλ=1の場合

Ax=λx(3210)(x1x2)=(x1x2)

なので

3x12x2=x1x1=x2

これを解き、0以外の任意の数sを使って表すと

x=s(11)

となる。

そのため、固有空間W(λ)

W(1)={s(11)|sR}.

であり、固有空間のうちの一つの固有ベクトルが(11)となる。

λ=2の場合、

(3210)(x1x2)=2(x1x2)
3x12x2=2x1x1=2x2
x=s(21)
  • 対象行列の固有値は負をとらない

  • 固有値に0がある(正定値じゃない)と、ランクが下がり、逆行列をもたない

固有値を求めやすい行列#

三角行列や対角行列は求めやすい

定理

n 次正方行列 A が三角行列であるとき、 A の固有値全体は重複もこめて A の対角成分と一致する

証明

Aが次のような上三角行列だったとする。

A=(a11a12a1n0a2200ann)

行列AλIの行列式(固有多項式)は対角成分の積で求められるため

φA(λ)=det(a11λa12a1n0a22λ00annλ)=(a11λ)(a22λ)(annλ)

となる。これを解くと、固有値はa11,a22,,annと、対角成分である。

定理

n 次正方行列 A

A=(BCOD)

の形をしているとする。 ここで Br 次正方行列、 Cr×s 行列、Ds 次正方行列、O はすべての成分が 0 からなる s×r 行列を表わす。 そのとき、

φA(t)=φB(t)φD(t)

が成り立つ。したがって、行列 A の固有値の全体は重複もこめて、行列 B の固有値と、行列 D の固有値を合せたものと一致する。

固有値の重複度#

固有方程式の解の重複度を、固有値の 重複度 という。

固有値の重複度と固有空間の次元数には次のような関係がある

定理

AMn(R)λAの1つの固有値とするとき、

λに属する固有空間の次元 λの重複度

が成り立つ

A=(1101)

は、三角行列なので

det(AλI)=det(1λ101λ)=(1λ)2

と、λ=1だけが固有値で、その重複度は2である。固有空間V(1)

V(1)={c(10)|cR}

この空間の次元は1である。

線形変換と表現行列の固有値は同じものになる。

定理

線形変換 f:VV が与えられたとき、 V の 1 つの基底をとり、 その基底に関する f の表現行列を A とする。そのとき、 f の固有値の集合は重複もこめて、 A の固有値の集合と一致する。

証明

v1,,vnV の 1 組の基底とする。 V のベクトル x をこの基底の 1 次結合 x=x1v1++xnvn と書く。そのとき、

f(x)=λxA(x1xn)=λ(x1xn)

であるから、この定理の主張が成り立つ。

固有値・固有ベクトルに関する定理#

固有値・固有ベクトルの存在#

任意の正方行列について、「固有値・固有ベクトルは存在する」という解説と「固有値・固有ベクトルは存在するとは限らない」という解説がある。どちらが正しいのか・・・。

固有値・固有ベクトルは存在する#

λ に関する n 次方程式であるので、 代数学の基本定理によって、 複素数の範囲に解が存在することが保証される。

固有値と固有ベクトルの解説 ~ 具体例と性質 ~ (証明付)   - 理数アラカルト -

解があっても非自明な解とは限らないのでは

固有値・固有ベクトルは存在するとは限らない#

川久保(2010)の反例

行列 A=(0110) で与えられる線形変換 A:R2R2 を考える。

Ax=λxx=(xy)

をみたす λRx0 が存在したとすると、

(0110)(xy)=λ(xy)

これより等式

{y=λxx=λy

を得る。第1式を第2式に代入して

x=λ(λx)=λ2x ゆえに (λ2+1)x=0

となる. これより x=0. これを第 1 式に代入して y=0 となる. つまり x=0 である。固有ベクトルはゼロベクトルでないものをいうから,これは固有ベク トルではない。つまり,この行列には固有値も固有ベクトルも存在しない。

(川久保勝夫. (2010). 線形代数学 [新装版]. より)

固有ベクトルの1次独立性#

定理

n 次正方行列 A の相異なる固有値を λ1,,λs(sn) とする。 各固有値 λi に属する固有ベクトルを xi とするとき、 x1,,xs は 1 次独立である。

証明

まずs=1のとき、固有ベクトルはx10なので、明らかにc1x1=0c1=0なので1次独立である。

次にr2について、s=r1が1次独立だと仮定したときs=rのときも1次独立となることを示す。

c1,,cnRについて、

()c1x1++csxs=0

とおくと、()に左からAをかければ、Axi=λixiより

c1Ax1++csAxs=c1λ1x1++csλsxs=0

他方、()に左からλsをかければ、

c1λsx1++csλsxs=0

となる。2つの式を引くと

c1(λ1λs)x1++cs(λsλs)xs=c1(λ1λs)x1++cs1(λs1λs)xs1=0

となる。異なる固有値に属するs1個の固有ベクトルx1,,xs1は1次独立であり、その係数はすべてゼロであるから、

c1(λ1λs)==cs1(λs1λs)=0

であり、すべての固有値λ1,,λs1が相異なるという仮定から、

c1==cs1=0

が導かれる。これらを()に代入すれば

csxs=0

となり、固有ベクトルの定義よりxs0であるため、cs=0である。

よってx1,,xsは1次独立である

三角化定理#

線形変換fの固有多項式ϕ(λ)n個の1次式の積に分解される

三角化定理

VK 上の n 次元ベクトル空間、 fV の線型変換とし、 f の固有値を α1,α2,,αn とする。

そのとき、fV の適当な基底によって、三角行列

[α1α2αn]

で表現される。

フロベニウスの定理#

フロベニウスの定理 (Frobenius theorem)

フロベニウスの定理

f(x)=amxm+am1xm1++a0 を多項式とする。 n 次正方行列 A の固有値を λ1,λ2,,λn とするとき,正方行列

f(A)=amAm+am1Am1++a0In

の固有値は f(λ1),f(λ2),,f(λn) である。

ケイリー・ハミルトンの定理#

ケイリー・ハミルトンの定理

Aの固有多項式をϕA(t)とするとき

ϕA(A)=O

になる

ケイリー・ハミルトンの定理 - Wikipedia

例:

2次正方行列

A=(abcd)

の場合、固有多項式は

ϕA(λ)=det(AλI)=det(aλbcdλ)=(aλ)(dλ)bc=adaλdλ+λ2bc=λ2(a+d)λ+(adbc)

なので

ϕA(A)=A2(a+d)A+(adbc)I=O

という形になる。 実際に計算してみると

A2(a+d)A+(adbc)I=(abcd)(abcd)a(abcd)d(abcd)+(adbc)I=(a2+bcab+bdac+cdbc+d2)(a2abacad)(adbdcdd2)+(adbc)I=(bcbdcdbc+d2ad)(adbdcdd2)+(adbc)I=(bcad00bcad)+(adbc)I=(0000)

となる。

ケイリー・ハミルトンの定理は何の役に立つのか

n乗を計算するときに計算量を抑えられる

例えばケイリー・ハミルトンの定理からA3A+2I=Oがわかっている状況でA7を求めたいとする。

A3=A2Iだから、3乗をくくりだせば

A7=A3A3A=(A2I)(A2I)A=(A24A+4I)A=A34A2+4A=(A2I)4A2+4A=4A2+5A2I

となり、行列積の計算としてはA2だけを計算すれば済む。

固有値は写像の行列表現のとりかた(基底のとりかた)に依らず一定#

定義:相似

n 次正方行列 A,B に対して、

B=P1AP

となる正則行列 P が存在するとき、 AB相似 であるという。

定理

n 次正方行列 A,B が相似であれば、両者の固有多項式は一致する、すなわち

φA(t)=φB(t)

である。したがって、 AB の固有値全体は重複もこめて一致する。

証明
φB(t)=|BtE|=|P1APtE|

tE は任意の行列と可換であるから

=|P1APP1tEP|=|P1(AtE)P|=|P1||AtE||P|=|P|1|AtE||P|=|AtE|=φA(t)

定理

線形変換 f:VV が与えられたとき、 V の 1 つの基底をとり、 その基底に関して f を行列表示したものを A とする。

そのとき、行列 A の固有多項式 φA(t) は基底の取り方によらない。

証明

線形変換を行列表示するとき、基底の取り換えは相似の関係になるから、前出の定理よりそれらの行列の固有多項式は一致する。

具体例(うまくいかなかった

線形写像f:R2R2が存在し、

f(v)=(1221)v

であるとする。

R2の標準基底

v1=(10), v2=(01)

を使ってWへ写したものは

(f(v1),f(v2))=(1221)

となる。

これらに対し、Wの基底

w1=(11), w2=(11)

を使って

(f(v1),f(v2))=(w1,w2)A

と写すような行列A

(w1,w2)1=(12121212)

を左から両辺にかけて

(w1,w2)1(f(v1),f(v2))=(w1,w2)1(w1,w2)A
(12121212)(1221)=(32321212)=A
import numpy as np

V = np.array([
    [1, 2],
    [2, 1],
])

W = np.array([
    [1, 1],
    [1, -1],
])

A = np.linalg.inv(W) @ V

lambdas, vectors = np.linalg.eig(A)
print(f"""
λ={lambdas}
x1={vectors[:, 0].round(3)}
x1'={(vectors[:, 0].round(3) * -np.sqrt(2)).round(1)}
x2={vectors[:, 1].round(3)}
x2'={(vectors[:, 1].round(3) * -np.sqrt(5)).round(1)}
""")
λ=[1.+0.70710678j 1.-0.70710678j]
x1=[ 0.866+0.j    -0.289+0.408j]
x1'=[-1.2+0.j   0.4-0.6j]
x2=[ 0.866-0.j    -0.289-0.408j]
x2'=[-1.9+0.j   0.6+0.9j]
import numpy as np

A = np.array([
    [1, 2],
    [2, 1],
])

lambdas, vectors = np.linalg.eig(A)
print(f"""
λ={lambdas}
x1={vectors[:, 0].round(3)}
x1'={(vectors[:, 0].round(3) * -np.sqrt(2)).round(1)}
x2={vectors[:, 1].round(3)}
x2'={(vectors[:, 1].round(3) * -np.sqrt(5)).round(1)}
""")
λ=[ 3. -1.]
x1=[0.707 0.707]
x1'=[-1. -1.]
x2=[-0.707  0.707]
x2'=[ 1.6 -1.6]