ローレンツアトラクター蝶のような図【Python×matplotlib×ChatGPT】

こんにちは!

今回は「ローレンツ蝶」とも呼ばれる、ローレンツアトラクターをpythonで描いてみました。

カオス理論については、よくわからないのですが奇妙で複雑な図に興味を持ちました。

言われてみれば確かに、蝶に見えますね。

pythonコードです。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def lorenz_equations(x, y, z, sigma, rho, beta):
    dx_dt = sigma * (y - x)
    dy_dt = x * (rho - z) - y
    dz_dt = x * y - beta * z
    return dx_dt, dy_dt, dz_dt

def simulate_lorenz_system(sigma, rho, beta, x0, y0, z0, num_steps, dt):
    x, y, z = np.zeros(num_steps), np.zeros(num_steps), np.zeros(num_steps)
    x[0], y[0], z[0] = x0, y0, z0

    for i in range(1, num_steps):
        dx, dy, dz = lorenz_equations(x[i-1], y[i-1], z[i-1], sigma, rho, beta)
        x[i] = x[i-1] + dt * dx
        y[i] = y[i-1] + dt * dy
        z[i] = z[i-1] + dt * dz

    return x, y, z

def plot_recursive_lorenz(num_recursive, ax, sigma, rho, beta, x0, y0, z0, num_steps, dt):
    if num_recursive == 0:
        return

    x, y, z = simulate_lorenz_system(sigma, rho, beta, x0, y0, z0, num_steps, dt)
    line_widths = np.random.rand(num_steps) * 2.0 + 0.5

    ax.plot(x, y, z, linewidth=0.5, alpha=0.7)

    new_x0, new_y0, new_z0 = x[-1], y[-1], z[-1]
    plot_recursive_lorenz(num_recursive-1, ax, sigma, rho, beta, new_x0, new_y0, new_z0, num_steps, dt)

# パラメータ設定
sigma = 10.0
rho = 28.0
beta = 8/3
x0, y0, z0 = 0.1, 0.1, 0.1
num_steps = 10000
dt = 0.01
num_recursive = 10

# 3Dプロット
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 再帰的にプロット
plot_recursive_lorenz(num_recursive, ax, sigma, rho, beta, x0, y0, z0, num_steps, dt)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Recursive Lorenz Attractor')

# 軸を消して図だけを表示
ax.set_axis_off()

plt.show()



少々、アレンジした図がこちらです。





より蝶に見えるかもしれません。

不思議です。