エノン写像の作図(非線形時系列解析の基礎理論 1章)
タイトルの通り「非線形時系列解析の基礎理論(amazonのページ / 東京大学出版会のページ)」という本をパラパラと読んでいます。1章で非線形時系列解析の歴史と発展が語られているのですが、エノン写像と呼ばれるものの図と例が出てきます。
書籍に出てくる図のグラフを再現するプログラムをJuliaで書いて遊びたい、というのがこの記事の内容です。notebookはこちらにあります。
系列を計算する
上のWikipediaのページでは力学系の例として2式で書かれています。
書籍では簡単に1行で書かれています。
これをこのまま計算する関数を用意すれば良いです。もう少し真面目に書けばよかったかもしれません。雑に配列に格納しました。
function make_series(x1, x2; a=1.4, b=0.3, T=100)
X = [x1, x2]
for t in 1:T
xt = 1 - a * X[end] ^ 2 + b * X[end-1]
push!(X, xt)
end
X
end
Plots.jl を使って図を描くとこのようになります。
seq1 = make_series(0.1, 0.1; T=98);
f = plot(legend=:outertopright, size=(1000, 300), ylims=(-1.5, 1.5))
plot!(f, seq1, lw=1, color=:black, label="x1=0.1, x2=0.1, a=1.4, b=0.3")
系列の初期値依存性を見る
make_series
にいろんな初期値や係数を与えると、初期値にどのように依存するかを確認できます。
作図したものがこちらです。途中から違いが出てきますね。
系列のリターンプロットを見る
横軸に
seq1 = make_series(0.1, 0.1; T=2000);
seq11 = make_series(0.1, 0.1; T=2000, b=0.0);
lims = (-1.5, 1.5)
f1 = scatter(seq1[3:end-1], seq1[4:end], size=(400, 400), ms=2, color=:black, xlims=lims, ylims=lims, label="seq1")
f2 = scatter(seq11[3:end-1], seq11[4:end], size=(400, 400), ms=2, color=:black, xlims=lims, ylims=lims, label="seq11")
plot!(f1, f2, size=(800, 400))
図が描けました。
分岐図を描く
変化させるパラメータを横軸に、過渡状態を取り除いた後に取る
f = plot(size=(500, 500), ylim=(-1.5, 1.5))
# b=0.3で固定し、aの探索は0.0から1.5まで0.01刻みとする
T = 500
L = 100
for a in range(0.0, 1.5; step=0.001)
seq_a = make_series(0.1, 0.1; a=a, b=0.3, T=T-2)
# 長さTの系列から、末尾のLぐらいで取りうる値を取得する
plot_y = collect(Set(seq_a[end-L:end]))
plot_x = [a for _ in 1:length(plot_y)]
scatter!(f, plot_x, plot_y, ms=1, color=:black, label=nothing)
end
f
そこそこの図が出来ました(ちょっと微妙なところもある)。
まとめ
作図してみると、いろいろ学びがありますね。また続きを読みたいと思います。
Discussion