n次元曲線

  • 動標構とフレネ=セレの係数
    • 曲線上の点に定める正規直交座標系で以下の条件を満たす
    • 曲線上の等速運動(単位時間あたりの移動距離が1であるような運動)を考える
      • 動標構の第1方向単位ベクトルe_1は、その点での速度ベクトルとする
      • 動標構は曲線上の位置によって(運動について考えれば、時刻によって、等速運動なので、曲線上の距離(s)によって)異なるから、それを定める方向単位ベクトルも位置によって(時刻によって)異なる
      • sは弧長パラメタのこと
      • 今、動標構の第1から第i単位ベクトルまでが、定まっているときに、第i+1単位ベクトルe_{i+1}を次のように定める
        • 第iベクトルの時間微分\frac{d e_i}{ds}があるときに、\frac{d e_i}{ds}=\sum_{j}^i a_j e_j +k_{i+1} e_{i+1}のように、\frac{d e_i}{ds}のうち、(e_1,...e_i)の線形結合で表される部分とそれ以外に分け、e_{i+1}e_1,...,e_iのすべてと直交するようにとる
    • このようにして第nベクトルまでを決定する
    • このとき、(e_1,...,e_n)が動標構である
    • ここで、動標構単位ベクトルの直交関係から
      • \frac{d e_i}{ds}=- k_{i-1} e_{i-1} +k_{i+1} e_{i+1}と項が2つ(i=2,...,n-1の場合となる。
    • この結果フルネ=セレの行列が対角成分より1行ずつ上下の成分のみを非ゼロとする行列となる
    • また、k_2,k_3,...,k_nが曲率
    • \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次微分を定めるもの
  • 曲線の曲がり具合をn-1段階の階層的パラメタ表示したものである
  • Moving frameは曲線上に乗せた正規直交基底なので、その変化は『回転』でもある
  • その視点で曲線を描く方法を変えてみよう(明日の記事)

曲率・捩率…

じっくり学ぶ曲線と曲面―微分幾何学初歩

じっくり学ぶ曲線と曲面―微分幾何学初歩

  • 2次元曲線は曲率で定義
  • 3次元曲線は曲率と捩率(れいりつ)で定義
  • n次元曲線は、曲がりに関するn-1個の変数(第一が曲率、第二が捩率、第三以降は、一般化されたもの)で定義
  • n次元の曲がりを表わすn-1個の変数はnxn行列を以下のように作り、それはフルネ=セレの一般次元の公式
  • \begin{pmatrix} 0& \chi_1(s) & ... & 0\\ -\chi_1(s)  & 0 & ... & ... \\ ... & ... & ... & ...\\ ... & ... & ... & 0 & \chi_{n-1}(s)\\ ...& ...& -\chi_{n-1}(s)& 0\\ \end{pmatrix}
  • こちら(Wiki)
  • フルネ=セレの行列成分が時間に関して(曲線上の位置に関して)一定であれば、それは、らせんになる
# フルネ=セレ

n<-5

M<-matrix(0,n,n)

c<-runif(n-1)
#c<-rep(1,n-1)
#c<-1^((n-1):1)
#c<-rnorm(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]
}
#M<-M+diag(rep(1,n))
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){ # 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,]<-M%*%xs[1,]
	xs[i,]<-xs[i-1,]+v*dt
	#xs[i,]<-(u%*%s^(i*dt)%*%v)%*%xs[1,]
	#xs[i,]<-(u%*%v^(i*dt)%*%v)%*%xs[1,]
	#dhk<-(u%*%diag(s^(i*dt))%*%v)%*% dhkInit
	dhk<-(M %*% dhk ) *dt + dhk
	# 単位ベクトル補正
	ll<-apply(dhk^2,1,sum)
	dhk<-((dhk)/sqrt(ll))
	v<-dhk[1,]
	#print(sum(v^2))
}

library(rgl)
plot3d(xs[,1],xs[,2],xs[,3],col=rainbow(Niter))

matplot(xs,type="l")