广义相对论水星近日点进动完整详细数学推导

从史瓦西度规 → 测地线方程 → 轨道微分方程 → 相对论修正 → 进动角公式,全程严谨推导。
一、基本前提
- 太阳静态球对称引力场,采用史瓦西度规
d s 2 = − ( 1 − 2 G M c 2 r ) c 2 d t 2 + d r 2 1 − 2 G M c 2 r + r 2 d θ 2 + r 2 sin 2 θ d φ 2 ds^2 = -\left(1-\frac{2GM}{c^2 r}\right)c^2dt^2 +\frac{dr^2}{1-\frac{2GM}{c^2 r}} +r^2d\theta^2 +r^2\sin^2\theta d\varphi^2 ds2=−(1−c2r2GM)c2dt2+1−c2r2GMdr2+r2dθ2+r2sin2θdφ2
行星做赤道面运动,取 θ = π 2 , d θ = 0 \theta=\dfrac{\pi}{2},\,d\theta=0 θ=2π,dθ=0,度规简化:
d s 2 = − ( 1 − 2 G M c 2 r ) c 2 d t 2 + d r 2 1 − 2 G M c 2 r + r 2 d φ 2 ds^2 = -\left(1-\frac{2GM}{c^2 r}\right)c^2dt^2 +\frac{dr^2}{1-\frac{2GM}{c^2 r}} +r^2d\varphi^2 ds2=−(1−c2r2GM)c2dt2+1−c2r2GMdr2+r2dφ2
-
定义变量替换
u = 1 r ⟹ d r = − 1 u 2 d u u=\frac1r \implies dr = -\frac{1}{u^2}du u=r1⟹dr=−u21du
-
自由粒子满足类时测地线 ,引入仿射参数 τ \tau τ(固有时),四速度归一:
g μ ν d x μ d τ d x ν d τ = − c 2 g_{\mu\nu}\frac{dx^\mu}{d\tau}\frac{dx^\nu}{d\tau}=-c^2 gμνdτdxμdτdxν=−c2
二、守恒量推导
1. 角动量守恒
φ \varphi φ 为循环坐标,角动量守恒:
L = r 2 d φ d τ = h = 常数 L=r^2\frac{d\varphi}{d\tau}=h=\text{常数} L=r2dτdφ=h=常数
d φ d τ = h u 2 \frac{d\varphi}{d\tau}=hu^2 dτdφ=hu2
2. 能量守恒
t t t 为循环坐标,能量守恒:
E = ( 1 − 2 G M c 2 r ) c 2 d t d τ = 常数 E=\left(1-\frac{2GM}{c^2 r}\right)c^2\frac{dt}{d\tau}=\text{常数} E=(1−c2r2GM)c2dτdt=常数
三、代入度规建立轨道方程
归一条件:
− ( 1 − 2 G M u c 2 ) ( d t d τ ) 2 c 2 + 1 1 − 2 G M u c 2 ( d r d τ ) 2 + r 2 ( d φ d τ ) 2 = − c 2 -\left(1-\frac{2GMu}{c^2}\right)\left(\frac{dt}{d\tau}\right)^2c^2 +\frac{1}{1-\frac{2GMu}{c^2}}\left(\frac{dr}{d\tau}\right)^2 +r^2\left(\frac{d\varphi}{d\tau}\right)^2 =-c^2 −(1−c22GMu)(dτdt)2c2+1−c22GMu1(dτdr)2+r2(dτdφ)2=−c2
把 d t d τ , d r d τ , d φ d τ \dfrac{dt}{d\tau},\dfrac{dr}{d\tau},\dfrac{d\varphi}{d\tau} dτdt,dτdr,dτdφ 全部换成对 φ \varphi φ 导数:
d r d τ = d r d φ d φ d τ = − h d u d φ \frac{dr}{d\tau}=\frac{dr}{d\varphi}\frac{d\varphi}{d\tau} =-h\frac{du}{d\varphi} dτdr=dφdrdτdφ=−hdφdu
代入守恒量,整理后两边除以 ( d φ d τ ) 2 = h 2 u 4 \left(\dfrac{d\varphi}{d\tau}\right)^2=h^2u^4 (dτdφ)2=h2u4,得到:
( d u d φ ) 2 + u 2 = 2 G M h 2 u 3 + E 2 c 2 h 2 \left(\frac{du}{d\varphi}\right)^2 + u^2 =\frac{2GM}{h^2}u^3+\frac{E^2}{c^2 h^2} (dφdu)2+u2=h22GMu3+c2h2E2
四、求导得到二阶轨道微分方程
等式两边对 φ \varphi φ 求导:
2 d u d φ d 2 u d φ 2 + 2 u d u d φ = 6 G M h 2 u 2 d u d φ 2\frac{du}{d\varphi}\frac{d^2u}{d\varphi^2}+2u\frac{du}{d\varphi} =\frac{6GM}{h^2}u^2\frac{du}{d\varphi} 2dφdudφ2d2u+2udφdu=h26GMu2dφdu
约去 2 d u d φ 2\dfrac{du}{d\varphi} 2dφdu(非平凡解不为 0):
d 2 u d φ 2 + u = G M h 2 + 3 G M u 2 \boldsymbol{\frac{d^2u}{d\varphi^2}+u = \frac{GM}{h^2}+3GM\,u^2} dφ2d2u+u=h2GM+3GMu2
对比牛顿力学方程
牛顿引力无时空弯曲修正:
d 2 u d φ 2 + u = G M h 2 \frac{d^2u}{d\varphi^2}+u = \frac{GM}{h^2} dφ2d2u+u=h2GM
多出相对论非线性修正项 : 3 G M u 2 \boldsymbol{3GM\,u^2} 3GMu2
五、微扰近似求解轨道
修正项极小,把解拆为牛顿椭圆解 + 小修正:
牛顿零阶解:
u 0 = G M h 2 ( 1 + e cos φ ) u_0=\frac{GM}{h^2}(1+e\cos\varphi) u0=h2GM(1+ecosφ)
e e e 为轨道偏心率。
设相对论解 u = u 0 + δ u u=u_0+\delta u u=u0+δu,代入方程忽略高阶小量,得到近似解:
u ≈ G M h 2 [ 1 + e cos ( ( 1 − ε ) φ ) ] , ε ≪ 1 u\approx \frac{GM}{h^2}\big[1+e\cos\big((1-\varepsilon)\varphi\big)\big],\quad \varepsilon\ll1 u≈h2GM[1+ecos((1−ε)φ)],ε≪1
六、求解一圈进动角度
轨道近日点满足余弦取极值,相位满足:
( 1 − ε ) φ = 2 π (1-\varepsilon)\varphi=2\pi (1−ε)φ=2π
公转几何转角:
φ = 2 π 1 − ε ≈ 2 π ( 1 + ε ) \varphi=\frac{2\pi}{1-\varepsilon}\approx 2\pi(1+\varepsilon) φ=1−ε2π≈2π(1+ε)
单圈额外偏转角度:
Δ φ = φ − 2 π = 2 π ε \Delta\varphi=\varphi-2\pi=2\pi\varepsilon Δφ=φ−2π=2πε
代入轨道半长轴 a a a、偏心率 e e e 关系:
h 2 = G M a ( 1 − e 2 ) h^2=GMa(1-e^2) h2=GMa(1−e2)
最终推导出广义相对论近日点进动公式:
Δ φ = 6 π G M c 2 a ( 1 − e 2 ) \boldsymbol{\Delta\varphi=\frac{6\pi GM}{c^2 a(1-e^2)}} Δφ=c2a(1−e2)6πGM
七、物理结论
-
牛顿理论: Δ φ = 0 \Delta\varphi=0 Δφ=0,轨道闭合无偏转;
-
广义相对论:存在正的偏转角度,行星每公转一周近日点向前移动;
-
水星轨道偏心率大、离太阳近,进动效应最显著,百年理论值 43 角秒,与观测严格吻合。
八、无量纲量级说明
G M c 2 \dfrac{GM}{c^2} c2GM 为太阳引力半径,数值极小,因此每圈进动角度极其微小,长期累积才可观测。
python
import numpy as np
import matplotlib.pyplot as plt
# Physical constants
G = 6.67430e-11
M_sun = 1.989e30
c = 3e8
# Mercury orbital parameters
a = 5.791e10
e = 0.2056
# Precession calculation
delta_phi_rad = 6 * np.pi * G * M_sun / (c**2 * a * (1 - e**2))
prec_per_cycle = delta_phi_rad
mercury_period_day = 88
total_day = 1000000 * 365
total_cycles = total_day / mercury_period_day
total_prec = total_cycles * prec_per_cycle
# Orbit function
def calc_orbit(phi, rotate_angle):
u0 = (1 + e) / a
u = u0 / (1 + e * np.cos(phi))
r = 1 / u
x = r * np.cos(phi + rotate_angle)
y = r * np.sin(phi + rotate_angle)
return x, y
phi = np.linspace(0, 2 * np.pi, 1000)
# Static orbit (no precession)
x_static, y_static = calc_orbit(phi, 0)
# Dynamic orbit after 1 million years precession
x_dynamic, y_dynamic = calc_orbit(phi, total_prec)
# Plot
plt.figure(figsize=(9, 9))
plt.plot(x_static, y_static, label='Initial Static Orbit', color='#1f77b4', linewidth=1.2)
plt.plot(x_dynamic, y_dynamic, label='Orbit after 1 Million Years', color='#d62728', linewidth=1.2)
plt.scatter(0, 0, c='#ff7f0e', s=220, label='Sun')
plt.axis('equal')
plt.legend(fontsize=11)
plt.title('Mercury Orbit Comparison Before & After 1 Million Years', fontsize=12)
plt.xlabel('X Coordinate (m)')
plt.ylabel('Y Coordinate (m)')
plt.grid(alpha=0.3)
plt.show()
# Output data
arcsec_conv = np.rad2deg(total_prec) * 3600
print(f"Total precession angle in 1 million years: {arcsec_conv:.2f} arcsec")