どんな小さな出来事でも連鎖反応で未来に大きな影響を及ぼす「バタフライ・エフェクト」。ゲームや映画で良く使われる演出ですね。
今回は、以下のローレンツ方程式により、バタフライ・エフェクトの現象を確かめてみます。
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. 描画
初期値の違いがどのように結果に影響してくるのか。グラフ描画(ローレンツ・アトラクタ)により確認してみます。
ほんの僅かな初期値の違いにより、周回する軌道が異なってくることが確認できました。まさにカオスです。
予測には精度の高い初期値(観測値)が大事なのですね。