- 変数がNx個
- ある基本単位があって、それがいくつか集まって、変数X_iの1個ができるとする。そのユニット数をns
- X_iが反応するときには、ある数単位psで反応する。1個でもよいし複数でもよい。この数は、反応の速さを決めるときに[X_i]^数、とべき乗で効いてくるものとする
- すべてのX_iはX_{i-1}と反応して増え、X_{i+1}と反応して減るものとする
- 増える反応、減る反応では、「基本単位」が変わらないものとする(和保存の法則)
- は一定
- そのうえで、反応は次の速度で進むものとする
- 和保存の法則からが成り立つ。これからが成り立つ
- 今、この反応系に自明な固定点以外の固定点があるとすれば
- これを満足するのは、が奇数なら
- 偶数なら、かつ
- このとき次の量が保存される
- ただし、
- 特に、のとき
- が保存される
- さらにのときとなってが、つまりが保存される(積の保存)
Nx<-4
ns<-sample(1:3,Nx,replace=TRUE)
ps<-sample(1:5,Nx,replace=TRUE)
as<-runif(Nx)
bs<-as
if(Nx%%2==1){
for(i in 1:Nx){
pre<-i-1
if(pre==0)pre<-Nx
bs[i]<-ns[pre]/ns[i] * as[pre]
}
}else{
for(i in 2:Nx){
pre<-i-1
if(pre==0)pre<-Nx
bs[i]<-ns[pre]/ns[i] * as[pre]
}
acumprod<-bcumprod<-1
for(i in 1:((Nx/2)-1)){
acumprod<-acumprod*as[i*2]
bcumprod<-bcumprod*bs[i*2]
}
as[Nx]<-bcumprod*bs[Nx]/acumprod
bs[1]<-ns[Nx]/ns[1]*as[Nx]
}
cumprod(as)[Nx]/cumprod(bs)[Nx]
cumprod(as[which((1:Nx)%%2==0)])/cumprod(bs[which((1:Nx)%%2==0)])
cumprod(as[which((1:Nx)%%2==1)])/cumprod(bs[which((1:Nx)%%2==1)])
ys<-rep(runif(1)*1,Nx)
if(Nx%%2==1){
inds<-c(1,2,3)
while(inds[3]!=1){
ys[inds[3]]<-bs[inds[2]]/as[inds[2]]*ys[inds[1]]
inds<-inds+2
inds[which(inds>Nx)]<-inds[which(inds>Nx)]-Nx
}
}else{
inds<-c(1,2,3)
inds2<-c(2,3,4)
while(inds[3]!=1){
ys[inds[3]]<-bs[inds[2]]/as[inds[2]]*ys[inds[1]]
inds<-inds+2
inds[which(inds>Nx)]<-inds[which(inds>Nx)]-Nx
ys[inds2[3]]<-bs[inds2[2]]/as[inds2[2]]*ys[inds2[1]]
inds2<-inds2+2
inds2[which(inds2>Nx)]<-inds2[which(inds2>Nx)]-Nx
}
}
fixxs<-ys^1/ps
cs<-rep(1,Nx)
cs[1]<-runif(1)*10
cs[2]<-runif(1)*10
cs
if(Nx%%2==1){
prei<-1
i<-3
while(i!=1){
cs[i]<-as[prei]/bs[i]*cs[prei]
prei<-i
i<-i+2
if(i>Nx)i<-i-Nx
if(prei>Nx)prei<-prei-Nx
}
}else{
prei<-1
prei2<-2
i<-3
i2<-4
while(i!=1){
cs[i]<-as[prei]/bs[i]*cs[prei]
cs[i2]<-as[prei2]/bs[i2]*cs[prei2]
prei<-i
i<-i+2
prei2<-i2
i2<-i2+2
if(i>Nx)i<-i-Nx
if(i2>Nx)i2<-i2-Nx
if(prei>Nx)prei<-prei-Nx
if(prei2>Nx)prei2<-prei2-Nx
}
}
cs
Niter<-10000
dt<-1
xs<-matrix(0,Niter,Nx)
xs[1,]<-runif(Nx)
xs[1,]<-fixxs
dev<-rnorm(Nx)/10
dev<-dev-mean(dev)
xs[1,]<-xs[1,]+runif(1)/10
library(MCMCpack)
E1<-E2<-rep(0,Niter)
E1[1]<-sum(ns*xs[1,])
for(i in 1:Nx){
tmp<-0
if(ps[i]!=1){
tmp<-cs[i]/(1-ps[i])*xs[1,i]^(1-ps[i])
}else{
tmp<-cs[i]*log(xs[1,i])
}
E2[1]<-E2[1]+tmp
}
for(i in 2:Niter){
for(j in 1:Nx){
pre<-j-1
post<-j+1
if(pre<1)pre<-Nx
if(post>Nx)post<-1
xs[i,j]<-xs[i-1,j]-(as[j]*xs[i-1,j]^ps[j]*xs[i-1,post]^ps[post]-bs[j]*xs[i-1,j]^ps[j]*xs[i-1,pre]^ps[pre])*dt
}
E1[i]<-sum(ns*xs[i,])
for(j in 1:Nx){
tmp<-0
if(ps[j]!=1){
tmp<-cs[j]/(1-ps[j])*xs[i,j]^(1-ps[j])
}else{
tmp<-cs[j]*log(xs[i,j])
}
E2[i]<-E2[i]+tmp
}
}
plot(as.data.frame(xs))
library(rgl)
plot3d(xs[,1],xs[,2],xs[,3])
matplot(xs,type="l")