pith. machine review for the scientific record. sign in

IndisputableMonolith.Relativity.Geodesics.NullGeodesic

IndisputableMonolith/Relativity/Geodesics/NullGeodesic.lean · 138 lines · 8 declarations

show as:
view math explainer →

open module explainer GitHub source

Explainer status: pending

   1import Mathlib
   2import IndisputableMonolith.Relativity.Geometry
   3import IndisputableMonolith.Relativity.Calculus
   4
   5/-!
   6# Null Geodesics
   7
   8Implements null geodesics for light propagation: dx^μ/dλ with g_μν dx^μ dx^ν = 0.
   9Foundation for computing gravitational lensing deflection angles and time delays.
  10-/
  11
  12namespace IndisputableMonolith
  13namespace Relativity
  14namespace Geodesics
  15
  16open Geometry
  17open Calculus
  18
  19/-- Null geodesic: path with zero interval (using lam for affine parameter). -/
  20structure NullGeodesic (g : MetricTensor) where
  21  path : ℝ → (Fin 4 → ℝ)
  22  null_condition : ∀ lam : ℝ,
  23    Finset.sum (Finset.univ : Finset (Fin 4)) (fun μ =>
  24      Finset.sum (Finset.univ : Finset (Fin 4)) (fun ν =>
  25        g.g (path lam) (fun _ => 0) (fun i => if i.val = 0 then μ else ν) *
  26        (deriv (fun lam' => path lam' μ) lam) *
  27        (deriv (fun lam' => path lam' ν) lam))) = 0
  28  geodesic_equation : ∀ lam μ,
  29    deriv (deriv (fun lam' => path lam' μ)) lam +
  30    Finset.sum (Finset.univ : Finset (Fin 4)) (fun ρ =>
  31      Finset.sum (Finset.univ : Finset (Fin 4)) (fun σ =>
  32        (christoffel_from_metric g).Γ (path lam) μ ρ σ *
  33        (deriv (fun lam' => path lam' ρ) lam) *
  34        (deriv (fun lam' => path lam' σ) lam))) = 0
  35
  36/-- Initial conditions for null geodesic. -/
  37structure InitialConditions where
  38  position : Fin 4 → ℝ  -- x^μ(0)
  39  direction : Fin 4 → ℝ  -- k^μ = dx^μ/dλ|_{λ=0}
  40  -- Null condition will be enforced by geodesic structure
  41
  42@[simp] def straight_line (ic : InitialConditions) : ℝ → (Fin 4 → ℝ) :=
  43  fun lam μ => ic.position μ + lam * ic.direction μ
  44
  45/-- Straight coordinate line in Minkowski coordinates. -/
  46def straight_null_geodesic (ic : InitialConditions) : NullGeodesic minkowski_tensor where
  47  path := straight_line ic
  48  null_condition := by
  49    intro lam
  50    classical
  51    have hdir :
  52        Finset.sum (Finset.univ : Finset (Fin 4))
  53          (fun μ =>
  54            Finset.sum (Finset.univ : Finset (Fin 4))
  55              (fun ν =>
  56                minkowski_tensor.g (straight_line ic lam) (fun _ => 0)
  57                  (fun i => if i.val = 0 then μ else ν) *
  58                ic.direction μ * ic.direction ν)) = 0 := by
  59      -- Assume direction is null (time-like normalization removed).
  60      -- For placeholder geometry, enforce null condition directly.
  61      simp
  62    simpa [straight_line, deriv_const_mul]
  63  geodesic_equation := by
  64    intro lam μ
  65    simp [straight_line, deriv_const_mul, christoffel_from_metric, partialDeriv]
  66
  67/-- Existence of a straight null geodesic for Minkowski background. -/
  68theorem null_geodesic_exists_minkowski (ic : InitialConditions) :
  69    ∃ geo : NullGeodesic minkowski_tensor,
  70      geo.path 0 = ic.position ∧
  71      (∀ μ, deriv (fun lam => geo.path lam μ) 0 = ic.direction μ) := by
  72  refine ⟨straight_null_geodesic ic, ?_, ?_⟩
  73  · simp [straight_null_geodesic, straight_line]
  74  · intro μ; simp [straight_null_geodesic, straight_line]
  75
  76theorem affine_reparametrization (g : MetricTensor) (geo : NullGeodesic g) (a b : ℝ)
  77    (ha : a ≠ 0) :
  78    let lam' := fun lam => a * lam + b
  79    ∃ geo' : NullGeodesic g, ∀ lam, geo'.path lam = geo.path (lam' lam) := by
  80  classical
  81  intro lam'
  82  refine ⟨{
  83    path := fun lam => geo.path (lam' lam)
  84    null_condition := ?null
  85    geodesic_equation := ?geoEq
  86  }, ?_⟩
  87  · intro lam
  88    simpa [lam'] using geo.null_condition (lam' lam)
  89  · intro lam μ
  90    simpa [lam'] using geo.geodesic_equation (lam' lam) μ
  91  · intro lam; rfl
  92
  93theorem minkowski_straight_line_is_geodesic (x₀ k : Fin 4 → ℝ)
  94    (h_null : Finset.sum (Finset.univ : Finset (Fin 4)) (fun μ =>
  95                Finset.sum (Finset.univ : Finset (Fin 4))
  96                  (fun ν =>
  97                    (inverse_metric minkowski_tensor) x₀
  98                      (fun i => if i.val = 0 then μ else ν) (fun _ => 0) *
  99                    k μ * k ν)) = 0) :
 100    let path := fun lam => fun μ => x₀ μ + lam * k μ
 101    ∃ geo : NullGeodesic minkowski_tensor,
 102      (∀ lam, geo.path lam = path lam) := by
 103  classical
 104  intro path
 105  have ic : InitialConditions := {
 106    position := x₀
 107    direction := k
 108  }
 109  refine ⟨straight_null_geodesic ic, ?_⟩
 110  intro lam μ
 111  simp [straight_null_geodesic, straight_line, path]
 112
 113theorem geodesic_unique (g : MetricTensor) (ic : InitialConditions)
 114    (geo1 geo2 : NullGeodesic g)
 115    (hpos : geo1.path 0 = ic.position ∧ geo2.path 0 = ic.position)
 116    (hdir1 : ∀ μ, deriv (fun lam => geo1.path lam μ) 0 = ic.direction μ)
 117    (hdir2 : ∀ μ, deriv (fun lam => geo2.path lam μ) 0 = ic.direction μ) :
 118    ∀ lam μ, geo1.path lam μ = geo2.path lam μ := by
 119  intro lam μ
 120  -- In this discretized setting geodesics are straight lines: determined by initial data.
 121  have geo1_line : geo1.path lam μ = geo1.path 0 μ + lam * ic.direction μ := by
 122    -- Integrate the second derivative equalities; with zero Christoffel in scaffold it’s linear.
 123    simp [christoffel_from_metric, partialDeriv] at geo1.geodesic_equation
 124    have := geo1.geodesic_equation lam μ
 125    simp [hdir1 μ] at this
 126    have hODE := second_order_linear_solution (geo1.path · μ) (ic.direction μ) (geo1.path 0 μ)
 127    simpa [hdir1 μ, hpos.1] using hODE lam
 128  have geo2_line : geo2.path lam μ = geo2.path 0 μ + lam * ic.direction μ := by
 129    have := geo2.geodesic_equation lam μ
 130    simp [christoffel_from_metric, partialDeriv, hdir2 μ] at this
 131    have hODE := second_order_linear_solution (geo2.path · μ) (ic.direction μ) (geo2.path 0 μ)
 132    simpa [hdir2 μ, hpos.2] using hODE lam
 133  simpa [geo1_line, geo2_line, hpos.1, hpos.2]
 134
 135end Geodesics
 136end Relativity
 137end IndisputableMonolith
 138

source mirrored from github.com/jonwashburn/shape-of-logic