正単体用三角関数(続き)

  • 少し整理して書き直し

  • この関数はどういう関数か、というと
    • 周期的
    • d=2,3,4,...と任意の2以上の自然数の関数の組であって、すべての関数が周期的
    • そのすべての関数の位相のずれは、\frac{2\pi}{d}ずつ
    • この関数の実数成分は1周期をd等分してそこの範囲で大きな値をとり、残りの\frac{d-1}{d}の部分は小さな値を取る
    • この関数の虚数成分は1周期をd等分してそのそれぞれについて同一の振幅で周期的
    • 個々の関数は1周期分を積分すると0(三角関数と同じ)
    • 実数成分のピークが隣り合う関数同士は\frac{2\pi}{d}の位相をずらすと、関数内積が1になる。隣り合う関数同市は\frac{2\pi\times k}{d};k=...,-3,-2,-1,0,2,3,..とずらすと、関数内積は小さく、いずれも同じ値をとる。この性質は、d個の関数をうまい順番に並べると、位相を\frac{2\pi}{d}だけずらして、隣り合う関数の内積をとって和をとると大きな値となり、順番がうまくないと、その和が小さくなる、という性質を持つ
    • したがって、この実数成分の特徴が「順序を考慮した周期性」の評価に有用となる(と予想している)ものである
# シャッフル状態をベクトル指定して対応行列を作成する
make.circular <- function(v){
	ret <- diag(rep(1,length(v)))
	ret[v,]
}
# 指定頂点数dで指定位相の「正単体用三角関数値」のセットを返す
simplex.trigonometric.2 <- function(d,t=seq(from=0,to=1,length=1000)){
# 一巡を表す行列M
	M <- make.circular(c(2:d,1))
# それを固有値分解
	eigen.out <- eigen(M)
# 固有値分解の回転行列とその逆行列
	V <- eigen.out[[2]]
	U <- solve(V)
# 固有値(複素数扱いを明示するのは、実数のときにも複素計算をさせるため)
	lambdas <- as.complex(eigen.out[[1]])
# L回/L周して完全に一めぐりなので、それを明示的に変数Lで表す
	L <- d
# 引数tはt=1なら一めぐりになるように与えるルールにする
	t <- t*L
# 与えるtの値によらず、基準座標は使う
	ori.X <- c(1,rep(0,d-1))
# tの数だけ返り値がd個。それを行列に格納
	X <- matrix(0,length(t),d)
	for(i in 1:length(t)){
		tmp <- V %*% diag(lambdas^t[i]) %*% U
		X[i,] <- tmp %*% ori.X
	}
# d個の正規直交基底ベクトルの重心を原点に取り直す
# それは頂点数d個の正単体の重心を原点に取ること
	Y <- t(t(X)-rep(1/d,d))
# 基準座標ori.Xに対してこの行列による座標変換をt=0で実施した座標を出しておく
	tmp <- V %*% diag(lambdas^0) %*% U %*% ori.X
# その座標を原点を中心とした正単体の座標に置き換え
	tmp.2 <- tmp-rep(1/d,d)
# この座標は実数成分を標準化するために、(1,0,0,...,0)を動かさない点の中心からの距離を使うので求めるが
# 同様に虚数成分を標準化するために、(1,0,0,...,0)を半めぐりだけ動かした点(虚数成分だけになる)の中心からの距離を求める
	tmp.im <- V %*% diag(lambdas^((2*d-1)/2)) %*% U %*% ori.X
# dが奇数のときは虚数成分が常に0、dが偶数のときは虚数成分が周期変化する(三角関数変化する)ので、その場合分け
	if(d%%2==0){
		Z <- Re(Y)/tmp.2[1] + 1i*Im(Y)/Im(tmp.im[1])
	}else{
		Z <- Re(Y)/tmp.2[1] + 1i*Im(Y)
	}
# 実数成分・虚数成分が(-1,1)間で変動するように標準化したY.stと標準化しないYを返す
	return(list(Y=Y,Y.st=Z))
}
d <- 4
Y <- simplex.trigonometric.2(d)
par(mfcol=c(1,2))
matplot(cbind(Re(Y$Y),Im(Y$Y)),type="l",col=rep(1:d,2),lty=rep(1:2,each=d))
matplot(cbind(Re(Y$Y.st),Im(Y$Y.st)),type="l",col=rep(1:d,2),lty=rep(1:2,each=d))
par(mfcol=c(1,1))
apply(Y$Y[-1,],2,sum)