元に戻る回転

  • 前項で元に戻る回転を正規直交基底の置換によってつくった
  • 正規直交基底の置換の連続化では回転が部分空間化している
  • したがって、正規直交基底の頂点が張る部分空間の「元に戻る回転」を、正規直交基底の置換による回転行列から作ろう
  • k+1次元で回転を作って、k次元に落とすことになる
  • 基底の頂点が張る部分空間では、直交基底の重心を原点に取り直し
  • その上で、直交基底の頂点に正単体の頂点座標をあてることで、次元を下げよう

# 次元
ks<-5
maxIm<-rep(0,length(ks))
for(ik in 1:length(ks)){
	k<-ks[ik]
# 次元kの単位ベクトル
M<-diag(rep(1,k))
# 置換行列をいくつ作るか
n<-3
# 置換行列のリスト
T<-list()
for(i in 1:n){
	# 全軸がくるりと回るように置換行列を作る
	T[[i]]<-M[sample(1:k),]
	#T[[i]]<-M[c(2:k,1),]
}
# 各置換行列の単位時間当たりの回転程度を自然数で与える
how.many.times<-sample(2:10,n,replace=TRUE)

# 各置換行列の特異値分解の固有値と固有ベクトルを格納
S<-list()
V<-list()
U<-list()
for(i in 1:n){
	tmp<-T[[i]]
	e.out<-eigen(tmp)
	S[[i]]<-e.out$values
	V[[i]]<-e.out$vectors
	U[[i]]<-solve(V[[i]])
}
# すべての周期の公倍数であって、かつ、k!の倍数であるような時刻
# もとに戻るはずの時刻
z<-prod(how.many.times)*factorial(k)

# 連続的時刻と元に戻るはずの時刻のリスト
t<-seq(from=0,to=1000,length=10000)
t<-c(t,z)
# 初期座標
x<-runif(k)*100
Niter<-length(t)
X<-matrix(0,Niter,k)
# 時刻ごとに座標を計算
for(i in 1:length(t)){
	tmpx<-x
	# 置換行列ごとに、指定時刻までの回転をさせ
	# すべての置換行列の処理を重ねる
	for(j in 1:n){
		tmpx<-V[[j]]%*%diag((S[[j]]+complex(0,0))^(t[i]/how.many.times[j]))%*%U[[j]]%*%tmpx
	}
	X[i,]<-tmpx
}
# plotする
matplot(Re(X),type="l")
plot(as.data.frame(X))

library(rgl)
#plot3d(Re(X)[,1:3],type="l")
# もとに戻っていることの確認
X[1,]-X[length(t),]

# 各置換行列が単位行列に戻っていることの確認
for(i in 1:n){
	print(V[[j]]%*%diag((S[[j]]+complex(0,0))^(z/how.many.times[j]))%*%U[[j]])
}
#print(apply(Im(X),2,max))
# 虚部の最大値を軸別出す
# さらにその最大値を取る
maxIm[ik]<-max(apply(Im(X),2,max))
S
T
Xsub<-X-apply(X,1,mean)
matplot(Xsub,type="l")
plot(as.data.frame(Xsub))

}
#plot(ks,maxIm,type="b")
CategoryVector<-function (nc = 3) 
{
    df <- nc - 1
    d <- df + 1
    diagval <- 1:d
    diagval <- sqrt((df + 1)/df) * sqrt((df - diagval + 1)/(df - 
        diagval + 2))
    others <- -diagval/(df - (0:(d - 1)))
    m <- matrix(rep(others, df + 1), nrow = df + 1, byrow = TRUE)
    diag(m) <- diagval
    m[upper.tri(m)] <- 0
    as.matrix(m[, 1:df])
}

CV<-CategoryVector(k)

Xsub2<-Xsub%*%CV
matplot(Re(Xsub2),type="l")
plot(Re(Xsub2))
plot3d(Xsub2[,1:3],type="l")