本节摘要:三百年猎解史仍在续写。统计三体力学绕开逐轨道预测,直接给出一族初值的结局分布;机器学习既当加速器又当学徒,在学守恒量与省算力上初显身手,也在混沌区暴露短板。本节速报这两条前线,附一份诚实的未解清单,并用一个小型统计实验体会"不预测轨道、只预测命运"的新范式。
每本天体力学的结尾都留着一页"未解问题",这一页在最近十年被刷新得格外勤。驱动刷新的有两股力量:一股来自算力与算法的常规进步——更快的积分器、更聪明的搜索,把旧问题从"算不动"变成"算得动";另一股来自问题本身的换代——研究者开始承认逐轨道预测在混沌区原理性失效,转而问"能不能不预测轨道,只预测命运"。第二股力量催生的范式,有个现成的名字:统计三体力学。
范式的操作定义值得整段抄录。传统方法面对一族初值,逐条积分、逐条判结局,最后数概率——贵在每条都要跑到底。统计三体力学的路线是:给混沌区的相空间假设一个遍历混合的性质(轨道在能量面上游走得足够随机),把结局概率从几何与能量簿记里解析地推导出来——单星逃逸的概率、双星的能量分布、角动量的去向,都写成总能量、总角动量与质量的显式函数。2019 年斯通与利在《自然》上给出第一版解,2021 年吉纳特与佩雷茨把它推广得更完整。检验方式是拿数值积分的统计"考卷"对照:在中等能量区间,解析分布与几十万条轨道的统计结果吻合得像模像样。
这趟范式转移的深层意义,是把庞加莱的"不可预测"当成了资源而非障碍:正因为混沌轨道在相空间里混合得充分,统计假设才立得住——混沌越彻底,统计越可靠。第 5.1 节"混沌有结构、随机无记忆"的辩证法,在这里完成闭环:结构(不变测度)正是统计的抓手。应用端已经开工:星团演化模拟里,亿万年尺度的三体交会不再逐条积分,而是按统计分布抽样;引力波天文学估算双黑洞-单星散射的形成率,同样靠它出账。
机器学习进场的方式比想象中朴素。当加速器:用神经网络学习引力场局部的受力或长时间步进的映射,让积分步长放大几个量级,精度损失换算力收益——在天体动力学里,它更像一台"可训练的近似积分器"。当学徒:更有雄心的玩法是让网络在拟合轨道数据的过程中"发现"守恒量——拉格朗日神经网络一类的架构,通过训练让能量与角动量自动浮现为不动的量;符号回归则尝试从数据里凑出简洁的解析关系。当扫描搭档:第 4.4 节的参数扫描里,神经网络可以预筛"哪里像孤岛",把牛顿精修的火力集中到可疑点。
软肋同样分明,而且全部落在混沌两个字上。其一,外推即崩塌:网络在训练分布内插值尚可,混沌区的轨道在稍远初值上就跑出训练分布,预测会一本正经地错——这与第 4 章的"伪混沌"同构,只是误差来源从算法换成了模型。其二,守恒量的"发现"需要验证:网络学出一个不动的量,未必是物理守恒量,可能只是训练集的过拟合痕迹——验收标准必须回到数学(它是否可积、是否与已知账本独立)。其三,可解释性的债:一个黑箱积分器给出漂亮轨道,但第 5 章的全部概念工具(李雅普诺夫时间、结局判据)都要求知道误差如何传播,黑箱把这门账记成了糊涂账。务实的定位因此很清楚:机器与三体的关系是师徒制的分工——机器管跑得快、扫得广,人负责立判据、验守恒、扛结论。
实验背景:亲手做一个最小统计三体——不跟踪任何一条轨道的细节,只给一大族初值统计结局分布,看分布是否稳定可复。操作:随机撒两百个初值,短程积分后用 5.2 节的判读器盖章,数概率;换一批随机种子重跑,对照两个分布。代码如下:
import math, random 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:] a1 = accel(q) v2 = [v[i] + 0.5 * dt * a1[i] for i in range(6)] q2 = [q[i] + 0.5 * dt * v2[i] for i in range(6)] a2 = accel(q2) v3 = [v[i] + 0.5 * dt * a2[i] for i in range(6)] q3 = [q[i] + 0.5 * dt * v3[i] for i in range(6)] a3 = accel(q3) v4 = [v[i] + dt * a3[i] for i in range(6)] q4 = [q[i] + dt * v4[i] for i in range(6)] a4 = accel(q4) qn = [q[i] + dt / 6 * (v[i] + 2 * v2[i] + 2 * v3[i] + v4[i]) for i in range(6)] vn = [v[i] + dt / 6 * (a1[i] + 2 * a2[i] + 2 * a3[i] + a4[i]) for i in range(6)] return qn + vn def outcome(s, t_max=80.0, dt=0.004): """返回标签:分离(有人单飞)或未决""" t = 0.0 while t < t_max: s = rk4_step(s, dt) t += dt q = s[:6] d02 = math.hypot(q[4] - q[2], q[5] - q[3]) d01 = math.hypot(q[2] - q[0], q[3] - q[1]) d12 = math.hypot(q[4] - q[0], q[5] - q[1]) if max(d01, d02, d12) > 30.0 and min(d01, d02, d12) < 8.0: return "分离" return "未决" def survey(seed, n=200): random.seed(seed) tally = {"分离": 0, "未决": 0} for _ in range(n): q = [random.uniform(-1, 1) for _ in range(6)] v = [random.uniform(-0.5, 0.5) for _ in range(6)] tally[outcome(q + v)] += 1 return tally a = survey(11) b = survey(23) print("种子 11 :", a) print("种子 23 :", b) pa = a["分离"] / 200 pb = b["分离"] / 200 print("分离概率两次估计:", round(pa, 3), "与", round(pb, 3), ",差", round(abs(pa - pb), 3))
结果:两批独立随机初值给出的分离概率接近(统计涨落与样本量平方根同量级),"分离占多数"的结论在两个种子下稳定成立。解读:这组数字就是统计三体力学的民间版——单条轨道的细节完全不可复现(混沌),但两百条的命运分布几乎可复现(遍历混合)。注意"未决"一栏并非理论包袱:它是积分预算的现实截断,真实研究靠拉长时段与更精的判据把它压缩。变式:把能量约束加上(只采样总能量为负的初值)再统计,分离概率会进一步抬升——正是解析理论里"负总能量必分家"那条会计规则的统计回声。
按三百年的惯例,前线速报以未解清单收尾——这一份刻意保留原味的粗粝。
💡 面对这页清单,三百年的猎解史给出的最诚恳态度藏在庞加莱那句旧话里:科学家研究的对象不是"自然"本身,而是"自然"的某个模型——模型换一版,问题清单就跟着换一版。三体问题没有"解决"的一天,只有"换版"的一天;这恰是它三百年来始终在前线的原因。
至此全册收束。三百年猎解史的每个站点——问题、账本、猎物、仪器、边界、战场——都已走过一遍;剩下的路程,在每一位读者自己跑起来的代码里。