200個のボール変動シミュレーションをJuliaで書く

2020/09/21に公開

中川毅(著) 人類と気候の10万年史 過去に何が起きたのか、これから何が起こるのか (ブルーバックス) という本を連休中に楽しく読んだので,作中に出てくるシミュレーションをやってみようと思います.

設定

  • n 個のボール (本ではn=200)
  • パラメータ a, \epsilon (作中では明示されていない)
  • 時刻tのときのボールの色は時刻t+1で次のように変化する
x _ {i,t+1} = \epsilon f(x _ {i, t}) + (1-\epsilon) f^\mathrm{ave.} (x _ t)
f(x) = 1 - ax^2
f^\mathrm{ave.}(x_t) = \frac{1}{n} \sum_{j=0}^n f(x_{j, t})

Juliaで実装する

まずは計算の部分です.

using Statistics

# 更新部分
f(x; a=1) = 1 .- a * x .^ 2
update(x; a=1, e=0.5) = (1 - e) .* f(x, a=a) .+ (1 - e) * mean(f(x, a=a))

次に描画する部分です.本の通り色の平均値をプロットすることにします

# 描画部分
max_iter = 1000
colors = rand(Float32, n);
results = zeros(max_iter + 1);
results[1] = mean(colors)
for i in 1:max_iter
    colors = update(colors, a=a, e=e)
    results[i + 1] = mean(colors)
end
plot(1:max_iter+1, results, marker=:circle, markersize=2, color=:blue, size=(800, 400))

適当に n=200, a=0.1, \epsilon=0.1 の結果を見てみます.

パラメータを探す

本によると

  • 安定した状態と乱雑な状態がくり返す
  • 2つの相が切り替わるタイミングには法則性が見られない

といった特徴的な系列になるはずですが,うまく再現できていません.

Discussion