目次

◦ベクトルを回転してみよう

◦行列は回転を引き起こす

◦役に立つ行列の基本操作

◦ベクトル空間と変換群

◦行列の指数関数

◦行列の指数関数の微分と行列式

◦3次元の回転

◦ユニタリ行列と3次元の回転

◦ベクトル、テンソル、そしてスピノール

◦最後にリー代数の話

•Rでなぞる

•ベクトルを回転してみよう、行列は回転を引き起こす

実二次元ベクトルを扱う

基本演算

ベクトルは値の組。

ベクトルの和、ベクトルの定数倍。

x <- c(1,2)
y <- c(3,4)
x+y
## [1] 4 6
a <- 3
a *x
## [1] 3 6

内積

ベクトルに内積を定義する。

要素同士の積の和として定義してもよいし、2つのベクトルを行列とみなして、その片方の転置と積とみなしてもよい。

my.ip.v <- function(x,y){
  #sum(x*y)
  t(x)%*%y
}
my.ip.v(x,y)
##      [,1]
## [1,]   11

ノルムはベクトルとそれ自身の内積の平方根。

my.norm <- function(x){
  sqrt(my.ip.v(x,x))
}
my.norm(x)
##          [,1]
## [1,] 2.236068

回転

回転行列を作る。

my.2d.rot <- function(theta){
  matrix(c(cos(theta),sin(theta),-sin(theta),cos(theta)),2,2)
}
theta <- runif(1)*2*pi
rot <- my.2d.rot(theta)
x.rot <- rot %*% x
y.rot <- rot %*% y

内積は回転で不変

my.ip.v(x,y)
##      [,1]
## [1,]   11
my.ip.v(x.rot,y.rot)
##      [,1]
## [1,]   11

外積

2次元ベクトルの外積はdetereminant

det(cbind(x,y))
## [1] -2

lこれも回転で不変。

det(cbind(x.rot,y.rot))
## [1] -2

回転行列

回転行列の性質

回転行列のdetermintは1。

回転行列の転置は逆行列。

thetas <- runif(3)
rots <- list()
for(i in 1:length(thetas)){
  rots[[i]] <- my.2d.rot(thetas[i])
}
lapply(rots,det)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 1
## 
## [[3]]
## [1] 1
ts <- lapply(rots,t)
for(i in 1:length(thetas)){
  print(rots[[i]] %*% ts[[i]])
}
##              [,1]         [,2]
## [1,] 1.000000e+00 3.957338e-18
## [2,] 3.957338e-18 1.000000e+00
##               [,1]          [,2]
## [1,]  1.000000e+00 -1.290201e-17
## [2,] -1.290201e-17  1.000000e+00
##               [,1]          [,2]
## [1,]  1.000000e+00 -6.667843e-18
## [2,] -6.667843e-18  1.000000e+00

回転行列の積は回転行列~回転群~

群には、結合則、単位元、逆元がある。

結合則。

(rots[[1]] %*% rots[[2]]) %*% rots[[3]]
##           [,1]       [,2]
## [1,] 0.4464702 -0.8947985
## [2,] 0.8947985  0.4464702
rots[[1]] %*% (rots[[2]]) %*% rots[[3]]
##           [,1]       [,2]
## [1,] 0.4464702 -0.8947985
## [2,] 0.8947985  0.4464702

単位元。

rots.e <- diag(rep(1,2))
rots.e %*% rots[[1]]
##           [,1]       [,2]
## [1,] 0.9556730 -0.2944302
## [2,] 0.2944302  0.9556730
rots[[1]] %*% rots.e
##           [,1]       [,2]
## [1,] 0.9556730 -0.2944302
## [2,] 0.2944302  0.9556730

逆元は、逆行列。

lapply(rots,solve)
# または、転置行列
lapply(rots,t)

2次元ベクトルと複素数

実部と虚部

2次元ベクトルの2つの要素を複素数の実部と虚部とみることにする。

zx <- x[1] + 1i * x[2]
zy <- y[1] + 1i * y[2]

和と実定数倍はベクトルの場合と同じ。

x + y
## [1] 4 6
zx + zy
## [1] 4+6i
x * y[1]
## [1] 3 6
zx * Re(zy)
## [1] 3+6i

内積と共役複素数

ベクトルの内積はちょっと違う。

ベクトルの内積を計算するには、共役複素数を持ち出す必要がある。

zx. <- Conj(zx)

ベクトルの内積は

my.complex.ip <- function(zx,zy){
  1/2*(zx * Conj(zy) + Conj(zx) * zy)
}
my.complex.ip(zx,zy)
## [1] 11+0i
my.ip.v(x,y)
##      [,1]
## [1,]   11

回転とは複素数をかけること

回転行列は

thetas <- runif(3)
rots <- list()
for(i in 1:length(thetas)){
  rots[[i]] <- my.2d.rot(thetas[i])
}

これに対応する複素数がある。

rots.z <- list()
for(i in 1:length(thetas)){
  rots.z[[i]] <- exp(1i*thetas[i])
}
for(i in 1:length(thetas)){
  print(rots[[i]] %*% x)
  print(rots.z[[i]] * zx)
}
##           [,1]
## [1,] -0.491009
## [2,]  2.181493
## [1] -0.491009+2.181493i
##            [,1]
## [1,] -0.2301292
## [2,]  2.2241944
## [1] -0.230129+2.224194i
##              [,1]
## [1,] -0.007440075
## [2,]  2.236055600
## [1] -0.00744+2.236056i

ベクトルとしての複素数、行列としての複素数

2次元ベクトルの2要素を複素数の実部と虚部に対応付けるのが、「実2次元ベクトルの複素数化」。

他方、回転行列の作用を、複素数の積に対応付けるときは\(e^{i\theta}\)\(\theta\)回転を表す2x2行列に対応付けるわけなので、\(1+i\times 0\)と、純虚数\(i\)に対応するのは、

matrix(c(1,0,0,1),2,2)
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1
matrix(c(0,-1,1,0),2,2)
##      [,1] [,2]
## [1,]    0    1
## [2,]   -1    0

2次元回転はSO(2)でありU(1)でもある

2次元の回転を2x2行列で表せば、determinantが1である直交行列であった。それをSO(2) : determinantが1であるという特殊性(special)を持つ直交(Orthogonal)な次元2の群、と言う。

他方、複素数を用いると、\(e^{i\theta}\)と表せて、これを複素数を要素とする1x1ユニタリ行列とみることで、この群をU(1)と書く。ちなみに、ユニタリ行列とは『共役転置行列と逆行列が等しい行列』のこと。

言い換えると、2次元平面にある単位円に、2x2実行列と、1x1複素行列との二つの見方がある、ということ。

これを、3次元空間の単位球面に一般化していきましょう、というのが、この文書の狙い。