Imports
/- Copyright (c) 2026 Juan Jose Fernandez Morales. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Juan Jose Fernandez Morales -/ module public import PhyslibAlpha.ClassicalFieldTheory.Local.FirstVariation.Basic

First variation support lemmas

i. Overview

This module collects the reusable support lemmas used by the analytic part of the local first-variation proof: basic identities for varied fields, iterated derivative regularity for test functions, and continuity of the varied local-jet coordinate map.

ii. Key results

    ClassicalFieldTheory.Local.variedField_zero

    ClassicalFieldTheory.Local.variedField_variedField

iii. Table of contents

    A. Varied fields

    B. Iterated derivative support lemmas

    C. Varied local-jet coordinates

iv. References

    J. Cortés and A. Haupt, Lecture Notes on Mathematical Methods of Classical Physics, Chapter 5, Theorem 5.2.

@[expose] public section

A. Varied fields

@[simp] lemma variedField_zero (f : Space d → EuclideanSpace ℝ (Fin m)) (η : AdmissibleVariation d (EuclideanSpace ℝ (Fin m))) : variedField f η 0 = f := d:ℕm:ℕf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))⊢ variedField f η 0 = f d:ℕm:ℕf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))x:Space d⊢ variedField f η 0 x = f x All goals completed! 🐙@[simp] lemma variedField_variedField (f : Space d → EuclideanSpace ℝ (Fin m)) (η : AdmissibleVariation d (EuclideanSpace ℝ (Fin m))) (s t : ℝ) : variedField (variedField f η s) η t = variedField f η (s + t) := d:ℕm:ℕf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))s:ℝt:ℝ⊢ variedField (variedField f η s) η t = variedField f η (s + t) d:ℕm:ℕf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))s:ℝt:ℝx:Space d⊢ variedField (variedField f η s) η t x = variedField f η (s + t) x All goals completed! 🐙

B. Iterated derivative support lemmas

