Briswell Tech Blog

ブリスウェルのテックブログです

バタフライ・エフェクト

どんな小さな出来事でも連鎖反応で未来に大きな影響を及ぼす「バタフライ・エフェクト」。ゲームや映画で良く使われる演出ですね。

今回は、以下のローレンツ方程式により、バタフライ・エフェクトの現象を確かめてみます。

x, y, zの変数とp, r, bの定数の常微分方程式です。定数値は、p=10, r=28, b=8/3 をローレンツさんは用いています。

1. ローレンツ方程式を定義

def lorenz(x, y, z, p=10, r=28, b=8/3):
    dot_x = -p * x + p * y
    dot_y = -x * z + r * x - y
    dot_z = x * y - b * z
    return dot_x, dot_y, dot_z

2. 時間間隔とステップ数を設定

dt = 0.01
num_steps = 15000

3. 空の配列を作成

xs = np.empty(num_steps + 1)
ys = np.empty(num_steps + 1)
zs = np.empty(num_steps + 1)

4. 初期値を設定

初期値①

xs[0], ys[0], zs[0] = (1., 1., 1.)

初期値②(0.001だけ増やす)

xs[0], ys[0], zs[0] = (1., 1., 1.001)

5. 座標生成

for i in range (n_steps):
    dot_x, dot_y, dot_z = lorenz(xs[i], ys[i], zs[i] )
    xs[i + 1] = xs[i] +  (dot_x * dt)
    ys[i + 1] = ys[i] +  (dot_y * dt)
    zs[i + 1] = zs[i] +  (dot_z * dt)

6. 描画

初期値の違いがどのように結果に影響してくるのか。グラフ描画(ローレンツ・アトラクタ)により確認してみます。

初期値①(1.000, 1.000, 1.000)

初期値②(1.000, 1.000, 1.001)

ほんの僅かな初期値の違いにより、周回する軌道が異なってくることが確認できました。まさにカオスです。

予測には精度の高い初期値(観測値)が大事なのですね。