ORT: Gravity Basics#

Chapter 12, part 1 | §12.1–12.14 | Formulas 23–39

This notebook covers the basic gravitational effects in ORT. The core idea: near mass, part of the velocity budget \(c\) goes toward the mass (\(v_{grav}\), the escape velocity), reducing the local spacetime speed: \(c_{local}^2 = c^2 - v_{grav}^2\). From this single extension follow gravitational time dilation, redshift, light deflection, orbital precession, and the full Schwarzschild metric.


import sys, pathlib
sys.path.insert(0, str(pathlib.Path().resolve().parent / 'shared'))
from ort_core import *
from ort_plots import (c_local_profile, c_local_profile_interactive, spacetime_embedding_3d,
    orbital_precession_plot, light_deflection_diagram, photon_sphere_shadow, einstein_ring_plot, comparison_table)
import matplotlib.pyplot as plt
import math
import numpy as np
%matplotlib inline

§12.1 — The Principle: the three-component velocity budget#

In SRT everything moves at \(c\) through spacetime. The velocity budget has two components:

\[v_{space}^2 + v_{time}^2 = c^2\]

Near mass a third component appears: the gravitational velocity \(v_{grav}\). This is the velocity component directed toward the central mass, with magnitude equal to the escape velocity (known from Newton):

\[v_{grav} = \sqrt{\frac{2GM}{r}}\]

The total velocity budget becomes:

\[v_{grav}^2 + v_{space}^2 + v_{time}^2 = c^2 \qquad (29)\]

What remains for space and time is the local spacetime speed:

\[c_{local}^2 \equiv c^2 - v_{grav}^2 = c^2 - \frac{2GM}{r}\]
\[c_{local}(r) = c \cdot \sqrt{1 - \frac{2GM}{c^2 r}} \qquad (23)\]

Define \(r_s = 2GM/c^2\). This is the distance where \(c_{local} = 0\), where the entire velocity budget is consumed by \(v_{grav}\):

\[r_s = \frac{2GM}{c^2} \qquad \text{(Schwarzschild radius — consequence, not postulate)}\]

The core idea: near mass, part of your velocity budget \(c\) goes toward the mass (\(v_{grav}\)), leaving less for motion through space and time (\(c_{local}\)).

The same pattern as in flat spacetime:

  • Flat spacetime: constant \(c\) → time dilation, length contraction, \(E = mc^2\)

  • Gravity: varying \(c_{local}\) → gravitational time dilation, redshift, event horizon

# c_local profile for the Sun and the Earth
fig = c_local_profile([SUN, EARTH], ['Sun', 'Earth'], lang='en')
plt.show()
_images/5a749116656b18fd310dcbe69800159c57f13c19c3da96b9955af555773ec848.png
# Interactive: adjust the mass and view the c_local profile
c_local_profile_interactive(lang='en')
Interactive version — download the notebook to use the slider.

The gradient of \(c_{local}\) is gravity#

The derivative of \(c_{local}\) with respect to \(r\) reveals a direct connection to the gravitational acceleration \(g\):

\[\frac{dc_{local}}{dr} = \frac{GM}{c \cdot r^2 \cdot \sqrt{1 - r_s/r}} \qquad (23b)\]

The proper acceleration of a stationary observer at distance \(r\) (from the Schwarzschild metric):

\[g_{proper} = \frac{GM}{r^2 \cdot \sqrt{1 - r_s/r}}\]

The relation is therefore:

\[\frac{dc_{local}}{dr} = \frac{g_{proper}}{c} \qquad (23c)\]

In the weak field (\(r \gg r_s\)) this simplifies to:

\[\frac{dc_{local}}{dr} \approx \frac{GM}{c \cdot r^2} = \frac{g}{c}\]

Interpretation: the gradient of the \(c_{local}\) field is gravity, scaled by \(1/c\). Where \(c_{local}\) changes rapidly with distance, gravity is strong. At the event horizon (\(r = r_s\)), \(dc_{local}/dr\) diverges — infinite proper acceleration, exactly as in GRT.

In ORT, gravity is therefore not a force, but the slope of the local velocity field.

# Verification: dc_local/dr = g_proper / c
print("=== Gradient of c_local = gravity ===")
print()

# Earth
print("--- Earth (surface) ---")
dc_dr_earth = EARTH.dc_local_dr(R_EARTH)
g_earth = EARTH.proper_acceleration(R_EARTH)
print(f"  dc_local/dr      = {dc_dr_earth:.6e} [1/s]")
print(f"  g_proper         = {g_earth:.4f} m/s²")
print(f"  g_proper / c     = {g_earth / C:.6e} [1/s]")
print(f"  Ratio            = {dc_dr_earth / (g_earth / C):.15f}  (should be 1)")
print()

