固有値と固有ベクトル¶
線形変換を使う定義¶
ベクトル空間から自分自身への線形写像を 線形変換 という。
「線形変換が与えられたとき、あるベクトルがあって、はをの定数倍に写すようにできるだろうか?」が固有値の議論の出発点となる
線形写像は具体的には行列で表すことができるため(線形写像の行列表現)、 は と等しい。
固有空間¶
広義固有空間¶
ある自然数に対して
を満たすをの固有値に対する 広義固有ベクトル (generalized eigenvector) という。
固有値に対する広義固有ベクトル全体にを加えた集合
を に対する 広義固有空間 (generalized eigenspace) という。
固有値の必要十分条件¶
固有方程式¶
は単位行列を用いて
と表すことができる(もちろんも可)。
斉次連立一次方程式の解が非自明な解 を持つことと、行列式となることは同値であるので、固有ベクトルがであるためには
でなければならない。この式を 固有方程式 あるいは 特性方程式 と呼び、固有値は固有方程式の解として求める。
固有値・固有ベクトルの求め方¶
固有値を求める¶
が非自明な解を持つためにはである必要があるため、そのようなを求める(固有方程式を解く)
(もしが対角行列などの行列式を求めやすい形状の行列であった場合、この部分が少し楽になるので活用しよう)
なので、
固有空間・固有ベクトルを求める¶
固有値に対応するベクトルを求める
の場合:
は
であり
となる。
これを解くと
つまり
であるため、未知の数をもちいて
と表すことができる。そのため、例えば は固有値0に属する固有ベクトルのひとつになる。
固有空間は
となる。
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])について、
について、
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.]
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.
の場合、なので
まずの場合
なので
これを解き、0以外の任意の数を使って表すと
となる。
そのため、固有空間は
であり、固有空間のうちの一つの固有ベクトルがとなる。
の場合、
対象行列の固有値は負をとらない
固有値に0がある(正定値じゃない)と、ランクが下がり、逆行列をもたない
固有値を求めやすい行列¶
三角行列や対角行列は求めやすい
固有値の重複度¶
固有方程式の解の重複度を、固有値の 重複度 という。
線形変換と表現行列の固有値は同じものになる。
証明
固有値・固有ベクトルに関する定理¶
固有値・固有ベクトルの存在¶
任意の正方行列について、「固有値・固有ベクトルは存在する」という解説と「固有値・固有ベクトルは存在するとは限らない」という解説がある。どちらが正しいのか・・・。
固有値・固有ベクトルは存在する¶
に関する 次方程式であるので、 代数学の基本定理によって、 複素数の範囲に解が存在することが保証される。
解があっても非自明な解とは限らないのでは
固有値・固有ベクトルは存在するとは限らない¶
固有ベクトルの1次独立性¶
三角化定理¶
線形変換の固有多項式が個の1次式の積に分解される
フロベニウスの定理¶
フロベニウスの定理 (Frobenius theorem)
ケイリー・ハミルトンの定理¶
→ 乗を計算するときに計算量を抑えられる
例えばケイリー・ハミルトンの定理からがわかっている状況でを求めたいとする。
だから、3乗をくくりだせば
となり、行列積の計算としてはだけを計算すれば済む。
固有値は写像の行列表現のとりかた(基底のとりかた)に依らず一定¶
証明
線形変換を行列表示するとき、基底の取り換えは相似の関係になるから、前出の定理よりそれらの行列の固有多項式は一致する。
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]