Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
何为混沌?从洛伦兹系统理解蝴蝶效应
洛伦兹系统
中文
常微分方程
混沌理论
洛伦兹系统中文常微分方程混沌理论
AnguseZhang
发布于 2023-07-31
推荐镜像 :Basic Image:bohrium-notebook:2023-04-07
推荐机型 :c2_m4_cpu
赞 7
何为混沌?从洛伦兹系统理解蝴蝶效应
蝴蝶效应
洛伦兹系统的数学求解
方程定义
使用Runge-Kutta格式进行求解
数值实验1 :初值条件敏感依存
数值实验2: 混沌的发生

何为混沌?从洛伦兹系统理解蝴蝶效应

©️ Copyright 2023 @ Authors
作者: 张与之 📨
日期:2023-07-31
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
快速开始:点击上方的 开始连接 按钮,选择 bohrium-notebook:2023-05-31镜像 和任意配置机型即可开始。

代码
文本

代码
文本

蝴蝶效应

你听说过“蝴蝶效应”吗? —— 据说,“一只蝴蝶在巴西轻拍翅膀,可能会导致一个月后德克萨斯州的一场龙卷风。”

在1961年的冬天,美国气象学家Edward Lorenz在使用计算机程序来模拟大气中空气流动的数学模型时发现,在两次计算过程中,只改变了某一中间结果的第三位小数后的精度,便对最终计算结果产生了巨大的影响。他也由此注意到动力学系统对初始条件的敏感性,结合他在气象领域的研究将这种现象不乏诗意地命名为“蝴蝶效应”,并在1993年出版的《混沌学本质》一书中正式将其定义为“动力系统状态的微小变化,将导致后续的状态,与原本可能演变的状态有很大的不同。”

2004年由Eric Bress和J. Mackye Gruber指导的同名科幻电影《蝴蝶效应》也引用了这个概念。Evan来子一个特殊家族,他的父亲与爷爷均因为“精神疾病”而被强制住院。20岁时,他发现自己通过家族遗传获得了可以通过观看承载着过去记忆的信物以改变过去,从而改变现在的能力。他希望改变自己与身边挚友不幸的童年。然而,他真的会成功吗?...

对“蝴蝶效应”这类现象的研究逐渐演化成为了混沌理论(Chaos Theory)———在一个决定性系统中可能产生随机结果。现如今,混沌理论在包括气象学、物理学、航空与航天、生态学、经济学、运筹学、生物学等许多学科与领域中得到了广泛应用。

在本文中,我们将构建一个简单的数学模型——洛伦兹系统,通过对这个系统的求解来尝试理解“蝴蝶效应”背后的混沌行为。

代码
文本

洛伦兹系统的数学求解

方程定义

我们定义一组常微分方程,其中, , 是一组待定参数。

使用Runge-Kutta格式进行求解

对于一个初值为的常微分方程系统

一种常见的常微分方程数值求解方法——Runge-Kuta格式可以被用来进行方程求解,即

代码
文本

相应的Python代码实现见下。

代码
文本
[1]
# 定义洛伦兹系统
def lorenz(p,t,s,r,b):
x,y,z = p.tolist()
return np.array((s*(y-x),x*(r-z)-y,x*y-b*z))

# 定义四阶Runge-Kutaa格式
def RungeKutta44(x_0,par , N = 3000, dt = 0.01):
x,y,z = x_0[0],x_0[1],x_0[2]
s,r,b = par[0],par[1],par[2]
t_list = np.array([i * dt for i in range(N)])
xl = [np.array((x,y,z))]
for i in range(N):
K1 = lorenz(xl[i], t_list[i], s,r,b )
K2 = lorenz(xl[i] + 0.5 * dt * K1, t_list[i] + 0.5 *dt, s,r,b)
K3 = lorenz(xl[i] + 0.5 * dt * K2, t_list[i] + 0.5 *dt, s,r,b)
K4 = lorenz(xl[i] + dt * K3, t_list[i] + dt, s,r,b)
xl.append(xl[i] + dt / 6.0 * (K1 + 4.0 * K2 + K3))
return np.array(xl)

代码
文本

数值实验1 :初值条件敏感依存

接下来,我们选择这组参数组合 ,并选择一组差异非常小的初值条件 作为对比实验,来研究初值条件对动力系统演化的影响。

代码
文本
[2]
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 定义步长与模拟步数
N = 10000
dt = 0.01
# 定义初值
x0 = (0.0, 1.0, 0)
x1 = (0.0, 1.0, 0.002)
# 定义超参数
par0 = (10.0, 28.0, 8.0 / 3.0)

#求解轨迹
track0 = RungeKutta44(x0,par0, N=N,dt=dt)
track1 = RungeKutta44(x1,par0, N=N,dt=dt)
fig = plt.figure(figsize=(8,4))

# 画出轨线的空间分布
ax = fig.add_subplot(121,projection="3d")
ax.scatter(track0[0,0],track0[0,1], track0[0,2],"-",color="r",s=8)
ax.scatter(track1[0,0],track1[0,1], track1[0,2],"-",color="b",s=2)
ax.plot(track0[:,0],track0[:,1],track0[:,2],lw=1.2,color='r', label= "Initial (0,1,0)")
ax.plot(track1[:,0],track1[:,1],track1[:,2],lw=0.6,color='b', label = "Initial (0,1,0.002)")
ax.set_title(r"$\sigma = 10 , \rho = 28, \beta = 8/3$")
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.legend()