# Sun
print("--- Sun (surface) ---")
dc_dr_sun = SUN.dc_local_dr(R_SUN)
g_sun = SUN.proper_acceleration(R_SUN)
print(f"  dc_local/dr      = {dc_dr_sun:.6e} [1/s]")
print(f"  g_proper         = {g_sun:.4f} m/s²")
print(f"  g_proper / c     = {g_sun / C:.6e} [1/s]")
print(f"  Ratio            = {dc_dr_sun / (g_sun / C):.15f}")
print()

# Black hole (10 M☉) — strong field
BH = GravityModel(10 * M_SUN)
print("--- Black hole 10 M☉ (r = 1.1 r_s) ---")
r_bh = 1.1 * BH.rs
dc_dr_bh = BH.dc_local_dr(r_bh)
g_bh = BH.proper_acceleration(r_bh)
print(f"  dc_local/dr      = {dc_dr_bh:.6e} [1/s]")
print(f"  g_proper         = {g_bh:.6e} m/s²")
print(f"  g_proper / c     = {dc_dr_bh:.6e} [1/s]")
print(f"  Ratio            = {dc_dr_bh / (g_bh / C):.15f}")
print()
print("The relation dc_local/dr = g/c holds EXACTLY, from weak to strong field.")
=== Gradient of c_local = gravity ===

--- Earth (surface) ---
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[4], line 7
      5 # Earth
      6 print("--- Earth (surface) ---")
----> 7 dc_dr_earth = EARTH.dc_local_dr(R_EARTH)
      8 g_earth = EARTH.proper_acceleration(R_EARTH)
      9 print(f"  dc_local/dr      = {dc_dr_earth:.6e} [1/s]")

AttributeError: 'GravityModel' object has no attribute 'dc_local_dr'

For comparison: derivation of \(g_{proper}\) via GRT#

The proper acceleration \(g_{proper} = \frac{GM}{r^2 \sqrt{1 - r_s/r}}\) was introduced above as a result from the Schwarzschild metric. Below is the full GRT derivation via Christoffel symbols, making clear how complex the standard route is versus ORT’s one-step formula \(g = c \cdot dc_{local}/dr\).

Step 1 — Schwarzschild metric

\[ds^2 = -f(r)\,c^2\,dt^2 + f(r)^{-1}\,dr^2 + r^2\,d\Omega^2 \qquad \text{with } f(r) = 1 - \frac{r_s}{r}\]

Step 2 — Four-velocity of a stationary observer

An observer who remains at fixed \(r\) (\(dr = d\theta = d\varphi = 0\)) has four-velocity:

\[u^\mu = \left(\frac{dt}{d\tau}, 0, 0, 0\right) = \left(\frac{1}{\sqrt{f}}, 0, 0, 0\right)\]

since \(ds^2 = -f \cdot c^2 \cdot dt^2 = -c^2 \cdot d\tau^2\), so \(dt/d\tau = 1/\sqrt{f}\).

Step 3 — Christoffel symbol \(\Gamma^r_{tt}\)

From the metric follows the relevant Christoffel symbol:

\[\Gamma^r_{tt} = \tfrac{1}{2}\,g^{rr}\,\frac{\partial g_{tt}}{\partial r} = \tfrac{1}{2}\,f(r)\,\frac{r_s \cdot c^2}{r^2} = f(r)\,\frac{GM}{r^2}\]

Step 4 — Coordinate acceleration (geodesic equation)

The geodesic equation \(\frac{d^2 x^r}{d\tau^2} + \Gamma^r_{\mu\nu}\,u^\mu\,u^\nu = 0\) gives for the stationary observer:

\[a^r_{coord} = -\Gamma^r_{tt}\,(u^t)^2 = -f(r)\,\frac{GM}{r^2}\,\frac{1}{f} = -\frac{GM}{r^2}\]

The factor \(f\) cancels — the coordinate acceleration is Newtonian.

Step 5 — From coordinate to proper acceleration

The local (physical) acceleration measured by the observer requires projection onto the local frame via \(\sqrt{g_{rr}}\):

\[g_{proper} = \sqrt{g_{rr}} \cdot |a^r_{coord}| = \frac{1}{\sqrt{f}} \cdot \frac{GM}{r^2} = \frac{GM}{r^2\,\sqrt{1 - r_s/r}}\]

Conclusion: five steps — metric, four-velocity, Christoffel symbols, geodesic equation, frame projection — to arrive at the same result that ORT gives in one step:

\[g = c \cdot \frac{dc_{local}}{dr} = \frac{GM}{r^2\,\sqrt{1 - r_s/r}} \qquad (23b/23c)\]

The mathematical machinery of GRT (differential geometry, Christoffel symbols, geodesic equations) is powerful and general, but obscures the physical insight: gravity is the slope of the local velocity field.

§12.2 — Gravitational Time Dilation#

A clock at distance \(r\) from a mass experiences \(c_{local} < c\). If the clock is at rest, all \(c_{local}\) goes to motion through time:

