使用 Python 进行三维洛伦兹吸引子绘图

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验是一个循序渐进的教程,用于使用 mplot3d 在三维空间中绘制爱德华·洛伦兹 1963 年的《确定性非周期流》。我们将使用 Python 和 Matplotlib,它是 Python 编程语言的一个绘图库。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入库

我们首先导入必要的库:Matplotlib 和 NumPy。

import matplotlib.pyplot as plt
import numpy as np

定义洛伦兹函数

我们定义洛伦兹函数,它接受三个参数并返回一个包含三个值的数组。我们使用洛伦兹参数的默认值s=10r=28b=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以及xyz的初始值。

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 模块进行了绘制。