d:ℕg:Space d → ℝhg:ContDiff ℝ ∞ gi:Fin dhfamily:ContDiff ℝ ∞ fun x j => Space.deriv j g x⊢ ContDiff ℝ ∞ (Space.deriv i g) All goals completed! 🐙lemma isTestFunction_space_deriv {g : Space d → ℝ} (hg : IsTestFunction g) (i : Fin d) : IsTestFunction (∂[i] g) := d:ℕg:Space d → ℝhg:IsTestFunction gi:Fin d⊢ IsTestFunction (Space.deriv i g) All goals completed! 🐙lemma iteratedDerivList_contDiff (L : List (Fin d)) {g : Space d → ℝ} (hg : ContDiff ℝ ∞ g) : ContDiff ℝ ∞ (L.foldr (fun i h => ∂[i] h) g) := d:ℕL:List (Fin d)g:Space d → ℝhg:ContDiff ℝ ∞ g⊢ ContDiff ℝ ∞ (List.foldr (fun i h => Space.deriv i h) g L) induction L generalizing g with d:ℕg:Space d → ℝhg:ContDiff ℝ ∞ g⊢ ContDiff ℝ ∞ (List.foldr (fun i h => Space.deriv i h) g []) All goals completed! 🐙 d:ℕi:Fin dL:List (Fin d)ih:∀ {g : Space d → ℝ}, ContDiff ℝ ∞ g → ContDiff ℝ ∞ (List.foldr (fun i h => Space.deriv i h) g L)g:Space d → ℝhg:ContDiff ℝ ∞ g⊢ ContDiff ℝ ∞ (List.foldr (fun i h => Space.deriv i h) g (i :: L)) d:ℕi:Fin dL:List (Fin d)ih:∀ {g : Space d → ℝ}, ContDiff ℝ ∞ g → ContDiff ℝ ∞ (List.foldr (fun i h => Space.deriv i h) g L)g:Space d → ℝhg:ContDiff ℝ ∞ ghtail:ContDiff ℝ ∞ (List.foldr (fun j h => Space.deriv j h) g L)⊢ ContDiff ℝ ∞ (List.foldr (fun i h => Space.deriv i h) g (i :: L)) All goals completed! 🐙lemma iteratedDerivList_isTestFunction (L : List (Fin d)) {g : Space d → ℝ} (hg : IsTestFunction g) : IsTestFunction (L.foldr (fun i h => ∂[i] h) g) := d:ℕL:List (Fin d)g:Space d → ℝhg:IsTestFunction g⊢ IsTestFunction (List.foldr (fun i h => Space.deriv i h) g L) induction L generalizing g with d:ℕg:Space d → ℝhg:IsTestFunction g⊢ IsTestFunction (List.foldr (fun i h => Space.deriv i h) g []) All goals completed! 🐙 d:ℕi:Fin dL:List (Fin d)ih:∀ {g : Space d → ℝ}, IsTestFunction g → IsTestFunction (List.foldr (fun i h => Space.deriv i h) g L)g:Space d → ℝhg:IsTestFunction g⊢ IsTestFunction (List.foldr (fun i h => Space.deriv i h) g (i :: L)) d:ℕi:Fin dL:List (Fin d)ih:∀ {g : Space d → ℝ}, IsTestFunction g → IsTestFunction (List.foldr (fun i h => Space.deriv i h) g L)g:Space d → ℝhg:IsTestFunction g⊢ IsTestFunction (Space.deriv i (List.foldr (fun i h => Space.deriv i h) g L)) All goals completed! 🐙d:ℕi:Fin dj:Fin dL:List (Fin d)ih:∀ {g : Space d → ℝ}, ContDiff ℝ ∞ g → List.foldr (fun j h => Space.deriv j h) (Space.deriv i g) L = Space.deriv i (List.foldr (fun j h => Space.deriv j h) g L)g:Space d → ℝhg:ContDiff ℝ ∞ gh2:ContDiff ℝ (↑2) (List.foldr (fun j h => Space.deriv j h) g L)⊢ ContDiff ℝ 2 (List.foldr (fun j h => Space.deriv j h) g L) All goals completed! 🐙lemma iteratedDeriv_coord_isTestFunction (η : AdmissibleVariation d (EuclideanSpace ℝ (Fin m))) (I : DerivativeIndex d k) (a : Fin m) : IsTestFunction (fun x => ∂^[I.1] (fun y => (η y) a) x) := d:ℕm:ℕk:ℕη:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))I:DerivativeIndex d ka:Fin m⊢ IsTestFunction fun x => Space.iteratedDeriv (↑I) (fun y => (η.toFun y).ofLp a) x All goals completed! 🐙lemma firstVariationDensityTerm_integrable_of_continuous_coordDeriv (L : Lagrangian d m k) (f : Space d → EuclideanSpace ℝ (Fin m)) (η : AdmissibleVariation d (EuclideanSpace ℝ (Fin m))) (I : DerivativeIndex d k) (a : Fin m) (hcont : Continuous (fun x : Space d => L.coordDeriv I a (jetAt k f x))) : Integrable (firstVariationDensityTerm L f η I a) := d:ℕm:ℕk:ℕL:Lagrangian d m kf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))I:DerivativeIndex d ka:Fin mhcont:Continuous fun x => L.coordDeriv I a (jetAt k f x)⊢ Integrable (firstVariationDensityTerm L f η I a) volume d:ℕm:ℕk:ℕL:Lagrangian d m kf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))I:DerivativeIndex d ka:Fin mhcont:Continuous fun x => L.coordDeriv I a (jetAt k f x)ψ:Space d → ℝ := fun x => Space.iteratedDeriv (↑I) (fun y => (η.toFun y).ofLp a) x⊢ Integrable (firstVariationDensityTerm L f η I a) volume d:ℕm:ℕk:ℕL:Lagrangian d m kf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))I:DerivativeIndex d ka:Fin mhcont:Continuous fun x => L.coordDeriv I a (jetAt k f x)ψ:Space d → ℝ := fun x => Space.iteratedDeriv (↑I) (fun y => (η.toFun y).ofLp a) xhψ:IsTestFunction ψ⊢ Integrable (firstVariationDensityTerm L f η I a) volume d:ℕm:ℕk:ℕL:Lagrangian d m kf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))I:DerivativeIndex d ka:Fin mhcont:Continuous fun x => L.coordDeriv I a (jetAt k f x)ψ:Space d → ℝ := fun x => Space.iteratedDeriv (↑I) (fun y => (η.toFun y).ofLp a) xhψ:IsTestFunction ψhψcont:Continuous ψ⊢ Integrable (firstVariationDensityTerm L f η I a) volume d:ℕm:ℕk:ℕL:Lagrangian d m kf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))I:DerivativeIndex d ka:Fin mhcont:Continuous fun x => L.coordDeriv I a (jetAt k f x)ψ:Space d → ℝ := fun x => Space.iteratedDeriv (↑I) (fun y => (η.toFun y).ofLp a) xhψ:IsTestFunction ψhψcont:Continuous ψhtermCont:Continuous fun x => L.coordDeriv I a (jetAt k f x) * ψ x⊢ Integrable (firstVariationDensityTerm L f η I a) volume d:ℕm:ℕk:ℕL:Lagrangian d m kf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))I:DerivativeIndex d ka:Fin mhcont:Continuous fun x => L.coordDeriv I a (jetAt k f x)ψ:Space d → ℝ := fun x => Space.iteratedDeriv (↑I) (fun y => (η.toFun y).ofLp a) xhψ:IsTestFunction ψhψcont:Continuous ψhtermCont:Continuous fun x => L.coordDeriv I a (jetAt k f x) * ψ xhsupp:HasCompactSupport fun x => L.coordDeriv I a (jetAt k f x) * ψ x⊢ Integrable (firstVariationDensityTerm L f η I a) volume All goals completed! 🐙

C. Varied local-jet coordinates

d:ℕm:ℕk:ℕf:Space d → EuclideanSpace ℝ (Fin m)η:AdmissibleVariation d (EuclideanSpace ℝ (Fin m))hf:ContDiff ℝ ∞ fhfjet:Continuous (jetCoordinatesAt k f)hηjet:Continuous (jetCoordinatesAt k η.toFun)hcoord:Continuous fun p => jetCoordinatesAt k f p.2 + p.1 • jetCoordinatesAt k η.toFun p.2hpair:Continuous fun p => (p.2, jetCoordinatesAt k f p.2 + p.1 • jetCoordinatesAt k η.toFun p.2)heq:(fun p => (p.2, jetCoordinatesAt k (variedField f η p.1) p.2)) = fun p => (p.2, jetCoordinatesAt k f p.2 + p.1 • jetCoordinatesAt k η.toFun p.2)⊢ Continuous fun p => (p.2, jetCoordinatesAt k f p.2 + p.1 • jetCoordinatesAt k η.toFun p.2) All goals completed! 🐙