\[\frac{\tau}{t_\infty} = \frac{c_{local}}{c} = \sqrt{1 - \frac{r_s}{r}} \qquad (24/25)\]

This is exactly the Schwarzschild time dilation from GRT.

# Time dilation at Earth's surface, GPS orbit, ISS orbit
print("=== Gravitational Time Dilation (Earth) ===")
print(f"Schwarzschild radius Earth: r_s = {EARTH.rs:.4e} m = {EARTH.rs*1000:.4f} mm")
print()

locations = [
    ("Earth surface", R_EARTH),
    ("ISS (408 km)", R_ISS),
    ("GPS (20,200 km)", R_GPS),
]
for name, r in locations:
    td = EARTH.time_dilation_factor(r)
    diff_per_day = (1 - td) * 86400e6  # microseconds per day
    print(f"{name:25s}: τ/t∞ = {td:.15f}  (offset: {diff_per_day:.3f} µs/day)")
=== Gravitational Time Dilation (Earth) ===
Schwarzschild radius Earth: r_s = 8.8698e-03 m = 8.8698 mm

Earth surface            : τ/t∞ = 0.999999999303892  (offset: 60.144 µs/day)
ISS (408 km)             : τ/t∞ = 0.999999999345788  (offset: 56.524 µs/day)
GPS (20,200 km)          : τ/t∞ = 0.999999999833092  (offset: 14.421 µs/day)
# Newton vs ORT: time dilation at GPS altitude
# Newton has NO time dilation — time is absolute!
r_gps = R_EARTH + 20_200_000  # GPS altitude ~20,200 km
td_ort = EARTH.time_dilation_factor(r_gps)
drift_per_day_us = (1 - td_ort) * 86400 * 1e6  # µs per day

print("=== Newton vs ORT: gravitational time dilation ===")
print(f"Clock at GPS altitude ({20200} km):")
print(f"  Newton:  Δt = 0 µs/day      (time is absolute!)")
print(f"  ORT:     Δt = {drift_per_day_us:+.2f} µs/day  (clock runs FASTER)")
print()
print(f"Without correction: GPS would drift {abs(drift_per_day_us) * C * 1e-6:.0f} m after 1 day!")
print(f"After 1 week: {abs(drift_per_day_us) * 7 * C * 1e-6:.0f} m — navigation useless.")
=== Newton vs ORT: gravitational time dilation ===
Clock at GPS altitude (20200 km):
  Newton:  Δt = 0 µs/day      (time is absolute!)
  ORT:     Δt = +14.42 µs/day  (clock runs FASTER)

Without correction: GPS would drift 4323 m after 1 day!
After 1 week: 30263 m — navigation useless.

§12.3 — Gravitational Redshift#

Light escaping a gravitational field loses frequency:

\[\frac{f_{obs}}{f_{emit}} = \frac{c_{local}(r_{emit})}{c_{local}(r_{obs})} = \frac{\sqrt{1 - r_s/r_{emit}}}{\sqrt{1 - r_s/r_{obs}}} \qquad (25/27)\]

When the observer is farther from the mass: \(f_{obs} < f_{emit}\)redshift.

# Pound-Rebka experiment (1959): 22.5 m height difference
h = 22.5  # meters
r_bottom = R_EARTH
r_top = R_EARTH + h

z = EARTH.gravitational_redshift(r_bottom, r_top)
delta_f_over_f = -z  # redshift = negative

# Approximation: Δf/f ≈ g·h/c²
g = G * M_EARTH / R_EARTH**2
approx = g * h / C**2

print("=== Pound-Rebka Experiment ===")
print(f"Height: {h} m")
print(f"Redshift z             = {z:.6e}")
print(f"|Δf/f|                 = {abs(delta_f_over_f):.6e}")
print(f"Approximation g·h/c²  = {approx:.6e}")
print(f"Measured (1959)        = (2.57 ± 0.26) ·10⁻¹⁵")
=== Pound-Rebka Experiment ===
Height: 22.5 m
Redshift z             = 2.442491e-15
|Δf/f|                 = 2.442491e-15
Approximation g·h/c²  = 2.458394e-15
Measured (1959)        = (2.57 ± 0.26) ·10⁻¹⁵

§12.4 — GPS Full Correction (SRT + Gravity)#

GPS combines both effects in a single formula:

\[v_{time} = \frac{\sqrt{c_{local}^2 - v^2}}{c} \qquad (26)\]

Component

Cause

Effect

SRT

Satellite velocity (3870 m/s)

−7 µs/day (slower)

Gravity

Lower g at GPS altitude

+45 µs/day (faster)

Net

Combined

+38 µs/day (faster)

# GPS correction: combined SRT + gravity
v_gps = 3870  # m/s (GPS satellite velocity)

# Earth surface (at rest)
td_surface = EARTH.combined_time_dilation(R_EARTH, 0)

# GPS satellite (moving at altitude)
td_gps = EARTH.combined_time_dilation(R_GPS, v_gps)

