ローレンツアトラクター蝶のような図【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()
少々、アレンジした図がこちらです。
より蝶に見えるかもしれません。
不思議です。