周期データの多次元角座標パラメタ処理

  • k次元
  • 固有値の数がk個
    • すべての固有値はノルムが1の複素数だから、k個の角パラメタe.value.\theta_i;i=1,2,...,kを用いて
    • \cos(e.value.\theta_i)+i\times \sin(e.value.\theta_i)と表せる
  • ノルムが1の複素数k次元ベクトルがk個
    • ノルムが1の第j番目の複素数k次元ベクトルは、\sum_{i=1}^k a_{j,i}^2を満足する実変数a_{j,i}と、k個の角変数を用いて\sum_{i=1}^k (Norm(a_{j,i}\times ( \cos(e.vector.\theta_{j,i}) + \sin(e.vector.\theta_{j,i}))))^2 =1
    • 上の記事のように、A_j=(a_{j,i})k-1個の角変数を用いて表せば
      • a_{j,i} = \sin(e.vector.\psi_{j,i-1})\times \prod_{t=i}^{k-1} \cos(e.vector.\psi_{j,t}),ただし\sin(e.vector.\psi_{j,0})=1と表せて
    • 結局e.value.\theta_i;i=1,2,...,ke.vector.\theta_{j,i};i=1,2,...,ke.value.\psi_{j,i};i=1,2,...,(k-1)の、k+k^2+k(k-1)=k^2自由度の変数表示となることがわかる
    • これは、任意のkxk複素数行列が固有値分解できて(対応が1対1対応である)ことと対応する…?…要確認→対応しない。kxkの複素行列の変数の数はkxkx2だから。
  • 上の記事と同様に、しかし、パラメタの扱いを本記事の方式で行っても、もちろん、周期的な動きをもたらす行列が作れる
e.val.theta<-runif(k)*2*pi
e.vec.theta<-matrix(runif(k^2)*2*pi,k,k)
e.vec.psi<-matrix(runif(k*(k-1))*2*pi,k,k-1)

e.vector.norm<-matrix(runif(k*(k-1))*2*pi,k,k-1)

v<-runif(k)
sphereCoords<-function(v){
	C<-cos(v)
	S<-sin(v)
	ret<-c(1,S)

	for(i in 1:length(v)){
		for(j in i:length(v)){
			ret[i]<-ret[i]*C[j]
		}
	}
	return(ret)
}

ret<-sphereCoords(v)

sum(ret^2)


TransitionMat<-function(e.val.theta,e.vec.theta,e.vec.psi){
	k<-length(e.val.theta)
	S<-diag(complex(real=cos(e.val.theta),imaginary=sin(e.val.theta)))
	V<-matrix(0,k,k)
	Co<-cos(e.vec.theta)
	Si<-sin(e.vec.theta)
	Comp<-matrix(complex(real=Co,imaginary=Si),k,k)
	for(i in 1:k){
		A<-sphereCoords(e.vec.psi[i,])
		V[i,]<-A*Comp[i,]
	}
	return(V%*%S%*%solve(V))
}

m<-TransitionMat(e.val.theta,e.vec.theta,e.vec.psi)
# 時間を経過させる
Niter<-100
dseries<-matrix(0,Niter,k)
dseries[1,]<-d.Complex
for(i in 2:Niter){
	dseries[i,]<-m%*%dseries[i-1,]
}
# 一部の状態量の時系列変化をプロットする
tobedrawn<-3
matplot(Re(dseries[,1:tobedrawn]),type="l")