简介
本实验是一个循序渐进的教程,用于使用 mplot3d 在三维空间中绘制爱德华·洛伦兹 1963 年的《确定性非周期流》。我们将使用 Python 和 Matplotlib,它是 Python 编程语言的一个绘图库。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
导入库
我们首先导入必要的库:Matplotlib 和 NumPy。
import matplotlib.pyplot as plt
import numpy as np
定义洛伦兹函数
我们定义洛伦兹函数,它接受三个参数并返回一个包含三个值的数组。我们使用洛伦兹参数的默认值s=10、r=28和b=2.667。
def lorenz(xyz, *, s=10, r=28, b=2.667):
"""
参数
----------
xyz : 类似数组,形状为 (3,)
三维空间中的感兴趣点。
s, r, b : 浮点数
定义洛伦兹吸引子的参数。
返回
-------
xyz_dot : 数组,形状为 (3,)
洛伦兹吸引子在*xyz*处的偏导数的值。
"""
x, y, z = xyz
x_dot = s*(y - x)
y_dot = r*x - y - x*z
z_dot = x*y - b*z
return np.array([x_dot, y_dot, z_dot])
设置初始参数
我们为模拟设置初始参数,包括时间步长dt、步数num_steps以及x、y和z的初始值。
dt = 0.01
num_steps = 10000
xyzs = np.empty((num_steps + 1, 3)) ## 需要多一个位置来存放初始值
xyzs[0] = (0., 1., 1.05) ## 设置初始值
计算洛伦兹吸引子
我们通过逐步推进时间,并使用前一个点和洛伦兹函数来估计下一个点,从而计算洛伦兹吸引子。
for i in range(num_steps):
xyzs[i + 1] = xyzs[i] + lorenz(xyzs[i]) * dt
绘制洛伦兹吸引子
我们使用 Matplotlib 的 mplot3d 模块来绘制洛伦兹吸引子。
ax = plt.figure().add_subplot(projection='3d')
ax.plot(*xyzs.T, lw=0.5)
ax.set_xlabel("X 轴")
ax.set_ylabel("Y 轴")
ax.set_zlabel("Z 轴")
ax.set_title("洛伦兹吸引子")
plt.show()
总结
在本教程中,我们学习了如何使用 Python 和 Matplotlib 绘制洛伦兹吸引子。我们定义了洛伦兹函数,设置了初始参数,计算了洛伦兹吸引子,并使用 Matplotlib 的 mplot3d 模块进行了绘制。