🥦Julia和Python蛛网图轨道图庞加莱截面曲面确定性非线性系统

关键词

Julia | Python | 动态系统 | 非线性 | 曲面 | 离散系统 | 降维 | 二维系统 | 零斜线 | 可激发系统 | 状态空间 | 李亚普诺夫指数 | 敏感依赖性 | 统计 | 线性代数 | 绘图 | 蛛网图 | 倍周期分岔 | 轨道图 | 混沌行为 | 物理 | 数学 | 轨迹 | 磁摆 | 动画 | 算法工具 | 微分方程 | 分叉 | 能量平衡 | 离散 | 雷尼熵 | 分形维数 | 延迟坐标嵌入 | 定向信息流 | 强制振荡器 | 洛伦兹 | 数值 | 状态空间 | 准周期 | 功率谱 | 归一化

🏈指点迷津 | Brief

🎯要点

  1. 🎯确定性混沌系统计算和视图:🖊庞加莱截面曲面,赫农-海尔斯系统和洛伦兹 63 系统。

  2. 🎯零斜线演示可激发系统计算和视图:🖊 庞加莱-本迪克松定理求解二维连续系统常微分方程 | 🖊绘制菲茨休-南云模型状态空间静态图 | 🖊绘制二阶准周期运动轨迹静态图和动画 | 🖊计算赫农-海尔斯系统三个特征轨迹的归一化功率谱。

  3. 🎯敏感依赖性计算和视图​:🖊模拟洛伦兹 63 系统敏感依赖性 | 🖊绘制三维收敛轨迹静态图和演变动画 | 🖊绘制最大李亚普诺夫指数为特征的相邻轨迹的指数散度 | 🖊无穷小二维离散系统轨迹的演化动画 | 🖊计算动态系统李亚普诺夫指数 | 🖊 绘制海尔斯离散系统中拉伸和折叠静态图和动画 | 🖊计算庞加莱截面曲面和李亚普诺夫指数,绘制赫农-海尔斯系统混沌度图。

  4. 🎯系统行为分叉静态视图和动画:🖊绘制一维能量平衡的交互式分叉静态图和动画 | 🖊一维离散系统动力学蛛网图可视化倍周期分岔 | 🖊计算和绘制逻辑图和罗斯勒系统的轨道图 | 🖊计算动态系统蛛网图中间歇性。

  5. 🎯概率描述确定性动态系统:🖊计算雷尼熵 | 🖊计算和绘制磁摆吸引力的分形边界 | 🖊计算分形维数估计 | 🖊计算无噪估计分形维数。

  6. 🎯延迟坐标嵌入非线性时间序列分析 | 🎯定向信息流 | 🎯动态台球 | 🎯周期性强制振荡器 | 🎯反应扩散系统和图灵模式

🍇Python动画洛伦兹系统轨迹图

洛伦兹方程是三个耦合的一阶非线性微分方程组,描述粒子随时间的轨迹。 该系统最初是由洛伦兹作为大气对流模型推导出来的,但方程看似简单,使其成为大气物理学以外领域中经常使用的示例。

这些方程通过指定时间导数,在给定控制参数 σβ\sigma、\betaρ\rho 的情况下描述空间变量 x、y 和 z 的演化空间变量:

dx/dt=σ(yx) {\rm d}x/{\rm d}t = \sigma(y - x)

dy/dt=x(ρz)y{\rm d}y/{\rm d}t = x(\rho - z) - y

dz/dt=xyβz{\rm d}z/{\rm d}t = xy - \beta z

给出起始点 (x0,y0,z0x_0, y_0, z_0) 和时间间隔 t 后,所得到的动态是完全确定性的。 虽然看起来很简单,但对于参数 (σ\sigma, ρ\rho,β \beta)​ 的某些选择,轨迹会变得混乱,并且所得轨迹显示出一些令人惊讶的特性。

尽管该系统不存在通用解析解,但可以通过数值方法计算解。 Python 使此类问题非常容易解决:只需使用 Scipy 的 ODEPACK 接口即可,ODEPACK 是一种用于求解常微分方程的优化 Fortran 包。 问题的设置方法如下:

 import numpy as np
 from scipy import integrate
 ​
 def lorentz_deriv((x, y, z), t0, sigma=10., beta=8./3, rho=28.0):
     return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]
 ​
 x0 = [1, 1, 1]  # starting vector
 t = np.linspace(0, 3, 1000) 
 x_t = integrate.odeint(lorentz_deriv, x0, t

现在我们已经计算了这些结果,我们可以使用 matplotlib 的动画和 3D 绘图工具包来可视化多个粒子的轨迹。

 import numpy as np
 from scipy import integrate
 ​
 from matplotlib import pyplot as plt
 from mpl_toolkits.mplot3d import Axes3D
 from matplotlib.colors import cnames
 from matplotlib import animation
 ​
 N_trajectories = 20
 ​
 def lorentz_deriv((x, y, z), t0, sigma=10., beta=8./3, rho=28.0):
     return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]
 ​
 np.random.seed(1)
 x0 = -15 + 30 * np.random.random((N_trajectories, 3))
 ​
 t = np.linspace(0, 4, 1000)
 x_t = np.asarray([integrate.odeint(lorentz_deriv, x0i, t)
                   for x0i in x0])
 ​
 fig = plt.figure()
 ax = fig.add_axes([0, 0, 1, 1], projection='3d')
 ax.axis('off')
 ​
 colors = plt.cm.jet(np.linspace(0, 1, N_trajectories))
 ​
 lines = sum([ax.plot([], [], [], '-', c=c)
              for c in colors], [])
 pts = sum([ax.plot([], [], [], 'o', c=c)
            for c in colors], [])
 ​
 def init():
     for line, pt in zip(lines, pts):
         line.set_data([], [])
         line.set_3d_properties([])
 ​
         pt.set_data([], [])
         pt.set_3d_properties([])
     return lines + pts
 ​
 def animate(i):
 ​
     for line, pt, xi in zip(lines, pts, x_t):
         x, y, z = xi[:i].T
         line.set_data(x, y)
         line.set_3d_properties(z)
 ​
         pt.set_data(x[-1:], y[-1:])
         pt.set_3d_properties(z[-1:])
 ​
     ax.view_init(30, 0.3 * i)
     fig.canvas.draw()
     return lines + pts
 ​
 anim = animation.FuncAnimation(fig, animate, init_func=init,
                                frames=500, interval=30, blit=True)
 ​
 plt.show()

请注意,空间中有两个位置似乎吸引了所有路径:这些是所谓的“洛伦兹吸引子”,并且具有一些有趣的属性。 随着参数 (\sigma, \rho, \beta) 的变化,这些洛伦兹吸引子的定性特征会以有些令人惊讶的方式变化。

Last updated