使用 Matplotlib 画洛仑兹吸引子
2010-05-22
美国气象学家洛伦兹(E.N.Lorenz,不要和提出洛伦兹变换的那位搞混)是混沌理论的奠基者之一。20 世纪 50 年代末到 60 年代初,他的主要工作目标是从理论上对天气情况进行长期预报。在使用计算机模拟天气时,他意外地发现,对于天气系统,哪怕初始条件的微小改变也会显著影响运算结果。随后,他在同事工作的基础上化简了自己先前的模型,得到了有 3 个变量的一阶微分方程组,由它描述的运动中存在一个奇异吸引子,即洛伦兹吸引子。
洛伦兹的工作结果最初在 1963 年发表,论文题目为 Deterministic Nonperiodic Flow,发表在Journal of the Atmospheric Sciences 杂志上。如今,这一方程组已成为混沌理论的经典,也是“巴西蝴蝶扇动翅膀在美国引起德克萨斯的飓风”(蝴蝶效应)一说的肇始。
下面,我们使用 Python 的绘图库 Matplotlib 来绘制一下洛伦兹吸引子曲线。代码如下,非常简单:
# -*- coding: utf-8 -*-
"Lorenz's strange attractor"
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
#import numpy as np
import matplotlib.pyplot as plt
xs, ys, zs = [], [], []
def mkPoints():
a, b, c = 10.0, 28.0, 8.0 / 3.0
h = 0.01
x0, y0, z0 = 0.1, 0, 0
for i in xrange(10000):
x1 = x0 + h * a * (y0 - x0)
y1 = y0 + h * (x0 * (b - z0) - y0)
z1 = z0 + h * (x0 * y0 - c * z0)
x0, y0, z0 = x1, y1, z1
xs.append(x0)
ys.append(y0)
zs.append(z0)
if __name__ == "__main__":
mpl.rcParams["legend.fontsize"] = 10
fig = plt.figure()
ax = Axes3D(fig)
mkPoints()
ax.plot(xs, ys, zs, label = "Lorenz's strange attractor")
ax.legend()
plt.show()
最后得到的图形如下:
这个图形是三维的,在 Matplotlib 界面上,你可以用鼠标拖拽的方式来旋转视角,以便从各个不同的角度观察它。
分类:文章标签:混沌matplotlibPython
发表评论:
电子邮件地址不会被公开。必填项已用 * 标注。
评论: