#!/usr/bin/env python
# coding: utf-8
#
# 線形代数(Linear Algebra IV)写像
#
#
# cc by Shigeto R. Nishitani, 2018-03-19
#
#
# * file: /Users/bob/python/doing_math_with_python/linear_algebra/LA-V_map.ipynb
# # Table of Contents
#
# # 写像
#
# ## 線形写像
# * $n$次元数ベクトル空間$\boldsymbol{R}^n$から$m$次元数ベクトル空間$\boldsymbol{R}^m$への写像$f$が
#
# 1. $\boldsymbol{R}^n$の任意のベクトル$ \boldsymbol{a}, \boldsymbol{b} $に対し,$f( \boldsymbol{a} + \boldsymbol{b} ) = f( \boldsymbol{a} ) + f( \boldsymbol{b} )$
# 1. $\boldsymbol{R}^n$の任意のベクトル$ \boldsymbol{a}$と任意の実数$\lambda$に対し,$f(\lambda \boldsymbol{a} )=\lambda f( \boldsymbol{a} )$
#
# が成り立つとき,$f$を$\boldsymbol{R}^n$から$\boldsymbol{R}^m$への**線形写像**という.
#
# * 零ベクトルは零ベクトルへ写像される($f(\boldsymbol{0})=\boldsymbol{0}$)
# * $f(-\boldsymbol{a})=-\boldsymbol{a}$
# * 零写像や恒等写像も線形写像
#
# * **線形写像の表現行列**
# $\boldsymbol{e}_1, \boldsymbol{e}_2, \ldots, \boldsymbol{e}_n$を$R^n$の標準的な基底とする.
# $$
# f(\boldsymbol{e}_j) = \boldsymbol{a}_j = (\boldsymbol{a}_{1j}, \boldsymbol{a}_{2j},\ldots,\boldsymbol{a}_{mj})\, (j=1,2,\ldots,n)
# $$
# のときこれらを列ベクトルみなして,$m \times n$行列
# $$
# A = [f(\boldsymbol{e}_1)\, f(\boldsymbol{e}_2)\, \cdots\, f(\boldsymbol{e}_n)]=
# [a_1\, a_2\, \cdots \, a_n]=
# \left(
# \begin{array}{cccc}
# a_{11} & a_{12} & \cdots & a_{1n} \\
# a_{21} & a_{22} & \cdots & a_{2n} \\
# \vdots & \vdots & \ddots & \vdots \\
# a_{m1} & a_{m2} & \cdots & a_{mn} \\
# \end{array}
# \right)
# $$
# を$f$の**(標準的な基底に関する)表現行列**という.
#
# * $\boldsymbol{y}=f(\boldsymbol{x})$の時,
# $$
# \left(
# \begin{array}{c}
# y_1 \\
# y_2 \\
# \vdots \\
# y_m
# \end{array}
# \right)
# = A
# \left(
# \begin{array}{c}
# x_1 \\
# x_2 \\
# \vdots \\
# x_n
# \end{array}
# \right)
# $$
#
# * $\boldsymbol{R}^n$から$\boldsymbol{R}^m$への写像
# $$
# (x_1,x_2,\ldots,x_n) \longmapsto (y_1,y_2,\ldots,y_m)
# $$
#
# * $\boldsymbol{x}\in \boldsymbol{R}^n$を列ベクトルとみなせば,
# $$
# f( \boldsymbol{x} ) = A \boldsymbol{x}
# $$
# が成り立つ.
#
# * 線形写像の和・実数倍・合成
# $$
# (f+g)(\boldsymbol{x}) = f(\boldsymbol{x}) + g(\boldsymbol{x}) \\
# (\lambda f) \boldsymbol{x} = \lambda f(\boldsymbol{x}) \\
# (g \circ f)(\boldsymbol{x}) = g(f(\boldsymbol{x}))
# $$
# $g \circ f$を合成写像または積という.
# ## 像と核
# $f$を$\boldsymbol{R}^n$から$\boldsymbol{R}^m$への線形写像とする.
# * **像(Im)**
# ${\rm Im\,}f = \{f( \boldsymbol{x} ); \boldsymbol{x} \in \boldsymbol{R}^n\}$は$\boldsymbol{R}^m$の部分空間でこれを**像(空間)**という.
# $f$の表現行列を$A=[\boldsymbol{a}_1\, \boldsymbol{a}_2\, \cdots\, \boldsymbol{a}_n]$とする時,
# * ${\rm Im\,}f =L\{\boldsymbol{a}_1,\boldsymbol{a}_2,\ldots,\boldsymbol{a}_n\}$($\boldsymbol{a}_1,\boldsymbol{a}_2,\ldots,\boldsymbol{a}_n$で生成される部分空間)
# * ${\rm dim\,}({\rm Im\,}f) = {\rm rank\,} A = {\rm rank\,}[[\boldsymbol{a}_1\,\boldsymbol{a}_2\,\cdots\,\boldsymbol{a}_n]$
# * $\boldsymbol{y}\in {\rm Im}f \iff
# {\rm rank\,}[\boldsymbol{a}_1\,\boldsymbol{a}_2\,\cdots\,\boldsymbol{a}_n]=
# {\rm rank\,}[\boldsymbol{a}_1\,\boldsymbol{a}_2\,\cdots\,\boldsymbol{a}_n \boldsymbol{y}]
# $
#
# * **全射(onto mapping)**
# ${\rm Im\,}f = \boldsymbol{R}^m$が全射であるとは,
# * $すべての\boldsymbol{y}\in \boldsymbol{R}^m \Longrightarrow
# f( \boldsymbol{x} ) = \boldsymbol{y} なる \boldsymbol{x} \in R^n が存在する$
# * $fが全射 \iff {\rm rank\,}A = m$
# * **核(Ker)**
# ${\rm Ker\,}f = \{\boldsymbol{x}\in \boldsymbol{R}^n; f( \boldsymbol{x} )= \boldsymbol{0} \}$は$\boldsymbol{R}^n$の部分空間であってこれを**核(空間)**という.
# * ${\rm Ker\,}f=\{\boldsymbol{x};A \boldsymbol{x} = \boldsymbol{0} \}$:同次連立一次方程式$A \boldsymbol{x} = \boldsymbol{0}$の解空間
# * ${\rm dim\,}({\rm Ker\,} f)=n -{\rm rank\,} A$
# * **単射(one to one mapping)**
# ${\rm Ker\,}f=\{\boldsymbol{0}\}$のとき$f$を**単射**であるという.このとき,
# * $f(\boldsymbol{x}_1)=f(\boldsymbol{x}_2) \Longrightarrow
# \boldsymbol{x}_1 = \boldsymbol{x}_2$
# * $fが単射 \iff {\rm rank\,} A = n$
# * **次元定理**
# $ {\rm dim\,}({\rm Im\,}f)+{\rm dim\,}({\rm Ker\,}f) = n$
# ## 不変部分空間
#
# $f$を$\boldsymbol{R}^n$上の線形変換とする.$\boldsymbol{R}^n$の部分空間$V$が
# $$
# f(V) \subset V
# $$
# をみたすとき,$V$を$f$に関する**不変部分空間**という.
#
# * 例
# * 核${\rm Ker\,}f$: $\boldsymbol{x} \in {\rm Ker\,}f \Rightarrow f(\boldsymbol{x})=\boldsymbol{0} \in {\rm Ker\,} fよってf({\rm Ker\,} f)\subset {\rm Ker\,}f$
# * 像${\rm Im\,}f$: $\boldsymbol{x} \in {\rm Im\,}f \Rightarrow f(\boldsymbol{x}) \in {\rm Im\,} fよってf({\rm Im\,} f)\subset {\rm Im\,}f$
# * 同次連立一次方程式の解空間: $\{\boldsymbol{x}\in \boldsymbol{R}^m; A\boldsymbol{x}=\boldsymbol{0}\}(= {\rm Ker\,} f)$
# * 固有値$\lambda$に対する固有空間: $\{\boldsymbol{x}\in\boldsymbol{R}^n;(A-\lambda E)\boldsymbol{x}=\boldsymbol{0}\}$
# * 固有値$\lambda$に対する一般固有空間($k$は指標): $\{\boldsymbol{x}\in\boldsymbol{R}^n;(A-\lambda E)^k\boldsymbol{x}=\boldsymbol{0}\}$
# # 紙
#
# ![LA-V](./figs/LinearAlgebra-V.png)
# # python code
# In[1]:
import numpy as np
from pprint import pprint
import scipy.linalg as linalg
np.set_printoptions(precision=3, suppress=True)
a = np.array([[2,1], [4,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[5]:
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 = 6
y_m = 6
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[ ]: