本节摘要:混沌不是"乱"的雅称,而是一组可逐条检验的数学性质:相邻轨道按指数速率分离(敏感初值),轨道被约束在有界区域内却永不重复(有界非周期),散点内部携带精细的自相似纹理(分形结构)。本节逐张核验证件,用双初值实验亲手量出李雅普诺夫时间——预测保质期的计量单位。
一个常见的概念纠缠发生在"混沌"与"随机"之间。三体系统的任何一条轨道都由牛顿方程严格决定:初值给定,未来唯一,没有任何骰子。可第 4 章照片上的散点雾又分明像随机——凭什么说它不是?答案是本章的总纲:混沌的轨道在个体层面完全确定,在信息层面不可长期预测。确定的方程配上指数放大的误差通道,"有限精度的初值"这个现实约束就足以让远期未来变得无法读取。三张证件,就是把这个抽象论证拆成三件可检验的事实。
想象两条相邻的轨道,初值只差一亿分之一。规则系统里,这对孪生轨道的距离大体温和增长,顶多线性漂开;混沌系统里,距离按 d(t) \approx d_0\,e^{\lambda t} 增长——\lambda 是李雅普诺夫指数,它的倒数 1/\lambda 叫李雅普诺夫时间,直观含义是"误差膨胀一个自然倍数所需的时间"。每过一个李雅普诺夫时间,你对初值的知识就丢失一位有效数字。初值给到十位精度,预测保质期大约就是十倍李雅普诺夫时间——保质期有价可估,这是混沌与随机最大的分野。
太阳系提供了量级感:拉斯基尔等人的长期积分给出内行星系统的李雅普诺夫时间在数百万年量级——相比行星公转周期,这很长;相比恒星寿命,这只是一瞬。太阳系的行星如今看起来规矩,其实也住在混沌的浅水区。而密近三体交会场合,李雅普诺夫时间缩短到几个交会周期——第 4 章布劳问题里"步长放大十倍就换结局"的现象,就是这个通道的威力。

第二条证件回答"散点雾为什么不是逃逸轨迹"。混沌轨道的活动范围被守恒量牢牢圈住:雅可比常数画出的零速度面(第 2.2 节)就是笼子的墙,雾铺得再开也铺不出墙外。可关在笼里为什么不重复?这正是不可积性的签名:若轨道周期重复,它就是一个周期解,周围会有一片规则区——而混沌区的拓扑(第 2.3 节的同宿缠绕)恰恰禁止这种整齐。于是混沌轨道在笼内无限游走、无限逼近每个它到过的邻域却永不精确重访——数学上这叫轨道在允许区内稠密。
"有界加非周期"组合起来的物理形象值得体会:它既不是行星那种规整的闭环,也不是彗星那种一去不回的抛物线,而是第三种存在方式——永远在家的流浪。第 6 章会看到,恒星团里的三体散射正是靠这种状态反复倒手能量。
第三张证件最反直觉:混沌散点雾不是均匀的雪花屏。把第 4 章的照片放大细看,点子的密度有层次、有走向,疏密纹理在更小的尺度上还会重演——这叫自相似,几何上的名字是分形。混沌雾的分形性来自幕后那位老熟人:同宿缠绕。无限折叠的稳定与不稳定流形把相空间揉成一层套一层的精细结构,散点只是这些结构在剖面上的投影。雾的"长相"不是装饰,它是统计力学可以下手的地方——密度纹理对应不变测度,第 6 章的统计三体力学就靠它吃饭。
实验背景:亲手量出一条三体轨道的李雅普诺夫指数,把"指数放大"变成一张表。操作:取两个初值相差 10^{-9} 的孪生轨道(用第 4 章的积分器),同步推进;每当分离距离超过阈值就把它重新归一(记录缩放因子),否则距离很快溢出浮点表示;累积缩放因子的对数就是李雅普诺夫指数的估计。这是标准技术,值得记住。代码如下:
import math def accel(q): out = [0.0] * 6 for i in range(3): for j in range(3): if i == j: continue dx = q[2 * j] - q[2 * i] dy = q[2 * j + 1] - q[2 * i + 1] r = math.hypot(dx, dy) + 1e-12 out[2 * i] += dx / r ** 3 out[2 * i + 1] += dy / r ** 3 return out def rk4_step(s, dt): q, v = s[:6], s[6:] def der(qq, vv): a = accel(qq) return list(vv) + a k1 = der(q, v) k2 = der([q[i] + 0.5 * dt * k1[i] for i in range(6)], [v[i] + 0.5 * dt * k1[6 + i] for i in range(6)]) k3 = der([q[i] + 0.5 * dt * k2[i] for i in range(6)], [v[i] + 0.5 * dt * k2[6 + i] for i in range(6)]) k4 = der([q[i] + dt * k3[i] for i in range(6)], [v[i] + dt * k3[6 + i] for i in range(6)]) qn = [q[i] + dt / 6 * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) for i in range(6)] vn = [v[i] + dt / 6 * (k1[6 + i] + 2 * k2[6 + i] + 2 * k3[6 + i] + k4[6 + i]) for i in range(6)] return qn + vn def sep(s1, s2): return max(abs(s1[i] - s2[i]) for i in range(12)) # 混沌初值(密度大的区域)与规则初值各测一次 base_chaos = [0.3, 0.0, 0.0, 0.0, 1.0, 0.0, 0.33, 0.34, -0.66, -0.68, 0.33, 0.34] base_reg = [0.8, 0.0, 0.0, 0.0, 1.0, 0.0, 0.30, 0.20, -0.60, -0.40, 0.30, 0.20] def lyapunov(base, t_max=2000.0, dt=0.002, d0=1e-9, renorm=1e-8): s1, s2 = list(base), [x + (d0 if i == 0 else 0.0) for i, x in enumerate(base)] t, log_sum, checks = 0.0, 0.0, 0 while t < t_max: s1 = rk4_step(s1, dt) s2 = rk4_step(s2, dt) t += dt d = sep(s1, s2) if d > renorm: log_sum += math.log(d / d0) checks += 1 s2 = [s1[i] + (s2[i] - s1[i]) * d0 / d for i in range(12)] return log_sum / t_max # 最大李雅普诺夫指数估计 lam_c = lyapunov(base_chaos) lam_r = lyapunov(base_reg) print("混沌初值 李雅普诺夫指数约:", round(lam_c, 4)) print("规则初值 李雅普诺夫指数约:", round(lam_r, 4)) print("对应的李雅普诺夫时间约:", round(1 / max(lam_c, 1e-12), 1), "个时间单位")
结果:混沌初值的指数估计稳定在正的十分之一量级(李雅普诺夫时间数十个时间单位,与几圈轨道相当);规则初值的估计随时长缩水、趋于零——规则轨道的孪生间距不指数放大,长时间下估计值被分母拖向零。解读三层:第一,正指数与零指数泾渭分明,这就是混沌与规则的定量分界,比照片判读更硬;第二,归一化重置不是作弊而是必需——不重置,分离距离很快涨到浮点上溢,实验中途夭折;第三,注意估计值需要长时间平均才收敛,短时间它会随轨道经过交会区而抖动——李雅普诺夫指数是轨道的长期属性,不是某一段的属性。变式:把同一条混沌初值的李雅普诺夫时间换算成"预测保质期"——初值精度十位小数,保质期约是它的十倍左右;再对比太阳系的数百万年量级,你会得到一个重要的比例感:混沌的可怕程度取决于你在跟哪个系统对话。
三张证件办齐,接下来清点更世俗的问题:一条混沌轨道折腾够了之后,结局有几种、各占多少概率、由什么机制裁决。