# 画出轨线随时间演化的过程
ax1=fig.add_subplot(122)
t_list = [i * dt for i in range(len(track1[:,0]))]
ax1.plot(t_list , track0[:,0], c = "b", label = "x")
ax1.plot(t_list, track0[:,1], c = "r", label = "y")
ax1.plot(t_list, track0[:,2], c = "g", label = "z")
ax1.set_xlabel("t")
#plt.rcParams["figure.dpi"] = 120
plt.legend()
plt.show()

代码
文本

我们从左图的模拟结果中可以看出,即使红线和蓝线的初值条件只在z方向有非常小的扰动(0.002),但是经过一段时间的演化,两段轨迹已经发生了巨大的偏差。

我们从右图的模拟结果中可以看出,在 这样的一组参数下,体系随时间变化的轨迹具有某种“混沌性”。

代码
文本

数值实验2: 混沌的发生

接下来我们选取 作为初值,并选取不同的方程参数,让 从1逐步增加至10,20,100,来研究在不同方程参数的组合下动力系统的混沌性。

代码
文本
[3]
# 定义步长与模拟步数
N = 10000
dt = 0.01
# 定义初值
x0 = (0.0, 1.0, 0)


# 定义超参数
param_list = [ (10.0, 1.0 , 8.0 / 3.0), (10.0, 10.0 , 8.0 / 3.0), (10.0, 20 , 8.0 / 3.0), (10.0, 100 , 8.0 / 3.0) ]
for par in param_list:
#求解轨迹
track0 = RungeKutta44(x0,par, N=N,dt=dt)
fig = plt.figure(figsize=(8,4))
# 画出轨线的空间分布
ax = fig.add_subplot(121,projection="3d")
ax.scatter(track0[0,0],track0[0,1], track0[0,2],"-",color="r",s=8)
ax.plot(track0[:,0],track0[:,1],track0[:,2],lw=1.0,color='r' )
ax.set_title(r"$ \rho = %d $"%par[1], fontsize =15)
ax.set_xlabel("x")
ax.set_ylabel("y")
# 画出轨线随时间演化的过程
ax1=fig.add_subplot(122)
t_list = [i * dt for i in range(len(track1[:,0]))]
ax1.plot(t_list , track0[:,0], c = "b", label = "x")
ax1.plot(t_list, track0[:,1], c = "r", label = "y")
ax1.plot(t_list, track0[:,2], c = "g", label = "z")
ax1.set_title(r"$ \rho = %d $"%par[1], fontsize =15)
ax1.set_xlabel("t")
plt.legend()
plt.show()


代码
文本

我们可以看出,当 比较小 的时候,动力系统会收敛至其不动点,当时间趋于无穷的时候其极限行为是稳定的。

从 10 增长至 20 的时候,轨迹在空间上的收敛性会消失,但当时间趋于无穷的时候体系振动的幅度会趋于0。

然而,当 增长至高于20的某一个阈值后,体系轨迹将保持持续震荡,此时,混沌行为就发生了。

代码
文本
[6]
# 定义步长与模拟步数
N = 10000
dt = 0.01
# 定义初值
x0 = (0.0, 1.0, 0)
x1 = (0.0, 1.0, 0.002)
# 定义超参数
par0 = (10.0, 28.0, 8.0 / 3.0)

#求解轨迹
track0 = RungeKutta44(x0,par0, N=N,dt=dt)
track1 = RungeKutta44(x1,par0, N=N,dt=dt)
fig = plt.figure(figsize=(8,6))

# 画出轨线的空间分布
ax = fig.add_subplot(projection="3d")
ax.scatter(track0[0,0],track0[0,1], track0[0,2],"-",color="r",s=8)
ax.scatter(track1[0,0],track1[0,1], track1[0,2],"-",color="b",s=2)
ax.plot(track0[:,0],track0[:,1],track0[:,2],lw=1.2,color='r', label= "Initial (0,1,0)")
ax.plot(track1[:,0],track1[:,1],track1[:,2],lw=0.6,color='b', label = "Initial (0,1,0.002)")
ax.set_title(r"$\sigma = 10 , \rho = 28, \beta = 8/3$")
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.legend()
plt.show()

代码
文本

最终再让我们看一下,在 ,与初值条件 时动力系统的轨迹。

看起来像不像一只翩翩起舞的🦋呢?

代码
文本
洛伦兹系统
中文
常微分方程
混沌理论
洛伦兹系统中文常微分方程混沌理论
已赞7
本文被以下合集收录
测试合集文章列表100篇
xingyanshi@dp.tech很长的名字xingyanshi@dp.tech很长的名字很长的
更新于 2024-08-04
104 篇2 人关注
physics
sai_xu
更新于 2024-03-16
10 篇0 人关注
推荐阅读
公开
Python Implementation: Syntax & Algorithms
python分子动力学优化算法积分算法计算材料学
python分子动力学优化算法积分算法计算材料学
JH_Wang
更新于 2024-07-18
2 赞2 转存文件
公开
《计算材料学》(分子动力学)算法原理
python计算材料学分子动力学
python计算材料学分子动力学
JH_Wang
更新于 2024-07-18
8 赞7 转存文件
评论
 import numpy as np i...

flyingdwarf

2023-07-31
右图可以标明一下是对应第一组初始条件~
评论