请选择 进入手机版 | 继续访问电脑版

CCOSE论坛

 找回密码
 立即注册
查看: 231|回复: 1

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

[复制链接]

503

主题

730

帖子

2755

积分

论坛元老

Rank: 7Rank: 7Rank: 7

积分
2755
发表于 2021-6-2 08:45:06 | 显示全部楼层 |阅读模式
洛伦兹和蝴蝶效应洛伦兹系统仿真

洛伦兹和蝴蝶效应
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混沌系统为:  

其中  均为空气流体的相关参数, ~  当然就是  ,   为时间, 其余类推。

系统中产生混沌是有条件,需选取合适的  ,比如:

方程的解  均为时间t的函数,绘制于3维空间就是一条空间曲线。下面仿真中,从相当接近的两点出发,设定方程在  时:

观察从两点出发的空间曲线,时间的范围和仿真步长设定为:

  ,单位s

步长    s

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

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

仿真结论:

确定系统表现出不确定性,即混沌特性

长期气象预报非常困难

%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()
<IPython.core.display.Javascript object>
ebb9b9f59b402d460c4623dfa87c1b15.png

相关资源:基于matlab的陈氏混沌系统仿真设计(可修改参数置换为蔡氏或者洛伦兹混沌系统)
lorenz_chaos.py (2.35 KB, 下载次数: 13)
回复

使用道具 举报

503

主题

730

帖子

2755

积分

论坛元老

Rank: 7Rank: 7Rank: 7

积分
2755
 楼主| 发表于 2021-6-2 08:45:36 | 显示全部楼层
上述程序亲测可用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|京ICP备17005959号|IAC-16|Archiver|手机版|小黑屋|CCOSE论坛

GMT+8, 2021-6-22 19:35 , Processed in 0.040683 second(s), 23 queries .

快速回复 返回顶部 返回列表