# Difference in microseconds per day
diff_us_per_day = (td_gps - td_surface) * 86400 * 1e6

# Individual components
grav_only = (EARTH.time_dilation_factor(R_GPS) - EARTH.time_dilation_factor(R_EARTH)) * 86400 * 1e6
srt_only = (math.sqrt(1 - (v_gps/C)**2) - 1) * 86400 * 1e6

print("=== GPS Correction ===")
print(f"Gravity only:           {grav_only:+.2f} µs/day")
print(f"SRT only (velocity):    {srt_only:+.2f} µs/day")
print(f"Combined (formula):     {diff_us_per_day:+.2f} µs/day")
print(f"\nExpected net:           +38 µs/day")
=== GPS Correction ===
Gravity only:           +45.72 µs/day
SRT only (velocity):    -7.20 µs/day
Combined (formula):     +38.52 µs/day

Expected net:           +38 µs/day

§12.5 — The Event Horizon (\(c_{local} = 0\))#

At \(r = r_s\), \(c_{local} = 0\). The consequences:

  1. Nothing can move — neither through space nor through time

  2. Clocks stop\(\tau/t_\infty = 0\)

  3. Light cannot escape — there is no local spacetime velocity left

# Black hole of 10 solar masses
BH_10 = GravityModel(10 * M_SUN)
print(f"=== Black hole of 10 M☉ ===")
print(f"r_s = {BH_10.rs:.3e} m = {BH_10.rs/1000:.2f} km")
print()

# c_local at various distances from the horizon
factors = [10.0, 5.0, 2.0, 1.5, 1.1, 1.01, 1.001, 1.0]
print(f"{'r/r_s':>8s}  {'c_local/c':>12s}  {'c_local (m/s)':>15s}")
print("-" * 40)
for f in factors:
    r = f * BH_10.rs
    cl = BH_10.c_local(r)
    print(f"{f:8.3f}  {cl/C:12.6f}  {cl:15.0f}")
=== Black hole of 10 M☉ ===
r_s = 2.954e+04 m = 29.54 km

   r/r_s     c_local/c    c_local (m/s)
----------------------------------------
  10.000      0.948683        284408098
   5.000      0.894427        268142526
   2.000      0.707107        211985280
   1.500      0.577350        173085256
   1.100      0.301511         90390827
   1.010      0.099504         29830465
   1.001      0.031607          9475533
   1.000      0.000000                0

§12.6 — Gravity Velocity \(v_{grav}\)#

Near a mass, part of your total velocity \(c\) goes towards that mass:

\[v_{grav}^2 + c_{local}^2 = c^2 \qquad (27)\]
\[v_{grav} = c \cdot \sqrt{\frac{r_s}{r}} \qquad (28)\]

This is exactly the escape velocity \(v_{esc} = \sqrt{2GM/r}\).

For a moving object, the three-component budget applies:

\[v_{grav}^2 + v_{space}^2 + v_{time}^2 = c^2 \qquad (29)\]
# v_grav at various distances
print("=== Velocity budget near 10 M☉ black hole ===")
print(f"{'r/r_s':>8s}  {'v_grav/c':>10s}  {'c_local/c':>10s}  {'check v²+c²':>12s}")
print("-" * 46)
for f in [10.0, 5.0, 2.0, 1.5, 1.1, 1.01, 1.0]:
    r = f * BH_10.rs
    vg = BH_10.v_grav(r)
    cl = BH_10.c_local(r)
    check = math.sqrt(vg**2 + cl**2) / C
    print(f"{f:8.3f}  {vg/C:10.6f}  {cl/C:10.6f}  {check:12.9f}")
=== Velocity budget near 10 M☉ black hole ===
   r/r_s    v_grav/c   c_local/c   check v²+c²
----------------------------------------------
  10.000    0.316228    0.948683   1.000000000
   5.000    0.447214    0.894427   1.000000000
   2.000    0.707107    0.707107   1.000000000
   1.500    0.816497    0.577350   1.000000000
   1.100    0.953463    0.301511   1.000000000
   1.010    0.995037    0.099504   1.000000000
   1.000    1.000000    0.000000   1.000000000

§12.7 — Spatial Stretching#

A coordinate distance \(dr\) corresponds to a larger physical distance \(dl\):

\[dl = \frac{dr}{\sqrt{1 - r_s/r}} = dr \cdot \frac{c}{c_{local}} \qquad (30)\]

This is the spatial component of the Schwarzschild metric:

\[g_{rr} = \left(1 - \frac{r_s}{r}\right)^{-1} = \left(\frac{c}{c_{local}}\right)^2\]

Together with \(g_{tt} = (c_{local}/c)^2\), ORT now matches both diagonal components.

