- 多次元視覚のことをやっている(こちら)
- そうすると、視覚で取った情報から各点の微分に関する情報を取り出して、それによって対象を理解しようか、という話になる
- じゃあ、ということで多様体上の微分のことが気になるのだが、そこには「球は球でも微分の状態が違うことがある」という話題がある
- エキゾチックな球面という話である(こちら)
- 多次元球面ならどんなものでもエキゾチックな球面があるかというとそうでもないらしい
- 歴史的に最初に登場した7次元球面の話でこれをなぞってみることにする(7次元のエキゾチック球面)
- 5次元空間の球面;と4次元空間の球面;とを考える
- という直積空間は、,上の点のペアのすべてを網羅する空間。自由度4+3=7
- ここではとなっている
- さて。
- をという赤道でその上半分と下半分に分けることにする
- この切り口はなる球面である。上で述べたと区別するべくと書くことにする
- この切り口に対応する直積空間があるから、の赤道で切り離すというときには直積空間全体を2分割している
- 切り離したら、つなぎたい(貼りあわせなおしたい)
- 貼りなおすときには上半分と下半分とが「きれいに1対1対応」するようにすることを考える
- 切り口のすべての点の対応関係を4元数を使ってうまいことやろう、という話
- という8つの数(であるので除いてある)を4つと4つ(に分けて、それをというような四元数に対応付けよう。としよう
- のノルムは1
- 今、四元数の性質から、q(x),q(y)のハミルトニアン積もやはり四元数でそのノルムが1だから
- 上半分のと下半分の(ただしはハミルトニアン積(の4成分の係数が作る長さ4のベクトルとする)が1対1対応付けできる
- (その貼りあわせも素直な対応関係だから微分可能で、そうすると、微分の仕方の違う球面ができる、という話)
- Rでやってみよう。Rには四元数・八元数をハンドリングするonionパッケージがある(ハミルトニアン積の関数がどれだか分らなかったのであまりメリットを得ていないのだが…)
- 適当に回転させてその軌道が貼り合わせによって変わることをみる
install.packages("onion")
library(onion)
Small.Rotation <- function(d,n.iter=100,r=0.01){
R <- diag(rep(1,d))
for(i in 1:n.iter){
s <- sample(1:d,2)
t <- rnorm(1) * r
tmp.R <- diag(rep(1,d))
tmp.R[s[1],s[1]] <- tmp.R[s[2],s[2]] <- cos(t)
tmp.R[s[1],s[2]] <- -sin(t)
tmp.R[s[2],s[1]] <- sin(t)
R <- tmp.R %*% R
}
R
}
Hamiloton.prod.quat <- function(u,v){
x <- Re(u)*Re(v)-i(u)*i(v) -j(u)*j(v)-k(u)*k(v)
y <- Re(u)*i(v)+i(u)*Re(v)+j(u)*k(v)-k(u)*j(v)
z <- Re(u)*j(v)-i(u)*k(v)+j(u)*Re(v)+k(u)*i(v)
w <- Re(u)*k(v)+i(u)*j(v)-j(u)*i(v)+k(u)*Re(v)
quaternion(Re=x,i=y,j=z,k=w)
}
d5 <- 5
d4 <- 4
d5 <- 5
d4 <- 4
n.pt <- 1000
X5 <- matrix(0,n.pt,d5)
X4 <- matrix(0,n.pt,d4)
X5[1] <- X4[1] <- 1
X5.ori <- X5
X4.ori <- X4
hariawase <- rep(0,n.pt)
R5 <- Small.Rotation(d5)
R4 <- Small.Rotation(d4)
for(i in 2:n.pt){
tmp5 <- R5 %*% X5[i-1,]
tmp4 <- R4 %*% X4[i-1,]
if(tmp5[5] * X5[i-1,5] < 0){
hariawase[i] <- 1
tmp.u <- tmp5
tmp.u <- tmp.u/sqrt(sum(tmp5[1:4]^2))
u <- quaternion(Re=tmp.u[1],i=tmp.u[2],j=tmp.u[3],k=tmp.u[4])
v <- quaternion(Re=tmp4[1],i=tmp4[2],j=tmp4[3],k=tmp4[4])
uv <- Hamiloton.prod.quat(u,v)
X5[i,] <- tmp5
X4[i,] <- c(Re(uv),i(uv),j(uv),k(uv))
}else{
X5[i,] <- tmp5
X4[i,] <- tmp4
}
X5.ori[i,] <- R5 %*% X5.ori[i-1,]
X4.ori[i,] <- R4 %*% X4.ori[i-1,]
}
plot(as.data.frame(cbind(X5,X4)),cex=0.01)
plot(as.data.frame(cbind(X5.ori,X4.ori)),cex=0.01)
matplot(cbind(X5,X4),type="l")
matplot(cbind(X5.ori,X4.ori),type="l")
plot(X5[,1],X5.ori[,1])
plot(X4[,1],X4.ori[,1])