#!/usr/bin/env python
# coding: utf-8
#
# 線形代数(Linear Algebra IV)固有値
#
#
# cc by Shigeto R. Nishitani, 2018-03-18
#
#
# * file: /Users/bob/python/doing_math_with_python/linear_algebra/LA-I.ipynb
# # Table of Contents
#
# # 固有値
#
# ## 固有値・固有ベクトル
#
# $A=[a_ij]$を$n$次正方行列とする.
# $$
# A \boldsymbol{x} = \lambda \boldsymbol{x}, \, \boldsymbol{x}\ne 0
# $$
# をみたす$n$次元列ベクトル$\boldsymbol{x}$が存在するような$\lambda$を$A$の**固有値**, $\boldsymbol{x}$を$\lambda$に対する(関する,属する)**固有ベクトル**という.
#
# * **固有多項式,固有方程式**
# $n$次多項式
# $$
# \phi(t) =\left| A- tE \right|
# =\left|
# \begin{array}{cccc}
# a_{11}-t & a_{12} & \cdots & a_{1n} \\
# a_{21} & a_{22}-t & \cdots & a_{2n} \\
# \vdots & \vdots & \ddots & \vdots \\
# a_{n1} & a_{n2} & \cdots & a_{nn}-t \\
# \end{array}
# \right|
# $$
# を$A$の**固有多項式**,$\phi(t)=0$を**固有方程式**という.
# * **固有値**は固有方程式の根である.
# * 各固有値$\lambda_i$に対する**固有ベクトル**は同次連立一次方程式$(A-\lambda_i E)\boldsymbol{x}=\boldsymbol{0}$の非自明解を求めればよい.
# ## 固有空間
# $V=\{\boldsymbol{x}; A\boldsymbol{x} = \lambda\boldsymbol{x} \}$を固有値$\lambda$に対する**固有空間**という.
#
# * 同次連立一次方程式$(A - \lambda\boldsymbol{x} ) = \boldsymbol{0}\}$の解空間で,$\lambda$に
# 対する固有ベクトル全体に零ベクトル$\boldsymbol{0}$を付け加えて得られるベクトル空間である.
#
# * 幾何的重複度,代数的重複度
#
# # 一般固有空間
# * 標数,ケーリーハミルトンの定理
#
# * 冪0行列の対角化
# * ジョルダンの標準形
# * 指数行列
# # 紙
#
# ![LA-IV](./figs/LinearAlgebra-IV.png)
# # python code
# In[12]:
import numpy as np
from pprint import pprint
import scipy.linalg as linalg
np.set_printoptions(precision=3, suppress=True)
a = np.array([[3,1], [2,2]])
# a = np.array([[2,1], [1,2]])
l,P = np.linalg.eig(a)
pprint(l)
pprint(P)
v0 = P[:,0]
v1 = P[:,1]
pprint(v0)
pprint(v1)
# In[13]:
import matplotlib.pyplot as plt
div = 32
for i in range(0,div):
theta = 2*np.pi/div*i
x = np.sin(theta)
y = np.cos(theta)
# print('%10.5f-%10.5f' % (x,y))
plt.plot(x,y,'o',color='r')
p0 = np.array([x,y])
p1 = np.dot(a,p0)
plt.plot(p1[0],p1[1],'o',color='b')
plt.plot([x, p1[0]], [y,p1[1]], color='k', linestyle='-', linewidth=1)
x_m = 7
y_m = 5
plt.hlines(0, -x_m, x_m, color='k', linestyle='-', linewidth=1)
plt.vlines(0, -y_m, y_m, color='k', linestyle='-', linewidth=1)
t=x_m
plt.plot([-t*v0[0],t*v0[0]], [-t*v0[1],t*v0[1]], color='g', linestyle='-', linewidth=2)
t=y_m
plt.plot([-t*v1[0],t*v1[0]], [-t*v1[1],t*v1[1]], color='g', linestyle='-', linewidth=2)
plt.axes().set_aspect('equal', 'datalim')
plt.show()
# In[ ]: