- 2次元曲線は曲率で定義
- 3次元曲線は曲率と捩率(れいりつ)で定義
- n次元曲線は、曲がりに関するn-1個の変数(第一が曲率、第二が捩率、第三以降は、一般化されたもの)で定義
- n次元の曲がりを表わすn-1個の変数はnxn行列を以下のように作り、それはフルネ=セレの一般次元の公式
- こちら(Wiki)
- フルネ=セレの行列成分が時間に関して(曲線上の位置に関して)一定であれば、それは、らせんになる
n<-5
M<-matrix(0,n,n)
c<-runif(n-1)
c<-1.1^((n-1):1)
for(i in 1:length(c)){
M[i,i+1]<-c[i]
M[i+1,i]<--c[i]
}
Niter<-10000
dt<-0.001
xs<-matrix(0,Niter,n)
xs[1,]<-runif(n)*10
e.out<-eigen(M)
u<-e.out[[2]]
v<-solve(u)
s<-diag(e.out[[1]])
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
}
dhk<-NormalBase(n)
v<-dhk[1,]
for(i in 2:Niter){
xs[i,]<-xs[i-1,]+v*dt
dhk<-(M %*% dhk ) *dt + 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")