3.3 3.3 分岔、混沌与控制入门


3.3 分岔、混沌与控制入门

本节摘要:参数稍微一动,系统的长期行为可能发生质变——平衡点分裂、周期加倍、乃至进入混沌。本节用虫口模型演示倍周期通向混沌的完整路线,量化混沌的初值敏感性,最后转向"干预":以倒立摆为例说明反馈控制如何把一个不稳定的平衡点变稳,接通控制理论的入口。

学习目标

阅读完本节,你应当能够:

  1. 画出虫口模型的分岔图并解读周期加倍现象;
  2. 解释初值敏感性与有界非周期的混沌双重特征;
  3. 说出闭环反馈改变系统特征值的机制。

虫口模型:一条参数轴上的沧海桑田

虫口迭代模型是离散动力系统的入门标本:下一代数量等于参数 r 乘以当代数量再乘以(一减当代数量),状态归一化到 0 与 1 之间。它的全部复杂性都藏在参数 r 里:r 小于 3 时种群收敛到不动点;r 跨过 3,不动点失稳,长期行为变成两点周期;继续加大 r,周期依次翻倍成 4、8、16……直到大约 3.5699 处进入混沌——轨道永不重复、却永远有界。

这种"参数渐变引发行为突变"的现象叫分岔。它的管理含义值得咀嚼:一座渔场、一条供应链,若运营参数正好停在分岔点附近,微调政策就可能让系统从平稳态跳进振荡态,且这种跳跃不会提前打招呼。

import numpy as np def logistic_map(x, r): return r * x * (1 - x) def attractor(r, x0=0.4, n_burn=800, n_keep=200): """丢弃暂态,保留长期行为样本""" x = x0 for _ in range(n_burn): x = logistic_map(x, r) out = [x] for _ in range(n_keep - 1): x = logistic_map(x, r) out.append(x) return np.array(out) # 沿参数轴扫描:每个 r 记录长期轨道的取值集合 for r in [2.8, 3.2, 3.5, 3.55, 3.9]: att = attractor(r) uniq = len(np.unique(np.round(att, 4))) print(f"r={r}: 长期行为取 {uniq} 个不同值, " f"范围 [{att.min():.3f}, {att.max():.3f}]")

五个参数值分别对应:单点不动点、2 周期、4 周期、8 周期、混沌(取值几乎连续散布)。把 r 从 2.5 到 4 每隔 0.002 扫一遍、每个点画出长期轨道散点,就是著名的分岔图——树状分叉不断加密,最终糊成一片。

混沌:不是随机,胜似随机

混沌的两要素是初值敏感有界非周期。后者从分岔图右端直接可见;前者才是混沌的杀伤力所在:两个只差亿分之一的初值,几十步之后轨道彻底分道扬镳。量化手段是看分离距离随步数的增长速率(正的李雅普诺夫指数):

import numpy as np def separation_growth(r=3.9, x0=0.4, gap=1e-10, n=60): """追踪一对近邻初值的分离历史""" xa, xb = x0, x0 + gap dist = [] for _ in range(n): xa, xb = r*xa*(1-xa), r*xb*(1-r*xb) dist.append(abs(xa - xb)) return np.array(dist) d = separation_growth() log_d = np.log(np.maximum(d, 1e-300)) growth = np.polyfit(np.arange(30, 55), log_d[30:55], 1)[0] print(f"前段分离速率约 e 的 {growth:.3f} 次方每步") print(f"初始间距 1e-10 → 第 {np.argmax(d > 0.1)} 步已超过 0.1")

典型结果:分离速率约每步放大到 e 的 0.7 次方(李雅普诺夫指数约 0.7),初始十亿分之一的差异在四十步左右放大到宏观量级。这就是长期预测失效的数学机制——不是模型不好,也不是计算不准,而是系统本身在指数放大一切不确定性。对预测工单的正确交付物因此从"第 50 步的值"变为"第 50 步的分布",这把话题交给第 4 章的随机方法与第 8 章的不确定性量化。

干预:反馈让不稳定变稳定

倒立摆是控制理论的开场白:摆杆竖直朝上是一个不稳定的平衡点(线性化特征值一正一负的鞍点),松手即倒。但只要装一个角度传感器与作动器,按"角度偏差乘增益、角速度乘阻尼增益"的规律施加校正力,闭环系统的特征值可以被推到左半平面——不稳定变成渐近稳定。反馈的本质就是重新配置特征值

import numpy as np from scipy.integrate import solve_ivp # 倒立摆线性化模型:状态 = 角度偏差, 角速度 g, L, mc, mp = 9.81, 1.0, 1.0, 0.3 def open_loop(t, s): A = np.array([[0, 1], [g/L, 0]]) # 无控制:鞍点 return A @ s def closed_loop(t, s, kp=25.0, kd=8.0): """状态反馈:校正力正比于角度与角速度""" u = -kp * s[0] - kd * s[1] A = np.array([[0, 1], [g/L, 0]]) B = np.array([[0], [1/(mc*L)]]) return A @ s + (B * u).ravel() print("开环特征值:", np.round(np.linalg.eigvals([[0,1],[g/L,0]]), 3)) K = np.array([[-25, -8]]) Acl = np.array([[0,1],[g/L,0]]) + np.array([[0],[1/(mc*L)]]) @ K print("闭环特征值:", np.round(np.linalg.eigvals(Acl), 3)) sol = solve_ivp(closed_loop, [0, 5], [0.35, 0.0], rtol=1e-9) final = sol.y[:, -1] print(f"初偏 0.35 rad → 终态角度 {final[0]:.4f}, 角速度 {final[1]:.4f}")

开环特征值一正一负,闭环在合适的增益下实部全负——角度从 0.35 弧度收回竖直附近。增益的选取有讲究:太小拉不住,太大则作动器饱和且对噪声过敏,这个权衡在第 6 章的优化语言里有精确表述(线性二次型调节器把"稳得快"与"用力省"写成加权目标)。本节只需要记住机制:传感器(观测)、控制器(反馈律)、作动器(执行)三件套合起来,等于给系统改写了雅可比矩阵

⚠️ 常见坑:把混沌当成"随机噪声"处理,试图用平滑或平均消除。混沌是确定性系统产生的类随机行为,平滑掉它等于抹掉系统真实动态,正确做法是做分布预测或改变系统参数(控制)。

💡 关键直觉:分岔图、李雅普诺夫指数、反馈增益三件事共享同一条主线——参数与结构决定长期行为。建模者的价值不是算出轨迹,而是知道把手拧到哪里,系统会从一种性格切换成另一种。

参数轴上的行为地图

参数轴上的行为地图

本节要点回顾

  • 分岔是参数渐变引发行为质变,虫口模型的倍周期路线是最短教科书案例;
  • 混沌两要素:有界非周期与初值敏感,李雅普诺夫指数量化分离速率;
  • 长期预测的正确交付物是分布而非单值,混沌不是噪声不能平滑;
  • 周期窗口说明混沌区结构复杂,秩序与混乱交替出现;
  • 反馈即改写雅可比:观测、控制律、执行三件套让不稳定平衡点变稳。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U