# Spatial stretching near the Sun and a 10 M☉ black hole
print("=== Spatial Stretching ===")
print()
print("--- Sun (surface) ---")
stretch_sun = SUN.spatial_stretching(R_SUN)
print(f"Stretching factor: {stretch_sun:.10f}")
print(f"Extra length per km: {(stretch_sun - 1) * 1000:.6f} m")
print()
print("--- 10 M☉ black hole ---")
for f in [10.0, 3.0, 1.5, 1.1, 1.01]:
    r = f * BH_10.rs
    s = BH_10.spatial_stretching(r)
    print(f"  r = {f:.2f} r_s:  stretching = {s:.6f}  (1 km → {s:.6f} km)")
=== Spatial Stretching ===

--- Sun (surface) ---
Stretching factor: 1.0000021231
Extra length per km: 0.002123 m

--- 10 M☉ black hole ---
  r = 10.00 r_s:  stretching = 1.054093  (1 km → 1.054093 km)
  r = 3.00 r_s:  stretching = 1.224745  (1 km → 1.224745 km)
  r = 1.50 r_s:  stretching = 1.732051  (1 km → 1.732051 km)
  r = 1.10 r_s:  stretching = 3.316625  (1 km → 3.316625 km)
  r = 1.01 r_s:  stretching = 10.049876  (1 km → 10.049876 km)

3D Flamm’s Paraboloid#

The spatial stretching can be visualized as Flamm’s paraboloid: a 2D embedding of the spatial geometry around a mass.

# 3D embedding of the spatial geometry
fig = spacetime_embedding_3d(lang='en')
if fig is not None:
    fig.show()

§12.8 — Light Deflection#

Light grazing a mass is deflected by two equal contributions:

  1. Temporal (refractive index): \(n_{time} = c/c_{local}\)

  2. Spatial (stretching): \(n_{space} = c/c_{local}\)

Combined: the effective refractive index:

\[n_{eff} = \left(\frac{c}{c_{local}}\right)^2 = \frac{1}{1 - r_s/r} \qquad (31)\]

The total deflection angle:

\[\alpha = \frac{2r_s}{b} = \frac{4GM}{bc^2} \qquad (32)\]

This is exactly the GRT result (Einstein 1915: 1.75”). Soldner (1801) and Einstein (1911) found half: only the temporal effect.

# Light deflection diagram
fig = light_deflection_diagram(lang='en')
plt.show()
_images/197191d8cc91191c4d298bf5a8f92674c66f433e3f507429c1e19b5bb057142e.png
# Light deflection by the Sun (b = R_sun)
alpha_arcsec = SUN.light_deflection_arcsec(R_SUN)
alpha_half = SUN.half_light_deflection(R_SUN) * (180/math.pi) * 3600

print("=== Light Deflection by the Sun ===")
print(f"Impact parameter b = R_sun = {R_SUN:.3e} m")
print(f"Soldner/Einstein 1911 (half value): {alpha_half:.4f}\"")
print(f"ORT / GRT (full):       {alpha_arcsec:.4f}\"")
print(f"Measured (Eddington 1919):          1.75 ± 0.06\"")
=== Light Deflection by the Sun ===
Impact parameter b = R_sun = 6.957e+08 m
Soldner/Einstein 1911 (half value): 0.8759"
ORT / GRT (full):       1.7517"
Measured (Eddington 1919):          1.75 ± 0.06"
# Newton vs ORT: light deflection by the Sun
# Newton/Soldner (1801) predicts HALF the correct answer!
alpha_newton = SUN.half_light_deflection(R_SUN) * (180 / math.pi) * 3600
alpha_ort = SUN.light_deflection_arcsec(R_SUN)

print("=== Newton vs ORT: light deflection by the Sun ===")
print(f"  Newton/Soldner (1801):  {alpha_newton:.4f}\"  (time curvature only)")
print(f"  ORT/Einstein (1915):    {alpha_ort:.4f}\"  (time + space curvature)")
print(f"  Eddington (1919):       1.75 ± 0.06\"  (measured!)")
print()
print(f"Newton predicts exactly HALF: {alpha_newton/alpha_ort:.3f}×")
print(f"The missing half comes from spatial curvature — something Newton lacks.")
=== Newton vs ORT: light deflection by the Sun ===
  Newton/Soldner (1801):  0.8759"  (time curvature only)
  ORT/Einstein (1915):    1.7517"  (time + space curvature)
  Eddington (1919):       1.75 ± 0.06"  (measured!)

Newton predicts exactly HALF: 0.500×
The missing half comes from spatial curvature — something Newton lacks.

§12.9 — Orbital Precession — the effective potential#

In Newtonian mechanics, the gravitational potential and angular momentum together yield an effective potential that describes a closed elliptical orbit:

\[V_{Newton}(r) = -\frac{GM}{r} + \frac{L^2}{2r^2} \qquad (33)\]

where \(L\) is the specific angular momentum. This orbit closes exactly — there is no precession.

In GRT (and in ORT) an extra term appears:

\[V_{GR}(r) = -\frac{GM}{r} + \frac{L^2}{2r^2} - \frac{GML^2}{r^3 c^2} \qquad (34)\]

