- この日の続き
- n次元空間にnp個の半径Rsのn'(n'<=n)次元の球が存在している
- 空間のすべての点は、この球の重なりあいが作る球面に向かう
- この球は、回転運動を持ち、その表面と周囲にその回転運動を起こさせる
- したがって、球の表面でも周囲でも、球が定める空間回転運動をしつつ、「複合球面」に向かう
library(rgl)
NormalBase<-function(n){
I<-X<-diag(rep(1,n))
thetas<-runif(n*(n-1)/2)*2*pi
T<-matrix(0,n,n)
T[lower.tri(T)]<-thetas
for(i in 1:(n-1)){
for(j in (i+1):n){
R<-I
R[i,i]<-R[j,j]<-cos(T[j,i])
R[i,j]<-sin(T[j,i])
R[j,i]<--R[i,j]
X<-R%*%X
}
}
X
}
n<-3
np<-4
p<-matrix(rnorm(np*n),np,n)
Niter<-10000
dt<-0.01
dists<-c()
for(i in 1:(np-1)){
for(j in (i+1):np){
dists<-c(dists,sqrt((p[i,]-p[j,])^2))
}
}
Rs<-runif(np,min=0,max=max(dists)/2)
dimRots<-sample(2:n,np,replace=TRUE)
RotsSub<-NULL
RotsSubInv<-NULL
Rots<-NULL
e.outs<-NULL
Rdts<-NULL
for(i in 1:np){
RotsSub[[i]]<-NormalBase(n)
RotsSubInv[[i]]<-solve(RotsSub[[i]])
Rots[[i]]<-diag(rep(1,n))
Rots[[i]][1:dimRots[i],1:dimRots[i]]<-NormalBase(dimRots[i])
e.outs[[i]]<-eigen(Rots[[i]])
Rdts[[i]]<-(e.outs[[i]][[2]])%*%diag((e.outs[[i]][[1]])^dt)%*%solve(e.outs[[i]][[2]])
}
Nrep<-30
xssum<-NULL
col<-c()
xssum<-p
col<-rep(2,np)
k2<-3
fracattraction<-1
for(rep in 1:Nrep){
xs<-matrix(0,Niter,n)
xs[1,]<-rnorm(n)
for(i in 2:Niter){
v<-rep(0,n)
vs<-matrix(0,np,n)
vsRot<-vs
for(j in 1:np){
tmp<-xs[i-1,]-p[j,]
tmp<-RotsSub[[j]]%*%tmp
tmpvs<--tmp
tmpL<-sqrt(sum(tmpvs[1:dimRots[j]]^2))
tmpvs[1:dimRots[j]]<-(tmpL-Rs[j])/tmpL*tmpvs[1:dimRots[j]]
vs[j,]<-RotsSubInv[[j]]%*%tmpvs
vsRot[j,]<-Re((RotsSubInv[[j]])%*%(Rdts[[j]]%*%(tmp)))-(xs[i-1,]-p[j,])
}
tmpl<-sqrt(apply(vs^2,1,sum))
stvs<-sign(tmpl)*vs/tmpl^k2
tmpv<-apply(stvs,2,sum)
tmpv<-tmpv/sqrt(sum(tmpv^2))
v<-fracattraction*tmpv*(cumprod(tmpl)[length(tmpl)])*dt
vsRot<-vsRot/tmpl
tmpvRot<-apply(vsRot,2,sum)
v<-v+tmpvRot
xs[i,]<-xs[i-1,]+v
}
xssum<-rbind(xssum,xs)
col<-c(col,rep(rep,Niter))
}
cex<-rep(0.1,length(col))
cex[1:Nrep]<-3
plot3d(xssum[,1],xssum[,2],xssum[,3],col=col)
filename<-"attractor"
M <- par3d("userMatrix")
play3d( par3dinterp( userMatrix=list(M,
rotate3d(M, pi/2, 1, 0, 0),
rotate3d(M, pi/2, 0, 1, 0) ) ),
duration=4 )