前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python洛伦兹混沌系统

Python洛伦兹混沌系统

作者头像
用户3577892
发布2020-06-12 16:55:11
1.4K0
发布2020-06-12 16:55:11
举报
文章被收录于专栏:数据科学CLUB

洛伦兹和蝴蝶效应洛伦兹系统仿真

洛伦兹和蝴蝶效应

1961年冬天,年轻的麻省理工学院气象学助教洛伦兹(1917-2008),在一台Royal McBee LPG-30计算机上,用一个仅包含12个微分方程的简单模式进行气候模拟。在完成了一次计算后,他想用同样的模式重复。为了节省时间,他没有从头到尾重复这次计算,而是从程序的中段开始。于是他把上一次计算到这个位置输出的数据,作为这次计算的初始条件。然后,为了避开计算机恼人的噪音,他出去喝了杯咖啡。回来的时候,他被惊呆了。根据常识,同样的程序和数据显然会导致同样的结果。但是第二次的预报结果与上一次大不一样。开始他认为是计算机的故障,排除了这种可能后,他发现,他输入的不是完整的数据。他当时用的计算机,储存数据的容量是小数点后六位数字,但是在打印输出数据时,为了节省纸张,只输出小数点后三位数字。而洛伦兹在给第二次计算输入初始条件的时候,只输入了小数点后的三位,与精确的数据有不到0.1%的误差。就是这个原本应该忽略不计的误差,使最终的结果大相径庭。这让洛伦兹意识到,完美的长期天气预报是不可能的。一个完美的预报不仅需要完美的气候模式,而且需要对温度、湿度、风和所有其他气象条件的精确测量,任何微小的误差,将导致完全不一样的气候现象。

1963年,洛伦兹在美国《气象学报》上发表了题为“确定性的非周期流”的论文,提出了在确定性系统中的非周期现象。第二年,他发表了另外一篇论文,指出对于模式中参数的微小改变将导致完全不一样的结果,使有规律的、周期性的行为,变成完全混乱的状态。不过,他的发现没有引起任何注意,直到十年后他提出“蝴蝶效应”这个通俗却惊人的想法,才让人们了解到这一现象的重要性。

1972年美国科学发展学会第139次会议上,洛伦兹发表了题为“可预测性:巴西一只蝴蝶扇动翅膀,能否在得克萨斯州掀起一场龙卷风”的演讲。他认为,一个微小的初始条件变化可能导致一连串逐渐放大的改变,最终导致完全不同的结果——这个看似荒谬的论断,打碎了所有人关于“因果决定论可预测度”所存的幻想,最终产生了当今世界最伟大的理论之一——“混沌理论”。洛伦兹后来说,他原本想用海鸥做比喻的。一个同事告诉他,用“蝴蝶”可能会更生动,而选择“巴西”则纯粹是为了押韵。

1987年,《纽约时报》科技部主任詹姆斯格莱克(James Gleick)在采访了200多名科学家后,撰写了一本后来享誉世界的畅销书《混沌:开创新科学》。第一章的标题就是“蝴蝶效应”,介绍了洛伦兹第一次发现混沌现象的过程,不过他给蝴蝶搬了个家——“今天北京一只蝴蝶拍翅对空气造成扰动,可能触发下个月纽约的暴风雨。”这本书后来被翻译成19种文字,也在上世纪90年代初给中国读者带来了“混沌”的概念。

这种最初只在气象预报中出现的现象,后来被发现存在于众多的自然和社会系统中,诸如人口的涨落、精神病的发病、心率的节奏、雪花的形状、股市的波动、汇率的变化等,都存在混沌现象。在洛伦兹之后,在计算机的帮助下,人类开始用“混沌理论”研究自然界和社会中的不规则、不连续和不稳定的方面,开启了简化复杂现象的可能性。(以上内容来自于:https://www.douban.com/group/topic/3067804/)

洛伦兹系统仿真

Lorenz发现了第一个混沌吸引子——Lorenz系统,从此揭开了混沌研究的序幕。人们不断发现新的混沌奇异性,不断地加深与统一对混沌的理解。混沌系统是指在一个确定性系统中,存在着貌似随机的不规则运动,其行为表现为不确定性、不可重复、不可预测,这就是混沌现象。混沌是非线性动力系统的固有特性,是非线性系统普遍存在的现象。

常微分方程表示的Lorenz混沌系统为:

根据仿真动态图,两条空间曲线在10s内(动态图中作了慢速播放),大致经历了:

  • 几乎重叠——————小幅分离——————各自独立运行

仿真结论:

  • 确定系统表现出不确定性,即混沌特性
  • 长期气象预报非常困难
代码语言:javascript
复制
%matplotlib notebook
# %matplotlib qt
from scipy.integrate import odeint 
import numpy as np 
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation
from IPython.display import HTML

#仿真数据
def lorenz(w, t, p, r, b): 
    x, y, z = w #初值
    return np.array([p*(y-x), x*(r-z)-y, x*y-b*z]) 
t = np.arange(0, 10.0, 0.01) # 创建时间点 
# 调用ode对lorenz进行求解, 用两个不同但很接近的初始值 
track1 = odeint(lorenz, (1.0, 1.00, 10.0), t, args=(10.0, 28.0, 3.0)) 
track2 = odeint(lorenz, (1.0, 1.00, 10.1), t, args=(10.0, 28.0, 3.0)) 
#转置以配合后面set_data函数的要求
track1 = track1.T
track2 = track2.T


#绘图
fig = plt.figure()
ax = p3.Axes3D(fig)

# Setting the axes properties,坐标范围要够大
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_xlim3d([-20.0, 20.0])
ax.set_ylim3d([-25.0, 25.0])
ax.set_zlim3d([0.0, 45.0])
ax.set_title('Lorenz chotic system')

# 设置小球和线形
ball1, = ax.plot([],[],linestyle='None',marker='o',\
                 markersize=10,markeredgecolor='r',\
                 color='orange',markeredgewidth=2)
ball2, = ax.plot([],[],linestyle='None',marker='o',\
                 markersize=10,markeredgecolor='green',\
                 color='orange',markeredgewidth=2)
line1, = ax.plot([],[],color='r')
line2, = ax.plot([],[],color='green')

def init():
    #注意set_data只能对二维数据进行,所以是0:2
    #set_3d_properties(track1[2,0])对第3维进行set_data
    ball1.set_data(track1[0:2, 0])
    ball1.set_3d_properties(track1[2,0])
    ball2.set_data(track2[0:2, 0])
    ball2.set_3d_properties(track2[2,0])
    line1.set_data(track1[0:2, 0])
    line1.set_3d_properties(track1[2,0])
    line2.set_data(track2[0:2, 0])
    line2.set_3d_properties(track2[2,0])
    return ball1,ball2,line1,line2

def animate(i):
    ball1.set_data(track1[0:2, i])
    ball1.set_3d_properties(track1[2,i])
    ball2.set_data(track2[0:2, i])
    ball2.set_3d_properties(track2[2,i])
    line1.set_data(track1[0:2, :i])
    line1.set_3d_properties(track1[2,:i])
    line2.set_data(track2[0:2, :i])
    line2.set_3d_properties(track2[2,:i])
    return ball1,ball2,line1,line2

line_ani = animation.FuncAnimation(fig, animate, np.arange(1,t.size), init_func=init,
                                  interval=30, repeat=False, blit=False)
plt.show()
代码语言:javascript
复制
<IPython.core.display.Javascript object>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学CLUB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 洛伦兹和蝴蝶效应
  • 洛伦兹系统仿真
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档