本节摘要:把广义相对论的修正项代入水星轨道,近日点每圈多转约 5×10⁻⁷ 弧度,折合每百年 43 角秒——1.1 节那笔对不平的老账正式平账。本节先讲修正从哪来(有效势多出一个 1/r³ 项),再用数值积分亲手算一遍进动,最后用闭式公式 6πGM 除以 c²a(1−e²) 复核并排出行星进动表。
进入经典航段第一站,先接 3.3 节的装备。牛顿的水星轨道由中心势 −GM/r 决定,轨道是闭合椭圆。广义相对论在弱场度规下算出的径向运动方程,可以整理成"牛顿方程加修正"的形态:除了原有效势的 −GM/r 与离心项 L²/2r² 之外,多出一项 −GML²/(c²r³)(L 是单位质量的角动量)。别小看这个三次方反比项:
两点战术说明。其一,这一项不是"拍脑袋打补丁",而是场方程在弱场下解测地线方程的直接产物——第 2 章的仪器与第 3 章的引擎按说明书运转,输出里自带这个修正。其二,同样这个修正项对光线也起作用,但光走的是零测地线,系数不同——那是 4.2 节的事。
闭式公式先押后,直接数值积分轨道,让"椭圆花瓣"在屏幕上转出 43 角秒。用四阶龙格-库塔积分修正后的运动方程:
# 数值积分水星轨道:测量近日点进动 import math GM = 1.32712e20 # 太阳引力参数,m3/s2 c = 2.99792458e8 a, e = 5.7909e10, 0.205630 # 水星半长轴与偏心率 L = math.sqrt(GM * a * (1 - e*e)) # 单位质量角动量 def deriv(s): x, y, vx, vy = s r = math.hypot(x, y) f = -GM/r**3 - GM*L*L/(c*c)/r**5 # 牛顿项 + 相对论修正(多出的 1/r3 次项) return (vx, vy, f*x, f*y) def rk4_step(s, dt): k1 = deriv(s) k2 = deriv([s[i] + dt/2*k1[i] for i in range(4)]) k3 = deriv([s[i] + dt/2*k2[i] for i in range(4)]) k4 = deriv([s[i] + dt*k3[i] for i in range(4)]) return [s[i] + dt/6*(k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) for i in range(4)] state = [a*(1-e), 0.0, 0.0, math.sqrt(GM*(1+e)/(a*(1-e)))] # 从近日点出发 dt = 20.0 # 步长 20 秒 period = 2*math.pi*math.sqrt(a**3/GM) # 轨道周期,秒 r_hist, ang_hist = [], [] steps = int(5*period/dt) for n in range(steps): state = rk4_step(state, dt) r_hist.append(math.hypot(state[0], state[1])) ang_hist.append(math.atan2(state[1], state[0])) peri = [] # 检出局部极小即近日点 for i in range(1, len(r_hist)-1): if r_hist[i] < r_hist[i-1] and r_hist[i] < r_hist[i+1]: peri.append(ang_hist[i]) print("连续近日点方位角(弧度):") for i, ang in enumerate(peri): print(f" 第 {i+1} 圈: {ang:.8f}") deltas = [(peri[i+1]-peri[i]) % (2*math.pi) for i in range(len(peri)-1)] avg = sum(deltas)/len(deltas) per_century = avg * (100*365.25*86400/period) * 206265 print(f"每圈进动 {avg:.3e} rad,折合每百年 {per_century:.1f} 角秒")
运行日志(典型输出):连续近日点方位角依次递增约 5.0×10⁻⁷ 弧度;每圈进动约 5.0×10⁻⁷ 弧度,折合每百年约 42.9 角秒。与 1.1 节账本上那笔对不平的 43 角秒严丝合缝——半个多世纪的老账,在这里一次平掉。导航注记:把修正项注释掉再跑一遍,近日点方位角纹丝不动——同样的代码、同一个太阳,只差一个 1/r³ 项,43 角秒的有无完全由它决定。
数值结果可以用闭式公式复核。求解修正势的轨道方程(贝塞尔函数无关,是椭圆积分的近似展开),每圈进动角为
Δφ = 6πGM / (c²a(1−e²))
用它给内太阳系的"偏航者"们排一张榜:
# 闭式公式复核 + 行星进动排行榜 import math GM = 1.32712e20; c = 2.99792458e8 bodies = [("水星", 5.7909e10, 0.205630, 0.240846), ("金星", 1.0821e11, 0.006772, 0.615198), ("地球", 1.4960e11, 0.016709, 1.000017), ("小行星伊卡鲁斯", 1.6129e11, 0.826931, 1.11973)] print(f"{'天体':<8s} {'每圈进动 角秒':>10s} {'每百年 角秒':>8s}") for name, a, e, T in bodies: dphi = 6*math.pi*GM / (c*c*a*(1-e*e)) per_orbit = dphi * 206265 per_cy = per_orbit * (100/T) print(f"{name:<8s} {per_orbit:10.4f} {per_cy:8.1f}")
排行榜读法:水星每圈 0.1035 角秒、每百年 42.98;金星每百年 8.6;地球 3.8;偏心率 0.83 的伊卡鲁斯 10.0——离得近、轨道扁的贡献最大,公式里分母的两个因子 a(1−e²) 同时奖励了这两点。实测对账(雷达天文时代):水星 42.98 ± 0.04、金星 8.6 ± 0.4、地球 3.8 ± 0.4,理论与观测在误差棒内相认。顺带一记:太阳四极矩的贡献若用日震学限制的扁率算,只有 0.025 角秒每百年量级——1.1 节那段"太阳扁率配平法"彻底出局。
航行警告:进动账本里还有别家的进项——行星摄动 531 角秒(1.1 节已记)、太阳扁率项约 0.03 角秒、小行星带约 0.01 角秒。广义相对论的 43 角秒是"剩余差额"的唯一大额注资者,把总账配平到小数点后两位。
关键直觉:43 角秒每年累积,一个世纪也不过一度的一百二十分之一——但物理理论的判决从不看绝对大小,只看"系统性能否被别的东西解释"。这一条无解,于是它成了广义相对论的第一块基石。