ぱらぱらめくる『キーポイント 行列と変換群』

  • この本はよい!
  • 行列・代数・複素数四元数などについて大まかにわかった上で、それらの相互関係をギュッとまとめるのによいです

キーポイント行列と変換群 (理工系数学のキーポイント (8))

キーポイント行列と変換群 (理工系数学のキーポイント (8))

  • 目次
    • ベクトルを回転してみよう
    • 行列は回転を引き起こす
    • 役に立つ行列の基本操作
    • ベクトル空間と変換群
    • 行列の指数関数
    • 行列の指数関数の微分行列式
    • 3次元の回転
    • ユニタリ行列と3次元の回転
    • ベクトル、テンソル、そしてスピノール
    • 最後にリー代数の話
  • Rでなぞる
  • ベクトルを回転してみよう、行列は回転を引き起こす

## 実二次元ベクトルを扱う

### 基本演算
ベクトルは値の組。
ベクトルの和、ベクトルの定数倍。

x <- c(1,2)
y <- c(3,4)
x+y
a <- 3
a *x

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

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

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

my.norm <- function(x){
  sqrt(my.ip.v(x,x))
}
my.norm(x)

### 回転

回転行列を作る。

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)
my.ip.v(x.rot,y.rot)

### 外積

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

det(cbind(x,y))

lこれも回転で不変。

det(cbind(x.rot,y.rot))

## 回転行列

### 回転行列の性質
回転行列のdetermintは1。
回転行列の転置は逆行列

thetas <- runif(3)
rots <- list()
for(i in 1:length(thetas)){
  rots[[i]] <- my.2d.rot(thetas[i])
}
lapply(rots,det)
ts <- lapply(rots,t)
for(i in 1:length(thetas)){
  print(rots[[i]] %*% ts[[i]])
}

### 回転行列の積は回転行列〜回転群〜

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

結合則

(rots[[1]] %*% rots[[2]]) %*% rots[[3]]
rots[[1]] %*% (rots[[2]]) %*% rots[[3]]

単位元

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

逆元は、逆行列

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

## 2次元ベクトルと複素数

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

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

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

x + y
zx + zy
x * y[1]
zx * Re(zy)

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

zx. <- Conj(zx)

ベクトルの内積

my.complex.ip <- function(zx,zy){
  1/2*(zx * Conj(zy) + Conj(zx) * zy)
}
my.complex.ip(zx,zy)
my.ip.v(x,y)

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

回転行列は

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)
}

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

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

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

matrix(c(1,0,0,1),2,2)
matrix(c(0,-1,1,0),2,2)

### 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次元空間の単位球面に一般化していきましょう、というのが、この文書の狙い。