- 単位球面上の点から、ランダムに方向を選んで、球面上の位置を変える
- 方向に関して、単位球が存在している空間に関するランダムな方向ベクトルを定め、その方向に指定角だけ移動することにする
- かなり制約がきつい酔歩だけれど、次元が少し上がると、どこにどういう『強い制約』があるのか、パッと見はわからない。このパッと見はわからない(けれど、本当はある)制約をどうしたら見破ることができるか、どこまでは見破ることができるか、その信じるべき根拠とその強さはどう測るか…
angular.move <- function(x,y,theta){
x. <- x/sqrt(sum(x^2))
y. <- y/sqrt(sum(y^2))
ctheta <- (sum(x. * y.))
tmp <- y. - x.*ctheta
tmp <- tmp/sqrt(sum(tmp^2))
Q <- tan(2*theta)
a <- 1/(Q+1)
b <- Q/(Q+1)
z <- a*x. + b*tmp
z <- z/sqrt(sum(z^2))
ret <- x + z
ret/sqrt(sum(ret^2))*sqrt(sum(x^2))
}
sphere.brownian <- function(n.step,p=3,x.init=c(1,rep(0,p-1)),phis=rep(0.01,n.step)){
R.sp <- function(n,p){
m <- matrix(rnorm(n*p),ncol=p)
d <- sqrt(apply(m^2,1,sum))
m/d
}
S <- R.sp(n.step,p)
X <- S
for(i in 2:n.step){
X[i,] <- angular.move(X[i-1,],S[i,],phis[i])
}
X
}
X <- sphere.brownian(n.step=10000,p=3,phis=rep(0.01,10000))
plot3d(X)
R.sp <- function(n,p){
m <- matrix(rnorm(n*p),ncol=p)
d <- sqrt(apply(m^2,1,sum))
m/d
}
p <- 5
n.step <- 10^4
S <- R.sp(n.step,p)
phis <- rep(0.01,n.step)
phis <- abs(rnorm(n.step,0,0.01))
X <- S
for(i in 2:n.step){
ctheta <- (sum(X[i-1,] * S[i,]))
tmp <- S[i,] - X[i-1,]*ctheta
tmp <- tmp/sqrt(sum(tmp^2))
Q <- tan(2*phis[i])
a <- 1/(Q+1)
b <- Q/(Q+1)
z <- a*X[i-1,] + b*tmp
z <- z/sqrt(sum(z^2))
X[i,] <- X[i-1,] + z
X[i,] <- X[i,]/sqrt(sum(X[i,]^2))
}
library(rgl)
if(p>=3){
plot3d(X[,1:3])
}else{
plot(X)
}
plot(as.data.frame(X))
matplot(X,type="l")
angs <- rep(0,n.step-1)
X1 <- X[1:(n.step-1),]
X2 <- X[2:n.step,]
X12 <- X1*X2
angs <- apply(X12,1,sum)
range(acos(angs))