本节摘要:两体问题在牛顿框架内可以被完全求解——所有轨道都是圆锥曲线,运动方程能写成封闭表达式。本节沿"质心分离、角动量定面、能量定线、方程定形"四步把椭圆完整推出来,并用一个数值实验对照解析解,验证推导的每一环。这条推导路径是三体一切近似理论的模具,值得亲手走一遍。
两个天体的舞蹈凭什么能被一行公式写尽,三个天体就不行?把这个反差当成动力学问题而非口号来消化,最好的办法是把两体的解从头推一遍——重点不是椭圆这个结论,而是守恒量在推导的每一步分别买到了什么。看清每一步的交易,你才会在第 2 章明白三体为什么"钱不够"。
设质量 m_1、m_2 的两个质点位置为 \mathbf{r}_1、\mathbf{r}_2,只受彼此引力。写牛顿第二定律得到两个方程,看似是两体的事,其实有一半是废话:质心以 \mathbf{R} = (m_1\mathbf{r}_1 + m_2\mathbf{r}_2)/(m_1 + m_2) 表示,两式相加立刻得到 \ddot{\mathbf{R}} = \mathbf{0}——质心做匀速直线运动,永不受力。这一步干净地砍掉了一半自由度:剩下真正要解的只有相对位置 \mathbf{r} = \mathbf{r}_1 - \mathbf{r}_2,它满足
形式上这是一个"单位质量质点在固定中心引力场中的运动",等效引力参数用两个质量之和。天体力学里把 G(m_1+m_2) 记作 \mu,本节之后都用它。所谓"一体半",指的就是这个化约:两体问题等价于一个自由质点绕固定引力中心的单体问题,加上一段谁都会解的质心匀速运动。
💡 关键直觉:化约之所以可能,是因为动量守恒(等价于质心匀速)在这里"免费"送掉了六个自由度里的六个。守恒量不只是漂亮的性质,它们是降维工具——第 2 章的账本危机,本质就是这个工具在三体处失灵。
第一步,角动量定面。 相对运动的角动量 \mathbf{h} = \mathbf{r} \times \dot{\mathbf{r}} 对时间求导,因引力始终沿 \mathbf{r} 方向,叉积为零,\mathbf{h} 守恒。\mathbf{r} 永远垂直于常向量 \mathbf{h},意味着运动被锁死在一张固定平面里——三维问题塌成二维。这是守恒量买到的第二件货。
第二步,换极坐标写方程。 在平面内取极坐标 (r, \theta),角动量守恒给出 r^2\dot{\theta} = h(常数)。径向方程是 r 的二阶方程,直接解很笨;标准技巧是换元 u = 1/r、以 \theta 为自变量,二阶方程变成
第三步,通解就是圆锥曲线。 这是个谐振子型方程,通解 u = \frac{\mu}{h^2}\left(1 + e\cos\theta\right),其中 e 由初始条件定。翻译回 r(\theta):
这正是圆锥曲线的极坐标方程:e = 0 是圆,0 < e < 1 是椭圆,e = 1 抛物线,e > 1 双曲线。所有初值条件,无一例外落进这四类——这就是"通解"二字的分量。
第四步,能量挑曲线、开普勒三定律归位。 能量 E = \frac{1}{2}\dot{r}^2 - \frac{\mu}{r} 守恒(定值不改变轨道形状,只决定你在四类里落哪一类)。椭圆半长轴 a = p/(1-e^2),由活力公式 v^2 = \mu\left(\frac{2}{r} - \frac{1}{a}\right) 与速度挂钩。面积速度 \frac{1}{2}r^2\dot{\theta} = \frac{h}{2} 恒定,就是开普勒第二定律;对椭圆周期积分,得 T^2 = \frac{4\pi^2}{\mu}a^3,即第三定律——且系数里带着 m_1 + m_2,比开普勒的纯经验版本更准。