The extra term \(-GML^2/(r^3c^2)\) is always negative and grows stronger as \(r\) decreases. At perihelion (closest to the Sun) the effect is largest. This opens the ellipse: after each orbit the perihelion has shifted slightly — perihelion precession.

Two equal contributions — the same 50/50 pattern#

Just as with light deflection, the extra term arises from the interplay of two effects:

  • Temporal (\(g_{tt}\)): the varying clock rate affects the effective orbital velocity → contribution \((3/2)\pi r_s / (a(1-e^2))\) per orbit

  • Spatial (\(g_{rr}\)): the stretching of radial distance affects the effective potential → equally large contribution \((3/2)\pi r_s / (a(1-e^2))\)

Combined:

\[\Delta\varphi = \frac{3\pi r_s}{a(1-e^2)} \qquad \text{per orbit} \qquad (35)\]

Mercury — the classical test#

For Mercury (\(a = 5.791 \cdot 10^{10}\) m, \(e = 0.20563\)):

  • \(\Delta\varphi\) per orbit = 0.1035 arcseconds

  • Orbits per century = 415.2

  • \(\Delta\varphi\) per century = 42.98 arcseconds — exactly the observed value

Planet

Δφ/orbit (“)

Orbits/century

Δφ/century (“)

Observed (“)

Mercury

0.1035

415.2

42.98

43.0

Venus

0.0053

162.5

0.86

8.6*

Earth

0.0038

100.0

0.38

3.8*

Mars

0.0013

53.1

0.07

1.4*

* The observed values for Venus, Earth, and Mars also include gravitational influences from other planets; the relativistic contribution is smallest for these planets.

Historical perspective#

  • Le Verrier (1859): discovered the anomalous precession of Mercury — 43 arcseconds per century unaccounted for by Newton

  • Einstein (1915): GRT predicts exactly 42.98”/century — with no free parameters. This was one of the first confirmations of GRT.

  • ORT: the same formula \(\Delta\varphi = 3\pi r_s/(a(1-e^2))\) — exactly the same result

# Orbital precession of Mercury
prec_per_orbit = SUN.orbital_precession_arcsec(A_MERCURY, E_MERCURY)
prec_per_century = SUN.orbital_precession_arcsec_century(A_MERCURY, E_MERCURY, T_MERCURY)

print("=== Orbital Precession of Mercury ===")
print(f"Semi-major axis a = {A_MERCURY:.4e} m")
print(f"Eccentricity e    = {E_MERCURY}")
print(f"Orbital period    = {T_MERCURY/86400:.3f} days")
print(f"\nΔφ per orbit       = {prec_per_orbit:.4f}\"")
print(f"Δφ per century     = {prec_per_century:.2f}\"")
print(f"Observed          = 43.0\"")
=== Orbital Precession of Mercury ===
Semi-major axis a = 5.7909e+10 m
Eccentricity e    = 0.20563
Orbital period    = 87.969 days

Δφ per orbit       = 0.1035"
Δφ per century     = 42.99"
Observed          = 43.0"
# Newton vs ORT: orbital precession of Mercury
# Newton predicts closed ellipses — 0 extra precession!
prec_ort = SUN.orbital_precession_arcsec(A_MERCURY, E_MERCURY)
prec_per_century = prec_ort * (100 * 365.25 * 86400) / T_MERCURY

print("=== Newton vs ORT: orbital precession of Mercury ===")
print(f"  Newton:           0.00\"/century  (ellipse closes exactly!)")
print(f"  ORT/Einstein:    {prec_per_century:.2f}\"/century")
print(f"  Observed:        43.0 ± 0.1\"/century  (Le Verrier, 1859)")
print()
print(f"This unexplained discrepancy was a mystery for 56 years.")
print(f"Einstein solved it in 1915 — his first confirmation of GRT.")
=== Newton vs ORT: orbital precession of Mercury ===
  Newton:           0.00"/century  (ellipse closes exactly!)
  ORT/Einstein:    42.99"/century
  Observed:        43.0 ± 0.1"/century  (Le Verrier, 1859)

This unexplained discrepancy was a mystery for 56 years.
Einstein solved it in 1915 — his first confirmation of GRT.
# Precession plot for Mercury
fig = orbital_precession_plot(SUN, A_MERCURY, E_MERCURY, n_orbits=5, lang='en')
plt.show()
_images/f00e42e675a4182bcdd0d3df2bbfc9f6ce86a54fd7cc9a4f7e4fd1de789506c5.png

§12.10 — What looks like curved spacetime#

In GRT, gravitational effects are described as curvature of spacetime: mass bends spacetime, and objects follow geodesics (straight paths in curved space).

In ORT there is an alternative description: the spacetime velocity \(c_{local}\) varies from place to place. Objects still move at their local \(c_{local}\) through spacetime, but because \(c_{local}\) depends on position, the “rules” change from point to point.

