目次
◦ベクトルを回転してみよう
◦行列は回転を引き起こす
◦役に立つ行列の基本操作
◦ベクトル空間と変換群
◦行列の指数関数
◦行列の指数関数の微分と行列式
◦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つの要素を複素数の実部と虚部とみることにする。
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次元の回転を2x2行列で表せば、determinantが1である直交行列であった。それをSO(2) : determinantが1であるという特殊性(special)を持つ直交(Orthogonal)な次元2の群、と言う。
他方、複素数を用いると、\(e^{i\theta}\)と表せて、これを複素数を要素とする1x1ユニタリ行列とみることで、この群をU(1)と書く。ちなみに、ユニタリ行列とは『共役転置行列と逆行列が等しい行列』のこと。
言い換えると、2次元平面にある単位円に、2x2実行列と、1x1複素行列との二つの見方がある、ということ。
これを、3次元空間の単位球面に一般化していきましょう、というのが、この文書の狙い。