- 前の記事を用いて、離散的取扱いのために「飛び出さ」ないようにしてシミュレーションしてみた
- 飛び出さないよう、高速になると、1ステップの時間を短くしている(スローモーション化)ので、本当は「さーっ」と通り過ぎるだろうあたりで収束してしまっているようなプロットになっているけれども。。。
n<-3
Niter<-1000
dx<-exp(1)/1000
Ys<-matrix(0,Niter,n+1)
loop<-TRUE
while(loop){
Ys[1,]<-c(rnorm(n),0)*0.001
if(sum(Ys[1,1:(n-2)]*Ys[1,2:(n-1)])<0)loop<-FALSE
}
shogen<-sign(Ys[1,])
TmpFx<-function(ys,Equal=FALSE,a=0.1){
tmp<-0
ret<-0
for(i in 1:(length(ys)-1)){
tmp<-tmp+ys[i]*ys[i+1]
}
ret<--tmp/ys[length(ys)]
if(!Equal){
ret<-ret+sign(ys[length(ys)])*a
}
ret
}
Ys[1,n+1]<-TmpFx(Ys[1,1:n])
alpha<-0.01
for(i in 2:Niter){
V<-Ys[i-1,2:(n+1)]
P<-Ys[i-1,1:n]
R<-XYRotation(P,V)
Rinv<-solve(R)
Vnorm<-sqrt(sum(V^2))
Pnorm<-sqrt(sum(P^2))
theta<-atan(Vnorm/Pnorm)
theta<-theta/Vnorm*dx
tmpRot<-diag(n)
tmpRot[1,1]<-cos(theta)
tmpRot[1,2]<--sin(theta)
tmpRot[2,1]<-sin(theta)
tmpRot[2,2]<-cos(theta)
tmpP<-R%*%P
tmpP<-tmpRot%*%tmpP
tmpP<-Rinv%*%tmpP
Ys[i,1:n]<-tmpP
Ys[i,n+1]<-TmpFx(Ys[i,1:n],Equal=TRUE)
tmpshogen<-sign(Ys[i,])
}
plot(as.data.frame(Ys))
library(rgl)
plot3d(Ys[,1:3],col=rainbow(1000),xlim=range(Ys[,1:3]),ylim=range(Ys[,1:3]),zlim=range(Ys[,1:3]))
matplot(Ys[,1:n],type="l")