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

PythonPythonBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验是一个循序渐进的教程,用于使用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模块进行了绘制。