A varying \(c_{local}\) produces the same effects as spacetime curvature:

  1. Clocks run slower where \(c_{local}\) is lower → time dilation

  2. Space stretches radially → distances become larger near mass

  3. Light deflects due to the combined refractive index \(n_{eff} = (c/c_{local})^2\)

  4. Light loses frequency when climbing → redshift

  5. At \(c_{local} = 0\) everything stops → event horizon

With \(v_{grav}\) and the spatial stretching we now also understand the spatial component: the varying \(c_{local}\) affects not only the flow of time, but also the distance measure. What in GRT looks like four-dimensional curved spacetime, is in ORT a varying local velocity structure.

§12.11 — The Schwarzschild Connection#

The Schwarzschild metric for a spherically symmetric mass:

\[ds^2 = \left(1 - \frac{r_s}{r}\right) c^2 dt^2 - \left(1 - \frac{r_s}{r}\right)^{-1} dr^2 - r^2 d\Omega^2\]

ORT now reproduces both diagonal components:

Time component: $\(g_{tt} = 1 - \frac{r_s}{r} = \left(\frac{c_{local}}{c}\right)^2 \qquad (36)\)$

The time dilation: \(\sqrt{g_{tt}} = c_{local}/c\) — exactly formula (23).

Spatial component: $\(g_{rr} = \left(1 - \frac{r_s}{r}\right)^{-1} = \left(\frac{c}{c_{local}}\right)^2 \qquad (37)\)$

The spatial stretching: \(\sqrt{g_{rr}} = c/c_{local}\) — exactly formula (30).

The agreement is not approximate — it is an exact equality for both diagonal components. This means that ORT, with a single principle (varying \(c_{local}\)), reproduces both the temporal and spatial effects of the Schwarzschild solution.

The off-diagonal components (which arise for rotating masses, Kerr metric) are treated in §12.27 (notebook 03).

# Numerical verification: g_tt and g_rr from Schwarzschild vs from c_local/c
print("=== Schwarzschild verification: g_tt and g_rr from c_local ===")
print()
print(f"{'r/r_s':>8s}  {'g_tt (Schw)':>12s}  {'(c_l/c)²':>12s}  {'g_rr (Schw)':>12s}  {'(c/c_l)²':>12s}  {'match':>6s}")
print("-" * 70)
for f in [100.0, 10.0, 5.0, 3.0, 2.0, 1.5, 1.1, 1.01]:
    r = f * BH_10.rs
    # Schwarzschild metric components
    g_tt_schw = 1 - BH_10.rs / r
    g_rr_schw = 1 / (1 - BH_10.rs / r)
    # ORT: from c_local
    cl = BH_10.c_local(r)
    g_tt_ort = (cl / C) ** 2
    g_rr_ort = (C / cl) ** 2
    match = "✓" if abs(g_tt_schw - g_tt_ort) < 1e-12 and abs(g_rr_schw - g_rr_ort) < 1e-10 else "✗"
    print(f"{f:8.2f}  {g_tt_schw:12.8f}  {g_tt_ort:12.8f}  {g_rr_schw:12.8f}  {g_rr_ort:12.8f}  {match:>6s}")
print()
print("One principle (varying c_local) → both Schwarzschild components: EXACT.")

§12.12 — The pattern: constant c → SRT, varying c_local → gravity#

ORT reveals an elegant pattern:

Regime

Spacetime velocity

What follows

No mass

\(c\) (constant)

SRT: time dilation, \(E=mc^2\), Lorentz

Near mass

\(c_{local} < c\)

Gravitational time dilation, redshift

Near mass

\(v_{grav} > 0\)

Light deflection, spatial stretching

Near mass

\(g_{tt} \cdot g_{rr}\)

Orbital precession (50/50 temporal + spatial)

Event horizon

\(c_{local} = 0\)

Nothing moves, Being = 0

Far from mass

\(c_{local} \to c\)

Return to flat spacetime

One principle — “everything moves at the local spacetime velocity” — describes both special relativity and the main gravitational effects. The velocity sphere gains a third component:

\[v_{grav}^2 + v_{space}^2 + v_{time}^2 = c^2\]

§12.13 — What this extension describes and what it does not#

The model now describes both the temporal and spatial effects of static, spherically symmetric gravity.

Described in this notebook (§12.1–12.14):

  • Time dilation, redshift, light deflection, orbital precession

  • Shapiro delay, geodetic precession, event horizon

  • Charged mass (Reissner-Nordström, see §12.15)

  • All four classical tests of GRT (§12.16), plus geodetic precession as a fifth test (§12.17)

