ケィオスの時系列解析メモランダム

時系列解析,生体情報学,数学・物理などの解説です.

【Rでカオス】ロジスティック写像の分岐図

今年度は研究室のセミナーで,カオスの勉強をしています.今回は,ロジスティック写像の分岐図を描くRスクリプトを載せておきます.まずは,ロジスティック写像について簡単に説明します.

ロジスティック写像 (logistic map)

 ロジスティック写像は,以下の差分方程式で定義されます.

 x_{n+1} = r x_n \left(1 - x_n \right)

ここで,0 < x_n < 1rは制御変数で,0 < r \le 4の範囲で考えることが多いです.R.L. デバネーの「カオス力学系入門」では,r > 4で,不安定なカオス軌道の存在を示したりしますが,通常はr \le 4を考えます.

 ロジスティック写像の振る舞いについては,私が作った以下の動画を参考にしてください.検索すると,もっと詳しい説明を見つけられると思います.
youtu.be

youtu.be

youtu.be

Rで分岐図

以下のRスクリプトを実行すると,ロジスティック写像の分岐図を描くことができます.

###############
# 制御変数の範囲
r.range <- c(2.8, 4)
# 変化させるrの総数
n.r <- 500
###############
r.list <- seq(r.range[1],r.range[2],length=n.r)
###
# xの初期値
x0 <- 0.5
###
plot(c(),c(),xlim=r.range,ylim=c(0,1),xaxs="i",yaxs="i",xlab="r",ylab=expression({x}[n]))
###
# 過渡状態ステップ数
n.trans <- 500
# 周期の確認ステップ数
n.per <- 256
# 非周期の場合の追加ステップ数
n.plt <- 1000
for(r in r.list){
 x.tmp <- x0
 for(i in 1:n.trans){
  x.tmp <- r*x.tmp*(1-x.tmp)
 }
 xn <- c()
 xn[1] <- x.tmp
 for(i in 2:n.per){
  xn[i] <- r*xn[i-1]*(1-xn[i-1])
 }
 xn.u <- unique(xn)
 n.xn <- length(xn.u)
 if(n.xn <= 64){ # 64周期以下であることを判定
  points(rep(r,n.xn),xn.u,"p",pch=16,cex=0.05,col=rgb(0,0.5,1,alpha=1))
 }else{
  for(i in (n.per+1):(n.per+n.plt)){
   xn[i] <- r*xn[i-1]*(1-xn[i-1])
  }
  n.xn <- length(xn)
  points(rep(r,n.xn),xn,"p",pch=16,cex=0.05,col=rgb(0,0.5,1,alpha=0.05))
 }
 # 最後の値を初期値に設定
 x0 <- tail(xn,1)
}

このスクリプトを,少し変えて描いた分岐図の例が以下です.

ロジスティック写像の分岐図

分岐図を描く領域を変えて,分岐図に見られる自己相似性を調べてみてください.