[matplotlib 3D] 8.ローレンツアトラクタ

matplotlib 3D
スポンサーリンク

ローレンツアトラクタ

コード

でできる図。

解説

ローレンツ方程式は、カオス的挙動を示す非線型方程式であり、3つの定数(s, r, b)が所定の値のときのローレンツ・アトラクタとなる。[1]

def lorenz(x, y, z, s=10, r=28, b=2.667):
    x_dot = s*(y - x)
    y_dot = r*x - y - x*z
    z_dot = x*y - b*z
    return x_dot, y_dot, z_dot

ローレンツアトラクタの関数で、あるx, y, zのときのx_dot, y_dot, z_dotを返してくれる。

xs = np.empty((num_steps + 1,))

np.emptyは値が初期化されていない配列を生成する。num_stepsが10000なので(10001,)の配列を生成する。np.emptyは実行速度が早いことが特徴。

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

各配列の0番目(1番最初)をそれぞれ設定する。

for i in range(num_steps):
    x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
    xs[i + 1] = xs[i] + (x_dot * dt)
    ys[i + 1] = ys[i] + (y_dot * dt)
    zs[i + 1] = zs[i] + (z_dot * dt)

まず、i=0のときだけで考えると、初期値(xs[0],ys[0], zs[0])のときのxdotをlorenz関数で求める。次のxs[1]の値は、xs[0]+求めたx_dot×dt(=0.01)とした値となる。この繰り返しをnum_stepsの数(10000回)だけ繰り返して、10000個のxs, ys, zsを求める。

ax.plot(xs, ys, zs, lw=0.5)

lwは線の太さの設定。

線の太さを変化させた場合

lw = 0.25
lw = 1

参考

  1. ローレンツ方程式 – Wikipedia

コメント