進行方向が巡回するとき

  • フルネ=セレの行列は、曲線の曲がり具合をパラメタ表示したもの
  • \begin{pmatrix} 0& \chi_1(s) & ... & 0\\ -\chi_1(s)  & 0 & ... & ... \\ ... & ... & ... & ...\\ ... & ... & ... & 0 & \chi_{n-1}(s)\\ ...& ...& -\chi_{n-1}(s)& 0\\ \end{pmatrix}
  • Moving frameの弧長パラメタに関する1次微分
  • 曲線の曲がり具合が曲線に沿って「一定」であるとき、なにかしらの行列を使って
  • \mathbf{E(s)}=M^s \mathbf{E(s)}と表すことができる。
  • ただしMは回転を表す行列である
  • 昨日の記事では、「フルネ=セレ」のMoving frameの増分行列を使って曲線を描いたが、今日は、Moving frameを回転させる行列を使って描こう
  • ここでmoving frameの第一ベクトルはその点での点の速度ベクトルであることを使って描く
  • そうすると、フルネ=セレで描いたときに「らせん」だったものが、トーラスに(も)なる(4次元以上での軌跡を3次元に投影した時に、ということのようだが)
# A rotation matrix determines moving frame

n<-4

# 回転行列を作る
NormalBase<-function(n){ # 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
}

Rot<-NormalBase(n)

#Rot<-matrix(c(0,1,0,0,-1,0,0,0,0,0,0,-1,0,0,1,0),n,n,byrow=TRUE)

E.out<-eigen(Rot)

V<-E.out[[2]]
V2<-solve(V)
S<-diag(E.out[[1]])

Niter<-10000
xs<-matrix(0,Niter,n)
xs[1,]<-runif(n)

dt<-0.005

T<-runif(Niter-1)
T<-sort(T)

dhk<-NormalBase(n)
v<-dhk[1,]
for(i in 2:Niter){
	#xs[i,]<-xs[i-1,]+v*dt*T[i-1]
	xs[i,]<-xs[i-1,]+v*dt
	
	dhk<-(V%*%S^(dt)%*%V2) %*% dhk
	# 単位ベクトル補正
	#ll<-apply(dhk^2,1,sum)
	#dhk<-((dhk)/sqrt(ll))
	v<-dhk[1,]
}
library(rgl)
plot3d(xs[,1],xs[,2],xs[,3],col=rainbow(Niter))

matplot(xs,type="l")
  • この場合のmoving frame回転行列は以下であった
Rot
             [,1]        [,2]        [,3]        [,4]
[1,]  0.003640657  0.02308859  0.05751062 -0.99807124
[2,]  0.542523942 -0.63809206 -0.54456963 -0.04416122
[3,] -0.062159929  0.61777600 -0.78327751 -0.03106943
[4,]  0.837729468  0.45897523  0.29430051  0.03063146