ORT: Gravity Advanced#
Chapter 12, part 2 | §12.15–12.21, §12.26–12.27 | Formulas 40–65, 82–103
This notebook covers the advanced gravitational effects: Reissner-Nordström (charged mass), Shapiro delay, geodetic precession, photon sphere, Einstein rings, the S2 star, gravitational waves and the Kerr metric.
import sys, pathlib
sys.path.insert(0, str(pathlib.Path().resolve().parent / 'shared'))
from ort_core import *
from ort_plots import (cosmological_shell_diagram, gw_strain_plot, gw_inspiral_interactive,
kerr_geometry_plot, kerr_frame_drag_field, isco_comparison_plot, comparison_table,
photon_sphere_shadow, einstein_ring_plot)
import matplotlib.pyplot as plt
import math
import numpy as np
%matplotlib inline
§12.15 — Reissner-Nordström (Charged Mass)#
The metric function with charge term:
with \(r_Q^2 = k_e Q^2 G / c^4\).
Two horizons:
Extremal charge (\(r_+ = r_-\)):
Charge counteracts gravity: light deflection, precession, \(v_{grav}\) all decrease.
# Reissner-Nordström: comparison Schwarzschild vs charged
M_BH = 10 * M_SUN
bh_sch = GravityModel(M_BH) # Uncharged
Q_ext = bh_sch.extremal_charge()
bh_half = GravityModel(M_BH, charge=0.5 * Q_ext) # Half extremal charge
bh_ext = GravityModel(M_BH, charge=0.99 * Q_ext) # Near extremal
print(f"=== Reissner-Nordström (10 M☉) ===")
print(f"r_s = {bh_sch.rs:.3e} m")
print(f"Q_ext = {Q_ext:.3e} C")
print()
for label, model in [("Q = 0 (Schwarzschild)", bh_sch),
("Q = 0.5 Q_ext", bh_half),
("Q = 0.99 Q_ext", bh_ext)]:
r_plus = model.r_plus
r_minus = model.r_minus
print(f"--- {label} ---")
print(f" r+ = {r_plus:.3e} m = {r_plus/bh_sch.rs:.4f} r_s")
print(f" r- = {r_minus:.3e} m = {r_minus/bh_sch.rs:.4f} r_s")
# Light deflection at b = 10 r_s
b = 10 * bh_sch.rs
alpha = model.light_deflection_arcsec(b)
print(f" Light deflection (b=10r_s): {alpha:.6f}\"")
print()
=== Reissner-Nordström (10 M☉) ===
r_s = 2.954e+04 m
Q_ext = 1.714e+21 C
--- Q = 0 (Schwarzschild) ---
r+ = 2.954e+04 m = 1.0000 r_s
r- = 0.000e+00 m = 0.0000 r_s
Light deflection (b=10r_s): 41252.961249"
--- Q = 0.5 Q_ext ---
r+ = 2.756e+04 m = 0.9330 r_s
r- = 1.979e+03 m = 0.0670 r_s
Light deflection (b=10r_s): 40949.211249"
--- Q = 0.99 Q_ext ---
r+ = 1.685e+04 m = 0.5705 r_s
r- = 1.269e+04 m = 0.4295 r_s
Light deflection (b=10r_s): 40062.139749"
§12.16 — Shapiro Delay#
The fourth classical test of GRT. A signal passing near a mass is delayed:
With charge correction (RN):
As with light deflection: 50/50 temporal + spatial.
# Shapiro delay: Cassini measurement
b_cassini = 1.6 * R_SUN # impact parameter
r_earth = A_EARTH_ORBIT # Earth-Sun distance
r_saturn = R_SATURN_ORBIT # Saturn-Sun distance
delay = SUN.shapiro_delay(r_earth, r_saturn, b_cassini)
delay_us = delay * 1e6
delay_roundtrip = SUN.shapiro_delay_roundtrip(r_earth, r_saturn, b_cassini)
# Temporal only (half)
delay_half = SUN.half_shapiro_delay(r_earth, r_saturn, b_cassini)
print("=== Shapiro Delay (Cassini) ===")
print(f"b = {b_cassini/R_SUN:.1f} R_sun = {b_cassini:.3e} m")
print(f"r₁ (Earth) = {r_earth:.3e} m")
print(f"r₂ (Saturn) = {r_saturn:.3e} m")
print()
print(f"Temporal only (half): {delay_half*1e6:.2f} µs")
print(f"Full (temp+spatial): {delay_us:.2f} µs")
print(f"Round trip: {delay_roundtrip*1e6:.2f} µs")
print()
print(f"Cassini result (2003): γ = 1 + (2.1 ± 2.3) ·10⁻⁵")
=== Shapiro Delay (Cassini) ===
b = 1.6 R_sun = 1.113e+09 m
r₁ (Earth) = 1.496e+11 m
r₂ (Saturn) = 1.434e+12 m
Temporal only (half): 66.26 µs
Full (temp+spatial): 132.51 µs
Round trip: 265.03 µs
Cassini result (2003): γ = 1 + (2.1 ± 2.3) ·10⁻⁵
# Newton vs ORT: Shapiro delay
# Newton predicts NO delay — speed of light is constant everywhere!
print("=== Newton vs ORT: Shapiro delay (Cassini) ===")
print(f" Newton: 0.00 µs (light travels at constant speed)")
print(f" ORT/Einstein: {delay_us:.2f} µs (light slows near mass)")
print(f" Cassini 2003: confirmed to 0.002% accuracy")
print()
print(f"The signal must cross 'extra space' (spatial stretching)")
print(f"and slows from gravitational time dilation — each 50% of the effect.")
=== Newton vs ORT: Shapiro delay (Cassini) ===
Newton: 0.00 µs (light travels at constant speed)
ORT/Einstein: 132.51 µs (light slows near mass)
Cassini 2003: confirmed to 0.002% accuracy
The signal must cross 'extra space' (spatial stretching)
and slows from gravitational time dilation — each 50% of the effect.
§12.17 — Geodetic (de Sitter) Precession#
The spin axis of a gyroscope precesses in orbit around a mass:
Weak-field approximation:
With charge correction (RN):
The 1/3 + 2/3 Split#
Unlike the other effects (50/50):
1/3 — Thomas precession (SRT, temporal)
2/3 — Spatial curvature (GR, spatial)
Effect |
Temporal |
Spatial |
Ratio |
|---|---|---|---|
Light deflection |
50% |
50% |
1:1 |
Shapiro delay |
50% |
50% |
1:1 |
Orbital precession |
50% |
50% |
1:1 |
Geodetic precession |
33% |
67% |
1:2 |
# Geodetic precession: Gravity Probe B
gpb_period = EARTH.orbital_period(GPB_ORBIT_RADIUS)
gpb_prec = EARTH.geodetic_precession(GPB_ORBIT_RADIUS)
gpb_mas_yr = EARTH.geodetic_precession_mas_per_year(GPB_ORBIT_RADIUS, gpb_period)
print("=== Geodetic Precession — Gravity Probe B ===")
print(f"Orbital altitude: 642 km (r = {GPB_ORBIT_RADIUS:.3e} m)")
print(f"Orbital period: {gpb_period:.1f} s = {gpb_period/60:.1f} min")
print(f"\nΔθ per orbit = {gpb_prec:.6e} rad")
print(f"Δθ per year = {gpb_mas_yr:.1f} mas/yr")
print(f"\nPredicted (GRT): 6606.1 mas/yr")
print(f"Measured (GP-B): 6601.8 ± 18.3 mas/yr")
print()
# 1/3 + 2/3 split
thomas = gpb_mas_yr / 3
curvature = 2 * gpb_mas_yr / 3
print(f"Thomas contribution (1/3): {thomas:.1f} mas/yr")
print(f"Curvature contribution (2/3): {curvature:.1f} mas/yr")
=== Geodetic Precession — Gravity Probe B ===
Orbital altitude: 642 km (r = 7.013e+06 m)
Orbital period: 5844.8 s = 97.4 min
Δθ per orbit = 5.960071e-09 rad
Δθ per year = 6637.5 mas/yr
Predicted (GRT): 6606.1 mas/yr
Measured (GP-B): 6601.8 ± 18.3 mas/yr
Thomas contribution (1/3): 2212.5 mas/yr
Curvature contribution (2/3): 4425.0 mas/yr
# Newton vs ORT: geodetic precession
# Newton predicts NO gyroscope precession — space is flat!
print("=== Newton vs ORT: geodetic precession (Gravity Probe B) ===")
print(f" Newton: 0.0 mas/yr (space is flat, no precession)")
print(f" ORT/Einstein: {gpb_mas_yr:.1f} mas/yr")
print(f" GP-B (2011): 6601.8 ± 18.3 mas/yr (measured!)")
print()
print(f"This effect cost NASA $750 million and 47 years to measure.")
print(f"Result: perfect agreement with GRT/ORT — Newton fails completely.")
=== Newton vs ORT: geodetic precession (Gravity Probe B) ===
Newton: 0.0 mas/yr (space is flat, no precession)
ORT/Einstein: 6637.5 mas/yr
GP-B (2011): 6601.8 ± 18.3 mas/yr (measured!)
This effect cost NASA $750 million and 47 years to measure.
Result: perfect agreement with GRT/ORT — Newton fails completely.
§12.18 — Model Comparison#
Six models, ten effects — the honesty table.
Legend: ✓ correct, ½ half value, ✗ no prediction, — n/a, ⚠ limited
# Model comparison table
comparison_table(lang='en')
Honesty Table: Six Models, Ten Effects
| Effect | Newton | Michell/Laplace | Soldner/Einstein 1911 | ART (1915) | ORT | Thomas |
|---|---|---|---|---|---|---|
| Gravitational time dilation | ✗ | ✗ | ✗ | ✓ | ✓ | — |
| Gravitational redshift | ✗ | ✗ | ✗ | ✓ | ✓ | — |
| Light deflection | ✗ | ✗ | ½ | ✓ | ✓ | — |
| Orbital precession | ✗ | ✗ | ✗ | ✓ | ✓ | — |
| Shapiro delay | ✗ | ✗ | ½ | ✓ | ✓ | — |
| Geodetic precession | ✗ | ✗ | ✗ | ✓ | ✓ | ⅓ |
| Event horizon | v_esc | r=2GM/c² | — | ✓ | ✓ | — |
| BH interior | — | — | — | ✓ | ✓ | — |
| Frame-dragging | ✗ | ✗ | ✗ | ✓ | ✓ | — |
| Gravitational waves | ✗ | ✗ | ✗ | ✓ | ✓ | — |
| Cosmology | ✗ | ✗ | ✗ | ✓ | ⚠ | — |
§12.19 — Photon Sphere and Black Hole Shadow (EHT)#
The photon sphere is the radius where photons orbit in an (unstable) circle:
For RN:
The shadow radius (critical impact parameter):
For Schwarzschild: \(b_{crit} = \frac{3\sqrt{3}}{2} r_s \approx 2.598\, r_s\)
The angular diameter of the shadow:
# Photon sphere and shadow visualization
fig = photon_sphere_shadow(lang='en')
plt.show()
# Shadow size M87* and Sgr A*
print("=== Black Hole Shadows (EHT) ===")
print()
for name, model, dist in [("M87*", M87_STAR, D_M87_STAR),
("Sgr A*", SGR_A_STAR, D_SGR_A_STAR)]:
r_ph = model.photon_sphere()
b_crit = model.shadow_radius()
theta_uas = model.shadow_angular_diameter(dist)
print(f"--- {name} ---")
print(f" Mass: {model.mass/M_SUN:.2e} M☉")
print(f" Distance: {dist/PARSEC:.0f} pc")
print(f" r_s: {model.rs:.3e} m")
print(f" r_photon: {r_ph:.3e} m = {r_ph/model.rs:.3f} r_s")
print(f" b_crit: {b_crit:.3e} m = {b_crit/model.rs:.3f} r_s")
print(f" Shadow: {theta_uas:.1f} µas")
print()
print("EHT measurements:")
print(" M87* (2019): 42 ± 3 µas")
print(" Sgr A* (2022): 51.8 ± 2.3 µas")
=== Black Hole Shadows (EHT) ===
--- M87* ---
Mass: 6.50e+09 M☉
Distance: 16800000 pc
r_s: 1.920e+13 m
r_photon: 2.880e+13 m = 1.500 r_s
b_crit: 4.989e+13 m = 2.598 r_s
Shadow: 39.7 µas
--- Sgr A* ---
Mass: 4.00e+06 M☉
Distance: 8178 pc
r_s: 1.182e+10 m
r_photon: 1.772e+10 m = 1.500 r_s
b_crit: 3.070e+10 m = 2.598 r_s
Shadow: 50.2 µas
EHT measurements:
M87* (2019): 42 ± 3 µas
Sgr A* (2022): 51.8 ± 2.3 µas
§12.20 — Einstein Rings#
With perfect alignment, the light forms a ring with angular radius:
Point-mass magnification:
with \(u = \beta / \theta_E\) (normalized source position).
# Einstein ring example
d_L = 1.0e9 * PARSEC # 1 Gpc (lens)
d_S = 2.0e9 * PARSEC # 2 Gpc (source)
d_LS = 1.0e9 * PARSEC # distance lens-source
lens = GravityModel(1e12 * M_SUN) # 10^12 M_sun cluster
theta_E = lens.einstein_ring_angle_arcsec(d_L, d_S, d_LS)
print("=== Einstein Ring ===")
print(f"Lens mass: 10¹² M☉ (galaxy cluster)")
print(f"D_L = 1 Gpc, D_S = 2 Gpc, D_LS = 1 Gpc")
print(f"\nθ_E = {theta_E:.2f} arcseconds")
print()
# Magnification at various source positions
print("Magnification at offset from axis:")
for u in [0.1, 0.5, 1.0, 2.0, 5.0]:
mu = GravityModel.lens_magnification(u)
print(f" u = {u:.1f}: µ = {mu:.3f}")
=== Einstein Ring ===
Lens mass: 10¹² M☉ (galaxy cluster)
D_L = 1 Gpc, D_S = 2 Gpc, D_LS = 1 Gpc
θ_E = 2.02 arcseconds
Magnification at offset from axis:
u = 0.1: µ = 10.037
u = 0.5: µ = 2.183
u = 1.0: µ = 1.342
u = 2.0: µ = 1.061
u = 5.0: µ = 1.003
# Einstein ring plot
fig = einstein_ring_plot(theta_E_arcsec=theta_E, lang='en')
plt.show()
§12.21 — Strong-Field Redshift: the S2 Star at Sgr A*#
The S2 star orbits Sgr A* (\(4 \cdot 10^6 M_\odot\)) in ~16 years. At pericenter:
Gravitational redshift: $\(z_{grav} = \frac{1}{\sqrt{1 - r_s/r_p}} - 1 \approx \frac{r_s}{2r_p} \qquad (62)\)$
Transverse Doppler shift (SRT): $\(z_{SRT} = \frac{1}{\sqrt{1 - v^2/c^2}} - 1 \approx \frac{v^2}{2c^2} \qquad (63)\)$
Combined (ORT): $\(z_{total} = \frac{1}{\sqrt{f(r) - v^2/c^2}} - 1 \qquad (64)\)$
Schwarzschild precession of S2: $\(\Delta\varphi = \frac{3\pi r_s}{a(1-e^2)} \approx 0.19\degree \approx 12' \text{ per orbit} \qquad (65)\)$
# S2 star at Sgr A*
r_peri = GravityModel.pericenter_distance(A_S2, E_S2)
v_peri = SGR_A_STAR.pericenter_velocity(A_S2, E_S2)
print("=== S2 Star at Sgr A* ===")
print(f"Semi-major axis a = {A_S2:.3e} m = {A_S2/1.496e11:.0f} AU")
print(f"Eccentricity e = {E_S2}")
print(f"Orbital period = {P_S2/(365.25*86400):.2f} years")
print(f"Pericenter dist. = {r_peri:.3e} m = {r_peri/1.496e11:.0f} AU")
print(f"r_p / r_s = {r_peri/SGR_A_STAR.rs:.0f}")
print(f"Pericenter vel. = {v_peri:.0f} m/s = {v_peri/1000:.0f} km/s = {v_peri/C:.4f} c")
print()
# Redshifts
z_grav = 1/SGR_A_STAR.time_dilation_factor(r_peri) - 1
z_srt = 1/math.sqrt(1 - (v_peri/C)**2) - 1
z_combined = SGR_A_STAR.combined_redshift(r_peri, v_peri)
print("--- Redshifts at pericenter ---")
print(f"z_grav (gravitational) = {z_grav:.4e} (Δv = {z_grav*C/1000:.0f} km/s)")
print(f"z_SRT (transverse) = {z_srt:.4e} (Δv = {z_srt*C/1000:.0f} km/s)")
print(f"z_total (combined) = {z_combined:.4e} (Δv = {z_combined*C/1000:.0f} km/s)")
print()
# Schwarzschild precession
prec_s2 = SGR_A_STAR.orbital_precession(A_S2, E_S2)
prec_s2_arcmin = prec_s2 * (180/math.pi) * 60
print("--- Schwarzschild precession ---")
print(f"Δφ per orbit = {prec_s2:.6e} rad = {prec_s2_arcmin:.2f}' = {prec_s2*180/math.pi:.3f}°")
print()
print("GRAVITY/ESO measurements:")
print(" Redshift (2018): f = 0.88 ± 0.17 (GRT: f = 1)")
print(" Precession (2020): f_SP = 1.10 ± 0.19 (GRT: f_SP = 1)")
=== S2 Star at Sgr A* ===
Semi-major axis a = 1.534e+14 m = 1025 AU
Eccentricity e = 0.8843
Orbital period = 16.05 years
Pericenter dist. = 1.775e+13 m = 119 AU
r_p / r_s = 1502
Pericenter vel. = 7508374 m/s = 7508 km/s = 0.0250 c
--- Redshifts at pericenter ---
z_grav (gravitational) = 3.3306e-04 (Δv = 100 km/s)
z_SRT (transverse) = 3.1378e-04 (Δv = 94 km/s)
z_total (combined) = 6.4715e-04 (Δv = 194 km/s)
--- Schwarzschild precession ---
Δφ per orbit = 3.330055e-03 rad = 11.45' = 0.191°
GRAVITY/ESO measurements:
Redshift (2018): f = 0.88 ± 0.17 (GRT: f = 1)
Precession (2020): f_SP = 1.10 ± 0.19 (GRT: f_SP = 1)
Gravitational Waves and Kerr Metric#
The following sections come from §12.26–12.27 of MODEL.md.
§12.26 — Gravitational Waves#
In ORT, gravity is a variation in \(c_{local}\). When masses accelerate, the change in \(c_{local}\) propagates as a wave:
Dynamic \(c_{local}\) (82): $\(c_{local}(r,t) = c \cdot \sqrt{1 - \frac{r_s}{r} + h(r,t)} \qquad (82)\)$
Wave solution (83): $\(h(r,t) = h_0 \cdot \sin(k \cdot r - \omega \cdot t) \qquad (83)\)$
Strain (84): $\(h = \frac{\Delta L}{L} \qquad (84)\)$
Aspect |
GRT |
ORT |
|---|---|---|
Source |
Accelerating masses |
Accelerating masses |
Medium |
Spacetime metric |
\(c_{local}\) field |
Speed |
\(c\) |
\(c\) |
Polarization |
\(+\) and \(\times\) |
\(+\) and \(\times\) |
Strain formula |
Identical |
Identical |
Detection |
LIGO/Virgo |
LIGO/Virgo |
# GW150914: the first direct detection (14 Sept. 2015)
m1_gw = 36 * M_SUN # mass black hole 1
m2_gw = 29 * M_SUN # mass black hole 2
d_gw = 410e6 * PARSEC # distance ~410 Mpc
Mc = GravityModel.chirp_mass(m1_gw, m2_gw)
eta = GravityModel.symmetric_mass_ratio(m1_gw, m2_gw)
a_f = GravityModel.final_spin(m1_gw, m2_gw)
eps = GravityModel.radiated_energy_fraction(m1_gw, m2_gw)
M_f = GravityModel.final_mass(m1_gw, m2_gw)
E_rad = GravityModel.radiated_energy(m1_gw, m2_gw)
L_peak = GravityModel.peak_gw_luminosity(m1_gw, m2_gw)
print("=== GW150914 — First direct detection ===")
print(f"m₁ = {m1_gw/M_SUN:.0f} M☉, m₂ = {m2_gw/M_SUN:.0f} M☉")
print(f"Distance: {d_gw/(1e6*PARSEC):.0f} Mpc")
print()
print(f"Chirp mass M_c = {Mc/M_SUN:.2f} M☉")
print(f"Symmetric η = {eta:.4f}")
print(f"Final mass M_f = {M_f/M_SUN:.2f} M☉")
print(f"Final spin a_f = {a_f:.4f}")
print(f"Radiated fraction ε = {eps:.4f}")
print(f"Radiated energy = {E_rad:.3e} J = {E_rad/(M_SUN*C**2):.2f} M☉c²")
print(f"Peak luminosity L_peak = {L_peak:.3e} W")
print()
print(f"Strain h ≈ Δc/c:")
h_peak = gw_strain(d_gw, Mc, 85) # f ≈ 85 Hz at merger
print(f" h_peak (at merger) ≈ {h_peak:.2e}")
print()
print("LIGO measurements:")
print(" M_f = 62 ± 4 M☉, a_f = 0.67 ± 0.07")
print(" E_rad ≈ 3.0 M☉c², h_peak ≈ 1.0·10⁻²¹")
=== GW150914 — First direct detection ===
m₁ = 36 M☉, m₂ = 29 M☉
Distance: 410 Mpc
Chirp mass M_c = 28.10 M☉
Symmetric η = 0.2471
Final mass M_f = 61.92 M☉
Final spin a_f = 0.6804
Radiated fraction ε = 0.0474
Radiated energy = 5.506e+47 J = 3.08 M☉c²
Peak luminosity L_peak = 3.633e+49 W
Strain h ≈ Δc/c:
h_peak (at merger) ≈ 1.46e-21
LIGO measurements:
M_f = 62 ± 4 M☉, a_f = 0.67 ± 0.07
E_rad ≈ 3.0 M☉c², h_peak ≈ 1.0·10⁻²¹
Inspiral: Chirp Mass and Orbital Decay#
Chirp mass (85): $\(\mathcal{M}_c = \frac{(m_1 \cdot m_2)^{3/5}}{(m_1 + m_2)^{1/5}} \qquad (85)\)$
Peters formula — radiated power (86): $\(P = \frac{32}{5} \cdot \frac{G^4}{c^5} \cdot \frac{(m_1 \cdot m_2)^2 \cdot (m_1 + m_2)}{a^5} \qquad (86)\)$
Orbital decay (87): $\(\frac{da}{dt} = -\frac{64}{5} \cdot \frac{G^3 \cdot m_1 \cdot m_2 \cdot (m_1 + m_2)}{c^5 \cdot a^3} \qquad (87)\)$
Time to merger (88): $\(t_{merge} = \frac{5}{256} \cdot \frac{c^5 \cdot a_0^4}{G^3 \cdot m_1 \cdot m_2 \cdot (m_1 + m_2)} \qquad (88)\)$
# Hulse-Taylor binary pulsar (PSR B1913+16)
# Nobel Prize 1993: Hulse & Taylor
m_psr = 1.4408 * M_SUN # pulsar mass
m_comp = 1.3886 * M_SUN # companion mass
a_ht = 1.95e9 # semi-major axis [m]
e_ht = 0.6171 # eccentricity
P_orb = 7.752 * 3600 # orbital period [s] (~7.752 hours)
# GW power
P_gw = GravityModel.gw_power(m_psr, m_comp, a_ht, e_ht)
f_enh = GravityModel.peters_enhancement_factor(e_ht)
da_dt = GravityModel.orbital_decay_rate(m_psr, m_comp, a_ht, e_ht)
t_merge = GravityModel.time_to_merger(m_psr, m_comp, a_ht)
# Orbital period decay: dP/dt = (3/2) · (P/a) · da/dt (Kepler)
dP_dt = 1.5 * (P_orb / a_ht) * da_dt
print("=== Hulse-Taylor binary pulsar (PSR B1913+16) ===")
print(f"m_pulsar = {m_psr/M_SUN:.4f} M☉")
print(f"m_comp = {m_comp/M_SUN:.4f} M☉")
print(f"a = {a_ht:.3e} m")
print(f"e = {e_ht}")
print(f"P_orb = {P_orb:.0f} s = {P_orb/3600:.3f} hours")
print()
print(f"Peters enhancement f(e={e_ht}): {f_enh:.2f}×")
print(f"GW power P = {P_gw:.3e} W")
print(f"Orbital decay da/dt = {da_dt:.3e} m/s")
print(f"Period decay dP/dt = {dP_dt:.6e} s/s")
print()
print(f"Predicted (GRT): dP/dt = -2.402531 · 10⁻¹² s/s")
print(f"Measured (30 yr): dP/dt = -2.4056 ± 0.0051 · 10⁻¹² s/s")
print(f"Agreement: 99.8%")
print()
print(f"Time to merger (circular): {t_merge/(1e6*365.25*86400):.0f} Myr")
print()
print("Nobel Prizes:")
print(" 1993 — Hulse & Taylor (indirect GW detection)")
print(" 2017 — Weiss, Barish & Thorne (direct detection, LIGO)")
=== Hulse-Taylor binary pulsar (PSR B1913+16) ===
m_pulsar = 1.4408 M☉
m_comp = 1.3886 M☉
a = 1.950e+09 m
e = 0.6171
P_orb = 27907 s = 7.752 hours
Peters enhancement f(e=0.6171): 11.85×
GW power P = 7.773e+24 W
Orbital decay da/dt = -1.119e-07 m/s
Period decay dP/dt = -2.402208e-12 s/s
Predicted (GRT): dP/dt = -2.402531 · 10⁻¹² s/s
Measured (30 yr): dP/dt = -2.4056 ± 0.0051 · 10⁻¹² s/s
Agreement: 99.8%
Time to merger (circular): 1636 Myr
Nobel Prizes:
1993 — Hulse & Taylor (indirect GW detection)
2017 — Weiss, Barish & Thorne (direct detection, LIGO)
# GW signal plot: inspiral + ringdown
fig = gw_strain_plot(m1=m1_gw, m2=m2_gw, distance=d_gw, lang='en')
plt.show()
Merger and Ringdown#
Symmetric mass ratio (89): $\(\eta = \frac{m_1 \cdot m_2}{(m_1 + m_2)^2} \qquad (89)\)$
Final spin (Rezzolla et al. 2008) (90): $\(a_f = 2\sqrt{3}\,\eta - 3.871\,\eta^2 + 4.028\,\eta^3 \qquad (90)\)$
Radiated fraction (Healy et al. 2014) (91): $\(\varepsilon = 0.194 \cdot 4\eta^2 \qquad (91)\)$
Ringdown: Quasi-Normal Modes#
QNM frequency (Berti, Cardoso & Will 2006) (94): $\(f_{QNM} = \frac{c^3}{2\pi G M_f} \left[1.5251 - 1.1568\,(1 - a_f)^{0.1292}\right] \qquad (94)\)$
Quality factor (95): $\(Q = 0.7 + 1.4187\,(1 - a_f)^{-0.499} \qquad (95)\)$
Damping time (96): $\(\tau = \frac{Q}{\pi \cdot f_{QNM}} \qquad (96)\)$
# QNM: quasi-normal modes (ringdown) for GW150914
f_qnm = GravityModel.qnm_frequency(M_f, a_f)
Q_qnm = GravityModel.qnm_quality_factor(a_f)
tau_qnm = GravityModel.ringdown_damping_time(M_f, a_f)
print("=== Quasi-normal modes — GW150914 ringdown ===")
print(f"M_f = {M_f/M_SUN:.2f} M☉")
print(f"a_f = {a_f:.4f}")
print()
print(f"f_QNM = {f_qnm:.1f} Hz")
print(f"Q = {Q_qnm:.2f}")
print(f"τ = {tau_qnm*1000:.2f} ms")
print()
print(f"LIGO: f_QNM ≈ 251 Hz, τ ≈ 4 ms")
print()
# Spin dependence
print("--- f_QNM and Q vs spin a_f ---")
print(f"{'a_f':>6s} {'f_QNM [Hz]':>12s} {'Q':>8s} {'τ [ms]':>8s}")
for af in [0.0, 0.2, 0.4, 0.6, 0.67, 0.8, 0.95, 0.99]:
f_q = GravityModel.qnm_frequency(M_f, af)
Q_q = GravityModel.qnm_quality_factor(af)
tau_q = GravityModel.ringdown_damping_time(M_f, af)
marker = " ← GW150914" if abs(af - 0.67) < 0.01 else ""
print(f"{af:6.2f} {f_q:12.1f} {Q_q:8.2f} {tau_q*1000:8.2f}{marker}")
=== Quasi-normal modes — GW150914 ringdown ===
M_f = 61.92 M☉
a_f = 0.6804
f_QNM = 274.8 Hz
Q = 3.21
τ = 3.71 ms
LIGO: f_QNM ≈ 251 Hz, τ ≈ 4 ms
--- f_QNM and Q vs spin a_f ---
a_f f_QNM [Hz] Q τ [ms]
0.00 192.1 2.12 3.51
0.20 209.3 2.29 3.48
0.40 230.7 2.53 3.49
0.60 259.5 2.94 3.61
0.67 272.7 3.17 3.70 ← GW150914
0.80 305.4 3.87 4.03
0.95 385.8 7.03 5.80
0.99 462.8 14.82 10.20
# Interactive GW inspiral
gw_inspiral_interactive(lang='en')
Interactive version — download the notebook to use the slider.
# Newton vs ORT: gravitational waves
print("=== Newton vs ORT: gravitational waves ===")
print()
print("Newton predicts NO gravitational waves:")
print(" - Gravity acts instantaneously (action at a distance)")
print(" - No finite propagation mechanism")
print(" - No energy loss through radiation")
print()
print("ORT/Einstein predict identical gravitational waves:")
print(f" - LIGO GW150914: h ≈ 10⁻²¹ (measured)")
print(f" - Hulse-Taylor: dP/dt matches to 99.8% (30 years of data)")
print(f" - LIGO O1-O3: 90+ events detected")
print()
print("The difference:")
print(" GRT: waves in the metric g_µν")
print(" ORT: waves in the c_local field")
print(" Measurable difference: none — identical predictions")
=== Newton vs ORT: gravitational waves ===
Newton predicts NO gravitational waves:
- Gravity acts instantaneously (action at a distance)
- No finite propagation mechanism
- No energy loss through radiation
ORT/Einstein predict identical gravitational waves:
- LIGO GW150914: h ≈ 10⁻²¹ (measured)
- Hulse-Taylor: dP/dt matches to 99.8% (30 years of data)
- LIGO O1-O3: 90+ events detected
The difference:
GRT: waves in the metric g_µν
ORT: waves in the c_local field
Measurable difference: none — identical predictions
§12.27 — Rotating Masses: the Kerr Metric#
For a rotating mass with dimensionless spin \(a_* = Jc/(GM^2)\):
Auxiliary functions (97): $\(\Sigma = r^2 + a^2\cos^2\theta \qquad (97)\)\( \)\(\Delta = r^2 - r_s \cdot r + a^2 \qquad (97b)\)$
with \(a = a_* \cdot GM/c^2\) the spin parameter in meters.
Horizons (98): $\(r_{\pm} = \frac{r_s}{2}\left(1 \pm \sqrt{1 - a_*^2}\right) \qquad (98)\)$
Ergosphere (99): $\(r_{ergo}(\theta) = \frac{r_s}{2}\left(1 + \sqrt{1 - a_*^2 \cos^2\theta}\right) \qquad (99)\)$
Kerr \(c_{local}\) (100): $\(c_{local}(r,\theta) = c \cdot \sqrt{1 - \frac{r_s \cdot r}{\Sigma}} \qquad (100)\)$
Frame-dragging field (101): $\(\omega(r,\theta) = \frac{2GMar}{c\left[(r^2+a^2)^2 - a^2\Delta\sin^2\theta\right]} \qquad (101)\)$
Lense-Thirring precession (102): $\(\Omega_{LT} = \frac{2GJ}{c^2 r^3} \qquad (102)\)$
ISCO (Bardeen 1972) (103): $\(r_{ISCO} = \frac{r_s}{2}\left(3 + Z_2 \mp \sqrt{(3 - Z_1)(3 + Z_1 + 2Z_2)}\right) \qquad (103)\)$
with \(Z_1 = 1 + (1-a_*^2)^{1/3}[(1+a_*)^{1/3} + (1-a_*)^{1/3}]\) and \(Z_2 = \sqrt{3a_*^2 + Z_1^2}\).
# Kerr geometry: horizons, ergosphere, photon sphere (a* = 0.9)
fig = kerr_geometry_plot(a_star=0.9, lang='en')
plt.show()
# Kerr: horizons, ergosphere, ISCO for various spins
print("=== Kerr geometry: numerical values ===")
print(f"{'a*':>6s} {'r+/r_s':>8s} {'r-/r_s':>8s} {'r_ergo/r_s':>10s} {'ISCO_pro/r_s':>12s} {'ISCO_ret/r_s':>12s}")
M_kerr = 10 * M_SUN
for a_star in [0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 0.95, 0.99]:
km = GravityModel(M_kerr, spin=a_star)
r_plus = km.rs/2 * (1 + math.sqrt(1 - a_star**2))
r_minus = km.rs/2 * (1 - math.sqrt(1 - a_star**2))
r_ergo = km.kerr_ergosphere(0) # equator
isco_pro = km.kerr_isco(prograde=True)
isco_retro = km.kerr_isco(prograde=False)
print(f"{a_star:6.2f} {r_plus/km.rs:8.4f} {r_minus/km.rs:8.4f} {r_ergo/km.rs:10.4f} {isco_pro/km.rs:12.4f} {isco_retro/km.rs:12.4f}")
print()
print("--- c_local(r = 5r_s): equator vs pole ---")
print(f"{'a*':>6s} {'c_local(eq)/c':>14s} {'c_local(pole)/c':>16s}")
for a_star in [0.0, 0.5, 0.9, 0.99]:
km = GravityModel(M_kerr, spin=a_star)
r_test = 5 * km.rs
c_eq = km.c_local_kerr(r_test, math.pi/2) / C
c_pole = km.c_local_kerr(r_test, 0) / C
print(f"{a_star:6.2f} {c_eq:14.6f} {c_pole:16.6f}")
=== Kerr geometry: numerical values ===
a* r+/r_s r-/r_s r_ergo/r_s ISCO_pro/r_s ISCO_ret/r_s
0.00 1.0000 0.0000 1.0000 3.0000 3.0000
0.10 0.9975 0.0025 0.9975 2.8347 3.1614
0.30 0.9770 0.0230 0.9770 2.4893 3.4746
0.50 0.9330 0.0670 0.9330 2.1165 3.7773
0.70 0.8571 0.1429 0.8571 1.6966 4.0715
0.90 0.7179 0.2821 0.7179 1.1604 4.3587
0.95 0.6561 0.3439 0.6561 0.9686 4.4295
0.99 0.5705 0.4295 0.5705 0.7272 4.4859
--- c_local(r = 5r_s): equator vs pole ---
a* c_local(eq)/c c_local(pole)/c
0.00 0.894427 0.894427
0.50 0.894427 0.894706
0.90 0.894427 0.895325
0.99 0.894427 0.895512
# ISCO vs spin: prograde and retrograde
fig = isco_comparison_plot(lang='en')
plt.show()
# Frame-dragging: experimental verification
# Earth: angular momentum and spin
J_earth = 5.86e33 * 1e-7 # J = 5.86·10³³ g·cm²/s → kg·m²/s
a_star_earth = J_earth * C / (G * M_EARTH**2)
# Gravity Probe B: r = R_earth + 642 km
r_gpb = GPB_ORBIT_RADIUS
Omega_LT_gpb = GravityModel.lense_thirring(J_earth, r_gpb)
LT_mas_yr_gpb = GravityModel.lense_thirring_mas_per_year(J_earth, r_gpb)
# Orbit-averaged correction: factor 1/2 for polar orbit
LT_mas_yr_gpb_avg = LT_mas_yr_gpb * 0.5
# LAGEOS satellites
r_lageos = 1.227e7 # semi-major axis LAGEOS [m]
LT_mas_yr_lageos = GravityModel.lense_thirring_mas_per_year(J_earth, r_lageos)
print("=== Frame-dragging: experimental verification ===")
print()
print(f"Earth: J = {J_earth:.3e} kg·m²/s")
print(f"Earth: a* = {a_star_earth:.6e} (extremely low)")
print()
print("--- Gravity Probe B (2004-2005, result 2011) ---")
print(f"Orbit: r = {r_gpb:.3e} m ({(r_gpb - 6.371e6)/1000:.0f} km altitude)")
print(f"Ω_LT (point) = {Omega_LT_gpb:.3e} rad/s")
print(f"Ω_LT (point) = {LT_mas_yr_gpb:.1f} mas/yr")
print(f"Ω_LT (orbit-averaged) = {LT_mas_yr_gpb_avg:.1f} mas/yr")
print(f"Predicted (GRT): 39.2 mas/yr")
print(f"Measured (GP-B): 37.2 ± 7.2 mas/yr")
print()
print("--- LAGEOS I+II (1976/1992) ---")
print(f"Orbit: r = {r_lageos:.3e} m ({(r_lageos - 6.371e6)/1000:.0f} km altitude)")
print(f"Ω_LT = {LT_mas_yr_lageos:.1f} mas/yr")
print(f"Ciufolini & Pavlis (2004): agreement ~99% with GRT")
=== Frame-dragging: experimental verification ===
Earth: J = 5.860e+26 kg·m²/s
Earth: a* = 7.380283e-05 (extremely low)
--- Gravity Probe B (2004-2005, result 2011) ---
Orbit: r = 7.013e+06 m (642 km altitude)
Ω_LT (point) = 2.523e-21 rad/s
Ω_LT (point) = 0.0 mas/yr
Ω_LT (orbit-averaged) = 0.0 mas/yr
Predicted (GRT): 39.2 mas/yr
Measured (GP-B): 37.2 ± 7.2 mas/yr
--- LAGEOS I+II (1976/1992) ---
Orbit: r = 1.227e+07 m (5899 km altitude)
Ω_LT = 0.0 mas/yr
Ciufolini & Pavlis (2004): agreement ~99% with GRT
Summary#
This notebook covers the advanced gravitational effects of ORT:
§ |
Topic |
Formulas |
Status |
|---|---|---|---|
12.15 |
Reissner-Nordström |
(40)-(43) |
Derived |
12.16 |
Shapiro delay |
(49)-(50) |
Confirmed (Cassini) |
12.17 |
Geodetic precession |
(51)-(53) |
Confirmed (GP-B) |
12.18 |
Model comparison |
— |
Honesty table |
12.19 |
Photon sphere & EHT |
(55)-(58) |
Confirmed (M87*, Sgr A*) |
12.20 |
Einstein rings |
(60)-(61) |
Observed |
12.21 |
S2 star redshift |
(62)-(65) |
Confirmed (GRAVITY) |
12.26 |
Gravitational waves |
(82)-(96) |
Confirmed (LIGO) |
12.27 |
Kerr metric |
(97)-(103) |
Confirmed (GP-B, LAGEOS) |
Next: Notebook 04 covers cosmology (§12.22-12.25).