2020/03/21

ロジスティック写像の書き方

ロジスティック写像とは


 ロジスティック写像(ロジスティックしゃぞう、英語: Logistic map)とは、1次元の離散力学系の一種。ロジスティック方程式の離散化からも得られるため離散型ロジスティック方程式とも呼ばれる。変数を \(x\) としたとき、次の1変数2次差分方程式(漸化式)で示される。

\[ \displaystyle x_{n+1} = ax_n(1-x_n) \tag{1} \]

 ロジスティック写像は、パラメータ \(a\) にどのような値を与えるかによって、 \(n\) を増やすに連れた \(x_n\) の値の変化(振る舞いや軌道と呼ぶ)が、一定値への収束、複数の値を繰り返し取り続ける周期的な振動、カオスと呼ばれる非周期的な極めて複雑な振る舞い、へと変化する。

出典: フリー百科事典『ウィキペディア(Wikipedia)


書き方


 R言語での書き方は以下のとおり。

List 1. logistic-map.R
# logistic-map

# Xn+a = a * Xn * (1-Xn)
# a  : パラメータ値
# n  : 繰り返し数
# m  : 返り値の数(m<n)
# x0 : 初期値
logistic.map <- function(a=2.4, n=600, m=200, x0=0.1) {
  xn    = numeric(n)
  xn[1] = x0
  for (i in 1:(n-1)) {
    xn[i+1] = a * xn[i] * (1 - xn[i])
  }
  return(list(x=rep(a, m), y=xn[(n-m+1):n]))
}

# 分岐図
png("logistic-map.png", width=800, height=600)
plot(0, 0, xlim=c(2.4, 4), ylim=c(0,1), asp=1, xlab="a", ylab="Xn")
for (a in seq(2.4, 4, by=0.0001)) {
  points(logistic.map(a), pch=1, cex=0.1, col=rgb(1, 0, 0, alpha=0.01))
}
dev.off()

# パラメータaを0.02から4まで変化させた時の時系列アニメーション
count=400
a = seq(0.02, 4, length=count)
n = 1:count
for (i in n) {
    file.name = sprintf("logistic-map_%03d.tif", i)
    title = sprintf("a = %04.2f", a[i])
    tiff(file.name, width=1920, height=1080)
    par(ps=20)
    l = logistic.map(a[i], 300, 300)
    x = 1:length(l$x)
    y = l$y
    plot(x, y, type="l", col=2, ylim=c(0, 1), xlab="n", ylab="X(n)")
    legend("bottomright", legend=title, lty=1, col=2)
    dev.off()
}
List 2. 実行コマンド
$ Rscript --vanilla logistic-map.R
$ ffmpeg -framerate 30 -i logistic-map_%03d.tif -vcodec libx264 -pix_fmt yuv420p -r 30 -crf 18 anime.mp4

実行結果


Fig 1. 分岐図(logistic-map.png)

Fig 2. パラメータ \(a\) を0.02から4まで変化させた時の時系列アニメーション(anime.mp4) 【備考】

2020/03/22 List.1, 2の一部を変更(理由:Youtubeアップ用にFig.2をHD仕様に変更したため)

0 件のコメント:

コメントを投稿

【備忘録】時系列データの編集方法(R言語, tidyverse)

TimeSeries.knit 1 サンプルデータ作成 2 日付単位に集計する 2.1 月毎集計 2.2 四半期毎集計 ...