使用Python制作Lorenz吸引子的轨道生成视频
在前面一篇文章中,使用Pyhon绘制了Lorenz吸引子的简单图像。通过绘制Lorenz方程的三维轨迹,可以直观展示吸引子的混沌结构。这是最经典的成像方法,使用数值积分求解微分方程后,通过三维绘图库(如Matplotlib)生成图像。
这次,我们实现绘制轨道生成的动态视频。
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation# 定义Lorenz方程组
def lorenz_system(state, t, sigma, rho, beta):x, y, z = statedxdt = sigma * (y - x)dydt = x * (rho - z) - ydzdt = x * y - beta * zreturn [dxdt, dydt, dzdt]# 参数设置
sigma, rho, beta = 10, 28, 8/3
t = np.arange(0, 30, 0.02) # 增大时间步长以减少总帧数(原0.01改为0.02)
initial_state = [0.0, 1.0, 0.0]# 求解微分方程
trajectory = odeint(lorenz_system, initial_state, t, args=(sigma, rho, beta))# 动态轨迹生成设置
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
line, = ax.plot([], [], [], lw=0.5, color='blue')# 动态设置坐标轴范围(避免轨迹超出视野)
x_min, x_max = np.min(trajectory[:,0]), np.max(trajectory[:,0])
y_min, y_max = np.min(trajectory[:,1]), np.max(trajectory[:,1])
z_min, z_max = np.min(trajectory[:,2]), np.max(trajectory[:,2])def init():ax.set_xlim(x_min, x_max)ax.set_ylim(y_min, y_max)ax.set_zlim(z_min, z_max)return line,def update(frame):line.set_data(trajectory[:frame,0], trajectory[:frame,1])line.set_3d_properties(trajectory[:frame,2])return line# 调整参数:总帧数=1500(原3000),间隔=20ms,禁用blit(避免3D渲染问题)
ani = FuncAnimation(fig,update,frames=range(0, len(t), 2), # 步长=2,跳过一半帧数init_func=init,blit=False, # 3D绘图建议关闭blitinterval=20
)# 保存视频(需安装FFmpeg)
try:ani.save("lorenz_attractor.mp4", writer="ffmpeg", fps=30)
except Exception as e:print(f"视频保存失败: {e}")# 显示动态窗口
plt.show()