Also described (notebooks 03–05):

  • Black hole interior (\(r < r_s\)): analytic continuation \(c_{interior} = c \cdot \sqrt{r_s/r - 1}\), based on the Oppenheimer-Snyder solution (§12.23)

  • Gravitational waves: dynamic \(c_{local}(r,t)\) — fully described in §12.26 (inspiral, merger, ringdown)

  • Cosmology: our universe as the interior of a black hole (§12.22–12.25, hypothesis + speculative)

  • Rotating masses (Kerr metric): \(c_{local}(r,\theta)\) + frame-dragging field \(\omega(r,\theta)\), Lense-Thirring precession, Kerr ISCO (§12.27)

Not yet described (future work):

  • Rotating charged masses (Kerr-Newman): the combination of rotation and charge — the most general black hole solution

Interpretive note:

  • \(c_{local}\) is a coordinate velocity: in GRT a local observer always measures the speed of light as \(c\) (equivalence principle); \(c_{local}\) corresponds to the coordinate velocity \(dr/dt\) from the external perspective — an interpretive difference that must be clearly stated

§12.14 — Invariance of Being in a Gravitational Field#

In SRT: \(\text{Being} = m_0 \cdot c\). Near mass:

\[\text{Being} = m_0 \cdot c_{local} \qquad (38)\]

Consequences:

  • Mass does NOT increase in gravity — it is \(c_{local}\) that decreases, not \(m_0\) that increases

  • Near other beings your Being decreases — anti-holistic principle

  • Event horizon: Being = 0\(c_{local} = 0 \Rightarrow m_0 \cdot 0 = 0\)

Gravitational binding energy:

\[E_{binding} = m_0 c^2 \left(1 - \sqrt{1 - \frac{r_s}{r}}\right) \qquad (39)\]
# Being near the Earth and a black hole
m0 = 1.0  # kg reference mass
print("=== Invariance of Being ===")
print(f"In flat spacetime: Being = m₀ · c = {m0 * C:.6e} kg·m/s")
print()

print("--- Near the Earth ---")
cl_earth = EARTH.c_local(R_EARTH)
being_earth = m0 * cl_earth
print(f"c_local(R_earth)  = {cl_earth:.6f} m/s")
print(f"Being(R_earth)    = {being_earth:.6e} kg·m/s")
print(f"Being/Being_∞     = {cl_earth/C:.15f}")
print()

print("--- Near 10 M☉ black hole ---")
for f in [10.0, 2.0, 1.1, 1.01]:
    r = f * BH_10.rs
    cl = BH_10.c_local(r)
    print(f"  r = {f:.2f} r_s:  Being = {m0 * cl:.6e} kg·m/s  ({cl/C:.6f} c)")

print()
# Binding energy
E_bind = m0 * C**2 * (1 - EARTH.time_dilation_factor(R_EARTH))
print(f"Binding energy 1 kg at Earth surface: {E_bind:.6e} J")
=== Invariance of Being ===
In flat spacetime: Being = m₀ · c = 2.997925e+08 kg·m/s

--- Near the Earth ---
c_local(R_earth)  = 299792457.791312 m/s
Being(R_earth)    = 2.997925e+08 kg·m/s
Being/Being_∞     = 0.999999999303892

--- Near 10 M☉ black hole ---
  r = 10.00 r_s:  Being = 2.844081e+08 kg·m/s  (0.948683 c)
  r = 2.00 r_s:  Being = 2.119853e+08 kg·m/s  (0.707107 c)
  r = 1.10 r_s:  Being = 9.039083e+07 kg·m/s  (0.301511 c)
  r = 1.01 r_s:  Being = 2.983046e+07 kg·m/s  (0.099504 c)

Binding energy 1 kg at Earth surface: 6.256305e+07 J

Summary#

All basic gravitational effects follow from a single extension:

\[c_{local}(r) = c \cdot \sqrt{1 - \frac{r_s}{r}}\]

Effect

Formula

Confirmation

Gradient = gravity

\(dc_{local}/dr = g/c\)

Formula (23b/23c)

Time dilation

\(\tau/t = \sqrt{1-r_s/r}\)

GPS, atomic clocks

Redshift

\(f_{obs}/f_{emit} = c_{local,e}/c_{local,o}\)

Pound-Rebka

GPS correction

\(v_{time} = \sqrt{c_{local}^2 - v^2}/c\)

Daily verification

Event horizon

\(c_{local} = 0\) at \(r = r_s\)

EHT M87*, Sgr A*

Light deflection

\(\alpha = 4GM/(bc^2)\)

Eddington 1919

Orbital precession

\(\Delta\varphi = 3\pi r_s/(a(1-e^2))\)

Mercury 42.98”/century

Schwarzschild metric

\(g_{tt} = (c_{local}/c)^2\), \(g_{rr} = (c/c_{local})^2\)

Exact — formula (36)/(37)

Being in gravity

\(S = m_0 \cdot c_{local}\)

Conservation law

Scope

§12.1–12.14: all basic effects

§12.15+: RN, Shapiro, Kerr, GW, cosmology

Next: Notebook 03 covers advanced topics (RN, Shapiro, geodetic precession, photon sphere, GW, Kerr).