推导再漂亮,也要让轨道自己跑一遍才算数。这里做一个完整的小实验:取半长轴 a = 1、偏心率 e = 0.5 的椭圆(单位取天文单位与年,\mu = 4\pi^2,正是日地系统的量级),先用解析公式算出理论周期,再用辛积分器从初值积分三十个"理论周期"的时间,回过头检查轨道是否闭合、周期是否对得上、能量是否守住。
实验背景是验证四步推导;操作是在近日点起步——那里速度纯切向、最好算——初值由活力公式给出,然后用蛙跳格式推进,每步记录位置、能量与角度。代码如下:
import math mu = 4 * math.pi ** 2 # 日地量级引力参数 a, e = 1.0, 0.5 dt = 1.0e-3 # 近日点初值:位置在长轴端点,速度纯切向,由活力公式给出 r0 = a * (1 - e) # 近日距 = 0.5 v0 = math.sqrt(mu * (1 + e) / (a * (1 - e))) # 近日点速度 pos = [r0, 0.0] vel = [0.0, v0] def accel(p): r = math.hypot(p[0], p[1]) f = -mu / r ** 3 return [f * p[0], f * p[1]] def energy(p, v): return 0.5 * (v[0] ** 2 + v[1] ** 2) - mu / math.hypot(p[0], p[1]) # 蛙跳积分:先推半步速度,再交替推进 acc = accel(pos) E0 = energy(pos, vel) T_theory = 2 * math.pi * math.sqrt(a ** 3 / mu) # 理论周期 = 1 年 t, crossings, prev_y, n = 0.0, 0, pos[1], 0 while n < 30: vel = [vel[i] + 0.5 * dt * acc[i] for i in range(2)] pos = [pos[i] + dt * vel[i] for i in range(2)] acc = accel(pos) vel = [vel[i] + 0.5 * dt * acc[i] for i in range(2)] t += dt # 数近日点穿越计周期:y 由负转正即过一圈 if prev_y < 0 <= pos[1] and pos[0] > 0: crossings += 1 if crossings == 30: print("数值周期:", t / 30, "理论周期:", T_theory) break prev_y = pos[1] n_steps_guard = t / dt if n_steps_guard > 1.0e7: print("积分未收敛到闭合周期") break E_end = energy(pos, vel) print("相对能量漂移:", abs((E_end - E0) / E0))
结果:数值周期收敛到 1.000 年上下,与理论周期 T = 2\pi\sqrt{a^3/\mu} = 1 年吻合到小数点后四五位(步长再折半,误差按平方缩小);相对能量漂移在 10^{-7} 量级,且不随圈数单向增长,只在零点附近抖动;把三十圈的位置点画出来,椭圆与 r(\theta) = p/(1+e\cos\theta) 的解析曲线重合到肉眼不可分。
解读这份结果,要分三层看。第一层:解析公式与数值积分互相印证,说明四步推导里每一次"守恒量出手"都没出错。第二层:能量不单向漂移、轨道不会一圈圈慢慢散开,是蛙跳这种辛格式的签名——换成一阶欧拉法同样跑,能量会一圈圈爬升,轨道慢慢变胖,第 4 章会专门解剖这个对比。第三层最要紧:这一切成立的前提是问题只有两体。整个验证过程没有任何一步用到"第三个天体不存在"以外的特殊技巧,但也没有任何一步能推广过去——径向方程能凑成谐振子形状,靠的正是中心引力场只由一个源头产生。
变式可以往三个方向拧。把 e 调到 0.9,近日点处步长必须跟着缩小,否则近距通过时误差爆炸——这预演了三体问题里近距交会带来的积分难题;把 \mu 里的质量比改成 m_1 = m_2,你得到的是双星系统的相对轨道,形状不变但质心挪到了中点;再往系统里悄悄加进第三个哪怕极轻的质点,谐振子方程立刻凑不出来,圆锥曲线退场——这个"加一个质点看崩塌"的实验,建议你亲手做一次,它比任何论述都更能说明三体问题难在哪。
推导走完,值得把能带走的东西清点一遍。其一,守恒量是降维的通货:动量砍掉质心、角动量砍掉平面,两体问题能用守恒量"买断",是它可解的全部秘密。其二,中心性不可替代:径向方程能积出来,依赖引力源唯一且固定;三体里每个天体都处在两个移动源头上,方程结构当场变质。其三,通解的价值在于覆盖:一条公式管住全部初值,这层保险在三体里再也没有恢复过——后续每一类"解"都只覆盖某片特定的初值区域。其四,数值验证要盯能量:判断一条数值轨道可不可信,能量行为是最快的第一道筛子,这个手法从本节的单轨道一直用到第 5 章的混沌判别。
方程写尽了两体的温柔,也照出了三体的棱角。下一节沿编年史走一遍:三百年来的人类如何在这道棱角上,一次次换猎具、换问法。