diff --git a/LeanPool/Vlasov/ForMathlib/VariationalEquation.lean b/LeanPool/Vlasov/ForMathlib/VariationalEquation.lean new file mode 100644 index 0000000000..824672bd0d --- /dev/null +++ b/LeanPool/Vlasov/ForMathlib/VariationalEquation.lean @@ -0,0 +1,701 @@ +/- +Copyright (c) 2026 Joseph K. Miller. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph K. Miller +-/ +module + +public import Mathlib.Analysis.Calculus.ParametricIntegral +public import Mathlib.Analysis.ODE.Gronwall +public import Mathlib.Analysis.SpecialFunctions.Integrals.Basic + +/-! +# Generic analysis for the Vlasov variational equation + +Picard-series solutions and their parameter dependence, a GrΓΆnwall difference-quotient bound, +and joint differentiability from continuous partial derivatives. These arguments use only +Mathlib, so they can compile independently of the characteristic-flow construction. +-/ + +@[expose] public section + +namespace Vlasov + +open MeasureTheory Filter Topology Asymptotics + +/-- Picard iterates for the linear IVP `x' = π’œ(t)x`, `x(0)=xβ‚€` (the V1c engine): +`Iβ‚€ ≑ xβ‚€`, `I_{n+1}(t) = βˆ«β‚€α΅— π’œ(s)(Iβ‚™(s)) ds`. -/ +noncomputable def picardIter {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) : β„• β†’ ℝ β†’ E + | 0, _ => xβ‚€ + | (n + 1), t => ∫ s in (0 : ℝ)..t, π’œ s (picardIter π’œ xβ‚€ n s) + +@[simp] lemma picardIter_zero {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (t : ℝ) : picardIter π’œ xβ‚€ 0 t = xβ‚€ := rfl + +lemma picardIter_succ {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (n : β„•) (t : ℝ) : + picardIter π’œ xβ‚€ (n + 1) t = ∫ s in (0 : ℝ)..t, π’œ s (picardIter π’œ xβ‚€ n s) := rfl + +/-- **C3 V1c-engine β€” the Picard iterates are continuous and satisfy the geometric +`(Kt)ⁿ/n!`-bound on `[0,T]`.** Proved by simultaneous induction (continuity feeds +integrability, which feeds the next bound). This `Ξ£ (KT)ⁿ/n! = e^{KT}`-summable bound is the +convergence driver for the V1c fixed point. -/ +lemma picardIter_continuousOn_and_bound {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) + (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hcontπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) + (hboundπ’œ : βˆ€ t ∈ Set.Icc 0 T, β€–π’œ tβ€– ≀ K) : + βˆ€ n, ContinuousOn (picardIter π’œ xβ‚€ n) (Set.Icc 0 T) ∧ + βˆ€ t ∈ Set.Icc 0 T, β€–picardIter π’œ xβ‚€ n tβ€– ≀ (K * t) ^ n / n.factorial * β€–xβ‚€β€– := by + intro n + induction n with + | zero => + refine ⟨continuousOn_const, fun t ht => ?_⟩ + simp + | succ n ih => + obtain ⟨ih_cont, ih_bd⟩ := ih + have hg_cont : ContinuousOn (fun s => π’œ s (picardIter π’œ xβ‚€ n s)) (Set.Icc 0 T) := + hcontπ’œ.clm_apply ih_cont + have hg_int : IntegrableOn (fun s => π’œ s (picardIter π’œ xβ‚€ n s)) (Set.Icc 0 T) := + hg_cont.integrableOn_Icc + refine ⟨?_, ?_⟩ + Β· have hcp := intervalIntegral.continuousOn_primitive_interval (a := 0) (b := T) (ΞΌ := volume) + (f := fun s => π’œ s (picardIter π’œ xβ‚€ n s)) (by rw [Set.uIcc_of_le hT]; exact hg_int) + rw [Set.uIcc_of_le hT] at hcp + exact hcp + Β· intro t ht + have ht0 : (0 : ℝ) ≀ t := ht.1 + have htT : t ≀ T := ht.2 + have h_ptwise : βˆ€ s ∈ Set.Icc (0 : ℝ) t, + β€–π’œ s (picardIter π’œ xβ‚€ n s)β€– ≀ K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– := by + intro s hs + have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨hs.1, le_trans hs.2 htT⟩ + calc β€–π’œ s (picardIter π’œ xβ‚€ n s)β€– + ≀ β€–π’œ sβ€– * β€–picardIter π’œ xβ‚€ n sβ€– := (π’œ s).le_opNorm _ + _ ≀ K * ((K * s) ^ n / n.factorial * β€–xβ‚€β€–) := + mul_le_mul (hboundπ’œ s hsT) (ih_bd s hsT) (norm_nonneg _) hK + _ = K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– := by ring + have hRHS_int : IntervalIntegrable + (fun s => K * (K * s) ^ n / n.factorial * β€–xβ‚€β€–) volume 0 t := + (Continuous.intervalIntegrable (by fun_prop) 0 t) + have hLHS_int : IntervalIntegrable + (fun s => β€–π’œ s (picardIter π’œ xβ‚€ n s)β€–) volume 0 t := by + apply ContinuousOn.intervalIntegrable + rw [Set.uIcc_of_le ht0] + exact (hg_cont.mono (Set.Icc_subset_Icc_right htT)).norm + calc β€–picardIter π’œ xβ‚€ (n + 1) tβ€– + = β€–βˆ« s in (0 : ℝ)..t, π’œ s (picardIter π’œ xβ‚€ n s)β€– := by rw [picardIter_succ] + _ ≀ ∫ s in (0 : ℝ)..t, β€–π’œ s (picardIter π’œ xβ‚€ n s)β€– := + intervalIntegral.norm_integral_le_integral_norm ht0 + _ ≀ ∫ s in (0 : ℝ)..t, K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– := + intervalIntegral.integral_mono_on ht0 hLHS_int hRHS_int h_ptwise + _ = (K * t) ^ (n + 1) / (n + 1).factorial * β€–xβ‚€β€– := by + have hpow : βˆ€ s : ℝ, K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– + = (K ^ (n + 1) * β€–xβ‚€β€– / n.factorial) * s ^ n := by + intro s; rw [mul_pow]; ring + simp_rw [hpow] + rw [intervalIntegral.integral_const_mul, integral_pow] + rw [Nat.factorial_succ] + push_cast + rw [mul_pow] + field_simp + ring + +/-- The Picard majorant can be chosen uniformly over the whole time window. -/ +private lemma picardIter_norm_le_uniform + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hcontπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (hboundπ’œ : βˆ€ t ∈ Set.Icc 0 T, β€–π’œ tβ€– ≀ K) + (n : β„•) (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : + β€–picardIter π’œ xβ‚€ n tβ€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := by + refine ((picardIter_continuousOn_and_bound π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ n).2 t ht).trans ?_ + exact mul_le_mul_of_nonneg_right + (div_le_div_of_nonneg_right + (pow_le_pow_leftβ‚€ (mul_nonneg hK ht.1) (mul_le_mul_of_nonneg_left ht.2 hK) n) + (Nat.cast_nonneg _)) (norm_nonneg _) + +/-- **Step 3 (i) β€” joint `(z,s)` continuity of the Dyson sum** (global-hypothesis form). +The Picard iterates are jointly continuous, and their common summable majorant gives continuity +of the sum on `univ Γ—Λ’ Icc 0 T`. Fixed-time continuity specializes this result. -/ +lemma picardSum_continuous_param_joint + {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hπ’œ_cont : Continuous (fun p : Z Γ— ℝ => π’œ p.1 p.2)) + (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) : + ContinuousOn (fun p : Z Γ— ℝ => βˆ‘' n, picardIter (π’œ p.1) xβ‚€ n p.2) + (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by + have hiter_cont : βˆ€ n, Continuous (fun p : Z Γ— ℝ => picardIter (π’œ p.1) xβ‚€ n p.2) := by + intro n + induction n with + | zero => + simp only [picardIter_zero] + exact continuous_const + | succ n ih => + have hg : Continuous (Function.uncurry fun z v => π’œ z v (picardIter (π’œ z) xβ‚€ n v)) := + hπ’œ_cont.clm_apply ih + have hpp := intervalIntegral.continuous_parametric_primitive_of_continuous + (ΞΌ := volume) (aβ‚€ := (0 : ℝ)) hg + simp only [picardIter_succ] + exact hpp + have hπ’œcont_z : βˆ€ z, ContinuousOn (π’œ z) (Set.Icc (0 : ℝ) T) := fun z => + (hπ’œ_cont.comp (continuous_const.prodMk continuous_id)).continuousOn + have hbd : βˆ€ (n : β„•) (p : Z Γ— ℝ), p ∈ Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T β†’ + β€–picardIter (π’œ p.1) xβ‚€ n p.2β€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := + fun n p hp => picardIter_norm_le_uniform (π’œ p.1) xβ‚€ T hT K hK + (hπ’œcont_z p.1) (hπ’œ_bound p.1) n p.2 hp.2 + have hsum : Summable (fun n => (K * T) ^ n / n.factorial * β€–xβ‚€β€–) := + (Real.summable_pow_div_factorial (K * T)).mul_right β€–xβ‚€β€– + exact continuousOn_tsum (fun n => (hiter_cont n).continuousOn) hsum hbd + +/-- **Step 3 (i) β€” joint `(z,s)` continuity of the Dyson sum** on a time window. +Clamp time into `[0,T]` so the global form applies, then transfer back by agreement of the +iterates on `[0,T]`. Fixed-time continuity specializes this result. -/ +lemma picardSum_continuous_param_Icc_joint + {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hπ’œ_contOn : ContinuousOn (fun p : Z Γ— ℝ => π’œ p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) + (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) : + ContinuousOn (fun p : Z Γ— ℝ => βˆ‘' n, picardIter (π’œ p.1) xβ‚€ n p.2) + (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by + set cl : ℝ β†’ ℝ := fun s => ↑(Set.projIcc 0 T hT s) with hcl + have hcl_cont : Continuous cl := continuous_subtype_val.comp continuous_projIcc + have hcl_mem : βˆ€ s, cl s ∈ Set.Icc (0 : ℝ) T := fun s => (Set.projIcc 0 T hT s).2 + have hcl_eq : βˆ€ s ∈ Set.Icc (0 : ℝ) T, cl s = s := by + intro s hs; change (↑(Set.projIcc 0 T hT s) : ℝ) = s; rw [Set.projIcc_of_mem hT hs] + set π’œc : Z β†’ ℝ β†’ (E β†’L[ℝ] E) := fun z s => π’œ z (cl s) with hπ’œc + have hπ’œc_cont : Continuous (fun p : Z Γ— ℝ => π’œc p.1 p.2) := by + have hmap : Continuous (fun p : Z Γ— ℝ => ((p.1, cl p.2) : Z Γ— ℝ)) := + continuous_fst.prodMk (hcl_cont.comp continuous_snd) + have hmem : βˆ€ p : Z Γ— ℝ, ((p.1, cl p.2) : Z Γ— ℝ) ∈ Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T := + fun p => ⟨Set.mem_univ _, hcl_mem p.2⟩ + exact hπ’œ_contOn.comp_continuous hmap hmem + have hπ’œc_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œc z sβ€– ≀ K := + fun z s _ => hπ’œ_bound z (cl s) (hcl_mem s) + have hagree : βˆ€ (n : β„•) (z : Z), βˆ€ s ∈ Set.Icc (0 : ℝ) T, + picardIter (π’œc z) xβ‚€ n s = picardIter (π’œ z) xβ‚€ n s := by + intro n + induction n with + | zero => intro z s _; simp + | succ n ih => + intro z s hs + simp only [picardIter_succ] + refine intervalIntegral.integral_congr (fun u hu => ?_) + have huIcc : u ∈ Set.Icc (0 : ℝ) T := by + rw [Set.uIcc_of_le hs.1] at hu; exact ⟨hu.1, le_trans hu.2 hs.2⟩ + have e1 : π’œc z u = π’œ z u := by simp only [hπ’œc, hcl_eq u huIcc] + rw [e1, ih z u huIcc] + have key := picardSum_continuous_param_joint π’œc xβ‚€ T hT K hK hπ’œc_cont hπ’œc_bound + refine key.congr ?_ + rintro ⟨z, s⟩ ⟨_, hs⟩ + simp only + congr 1; funext n; exact (hagree n z s hs).symm + +/-- **C3 V1c-conv β€” the Dyson sum `M := βˆ‘β‚™ Iβ‚™` is continuous on `[0,T]`.** Weierstrass M-test: +the terms are dominated by the summable majorant `(KT)ⁿ/n!Β·β€–xβ‚€β€–`, so the series converges +uniformly; the uniform limit of the continuous partial sums is continuous. (`M` is the candidate +solution: `M = xβ‚€ + βˆ«β‚€α΅— π’œ(s)(M s) ds`, proved next.) -/ +lemma picardSum_continuousOn {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hcontπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (hboundπ’œ : βˆ€ t ∈ Set.Icc 0 T, β€–π’œ tβ€– ≀ K) : + ContinuousOn (fun t => βˆ‘' n, picardIter π’œ xβ‚€ n t) (Set.Icc 0 T) := by + have hcb := picardIter_continuousOn_and_bound π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ + have hbd : βˆ€ (n : β„•) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + β€–picardIter π’œ xβ‚€ n tβ€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := + picardIter_norm_le_uniform π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ + have hsum : Summable (fun n => (K * T) ^ n / n.factorial * β€–xβ‚€β€–) := + (Real.summable_pow_div_factorial (K * T)).mul_right β€–xβ‚€β€– + exact continuousOn_tsum (fun n => (hcb n).1) hsum hbd + +/-- **C3 V2-core β€” the Dyson sum is continuous in a parameter.** Restrict joint continuity +of the Dyson sum to a fixed time in `[0,T]`. The uniform majorant and convergence argument live +in `picardSum_continuous_param_joint`, shared by both forms. -/ +lemma picardSum_continuous_param + {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hπ’œ_cont : Continuous (fun p : Z Γ— ℝ => π’œ p.1 p.2)) + (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) + (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : + Continuous (fun z => βˆ‘' n, picardIter (π’œ z) xβ‚€ n t) := by + exact (picardSum_continuous_param_joint π’œ xβ‚€ T hT K hK hπ’œ_cont hπ’œ_bound).comp_continuous + (continuous_id.prodMk continuous_const) (fun z => ⟨Set.mem_univ z, ht⟩) + +/-- Window version of `picardSum_continuous_param`: restrict the joint window theorem to a +fixed time. The clamping and iterate-agreement argument is shared with the joint form. -/ +lemma picardSum_continuous_param_Icc + {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hπ’œ_contOn : ContinuousOn (fun p : Z Γ— ℝ => π’œ p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) + (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) + (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : + Continuous (fun z => βˆ‘' n, picardIter (π’œ z) xβ‚€ n t) := by + exact (picardSum_continuous_param_Icc_joint π’œ xβ‚€ T hT K hK hπ’œ_contOn hπ’œ_bound).comp_continuous + (continuous_id.prodMk continuous_const) (fun z => ⟨Set.mem_univ z, ht⟩) + +/-- **C3 V1c-rec β€” finite Picard recurrence.** The `(N+1)`-th partial Dyson sum equals +`xβ‚€ + βˆ«β‚€α΅— π’œ(s)(Sβ‚™(s)) ds`, where `Sβ‚™ = βˆ‘_{n π’œ s (picardIter π’œ xβ‚€ n s)) volume 0 t := by + intro n + apply ContinuousOn.intervalIntegrable + rw [Set.uIcc_of_le ht.1] + exact (hcontπ’œ.clm_apply (hcb n).1).mono (Set.Icc_subset_Icc_right ht.2) + rw [Finset.sum_range_succ', picardIter_zero] + simp only [picardIter_succ] + rw [add_comm] + congr 1 + rw [← intervalIntegral.integral_finsetSum (fun i _ => hint i)] + refine intervalIntegral.integral_congr (fun s _ => ?_) + exact (map_sum (π’œ s) (fun i => picardIter π’œ xβ‚€ i s) (Finset.range N)).symm + +/-- **C3 V1c-inteq β€” the Dyson sum solves the integral equation.** +`M(t) = xβ‚€ + βˆ«β‚€α΅— π’œ(s)(M s) ds` on `[0,T]`, where `M = βˆ‘'β‚™ Iβ‚™`. Pass `N β†’ ∞` in the finite +recurrence: LHS β†’ `M t` (partial sums of the summable series); RHS via DCT (the terms +`π’œ(s)(S_N s) β†’ π’œ(s)(M s)` pointwise, dominated by the constant `KΒ·βˆ‘'β‚™ (KT)ⁿ/n!Β·β€–xβ‚€β€–`). -/ +lemma picardSum_solves_integralEq + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hcontπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (hboundπ’œ : βˆ€ t ∈ Set.Icc 0 T, β€–π’œ tβ€– ≀ K) + (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : + (βˆ‘' n, picardIter π’œ xβ‚€ n t) + = xβ‚€ + ∫ s in (0 : ℝ)..t, π’œ s (βˆ‘' n, picardIter π’œ xβ‚€ n s) := by + have hcb := picardIter_continuousOn_and_bound π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ + have ht0 : (0 : ℝ) ≀ t := ht.1 + have htT : t ≀ T := ht.2 + have hmaj : βˆ€ n, βˆ€ s ∈ Set.Icc (0 : ℝ) T, + β€–picardIter π’œ xβ‚€ n sβ€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := + picardIter_norm_le_uniform π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ + have hmaj_summable : Summable (fun n => (K * T) ^ n / n.factorial * β€–xβ‚€β€–) := + (Real.summable_pow_div_factorial (K * T)).mul_right β€–xβ‚€β€– + have hsummable : βˆ€ s ∈ Set.Icc (0 : ℝ) T, Summable (fun n => picardIter π’œ xβ‚€ n s) := by + intro s hs + exact (hmaj_summable.of_nonneg_of_le (fun n => norm_nonneg _) (fun n => hmaj n s hs)).of_norm + set C : ℝ := βˆ‘' n, (K * T) ^ n / n.factorial * β€–xβ‚€β€– with hC + have hSbound : βˆ€ N, βˆ€ s ∈ Set.Icc (0 : ℝ) T, + β€–βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n sβ€– ≀ C := by + intro N s hs + refine le_trans (norm_sum_le _ _) ?_ + refine le_trans (Finset.sum_le_sum (fun n _ => hmaj n s hs)) ?_ + exact hmaj_summable.sum_le_tsum _ (fun n _ => by positivity) + set M : ℝ β†’ E := fun u => βˆ‘' n, picardIter π’œ xβ‚€ n u with hM + have hLHS : Filter.Tendsto (fun N => βˆ‘ n ∈ Finset.range (N + 1), picardIter π’œ xβ‚€ n t) + Filter.atTop (nhds (M t)) := + ((hsummable t ht).hasSum.tendsto_sum_nat).comp (Filter.tendsto_add_atTop_nat 1) + have hRHS_int : Filter.Tendsto + (fun N => ∫ s in Set.Ioc (0 : ℝ) t, π’œ s (βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n s)) + Filter.atTop (nhds (∫ s in Set.Ioc (0 : ℝ) t, π’œ s (M s))) := by + apply MeasureTheory.tendsto_integral_of_dominated_convergence (bound := fun _ => K * C) + Β· intro N + apply ContinuousOn.aestronglyMeasurable _ measurableSet_Ioc + exact (hcontπ’œ.clm_apply (continuousOn_finsetSum _ (fun n _ => (hcb n).1))).mono + (Set.Ioc_subset_Icc_self.trans (Set.Icc_subset_Icc_right htT)) + Β· exact integrableOn_const (hs := measure_Ioc_lt_top.ne) + Β· intro N + refine MeasureTheory.ae_restrict_of_forall_mem measurableSet_Ioc (fun s hs => ?_) + have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨le_of_lt hs.1, le_trans hs.2 htT⟩ + calc β€–π’œ s (βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n s)β€– + ≀ β€–π’œ sβ€– * β€–βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n sβ€– := (π’œ s).le_opNorm _ + _ ≀ K * C := mul_le_mul (hboundπ’œ s hsT) (hSbound N s hsT) (norm_nonneg _) hK + Β· refine MeasureTheory.ae_restrict_of_forall_mem measurableSet_Ioc (fun s hs => ?_) + have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨le_of_lt hs.1, le_trans hs.2 htT⟩ + exact ((π’œ s).continuous.tendsto (M s)).comp ((hsummable s hsT).hasSum.tendsto_sum_nat) + rw [intervalIntegral.integral_of_le ht0] + have hrec' : βˆ€ N, βˆ‘ n ∈ Finset.range (N + 1), picardIter π’œ xβ‚€ n t + = xβ‚€ + ∫ s in Set.Ioc (0 : ℝ) t, π’œ s (βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n s) := by + intro N + rw [picardSum_finset_recurrence π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ N t ht, + intervalIntegral.integral_of_le ht0] + exact tendsto_nhds_unique hLHS ((hRHS_int.const_add xβ‚€).congr (fun N => (hrec' N).symm)) + +/-- The explicit Picard sum satisfies the linear initial-value problem. -/ +private lemma picardSum_spec + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (T : ℝ) (hT : 0 ≀ T) + (hπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (xβ‚€ : E) : + (βˆ‘' n, picardIter π’œ xβ‚€ n 0) = xβ‚€ ∧ + ContinuousOn (fun t => βˆ‘' n, picardIter π’œ xβ‚€ n t) (Set.Icc 0 T) ∧ + βˆ€ t ∈ Set.Icc 0 T, + HasDerivWithinAt (fun t => βˆ‘' n, picardIter π’œ xβ‚€ n t) + (π’œ t (βˆ‘' n, picardIter π’œ xβ‚€ n t)) (Set.Icc 0 T) t := by + obtain ⟨K, hbK⟩ := isCompact_Icc.exists_bound_of_continuousOn hπ’œ + have hK'0 : 0 ≀ max K 0 := le_max_right _ _ + have hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, β€–π’œ tβ€– ≀ max K 0 := + fun t ht => le_trans (hbK t ht) (le_max_left _ _) + set M : ℝ β†’ E := fun u => βˆ‘' n, picardIter π’œ xβ‚€ n u with hM + have hMcont : ContinuousOn M (Set.Icc 0 T) := + picardSum_continuousOn π’œ xβ‚€ T hT (max K 0) hK'0 hπ’œ hbound + have hMeq : βˆ€ t ∈ Set.Icc (0 : ℝ) T, M t = xβ‚€ + ∫ s in (0 : ℝ)..t, π’œ s (M s) := + fun t ht => picardSum_solves_integralEq π’œ xβ‚€ T hT (max K 0) hK'0 hπ’œ hbound t ht + have hg_cont : ContinuousOn (fun s => π’œ s (M s)) (Set.Icc 0 T) := hπ’œ.clm_apply hMcont + refine ⟨?_, hMcont, fun t ht => ?_⟩ + Β· change M 0 = xβ‚€ + rw [hMeq 0 ⟨le_refl 0, hT⟩, intervalIntegral.integral_same, add_zero] + Β· have : Fact (t ∈ Set.Icc (0 : ℝ) T) := ⟨ht⟩ + have hg_int : IntervalIntegrable (fun s => π’œ s (M s)) volume 0 t := by + apply ContinuousOn.intervalIntegrable + rw [Set.uIcc_of_le ht.1] + exact hg_cont.mono (Set.Icc_subset_Icc_right ht.2) + have hg_meas : StronglyMeasurableAtFilter (fun s => π’œ s (M s)) (nhdsWithin t (Set.Icc 0 T)) := + ⟨Set.Icc 0 T, self_mem_nhdsWithin, hg_cont.aestronglyMeasurable measurableSet_Icc⟩ + have hFTC : HasDerivWithinAt (fun u => ∫ s in (0 : ℝ)..u, π’œ s (M s)) (π’œ t (M t)) + (Set.Icc 0 T) t := + intervalIntegral.integral_hasDerivWithinAt_right hg_int hg_meas (hg_cont t ht) + exact (hFTC.const_add xβ‚€).congr (fun y hy => hMeq y hy) (hMeq t ht) + + +/-- Existence for a linear ODE with continuous coefficients on a compact interval. +The Picard sum gives an explicit solution. Its summable factorial majorant supplies continuity, +and its integral equation supplies the derivative through the fundamental theorem of calculus. -/ +theorem exists_linearODE_solution_Icc + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (T : ℝ) (hT : 0 ≀ T) + (hπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (xβ‚€ : E) : + βˆƒ M : ℝ β†’ E, M 0 = xβ‚€ ∧ ContinuousOn M (Set.Icc 0 T) ∧ + βˆ€ t ∈ Set.Icc 0 T, HasDerivWithinAt M (π’œ t (M t)) (Set.Icc 0 T) t := by + exact ⟨fun t => βˆ‘' n, picardIter π’œ xβ‚€ n t, picardSum_spec π’œ T hT hπ’œ xβ‚€βŸ© + +/-- **C3 V1cβ†’matrix β€” the fundamental matrix of a linear ODE.** Specialising +`exists_linearODE_solution_Icc` to the operator space `E := F β†’L[ℝ] F` with `π’œ(s) := A(s) ∘ (Β·)` +(left composition) and `xβ‚€ := id` gives the fundamental solution `M' = A(t)∘M`, `M(0) = id`. +This `M(t)` is the candidate `Dflow t z` of the variational equation (#3), once `A` is the Vlasov +field Jacobian `A(s) = D_z b(s, Ξ¦_s z)` along the flow (F2). -/ +lemma exists_fundamentalMatrix + {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] + (A : ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (hA : ContinuousOn A (Set.Icc 0 T)) : + βˆƒ M : ℝ β†’ (F β†’L[ℝ] F), M 0 = ContinuousLinearMap.id ℝ F ∧ ContinuousOn M (Set.Icc 0 T) ∧ + βˆ€ t ∈ Set.Icc 0 T, HasDerivWithinAt M ((A t).comp (M t)) (Set.Icc 0 T) t := by + obtain ⟨M, hM0, hMcont, hMderiv⟩ := exists_linearODE_solution_Icc + (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) T hT + ((ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA) + (ContinuousLinearMap.id ℝ F) + refine ⟨M, hM0, hMcont, fun t ht => ?_⟩ + simpa [ContinuousLinearMap.compL_apply] using hMderiv t ht + +/-- **C3 (shared) β€” Lipschitz-in-parameter + ContinuousOn-in-time β‡’ jointly ContinuousOn.** +A generic upgrade: if `G z Β·` is `ContinuousOn (Icc 0 T)` for each `z` and `z ↦ G z s` is +`C`-Lipschitz uniformly over `s ∈ [0,T]`, then `(z,s) ↦ G z s` is jointly continuous on +`univ Γ—Λ’ Icc 0 T`. Used to derive flow joint continuity `(z,s) ↦ Ξ¦_s z` from +`charFlow_lipschitzInZ_via_gronwall_Ioo` (Lipschitz-in-`z`) + per-`z` continuity in `s`. -/ +lemma continuousOn_prod_of_lipschitz_continuousOn + {Z E : Type*} [PseudoMetricSpace Z] [PseudoMetricSpace E] + (G : Z β†’ ℝ β†’ E) (T C : ℝ) + (hlip : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z₁ zβ‚‚, dist (G z₁ s) (G zβ‚‚ s) ≀ C * dist z₁ zβ‚‚) + (hcont : βˆ€ z, ContinuousOn (fun s => G z s) (Set.Icc (0 : ℝ) T)) : + ContinuousOn (fun p : Z Γ— ℝ => G p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by + rw [Metric.continuousOn_iff] + rintro ⟨zβ‚€, sβ‚€βŸ© ⟨_, hsβ‚€βŸ© Ξ΅ hΞ΅ + obtain βŸ¨Ξ΄β‚, hδ₁, hcs⟩ := + (Metric.continuousWithinAt_iff).mp (hcont zβ‚€ sβ‚€ hsβ‚€) (Ξ΅/2) (by positivity) + have hC1 : (0 : ℝ) < |C| + 1 := by positivity + refine ⟨min δ₁ (Ξ΅ / (2 * (|C| + 1))), by positivity, ?_⟩ + rintro ⟨z, s⟩ ⟨_, hs⟩ hd + rw [Prod.dist_eq, max_lt_iff] at hd + obtain ⟨hdz, hds⟩ := hd + have hterm1 : dist (G z s) (G zβ‚€ s) < Ξ΅/2 := by + calc dist (G z s) (G zβ‚€ s) + ≀ C * dist z zβ‚€ := hlip s hs z zβ‚€ + _ ≀ (|C| + 1) * dist z zβ‚€ := + mul_le_mul_of_nonneg_right (by linarith [le_abs_self C]) dist_nonneg + _ < (|C| + 1) * (Ξ΅ / (2 * (|C| + 1))) := + mul_lt_mul_of_pos_left (lt_of_lt_of_le hdz (min_le_right _ _)) hC1 + _ = Ξ΅/2 := by field_simp + have hterm2 : dist (G zβ‚€ s) (G zβ‚€ sβ‚€) < Ξ΅/2 := + hcs hs (lt_of_lt_of_le hds (min_le_left _ _)) + calc dist (G z s) (G zβ‚€ sβ‚€) + ≀ dist (G z s) (G zβ‚€ s) + dist (G zβ‚€ s) (G zβ‚€ sβ‚€) := dist_triangle _ _ _ + _ < Ξ΅/2 + Ξ΅/2 := add_lt_add hterm1 hterm2 + _ = Ξ΅ := by ring + +/-- Generic GrΓΆnwall difference-quotient bound (open-interval ODE + `sβ‚€β†’0⁺` limit). Two curves +`uh, mh` that approximately solve the same linear ODE `w' = vlinΒ·w` on `Ioo 0 T` from the same datum +(`uh 0 = mh 0`), with `mh` exact and `uh`'s defect uniformly `≀ Ξ΅f`, satisfy +`dist (uh t) (mh t) ≀ gronwallBound 0 K Ξ΅f t`. `vlin` is abstract (kept opaque to avoid unfolding +the heavy `vlasovFieldJacobian` integral in the GrΓΆnwall application). -/ +lemma gronwall_diffQuotient_bound + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + (vlin : ℝ β†’ (E β†’L[ℝ] E)) (K : NNReal) (hvlin_lip : βˆ€ s, LipschitzWith K (vlin s)) + (uh mh Fuh : ℝ β†’ E) (Ξ΅f : ℝ) (T t : ℝ) (ht : t ∈ Set.Ioo (0 : ℝ) T) + (huh_cont : ContinuousOn uh (Set.Icc 0 T)) (hmh_cont : ContinuousOn mh (Set.Icc 0 T)) + (huh_deriv : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt uh (Fuh s) s) + (hmh_deriv : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt mh ((vlin s) (mh s)) s) + (hdefect : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, dist (Fuh s) (vlin s (uh s)) ≀ Ξ΅f) + (h0 : uh 0 = mh 0) : + dist (uh t) (mh t) ≀ gronwallBound 0 (K:ℝ) Ξ΅f t := by + have hbound_s0 : βˆ€ sβ‚€ ∈ Set.Ioo (0 : ℝ) t, + dist (uh t) (mh t) ≀ gronwallBound (dist (uh sβ‚€) (mh sβ‚€)) (K:ℝ) Ξ΅f (t - sβ‚€) := by + intro sβ‚€ hsβ‚€ + have hIco_sub : Set.Ico sβ‚€ t βŠ† Set.Ioo 0 T := fun s hs => + ⟨lt_of_lt_of_le hsβ‚€.1 hs.1, hs.2.trans ht.2⟩ + have hIcc_sub : Set.Icc sβ‚€ t βŠ† Set.Icc 0 T := fun s hs => + ⟨le_trans hsβ‚€.1.le hs.1, le_trans hs.2 ht.2.le⟩ + have key := dist_le_of_approx_trajectories_ODE (K := K) + (Ξ΅f := Ξ΅f) (Ξ΅g := 0) (Ξ΄ := dist (uh sβ‚€) (mh sβ‚€)) + hvlin_lip (huh_cont.mono hIcc_sub) + (fun s hs => (huh_deriv s (hIco_sub hs)).hasDerivWithinAt) + (fun s hs => hdefect s (hIco_sub hs)) + (hmh_cont.mono hIcc_sub) + (fun s hs => (hmh_deriv s (hIco_sub hs)).hasDerivWithinAt) + (fun s _ => le_of_eq (dist_self _)) (le_refl _) + have hkey := key t ⟨hsβ‚€.2.le, le_refl t⟩ + simpa only [add_zero] using hkey + have : (𝓝[Set.Ioo 0 t] (0 : ℝ)).NeBot := left_nhdsWithin_Ioo_neBot ht.1 + have hT0 : (0 : ℝ) ≀ T := le_trans ht.1.le ht.2.le + have hsub_Icc : Set.Ioo (0 : ℝ) t βŠ† Set.Icc 0 T := fun s hs => ⟨hs.1.le, le_trans hs.2.le ht.2.le⟩ + have htend_uh : Tendsto uh (𝓝[Set.Ioo 0 t] 0) (𝓝 (uh 0)) := + (huh_cont 0 ⟨le_refl 0, hT0⟩).tendsto.mono_left (nhdsWithin_mono 0 hsub_Icc) + have htend_mh : Tendsto mh (𝓝[Set.Ioo 0 t] 0) (𝓝 (mh 0)) := + (hmh_cont 0 ⟨le_refl 0, hT0⟩).tendsto.mono_left (nhdsWithin_mono 0 hsub_Icc) + have htend_Ξ΄ : Tendsto (fun sβ‚€ => dist (uh sβ‚€) (mh sβ‚€)) (𝓝[Set.Ioo 0 t] 0) (𝓝 0) := by + have := htend_uh.dist htend_mh + rwa [h0, dist_self] at this + have htend_x : Tendsto (fun sβ‚€ : ℝ => t - sβ‚€) (𝓝[Set.Ioo 0 t] 0) (𝓝 t) := by + have h0' : Tendsto (fun sβ‚€ : ℝ => t - sβ‚€) (𝓝 0) (𝓝 (t - 0)) := + (continuous_const.sub continuous_id).tendsto 0 + rw [sub_zero] at h0'; exact h0'.mono_left nhdsWithin_le_nhds + have hgb_cont : Continuous (fun p : ℝ Γ— ℝ => gronwallBound p.1 (K:ℝ) Ξ΅f p.2) := by + by_cases hK : (K:ℝ) = 0 + Β· simp only [hK, gronwallBound_K0]; fun_prop + Β· have heq : (fun p : ℝ Γ— ℝ => gronwallBound p.1 (K:ℝ) Ξ΅f p.2) + = fun p => p.1 * Real.exp ((K:ℝ) * p.2) + Ξ΅f / (K:ℝ) * (Real.exp ((K:ℝ) * p.2) - 1) := by + funext p; rw [gronwallBound_of_K_ne_0 hK] + rw [heq]; fun_prop + have htend_gb : Tendsto (fun sβ‚€ => gronwallBound (dist (uh sβ‚€) (mh sβ‚€)) (K:ℝ) Ξ΅f (t - sβ‚€)) + (𝓝[Set.Ioo 0 t] 0) (𝓝 (gronwallBound 0 (K:ℝ) Ξ΅f t)) := + (hgb_cont.tendsto (0, t)).comp (htend_Ξ΄.prodMk_nhds htend_x) + exact ge_of_tendsto htend_gb (eventually_nhdsWithin_of_forall (fun sβ‚€ hsβ‚€ => hbound_s0 sβ‚€ hsβ‚€)) + +/-- **Step 3 gating lemma (generic) β€” joint `CΒΉ` from continuous partial derivatives** on a +`ℝ Γ— E` domain (Mathlib-absent). A partial `s`-derivative `Ds p` at every point (`Ds` continuous) +plus a partial `z`-derivative `Dzβ‚€` at the base point β‡’ `f` is FrΓ©chet-differentiable at `(sβ‚€,zβ‚€)` +with total derivative `(h,k) ↦ hβ€’Ds(sβ‚€,zβ‚€) + Dzβ‚€ k`. Proof: split the increment into an +`s`-part (FTC `βˆ«β‚€Κ° Ds(sβ‚€+u,zβ‚€+k)du β‰ˆ hβ€’Dsβ‚€` by continuity of `Ds`) and a `z`-part +(`= Dzβ‚€ k + o(k)`). +This is the keystone for the joint `(s,w)` regularity of the two-time flow `Ξ¦_{sβ†’t}`: the flow's +partials are `M_s z` (jointly continuous, V2) in `z` and `b_s(Ξ¦_s z)` in `s`. + +**PR-ABLE (Mathlib upstream candidate).** This is a general real-analysis result with no Vlasov +content β€” "a function on `ℝ Γ— E` with a continuous partial derivative in the `ℝ` factor and a +FrΓ©chet partial derivative in the `E` factor is FrΓ©chet-differentiable" β€” filling a genuine gap in +`Mathlib/Analysis/Calculus`. Generalisation worth doing before a PR: replace the `ℝ` factor by an +arbitrary first factor with an analogous "integrate the partial along segments" hypothesis, and +weaken `Continuous Ds` to `ContinuousAt Ds` at the base point (the proof only uses a neighbourhood +of `(sβ‚€,zβ‚€)`). -/ +theorem hasFDerivAt_of_continuous_partials + {E F : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] + {f : ℝ Γ— E β†’ F} {Ds : ℝ Γ— E β†’ F} {Dzβ‚€ : E β†’L[ℝ] F} (sβ‚€ : ℝ) (zβ‚€ : E) + (hDs : βˆ€ p : ℝ Γ— E, HasDerivAt (fun s => f (s, p.2)) (Ds p) p.1) + (hDs_cont : Continuous Ds) + (hDzβ‚€ : HasFDerivAt (fun z => f (sβ‚€, z)) Dzβ‚€ zβ‚€) : + HasFDerivAt f + ((ContinuousLinearMap.fst ℝ ℝ E).smulRight (Ds (sβ‚€, zβ‚€)) + + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) (sβ‚€, zβ‚€) := by + set Dsβ‚€ : F := Ds (sβ‚€, zβ‚€) with hDsβ‚€ + rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] + intro Ξ΅ hΞ΅ + have hBz : βˆ€αΆ  k in 𝓝 (0 : E), + β€–f (sβ‚€, zβ‚€ + k) - f (sβ‚€, zβ‚€) - Dzβ‚€ kβ€– ≀ (Ξ΅ / 2) * β€–kβ€– := by + have hz := hDzβ‚€ + rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] at hz + exact hz (half_pos hΞ΅) + have hBz' : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, + β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– ≀ (Ξ΅ / 2) * β€–p.2β€– := + (continuous_snd.tendsto (0 : ℝ Γ— E)).eventually hBz + have hball : βˆ€αΆ  q in 𝓝 ((sβ‚€, zβ‚€) : ℝ Γ— E), β€–Ds q - Dsβ‚€β€– ≀ Ξ΅ / 2 := by + have hc : Tendsto Ds (𝓝 (sβ‚€, zβ‚€)) (𝓝 Dsβ‚€) := hDs_cont.continuousAt + have hsub : Tendsto (fun q => Ds q - Dsβ‚€) (𝓝 (sβ‚€, zβ‚€)) (𝓝 (Dsβ‚€ - Dsβ‚€)) := + hc.sub tendsto_const_nhds + rw [sub_self] at hsub + have h0 : Tendsto (fun q => β€–Ds q - Dsβ‚€β€–) (𝓝 (sβ‚€, zβ‚€)) (𝓝 0) := by + simpa using hsub.norm + exact h0.eventually (Iic_mem_nhds (half_pos hΞ΅)) + obtain ⟨δ, hΞ΄pos, hδ⟩ := Metric.eventually_nhds_iff.mp hball + have hAs : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, + β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– ≀ (Ξ΅ / 2) * β€–pβ€– := by + filter_upwards [Metric.ball_mem_nhds (0 : ℝ Γ— E) hΞ΄pos] with p hp + rw [mem_ball_zero_iff] at hp + have hcont_u : Continuous (fun u => Ds (u, zβ‚€ + p.2)) := + hDs_cont.comp (continuous_id.prodMk continuous_const) + have hg_deriv : βˆ€ u : ℝ, HasDerivAt (fun s => f (s, zβ‚€ + p.2)) (Ds (u, zβ‚€ + p.2)) u := + fun u => hDs (u, zβ‚€ + p.2) + have hftc : ∫ u in sβ‚€..(sβ‚€ + p.1), Ds (u, zβ‚€ + p.2) + = f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) := by + rw [intervalIntegral.integral_eq_sub_of_hasDerivAt (fun u _ => hg_deriv u) + (hcont_u.intervalIntegrable _ _)] + have hbound_u : βˆ€ u ∈ Set.uIoc sβ‚€ (sβ‚€ + p.1), β€–Ds (u, zβ‚€ + p.2) - Dsβ‚€β€– ≀ Ξ΅ / 2 := by + intro u hu + refine @hΞ΄ (u, zβ‚€ + p.2) ?_ + have hple : |p.1| ≀ β€–pβ€– := by rw [← Real.norm_eq_abs]; exact norm_fst_le p + have hp1 : |u - sβ‚€| ≀ β€–pβ€– := by + rcases Set.mem_uIcc.mp (Set.uIoc_subset_uIcc hu) with ⟨ha, hb⟩ | ⟨ha, hb⟩ + Β· rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ u - sβ‚€)] + rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ p.1)] at hple; linarith + Β· rw [abs_of_nonpos (by linarith : u - sβ‚€ ≀ 0)] + rw [abs_of_nonpos (by linarith : p.1 ≀ 0)] at hple; linarith + have hp2 : β€–p.2β€– ≀ β€–pβ€– := norm_snd_le p + rw [Prod.dist_eq] + simp only [dist_eq_norm, add_sub_cancel_left, Real.norm_eq_abs] + exact lt_of_le_of_lt (max_le hp1 hp2) hp + have hA_eq : f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€ + = ∫ u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€) := by + rw [intervalIntegral.integral_sub (hcont_u.intervalIntegrable _ _) + (intervalIntegrable_const), hftc, intervalIntegral.integral_const, + add_sub_cancel_left] + rw [hA_eq] + calc β€–βˆ« u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€)β€– + ≀ (Ξ΅ / 2) * |(sβ‚€ + p.1) - sβ‚€| := + intervalIntegral.norm_integral_le_of_norm_le_const hbound_u + _ = (Ξ΅ / 2) * β€–p.1β€– := by rw [add_sub_cancel_left, Real.norm_eq_abs] + _ ≀ (Ξ΅ / 2) * β€–pβ€– := mul_le_mul_of_nonneg_left (norm_fst_le p) (by positivity) + filter_upwards [hAs, hBz'] with p hAp hBp + have hdecomp : + f ((sβ‚€, zβ‚€) + p) - f (sβ‚€, zβ‚€) + - ((ContinuousLinearMap.fst ℝ ℝ E).smulRight Dsβ‚€ + + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) p + = (f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) + + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2) := by + rw [show ((sβ‚€, zβ‚€) + p : ℝ Γ— E) = (sβ‚€ + p.1, zβ‚€ + p.2) from rfl] + simp only [add_apply, ContinuousLinearMap.smulRight_apply, + ContinuousLinearMap.coe_fst', ContinuousLinearMap.comp_apply, + ContinuousLinearMap.coe_snd'] + abel + rw [hdecomp] + calc β€–(f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) + + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2)β€– + ≀ β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– + + β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– := norm_add_le _ _ + _ ≀ (Ξ΅ / 2) * β€–pβ€– + (Ξ΅ / 2) * β€–pβ€– := + add_le_add hAp (le_trans hBp (mul_le_mul_of_nonneg_left (norm_snd_le p) (by positivity))) + _ = Ξ΅ * β€–pβ€– := by ring + +/-- **Step 3 gating lemma (LOCAL / open-set form)** β€” joint `HasFDerivAt` from continuous partial +derivatives on an open set `U βŠ† ℝ Γ— E`. The open-set generalisation of +`hasFDerivAt_of_continuous_partials` (which is the `U := univ` special case) that the PR-note above +flagged: the `s`-partial is required only on `U`, and `Ds` only `ContinuousOn U`. This is the form +the Vlasov flow needs β€” its partials exist and are continuous only on the open window +`Ioo 0 T Γ—Λ’ univ`. Proof = the global proof + ball-in-`U` bookkeeping (`B((sβ‚€,zβ‚€),r) βŠ† U`; the FTC +segment points `(u, zβ‚€+p.2)`, `u ∈ uIcc sβ‚€ (sβ‚€+p.1)`, lie within `β€–pβ€– < min Ξ΄ (r/2)` of `(sβ‚€,zβ‚€)`, +hence in `U` and within the continuity radius `Ξ΄`). + +NOTE (consolidation TODO): the global `hasFDerivAt_of_continuous_partials` above is the `univ` +special case of this; a follow-up cleanup should rewrite it as the one-line corollary +`hasFDerivAt_of_continuous_partials_open isOpen_univ (Set.mem_univ _) (fun p _ => hDs p) +hDs_cont.continuousOn hDzβ‚€` to drop the duplicated proof. **PR-ABLE** (the more +general statement). -/ +theorem hasFDerivAt_of_continuous_partials_open + {E F : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] + {f : ℝ Γ— E β†’ F} {Ds : ℝ Γ— E β†’ F} {Dzβ‚€ : E β†’L[ℝ] F} + {U : Set (ℝ Γ— E)} (hU : IsOpen U) {sβ‚€ : ℝ} {zβ‚€ : E} (hmem : (sβ‚€, zβ‚€) ∈ U) + (hDs : βˆ€ p ∈ U, HasDerivAt (fun s => f (s, p.2)) (Ds p) p.1) + (hDs_cont : ContinuousOn Ds U) + (hDzβ‚€ : HasFDerivAt (fun z => f (sβ‚€, z)) Dzβ‚€ zβ‚€) : + HasFDerivAt f + ((ContinuousLinearMap.fst ℝ ℝ E).smulRight (Ds (sβ‚€, zβ‚€)) + + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) (sβ‚€, zβ‚€) := by + set Dsβ‚€ : F := Ds (sβ‚€, zβ‚€) with hDsβ‚€ + obtain ⟨r, hrpos, hrU⟩ := Metric.isOpen_iff.mp hU (sβ‚€, zβ‚€) hmem + rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] + intro Ξ΅ hΞ΅ + have hBz : βˆ€αΆ  k in 𝓝 (0 : E), + β€–f (sβ‚€, zβ‚€ + k) - f (sβ‚€, zβ‚€) - Dzβ‚€ kβ€– ≀ (Ξ΅ / 2) * β€–kβ€– := by + have hz := hDzβ‚€ + rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] at hz + exact hz (half_pos hΞ΅) + have hBz' : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, + β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– ≀ (Ξ΅ / 2) * β€–p.2β€– := + (continuous_snd.tendsto (0 : ℝ Γ— E)).eventually hBz + have hball : βˆ€αΆ  q in 𝓝 ((sβ‚€, zβ‚€) : ℝ Γ— E), β€–Ds q - Dsβ‚€β€– ≀ Ξ΅ / 2 := by + have hc : Tendsto Ds (𝓝 (sβ‚€, zβ‚€)) (𝓝 Dsβ‚€) := hDs_cont.continuousAt (hU.mem_nhds hmem) + have hsub : Tendsto (fun q => Ds q - Dsβ‚€) (𝓝 (sβ‚€, zβ‚€)) (𝓝 (Dsβ‚€ - Dsβ‚€)) := + hc.sub tendsto_const_nhds + rw [sub_self] at hsub + have h0 : Tendsto (fun q => β€–Ds q - Dsβ‚€β€–) (𝓝 (sβ‚€, zβ‚€)) (𝓝 0) := by + simpa using hsub.norm + exact h0.eventually (Iic_mem_nhds (half_pos hΞ΅)) + obtain ⟨δ, hΞ΄pos, hδ⟩ := Metric.eventually_nhds_iff.mp hball + set ρr : ℝ := min Ξ΄ (r / 2) with hρr + have hρrpos : 0 < ρr := lt_min hΞ΄pos (by positivity) + have hAs : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, + β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– ≀ (Ξ΅ / 2) * β€–pβ€– := by + filter_upwards [Metric.ball_mem_nhds (0 : ℝ Γ— E) hρrpos] with p hp + rw [mem_ball_zero_iff] at hp + have hdist : βˆ€ u ∈ Set.uIcc sβ‚€ (sβ‚€ + p.1), + dist ((u, zβ‚€ + p.2) : ℝ Γ— E) (sβ‚€, zβ‚€) ≀ β€–pβ€– := by + intro u hu + have hple : |p.1| ≀ β€–pβ€– := by rw [← Real.norm_eq_abs]; exact norm_fst_le p + have hp1 : |u - sβ‚€| ≀ β€–pβ€– := by + rcases Set.mem_uIcc.mp hu with ⟨ha, hb⟩ | ⟨ha, hb⟩ + Β· rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ u - sβ‚€)] + rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ p.1)] at hple; linarith + Β· rw [abs_of_nonpos (by linarith : u - sβ‚€ ≀ 0)] + rw [abs_of_nonpos (by linarith : p.1 ≀ 0)] at hple; linarith + have hp2 : β€–p.2β€– ≀ β€–pβ€– := norm_snd_le p + rw [Prod.dist_eq] + refine max_le ?_ ?_ + Β· rw [dist_eq_norm]; simpa [Real.norm_eq_abs] using hp1 + Β· rw [dist_eq_norm, add_sub_cancel_left]; exact hp2 + have hmemU : βˆ€ u ∈ Set.uIcc sβ‚€ (sβ‚€ + p.1), ((u, zβ‚€ + p.2) : ℝ Γ— E) ∈ U := by + intro u hu + apply hrU + rw [Metric.mem_ball] + exact lt_of_le_of_lt (hdist u hu) + (lt_of_lt_of_le hp (le_trans (min_le_right _ _) (by linarith))) + have hcont_u : ContinuousOn (fun u => Ds (u, zβ‚€ + p.2)) (Set.uIcc sβ‚€ (sβ‚€ + p.1)) := by + refine hDs_cont.comp (continuous_id.prodMk continuous_const).continuousOn ?_ + exact fun u hu => hmemU u hu + have hg_deriv : βˆ€ u ∈ Set.uIcc sβ‚€ (sβ‚€ + p.1), + HasDerivAt (fun s => f (s, zβ‚€ + p.2)) (Ds (u, zβ‚€ + p.2)) u := + fun u hu => hDs (u, zβ‚€ + p.2) (hmemU u hu) + have hftc : ∫ u in sβ‚€..(sβ‚€ + p.1), Ds (u, zβ‚€ + p.2) + = f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) := by + rw [intervalIntegral.integral_eq_sub_of_hasDerivAt (fun u hu => hg_deriv u hu) + (hcont_u.intervalIntegrable)] + have hbound_u : βˆ€ u ∈ Set.uIoc sβ‚€ (sβ‚€ + p.1), β€–Ds (u, zβ‚€ + p.2) - Dsβ‚€β€– ≀ Ξ΅ / 2 := by + intro u hu + refine @hΞ΄ (u, zβ‚€ + p.2) ?_ + have hmem' := hdist u (Set.uIoc_subset_uIcc hu) + exact lt_of_le_of_lt hmem' (lt_of_lt_of_le hp (min_le_left _ _)) + have hA_eq : f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€ + = ∫ u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€) := by + rw [intervalIntegral.integral_sub (hcont_u.intervalIntegrable) + (intervalIntegrable_const), hftc, intervalIntegral.integral_const, + add_sub_cancel_left] + rw [hA_eq] + calc β€–βˆ« u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€)β€– + ≀ (Ξ΅ / 2) * |(sβ‚€ + p.1) - sβ‚€| := + intervalIntegral.norm_integral_le_of_norm_le_const hbound_u + _ = (Ξ΅ / 2) * β€–p.1β€– := by rw [add_sub_cancel_left, Real.norm_eq_abs] + _ ≀ (Ξ΅ / 2) * β€–pβ€– := mul_le_mul_of_nonneg_left (norm_fst_le p) (by positivity) + filter_upwards [hAs, hBz'] with p hAp hBp + have hdecomp : + f ((sβ‚€, zβ‚€) + p) - f (sβ‚€, zβ‚€) + - ((ContinuousLinearMap.fst ℝ ℝ E).smulRight Dsβ‚€ + + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) p + = (f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) + + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2) := by + rw [show ((sβ‚€, zβ‚€) + p : ℝ Γ— E) = (sβ‚€ + p.1, zβ‚€ + p.2) from rfl] + simp only [add_apply, ContinuousLinearMap.smulRight_apply, + ContinuousLinearMap.coe_fst', ContinuousLinearMap.comp_apply, + ContinuousLinearMap.coe_snd'] + abel + rw [hdecomp] + calc β€–(f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) + + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2)β€– + ≀ β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– + + β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– := norm_add_le _ _ + _ ≀ (Ξ΅ / 2) * β€–pβ€– + (Ξ΅ / 2) * β€–pβ€– := + add_le_add hAp (le_trans hBp (mul_le_mul_of_nonneg_left (norm_snd_le p) (by positivity))) + _ = Ξ΅ * β€–pβ€– := by ring + +end Vlasov diff --git a/LeanPool/Vlasov/Imports.lean b/LeanPool/Vlasov/Imports.lean index 7395428db4..9e6bab3309 100644 --- a/LeanPool/Vlasov/Imports.lean +++ b/LeanPool/Vlasov/Imports.lean @@ -12,9 +12,16 @@ public import LeanPool.Vlasov.Base.Geometry public import LeanPool.Vlasov.Basic public import LeanPool.Vlasov.ForMathlib public import LeanPool.Vlasov.ForMathlib.PicardLindelof +public import LeanPool.Vlasov.ForMathlib.VariationalEquation public import LeanPool.Vlasov.OT +public import LeanPool.Vlasov.OT.CharacteristicConstruction public import LeanPool.Vlasov.OT.CharacteristicFlow +public import LeanPool.Vlasov.OT.Continuation public import LeanPool.Vlasov.OT.Coupling +public import LeanPool.Vlasov.OT.FlowDifferentiability +public import LeanPool.Vlasov.OT.FrozenField +public import LeanPool.Vlasov.OT.LocalWellPosedness +public import LeanPool.Vlasov.OT.TestApproximation public import LeanPool.Vlasov.OT.Wasserstein public import LeanPool.Vlasov.OT.WeakToLagrangian public import LeanPool.Vlasov.OT.WellPosedness diff --git a/LeanPool/Vlasov/OT.lean b/LeanPool/Vlasov/OT.lean index 6bafa90ba2..86ba87f9ca 100644 --- a/LeanPool/Vlasov/OT.lean +++ b/LeanPool/Vlasov/OT.lean @@ -10,8 +10,6 @@ public import LeanPool.Vlasov.OT.Coupling public import LeanPool.Vlasov.OT.Wasserstein public import LeanPool.Vlasov.OT.WeakToLagrangian public import LeanPool.Vlasov.OT.WellPosedness -import Mathlib.Analysis.SpecialFunctions.Trigonometric.Arctan -import Mathlib.MeasureTheory.Covering.Besicovitch /-! # Optimal transport, characteristic flow, and the well-posedness ladder. -/ diff --git a/LeanPool/Vlasov/OT/CharacteristicConstruction.lean b/LeanPool/Vlasov/OT/CharacteristicConstruction.lean new file mode 100644 index 0000000000..9fb52770ab --- /dev/null +++ b/LeanPool/Vlasov/OT/CharacteristicConstruction.lean @@ -0,0 +1,2568 @@ +/- +Copyright (c) 2026 Joseph K. Miller. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph K. Miller +-/ +module + +public import LeanPool.Vlasov.Basic +public import LeanPool.Vlasov.OT.Coupling +public import Mathlib.Analysis.ODE.Gronwall +import LeanPool.Vlasov.ForMathlib.PicardLindelof +import Mathlib.MeasureTheory.Integral.Prod + +/-! +# Characteristic construction and growth bounds + +The phase-space vector field, GrΓΆnwall estimates, window predicates and characteristic +construction compile before the pushforward and fixed-point arguments that use them. +-/ + +@[expose] public section + +namespace Vlasov + +open MeasureTheory ENNReal + +/-! ## Vlasov velocity field and its Lipschitz lemma -/ + +/-- The Vlasov phase-space vector field: +`b_t(x, v) := (v, βˆ’(βˆ‡W βˆ— ρ_t)(x))`. + +Note that the first component is the identity in `v` (the position +ODE `x' = v`) and the second component is the mean-field force +`βˆ’βˆ‡W βˆ— ρ_t` evaluated at `x` (the velocity ODE `v' = βˆ’(βˆ‡W βˆ— ρ)(x)`). +-/ +noncomputable def vlasovVectorField + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (t : ℝ) (z : PhaseSpace d) : PhaseSpace d := + (z.2, -(convolveFunctionMeasure gradW (ρ t) z.1)) + +/-- Position-side Lipschitz of the convolution `βˆ‡W βˆ— ρ`. +For `gradW` L-Lipschitz and `ρ` a probability measure with finite +first moment (which guarantees integrability of the kernel), the map +`x ↦ (βˆ‡W βˆ— ρ)(x)` is L-Lipschitz. + +Proof sketch: by `LipschitzWith.dist_le_mul` applied pointwise to +`gradW`, then integration over the probability measure `ρ`: + β€–βˆ« y, gradW(xβˆ’y) βˆ‚Ο βˆ’ ∫ y, gradW(x'βˆ’y) βˆ‚Οβ€– + = β€–βˆ« y, (gradW(xβˆ’y) βˆ’ gradW(x'βˆ’y)) βˆ‚Οβ€– + ≀ ∫ y, β€–gradW(xβˆ’y) βˆ’ gradW(x'βˆ’y)β€– βˆ‚Ο + ≀ ∫ y, L Β· β€–x βˆ’ x'β€– βˆ‚Ο + = L Β· β€–x βˆ’ x'β€– Β· ρ(univ) + = L Β· β€–x βˆ’ x'β€– (probability measure). + +The integrability hypotheses on `gradW(x βˆ’ Β·)` for two distinct `x`s +are needed for `integral_sub` and `norm_integral_le_integral_norm` +to fire. At the dobrushin call site these follow from finite first +moment of `ρ` + Lipschitz growth of `gradW`. -/ +lemma convolveFunctionMeasure_lipschitz_in_x + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] + (h_int : βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) ρ) : + LipschitzWith L (fun x => convolveFunctionMeasure gradW ρ x) := by + refine LipschitzWith.of_dist_le_mul (fun x x' => ?_) + unfold convolveFunctionMeasure + rw [dist_eq_norm, ← integral_sub (h_int x) (h_int x')] + -- Pointwise bound: β€–gradW(x βˆ’ y) βˆ’ gradW(x' βˆ’ y)β€– ≀ L Β· β€–x βˆ’ x'β€– + have h_pt : βˆ€ y, β€–gradW (x - y) - gradW (x' - y)β€– ≀ (L : ℝ) * β€–x - x'β€– := + fun y => by + have h_sub : (x - y) - (x' - y) = x - x' := by + rw [sub_sub_sub_cancel_right] + have := hL.dist_le_mul (x - y) (x' - y) + rw [dist_eq_norm, dist_eq_norm, h_sub] at this + exact this + -- Integrability of the pointwise bound function (a constant). + have h_bound_int : Integrable (fun _ : PhysSpace d => (L : ℝ) * β€–x - x'β€–) ρ := + integrable_const _ + -- Integrability of the norm of the difference, via mono'. + have h_norm_int : Integrable (fun y => β€–gradW (x - y) - gradW (x' - y)β€–) ρ := + Integrable.mono' h_bound_int ((h_int x).sub (h_int x')).norm.aestronglyMeasurable + (Filter.Eventually.of_forall fun y => by + rw [Real.norm_eq_abs, abs_of_nonneg (norm_nonneg _)] + exact h_pt y) + calc β€–βˆ« y, gradW (x - y) - gradW (x' - y) βˆ‚Οβ€– + ≀ ∫ y, β€–gradW (x - y) - gradW (x' - y)β€– βˆ‚Ο := + norm_integral_le_integral_norm _ + _ ≀ ∫ _, (L : ℝ) * β€–x - x'β€– βˆ‚Ο := + integral_mono_ae h_norm_int h_bound_int (Filter.Eventually.of_forall h_pt) + _ = (L : ℝ) * β€–x - x'β€– := by + simp [integral_const, measureReal_def, measure_univ] + +/-- A Lipschitz force has an affine convolution bound controlled by the first moment. -/ +lemma norm_convolveFunctionMeasure_le_affine + {d : β„•} (gradW : PhysSpace d β†’ PhysSpace d) (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] + (h_int : βˆ€ x, Integrable (fun y => gradW (x - y)) ρ) + (h_y_int : Integrable (fun y : PhysSpace d => β€–yβ€–) ρ) + (M : ℝ) (hM : ∫ y, β€–yβ€– βˆ‚Ο ≀ M) (x : PhysSpace d) : + β€–convolveFunctionMeasure gradW ρ xβ€– ≀ β€–gradW 0β€– + (L : ℝ) * M + (L : ℝ) * β€–xβ€– := by + have h_point : βˆ€ y, β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L : ℝ) * (β€–xβ€– + β€–yβ€–) := by + intro y + have h_lipschitz := hL.dist_le_mul (x - y) 0 + simp only [dist_eq_norm, sub_zero] at h_lipschitz + exact (norm_le_norm_add_norm_sub' (gradW (x - y)) (gradW 0)).trans + (add_le_add le_rfl (h_lipschitz.trans + (mul_le_mul_of_nonneg_left (norm_sub_le x y) L.coe_nonneg))) + have h_sum_int : Integrable (fun y : PhysSpace d => β€–xβ€– + β€–yβ€–) ρ := + (integrable_const β€–xβ€–).add h_y_int + have h_bound_int : Integrable (fun y => β€–gradW 0β€– + (L : ℝ) * (β€–xβ€– + β€–yβ€–)) ρ := + (integrable_const β€–gradW 0β€–).add (h_sum_int.const_mul (L : ℝ)) + calc + β€–convolveFunctionMeasure gradW ρ xβ€– ≀ ∫ y, β€–gradW (x - y)β€– βˆ‚Ο := + norm_integral_le_integral_norm _ + _ ≀ ∫ y, (β€–gradW 0β€– + (L : ℝ) * (β€–xβ€– + β€–yβ€–)) βˆ‚Ο := + integral_mono (h_int x).norm h_bound_int h_point + _ = β€–gradW 0β€– + (L : ℝ) * (β€–xβ€– + ∫ y, β€–yβ€– βˆ‚Ο) := by + rw [integral_add (integrable_const _) (h_sum_int.const_mul (L : ℝ)), + integral_const_mul, integral_add (integrable_const _) h_y_int] + simp only [integral_const, measureReal_def, measure_univ, ENNReal.toReal_one, one_smul] + _ ≀ β€–gradW 0β€– + (L : ℝ) * (β€–xβ€– + M) := + add_le_add le_rfl (mul_le_mul_of_nonneg_left (add_le_add le_rfl hM) L.coe_nonneg) + _ = β€–gradW 0β€– + (L : ℝ) * M + (L : ℝ) * β€–xβ€– := by ring + +/-! ## Flow distance growth bound (Gronwall on the characteristic ODE) + +A standalone regularity theorem about `IsCharacteristicFlow`: solutions of +the characteristic ODE have at most linear growth in their initial condition, +with a constant depending on `T`, the Lipschitz constant of `gradW`, and a +uniform first-moment bound on the measure curve `ρ`. + +Math content: Gronwall on the position-velocity pair, using + `β€–(βˆ‡W βˆ— ρ_t)(x)β€– ≀ β€–gradW 0β€– + L Β· (β€–xβ€– + βˆ«β€–yβ€–dρ_t)` +as the velocity-field bound. -/ + +/-- **`IsCharacteristicFlowOn`-flavored variant of `flow_distance_growth_bound`**. + +Same Gronwall growth bound, but for a flow specified by **boundary regularity +hypotheses** (`h_init`, `h_cont_Icc`, `h_deriv_Ico`) instead of the universal-in-`t` +ODE of `IsCharacteristicFlow`. This matches what +`exists_vlasov_characteristicFlow_global_smallT` produces (modulo deriving the +boundary regularity from `IsCharacteristicFlowOn`'s `Ioo 0 T` ODE clauses), and +mirrors the hypothesis-passing pattern of `charFlow_measurable_via_gronwall`. + +**Used by**: `Phi_step` to derive the per-`z` growth bound +(`PhiAsVlasovMeasureCurve`'s `h_growth` hypothesis); window uniqueness is a +natural secondary consumer. + +The global `flow_distance_growth_bound` follows by supplying its initial +condition, continuity and derivative statements as boundary regularity. + +**Metric-dependence note**: +This bound uses the unbounded position difference `β€–X^M(t,z) - X^{M'}(t,z)β€–`, +which forces Gronwall and produces exponential-in-`T` constants +`C_T β‰ˆ exp((1+L)Β·T)`. The `Wbar = W_{min(|x-y|,1)}` analog (Dobrushin 1979, Β§5) +uses the bounded-and-Lipschitz absorption + `|B_ΞΌ(x) - B_{ΞΌ'}(x)| ≀ max(2β€–Bβ€–_∞, C_B) Β· min(|x₁-xβ‚‚|, 1)` +and produces *linear-in-`T`* constants (Dobrushin 1979, eq. 5.7), changing this +output shape from `C_T Β· (β€–zβ€– + 1)` to a bounded analog. -/ +theorem flow_distance_growth_bound_on + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT : 0 ≀ T) + -- Boundary regularity, replacing IsCharacteristicFlow's universal ODE. + (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) + (h_cont_Icc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) + (h_deriv_Ico : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, + HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) + (Set.Ici s) s) + -- ρ regularity, identical to flow_distance_growth_bound's hypotheses. + (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) + (hM_ρ : βˆ€ t ∈ Set.Icc 0 T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ M_ρ) + (h_y_int : βˆ€ t ∈ Set.Icc 0 T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) : + βˆƒ C_T, 0 ≀ C_T ∧ + βˆ€ t ∈ Set.Icc 0 T, βˆ€ z : PhaseSpace d, + β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1) := by + -- Gronwall parameters: K = 1 + L, Ξ΅β‚€ = β€–gradW 0β€– + L * M_ρ. + set K := 1 + (L : ℝ) with hK_def + set Ξ΅β‚€ := β€–gradW 0β€– + (L : ℝ) * M_ρ with hΞ΅β‚€_def + have hK_pos : 0 < K := by positivity + have hΞ΅β‚€_nn : 0 ≀ Ξ΅β‚€ := by positivity + -- Witness: C_T = gronwallBound 1 K Ξ΅β‚€ T. + use gronwallBound 1 K Ξ΅β‚€ T + refine ⟨?_, ?_⟩ + Β· have hmono := gronwallBound_mono (by norm_num : (0 : ℝ) ≀ 1) hΞ΅β‚€_nn hK_pos.le hT + linarith [gronwallBound_x0 1 K Ξ΅β‚€] + Β· intro t ht z + -- Convolution bound: β€–(βˆ‡W βˆ— ρ_t)(x)β€– ≀ Ξ΅β‚€ + L * β€–xβ€–. + have h_conv_bound : βˆ€ s ∈ Set.Icc 0 T, βˆ€ x : PhysSpace d, + β€–convolveFunctionMeasure gradW (ρ s) xβ€– ≀ Ξ΅β‚€ + (L : ℝ) * β€–xβ€– := by + intro s hs x + exact norm_convolveFunctionMeasure_le_affine gradW L hL (ρ s) (h_int s) + (h_y_int s hs) M_ρ (hM_ρ s hs) x + -- Gronwall step. Boundary regularity comes from hypotheses, not from + -- IsCharacteristicFlow. + have h_f_cont : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc 0 T) := + h_cont_Icc z + have h_deriv : βˆ€ s ∈ Set.Ico 0 T, + HasDerivWithinAt (fun s => (charX s z, charV s z)) + (charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z)) + (Set.Ici s) s := by + intro s hs + have hderiv := h_deriv_Ico z s hs + -- vlasovVectorField gradW ρ s (charX s z, charV s z) = (charV s z, -conv ...) + unfold vlasovVectorField at hderiv + exact hderiv + have h_init_norm : β€–(charX 0 z, charV 0 z)β€– ≀ β€–zβ€– := by + rw [h_init z] + have h_bound : βˆ€ s ∈ Set.Ico 0 T, + β€–(charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z))β€– ≀ + K * β€–(charX s z, charV s z)β€– + Ξ΅β‚€ := by + intro s hs + have hs_mem : s ∈ Set.Icc 0 T := ⟨hs.1, le_of_lt hs.2⟩ + simp only [Prod.norm_def, norm_neg] + have hFsz := le_max_left β€–charX s zβ€– β€–charV s zβ€– + have hGsz := le_max_right β€–charX s zβ€– β€–charV s zβ€– + have hM_nn : 0 ≀ max β€–charX s zβ€– β€–charV s zβ€– := + le_max_iff.mpr (Or.inl (norm_nonneg _)) + have h_v_le : β€–charV s zβ€– ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := + calc β€–charV s zβ€– ≀ max β€–charX s zβ€– β€–charV s zβ€– := hGsz + _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– := + le_mul_of_one_le_left hM_nn (by linarith [NNReal.coe_nonneg L]) + _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := le_add_of_nonneg_right hΞ΅β‚€_nn + have h_conv_le : β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– ≀ + K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := + calc β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– + ≀ Ξ΅β‚€ + (L : ℝ) * β€–charX s zβ€– := h_conv_bound s hs_mem _ + _ ≀ Ξ΅β‚€ + K * max β€–charX s zβ€– β€–charV s zβ€– := by + have hLK : (L : ℝ) ≀ K := le_add_of_nonneg_left zero_le_one + linarith [mul_le_mul_of_nonneg_left hFsz (NNReal.coe_nonneg L), + mul_le_mul_of_nonneg_right hLK hM_nn] + _ = K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := by ring + exact max_le h_v_le h_conv_le + have h_grw := norm_le_gronwallBound_of_norm_deriv_right_le + h_f_cont h_deriv h_init_norm h_bound t ht + simp only [sub_zero] at h_grw + calc β€–(charX t z, charV t z)β€– + ≀ gronwallBound β€–zβ€– K Ξ΅β‚€ t := h_grw + _ ≀ gronwallBound β€–zβ€– K Ξ΅β‚€ T := + gronwallBound_mono (norm_nonneg _) hΞ΅β‚€_nn hK_pos.le ht.2 + _ ≀ gronwallBound 1 K Ξ΅β‚€ T * (β€–zβ€– + 1) := by + rw [gronwallBound_of_K_ne_0 hK_pos.ne', gronwallBound_of_K_ne_0 hK_pos.ne'] + simp only [one_mul] + have he1 : 0 ≀ Real.exp (K * T) - 1 := + by linarith [Real.one_le_exp (mul_nonneg hK_pos.le hT)] + have hΞ΅K := div_nonneg hΞ΅β‚€_nn hK_pos.le + nlinarith [norm_nonneg z, Real.exp_nonneg (K * T), + mul_nonneg hΞ΅K he1, mul_nonneg (norm_nonneg z) (mul_nonneg hΞ΅K he1)] + +/-- **Flow distance growth bound** (`L`-Lipschitz `gradW`, uniform first moment +on `ρ`). Solutions of the characteristic ODE grow at most linearly in their +initial condition: `β€–(charX t z, charV t z)β€– ≀ C_T Β· (β€–zβ€– + 1)` for some +`C_T` depending only on `T`, `L`, `β€–gradW 0β€–`, and the uniform first-moment +bound `M_ρ`. -/ +theorem flow_distance_growth_bound + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hflow : IsCharacteristicFlow gradW ρ charX charV) + (T : ℝ) (hT : 0 ≀ T) + (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) + (hM_ρ : βˆ€ t ∈ Set.Icc 0 T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ M_ρ) + (h_y_int : βˆ€ t ∈ Set.Icc 0 T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) : + βˆƒ C_T, 0 ≀ C_T ∧ + βˆ€ t ∈ Set.Icc 0 T, βˆ€ z : PhaseSpace d, + β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1) := by + obtain ⟨hflow_init, hflow_x, hflow_v⟩ := hflow + refine flow_distance_growth_bound_on gradW L hL ρ charX charV T hT + (fun z => Prod.ext (hflow_init z).1 (hflow_init z).2) ?_ ?_ + M_ρ hM_ρ_nn hM_ρ h_y_int h_int + Β· intro z + exact continuousOn_of_forall_continuousAt fun s _ => + (hflow_x s z).continuousAt.prodMk (hflow_v s z).continuousAt + Β· intro z s _ + exact ((hflow_x s z).prodMk (hflow_v s z)).hasDerivWithinAt + +/-- **Two-flow difference Gronwall bound** β€” the reusable core of the +integrated Dobrushin coupling bound. The distance between two trajectories +`Ξ¦_f Β· z₁`, `Ξ¦_g Β· zβ‚‚` of flows generated by fields `b_f, b_g` (`b_f` +`L`-Lipschitz in space) grows by Gronwall: if the field difference *at the +second trajectory* is bounded by `Ξ΅` on `[0, T]` and the initial separation by +`Ξ΄`, then `β€–Ξ¦_f t z₁ - Ξ¦_g t zβ‚‚β€– ≀ gronwallBound Ξ΄ L Ξ΅ t`. + +Mirrors `flow_distance_growth_bound`'s Gronwall structure +(`norm_le_gronwallBound_of_norm_deriv_right_le`) but for the *difference* of two +flows. In the integrated-bound application, `z₁ = Ο‰.1`, `zβ‚‚ = Ο‰.2` range over a +coupling `Ο€β‚€` of `(f 0, g 0)`, `Ξ΅ = (L : ℝ) * (wasserstein1 (f s) (g s)).toReal` +(the self-coupling diff-bound, uniform in the trajectory), and integrating this +pointwise bound over `Ο€β‚€` against the pushforward bound gives the Dobrushin +estimate `W₁(f t, g t) ≀ … Β· W₁(f 0, g 0)`. -/ +theorem flow_difference_growth_bound + {Ξ± : Type*} [NormedAddCommGroup Ξ±] [NormedSpace ℝ Ξ±] + (b_f b_g : ℝ β†’ Ξ± β†’ Ξ±) (L : NNReal) (hL_f : βˆ€ t, LipschitzWith L (b_f t)) + (Ξ¦_f Ξ¦_g : ℝ β†’ Ξ± β†’ Ξ±) (z₁ zβ‚‚ : Ξ±) + (T : ℝ) + (hcont_f : ContinuousOn (fun s => Ξ¦_f s z₁) (Set.Icc 0 T)) + (hcont_g : ContinuousOn (fun s => Ξ¦_g s zβ‚‚) (Set.Icc 0 T)) + (hΞ¦_f : βˆ€ s ∈ Set.Ico 0 T, + HasDerivWithinAt (fun u => Ξ¦_f u z₁) (b_f s (Ξ¦_f s z₁)) (Set.Ici s) s) + (hΞ¦_g : βˆ€ s ∈ Set.Ico 0 T, + HasDerivWithinAt (fun u => Ξ¦_g u zβ‚‚) (b_g s (Ξ¦_g s zβ‚‚)) (Set.Ici s) s) + (Ξ΄ Ξ΅ : ℝ) (h_init : β€–Ξ¦_f 0 z₁ - Ξ¦_g 0 zβ‚‚β€– ≀ Ξ΄) + (h_diff : βˆ€ s ∈ Set.Icc 0 T, + β€–b_f s (Ξ¦_g s zβ‚‚) - b_g s (Ξ¦_g s zβ‚‚)β€– ≀ Ξ΅) : + βˆ€ t ∈ Set.Icc 0 T, + β€–Ξ¦_f t z₁ - Ξ¦_g t zβ‚‚β€– ≀ gronwallBound Ξ΄ (L : ℝ) Ξ΅ t := by + have hcont : ContinuousOn (fun s => Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚) (Set.Icc 0 T) := + hcont_f.sub hcont_g + have hderiv : βˆ€ s ∈ Set.Ico 0 T, + HasDerivWithinAt (fun u => Ξ¦_f u z₁ - Ξ¦_g u zβ‚‚) + (b_f s (Ξ¦_f s z₁) - b_g s (Ξ¦_g s zβ‚‚)) (Set.Ici s) s := + fun s hs => (hΞ¦_f s hs).sub (hΞ¦_g s hs) + have hbound : βˆ€ s ∈ Set.Ico 0 T, + β€–b_f s (Ξ¦_f s z₁) - b_g s (Ξ¦_g s zβ‚‚)β€– ≀ + (L : ℝ) * β€–Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚β€– + Ξ΅ := by + intro s hs + have hs_icc : s ∈ Set.Icc 0 T := ⟨hs.1, hs.2.le⟩ + have h_lip : β€–b_f s (Ξ¦_f s z₁) - b_f s (Ξ¦_g s zβ‚‚)β€– ≀ + (L : ℝ) * β€–Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚β€– := by + have := (hL_f s).dist_le_mul (Ξ¦_f s z₁) (Ξ¦_g s zβ‚‚) + rwa [dist_eq_norm, dist_eq_norm] at this + calc β€–b_f s (Ξ¦_f s z₁) - b_g s (Ξ¦_g s zβ‚‚)β€– + = β€–(b_f s (Ξ¦_f s z₁) - b_f s (Ξ¦_g s zβ‚‚)) + + (b_f s (Ξ¦_g s zβ‚‚) - b_g s (Ξ¦_g s zβ‚‚))β€– := by congr 1; abel + _ ≀ β€–b_f s (Ξ¦_f s z₁) - b_f s (Ξ¦_g s zβ‚‚)β€– + + β€–b_f s (Ξ¦_g s zβ‚‚) - b_g s (Ξ¦_g s zβ‚‚)β€– := norm_add_le _ _ + _ ≀ (L : ℝ) * β€–Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚β€– + Ξ΅ := + add_le_add h_lip (h_diff s hs_icc) + intro t ht + have hg := norm_le_gronwallBound_of_norm_deriv_right_le hcont hderiv h_init hbound t ht + simpa using hg + +/-- **Per-trajectory mild (integral-form) difference bound.** +Mild-form companion to `flow_difference_growth_bound`: +the raw integral inequality +`β€–Ξ³_f t βˆ’ Ξ³_g tβ€– ≀ β€–Ξ³_f 0 βˆ’ Ξ³_g 0β€– + βˆ«β‚€α΅— (Lβ€–Ξ³_f s βˆ’ Ξ³_g sβ€– + Ξ΅ s) ds`, +keeping the forcing `Ξ΅ s` *inside* the integral. After integrating this over +the base measure, the self-reference `Ξ΅ s = LΒ·W₁(f s,g s) ≀ LΒ·Q(s)` is resolved +by `gronwall_mild_le` β€” avoiding the constant-`Ξ΅` smallness that +`flow_difference_growth_bound`'s closed form would force (and the blocked +windowing that smallness needs). -/ +theorem flow_difference_mild_bound + {Ξ± : Type*} [NormedAddCommGroup Ξ±] [NormedSpace ℝ Ξ±] [CompleteSpace Ξ±] + (b_f b_g : ℝ β†’ Ξ± β†’ Ξ±) (L : NNReal) (hL_f : βˆ€ t, LipschitzWith L (b_f t)) + (Ξ³_f Ξ³_g : ℝ β†’ Ξ±) (T : ℝ) + (hcont_f : ContinuousOn Ξ³_f (Set.Icc 0 T)) + (hcont_g : ContinuousOn Ξ³_g (Set.Icc 0 T)) + (hderiv_f : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt Ξ³_f (b_f s (Ξ³_f s)) (Set.Ioi s) s) + (hderiv_g : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt Ξ³_g (b_g s (Ξ³_g s)) (Set.Ioi s) s) + (hint : IntervalIntegrable (fun s => b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) + MeasureTheory.volume 0 T) + (Ξ΅ : ℝ β†’ ℝ) (hΞ΅_int : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 T) + (h_diff : βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–b_f s (Ξ³_g s) - b_g s (Ξ³_g s)β€– ≀ Ξ΅ s) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, + β€–Ξ³_f t - Ξ³_g tβ€– ≀ β€–Ξ³_f 0 - Ξ³_g 0β€– + + ∫ s in (0 : ℝ)..t, ((L : ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) := by + intro t ht + have h0t : (0 : ℝ) ≀ t := ht.1 + have htT : t ≀ T := ht.2 + have hIcc_sub : Set.Icc (0 : ℝ) t βŠ† Set.Icc 0 T := Set.Icc_subset_Icc_right htT + have hcont_diff : ContinuousOn (fun s => Ξ³_f s - Ξ³_g s) (Set.Icc 0 t) := + (hcont_f.mono hIcc_sub).sub (hcont_g.mono hIcc_sub) + have hderiv_diff : βˆ€ s ∈ Set.Ioo (0 : ℝ) t, + HasDerivWithinAt (fun s => Ξ³_f s - Ξ³_g s) + (b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) (Set.Ioi s) s := by + intro s hs + have hs' : s ∈ Set.Ioo (0 : ℝ) T := ⟨hs.1, hs.2.trans_le htT⟩ + exact (hderiv_f s hs').sub (hderiv_g s hs') + have hint_t : IntervalIntegrable (fun s => b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) + MeasureTheory.volume 0 t := + hint.mono_set (by + rw [Set.uIcc_of_le h0t, Set.uIcc_of_le (h0t.trans htT)]; exact hIcc_sub) + have hftc := intervalIntegral.integral_eq_sub_of_hasDeriv_right_of_le h0t hcont_diff + hderiv_diff hint_t + have hsplit : βˆ€ s ∈ Set.Icc (0 : ℝ) t, + β€–b_f s (Ξ³_f s) - b_g s (Ξ³_g s)β€– ≀ (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s := by + intro s hs + have hsT : s ∈ Set.Icc (0 : ℝ) T := hIcc_sub hs + have h_lip : β€–b_f s (Ξ³_f s) - b_f s (Ξ³_g s)β€– ≀ (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– := by + have := (hL_f s).dist_le_mul (Ξ³_f s) (Ξ³_g s) + rwa [dist_eq_norm, dist_eq_norm] at this + calc β€–b_f s (Ξ³_f s) - b_g s (Ξ³_g s)β€– + = β€–(b_f s (Ξ³_f s) - b_f s (Ξ³_g s)) + (b_f s (Ξ³_g s) - b_g s (Ξ³_g s))β€– := by + congr 1; abel + _ ≀ β€–b_f s (Ξ³_f s) - b_f s (Ξ³_g s)β€– + β€–b_f s (Ξ³_g s) - b_g s (Ξ³_g s)β€– := + norm_add_le _ _ + _ ≀ (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s := add_le_add h_lip (h_diff s hsT) + have hci : IntervalIntegrable (fun s => (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) + MeasureTheory.volume 0 t := by + refine IntervalIntegrable.add (IntervalIntegrable.const_mul ?_ (L:ℝ)) + (hΞ΅_int.mono_set (by + rw [Set.uIcc_of_le h0t, Set.uIcc_of_le (h0t.trans htT)]; exact hIcc_sub)) + refine ContinuousOn.intervalIntegrable ?_ + rw [Set.uIcc_of_le h0t]; exact hcont_diff.norm + have hnorm_le : β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– ≀ + ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) := by + calc β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– + ≀ ∫ s in (0 : ℝ)..t, β€–b_f s (Ξ³_f s) - b_g s (Ξ³_g s)β€– := + intervalIntegral.norm_integral_le_integral_norm h0t + _ ≀ ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) := + intervalIntegral.integral_mono_on h0t hint_t.norm hci hsplit + have ha_le : β€–Ξ³_f t - Ξ³_g tβ€– ≀ β€–Ξ³_f 0 - Ξ³_g 0β€– + + β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– := by + have heq : (Ξ³_f t - Ξ³_g t) - (Ξ³_f 0 - Ξ³_g 0) = + ∫ s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) := hftc.symm + calc β€–Ξ³_f t - Ξ³_g tβ€– + = β€–(Ξ³_f 0 - Ξ³_g 0) + ((Ξ³_f t - Ξ³_g t) - (Ξ³_f 0 - Ξ³_g 0))β€– := by congr 1; abel + _ ≀ β€–Ξ³_f 0 - Ξ³_g 0β€– + β€–(Ξ³_f t - Ξ³_g t) - (Ξ³_f 0 - Ξ³_g 0)β€– := norm_add_le _ _ + _ = β€–Ξ³_f 0 - Ξ³_g 0β€– + β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– := by + rw [heq] + linarith [ha_le, hnorm_le] + +/-- **Integrate a per-trajectory mild bound over the base measure (Tonelli step).** +Given a base probability measure `Ο€` on `Ξ©` and a family `w : ℝ β†’ Ξ© β†’ Ξ±`, if each +trajectory satisfies the mild bound `β€–w t Ο‰β€– ≀ β€–w 0 Ο‰β€– + βˆ«β‚€α΅— (Lβ€–w s Ο‰β€– + Ξ΅ s) ds`, +then the integrated quantity `Q t := ∫ β€–w t Ο‰β€– βˆ‚Ο€` satisfies +`Q t ≀ Q 0 + βˆ«β‚€α΅— (L Β· Q s + Ξ΅ s) ds`. The `βˆ«β‚€α΅— Lβ€–w s Ο‰β€–` term swaps via Tonelli. -/ +theorem integral_mild_bound + {Ξ© Ξ± : Type*} [MeasurableSpace Ξ©] [NormedAddCommGroup Ξ±] + [MeasurableSpace Ξ±] [BorelSpace Ξ±] + (Ο€ : Measure Ξ©) [IsProbabilityMeasure Ο€] + (w : ℝ β†’ Ξ© β†’ Ξ±) (L : ℝ) (hL : 0 ≀ L) (Ξ΅ : ℝ β†’ ℝ) (T : ℝ) (hT : 0 ≀ T) + -- joint-measurability inputs (CarathΓ©odory: continuous-in-time + measurable-in-Ο‰) + (hw_cont : βˆ€ Ο‰, Continuous (fun s => w s Ο‰)) + (hw_meas : βˆ€ s, Measurable (w s)) + -- domination: β€–w s Ο‰β€– ≀ dom Ο‰ uniformly on [0,T], dom integrable + (dom : Ξ© β†’ ℝ) (hdom_int : Integrable dom Ο€) + (hdom : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ Ο‰, β€–w s Ο‰β€– ≀ dom Ο‰) + (hΞ΅_int : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 T) + (hΞ΅_nn : βˆ€ s ∈ Set.Icc (0 : ℝ) T, 0 ≀ Ξ΅ s) + -- the per-trajectory mild bound (e.g. from flow_difference_mild_bound) + (hper : βˆ€ Ο‰, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + β€–w t Ο‰β€– ≀ β€–w 0 Ο‰β€– + ∫ s in (0 : ℝ)..t, (L * β€–w s Ο‰β€– + Ξ΅ s)) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (∫ Ο‰, β€–w t Ο‰β€– βˆ‚Ο€) ≀ (∫ Ο‰, β€–w 0 Ο‰β€– βˆ‚Ο€) + + ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by + -- joint measurability of `(s, Ο‰) ↦ w s Ο‰` and of its norm + have hjoint : Measurable (Function.uncurry w) := + measurable_uncurry_of_continuous_of_measurable hw_cont hw_meas + have hjoint_norm : Measurable (fun p : ℝ Γ— Ξ© => β€–w p.1 p.2β€–) := hjoint.norm + -- abbreviation Q s := ∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€ + set Q : ℝ β†’ ℝ := fun s => ∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€ with hQ + intro t ht + have h0t : (0 : ℝ) ≀ t := ht.1 + have htT : t ≀ T := ht.2 + have hIcc_sub : Set.Icc (0 : ℝ) t βŠ† Set.Icc 0 T := Set.Icc_subset_Icc_right htT + -- `w 0 Β·` and `w t Β·` are integrable over Ο€ (dominated by `dom`) + have h0_mem : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T := ⟨le_refl 0, hT⟩ + have ht_mem : t ∈ Set.Icc (0 : ℝ) T := ht + have hint0 : Integrable (fun Ο‰ => β€–w 0 Ο‰β€–) Ο€ := by + refine hdom_int.mono' ((hw_meas 0).norm.aestronglyMeasurable) ?_ + filter_upwards with Ο‰ + rw [Real.norm_of_nonneg (norm_nonneg _)] + exact hdom 0 h0_mem Ο‰ + have hintt : Integrable (fun Ο‰ => β€–w t Ο‰β€–) Ο€ := by + refine hdom_int.mono' ((hw_meas t).norm.aestronglyMeasurable) ?_ + filter_upwards with Ο‰ + rw [Real.norm_of_nonneg (norm_nonneg _)] + exact hdom t ht_mem Ο‰ + -- the inner integrand `g s Ο‰ := L * β€–w s Ο‰β€– + Ξ΅ s` + set g : ℝ β†’ Ξ© β†’ ℝ := fun s Ο‰ => L * β€–w s Ο‰β€– + Ξ΅ s with hg + -- product measure for the Tonelli swap + -- `volume.restrict (Set.uIoc 0 t)` is a finite measure (`uIoc 0 t = Ioc 0 t`) + have huIoc : Set.uIoc (0 : ℝ) t = Set.Ioc 0 t := Set.uIoc_of_le h0t + have hvol_lt : MeasureTheory.volume (Set.uIoc (0 : ℝ) t) < ⊀ := by + rw [huIoc, Real.volume_Ioc]; exact ENNReal.ofReal_lt_top + have hfin_restrict : IsFiniteMeasure (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := by + refine ⟨?_⟩ + rw [Measure.restrict_apply_univ]; exact hvol_lt + -- `Ξ΅` is integrable over `volume.restrict (uIoc 0 t)` + have hΞ΅_int_t : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 t := + hΞ΅_int.mono_set (by + rw [Set.uIcc_of_le h0t, Set.uIcc_of_le hT]; exact Set.Icc_subset_Icc_right htT) + have hΞ΅_intOn : Integrable Ξ΅ (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := + hΞ΅_int_t.def' + -- AEStronglyMeasurability of `uncurry g` over the product measure + have hg_aesm : AEStronglyMeasurable (Function.uncurry g) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := by + have h1 : AEStronglyMeasurable (fun p : ℝ Γ— Ξ© => L * β€–w p.1 p.2β€–) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := + (measurable_const.mul hjoint_norm).aestronglyMeasurable + have h2 : AEStronglyMeasurable (fun p : ℝ Γ— Ξ© => Ξ΅ p.1) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := + hΞ΅_intOn.aestronglyMeasurable.comp_fst + exact h1.add h2 + -- product integrability of `uncurry g`, via the dominator `LΒ·dom(Ο‰) + Ξ΅(s)` + have hdom_prod : Integrable (fun p : ℝ Γ— Ξ© => L * dom p.2 + Ξ΅ p.1) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := + ((hdom_int.const_mul L).comp_snd + (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t))).add (hΞ΅_intOn.comp_fst Ο€) + have hae_fst : βˆ€α΅ p : ℝ Γ— Ξ© + βˆ‚((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€), p.1 ∈ Set.uIoc (0 : ℝ) t := + (MeasureTheory.Measure.quasiMeasurePreserving_fst).tendsto_ae.eventually + (MeasureTheory.ae_restrict_mem measurableSet_uIoc) + have hg_int : Integrable (Function.uncurry g) + ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := by + refine hdom_prod.mono' hg_aesm ?_ + filter_upwards [hae_fst] with p hp + have hp_icc : p.1 ∈ Set.Icc (0 : ℝ) T := by + rw [huIoc] at hp; exact ⟨le_of_lt hp.1, hp.2.trans htT⟩ + have hwle : β€–w p.1 p.2β€– ≀ dom p.2 := hdom p.1 hp_icc p.2 + have hΞ΅nn : 0 ≀ Ξ΅ p.1 := hΞ΅_nn p.1 hp_icc + have hg_nn : 0 ≀ L * β€–w p.1 p.2β€– + Ξ΅ p.1 := + add_nonneg (mul_nonneg hL (norm_nonneg _)) hΞ΅nn + change β€–L * β€–w p.1 p.2β€– + Ξ΅ p.1β€– ≀ L * dom p.2 + Ξ΅ p.1 + rw [Real.norm_of_nonneg hg_nn] + nlinarith [mul_le_mul_of_nonneg_left hwle hL] + -- inner intervalIntegral = integral against the restricted measure + have hconv : βˆ€ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) + = ∫ s, g s Ο‰ βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := by + intro Ο‰ + rw [intervalIntegral.integral_of_le h0t, ← huIoc] + -- marginal integrability `Ο‰ ↦ ∫ s, g s Ο‰` + have hmarg : Integrable + (fun Ο‰ => ∫ s, g s Ο‰ βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t))) Ο€ := + hg_int.integral_prod_right + have hinner_int : Integrable (fun Ο‰ => ∫ s in (0 : ℝ)..t, g s Ο‰) Ο€ := by + simpa only [hconv] using hmarg + -- per-`s` identity ∫ Ο‰, g s Ο‰ βˆ‚Ο€ = L Β· (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s + have hg_int_s : βˆ€ s ∈ Set.Icc (0 : ℝ) T, Integrable (fun Ο‰ => β€–w s Ο‰β€–) Ο€ := by + intro s hs + refine hdom_int.mono' ((hw_meas s).norm.aestronglyMeasurable) ?_ + filter_upwards with Ο‰ + rw [Real.norm_of_nonneg (norm_nonneg _)]; exact hdom s hs Ο‰ + have hQg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + (∫ Ο‰, g s Ο‰ βˆ‚Ο€) = L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s := by + intro s hs + simp only [hg] + rw [integral_add ((hg_int_s s hs).const_mul L) (integrable_const _), integral_const_mul] + congr 1 + simp [integral_const, measureReal_def, measure_univ] + -- the double integral, via Tonelli + have hdouble : (∫ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€) + = ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by + calc (∫ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€) + = ∫ Ο‰, (∫ s, g s Ο‰ βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t))) βˆ‚Ο€ := by + simp only [hconv] + _ = ∫ s, (∫ Ο‰, g s Ο‰ βˆ‚Ο€) βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := + (MeasureTheory.integral_integral_swap hg_int).symm + _ = ∫ s in (0 : ℝ)..t, (∫ Ο‰, g s Ο‰ βˆ‚Ο€) := by + rw [huIoc, ← intervalIntegral.integral_of_le h0t] + _ = ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by + refine intervalIntegral.integral_congr (fun s hs => ?_) + rw [Set.uIcc_of_le h0t] at hs + exact hQg s ⟨hs.1, hs.2.trans htT⟩ + -- assemble + calc (∫ Ο‰, β€–w t Ο‰β€– βˆ‚Ο€) + ≀ ∫ Ο‰, (β€–w 0 Ο‰β€– + ∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€ := + integral_mono hintt (hint0.add hinner_int) (fun Ο‰ => hper Ο‰ t ht) + _ = (∫ Ο‰, β€–w 0 Ο‰β€– βˆ‚Ο€) + ∫ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€ := + integral_add hint0 hinner_int + _ = (∫ Ο‰, β€–w 0 Ο‰β€– βˆ‚Ο€) + ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by + rw [hdouble] + +/-- **Integrated coupling-Gronwall bound** (base-measure generic). + +Given a base probability measure `Ο€` on `Ξ©` and two parameter-families of +trajectories `X_f, X_g : ℝ β†’ Ξ© β†’ Ξ±` solving ODEs with `L`-Lipschitz vector fields +`b_f, b_g` on `[0, T]`, with a cross-field bound `β€–b_f s y - b_g s yβ€– ≀ Ξ΅ s` whose +amplitude `Ξ΅ s` is **self-referentially** controlled by the integrated trajectory +distance `Q s := ∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€` (i.e. `Ξ΅ s ≀ L Β· Q s`), the +integrated distance obeys the closed Gronwall bound +`Q t ≀ Q 0 Β· exp (2 L t)` on `[0, T]`. + +**Composition** (the collapse pipeline): +* per-`Ο‰`, `flow_difference_mild_bound` gives the mild integral inequality + `β€–X_f t Ο‰ - X_g t Ο‰β€– ≀ β€–X_f 0 Ο‰ - X_g 0 Ο‰β€– + βˆ«β‚€α΅— (Lβ€–X_f s Ο‰ - X_g s Ο‰β€– + Ξ΅ s)`; +* `integral_mild_bound` integrates this over `Ο€` (Tonelli on a nonnegative + integrand), yielding `Q t ≀ Q 0 + βˆ«β‚€α΅— (LΒ·Q s + Ξ΅ s)`; +* the self-reference `Ξ΅ s ≀ LΒ·Q s` collapses the integrand to `2 L Β· Q s`; +* `gronwall_mild_le` (scalar mild Gronwall) closes to `Q 0 Β· exp (2 L t)`. + +**Clamp bridge**: `integral_mild_bound` and the DCT continuity of `Q` +require *global*-in-`s` continuity, but the flow regularity is only on the +window `[0, T]`. We work with the clamped flow `s ↦ X_f (clamp s) Ο‰` (globally +continuous, agreeing with `X_f` on `[0, T]`), apply the window machinery to it, +and transfer back on `[0, T]` where `clamp = id` via integrand congruence. + +**Base-measure genericity**: `Ο€` is abstract, so this serves both the +uniqueness call site (`Ο€ = f 0`, `Q 0 = 0`, Foundation-B-free) and the +mean-field call site (`Ο€` an optimal coupling, `Q 0 = W₁(f 0, g 0)`). -/ +theorem integrated_coupling_gronwall_bound + {Ξ© Ξ± : Type*} [MeasurableSpace Ξ©] + [NormedAddCommGroup Ξ±] [NormedSpace ℝ Ξ±] [CompleteSpace Ξ±] + [MeasurableSpace Ξ±] [BorelSpace Ξ±] [MeasurableSubβ‚‚ Ξ±] + (Ο€ : Measure Ξ©) [IsProbabilityMeasure Ο€] + (X_f X_g : ℝ β†’ Ξ© β†’ Ξ±) (b_f b_g : ℝ β†’ Ξ± β†’ Ξ±) (L : NNReal) (T : ℝ) (hT : 0 ≀ T) + (hL_f : βˆ€ t, LipschitzWith L (b_f t)) + -- per-`Ο‰` flow regularity (matches `flow_difference_mild_bound`) + (hcont_f : βˆ€ Ο‰, ContinuousOn (fun s => X_f s Ο‰) (Set.Icc 0 T)) + (hcont_g : βˆ€ Ο‰, ContinuousOn (fun s => X_g s Ο‰) (Set.Icc 0 T)) + (hderiv_f : βˆ€ Ο‰, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt (fun s => X_f s Ο‰) (b_f s (X_f s Ο‰)) (Set.Ioi s) s) + (hderiv_g : βˆ€ Ο‰, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt (fun s => X_g s Ο‰) (b_g s (X_g s Ο‰)) (Set.Ioi s) s) + (hint : βˆ€ Ο‰, IntervalIntegrable + (fun s => b_f s (X_f s Ο‰) - b_g s (X_g s Ο‰)) MeasureTheory.volume 0 T) + -- measurability + domination for the Tonelli / DCT + (hmeas_f : βˆ€ s, Measurable (X_f s)) (hmeas_g : βˆ€ s, Measurable (X_g s)) + (dom : Ξ© β†’ ℝ) (hdom_int : Integrable dom Ο€) + (hdom : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– ≀ dom Ο‰) + -- the cross-field bound `Ξ΅` and its self-reference to `Q` + (Ξ΅ : ℝ β†’ ℝ) (hΞ΅_int : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 T) + (hΞ΅_nn : βˆ€ s ∈ Set.Icc (0 : ℝ) T, 0 ≀ Ξ΅ s) + (h_diff : βˆ€ Ο‰, βˆ€ s ∈ Set.Icc (0 : ℝ) T, + β€–b_f s (X_g s Ο‰) - b_g s (X_g s Ο‰)β€– ≀ Ξ΅ s) + (h_self : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + Ξ΅ s ≀ (L : ℝ) * ∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (∫ Ο‰, β€–X_f t Ο‰ - X_g t Ο‰β€– βˆ‚Ο€) ≀ + (∫ Ο‰, β€–X_f 0 Ο‰ - X_g 0 Ο‰β€– βˆ‚Ο€) * Real.exp (2 * (L:ℝ) * t) := by + -- clamp into `[0, T]` (opaque; used only through its three properties) + obtain ⟨clamp, hclamp_cont, hclamp_mem, hclamp_id⟩ : + βˆƒ clamp : ℝ β†’ ℝ, Continuous clamp ∧ (βˆ€ s, clamp s ∈ Set.Icc (0 : ℝ) T) ∧ + (βˆ€ s ∈ Set.Icc (0 : ℝ) T, clamp s = s) := by + refine ⟨fun s => max 0 (min s T), ?_, ?_, ?_⟩ + Β· exact continuous_const.max (continuous_id.min continuous_const) + Β· intro s; exact ⟨le_max_left _ _, max_le hT (min_le_right _ _)⟩ + Β· intro s hs; change max 0 (min s T) = s + rw [min_eq_left hs.2, max_eq_right hs.1] + -- the clamped difference flow `W s Ο‰ = X_f (clamp s) Ο‰ - X_g (clamp s) Ο‰` + set W : ℝ β†’ Ξ© β†’ Ξ± := fun s Ο‰ => X_f (clamp s) Ο‰ - X_g (clamp s) Ο‰ with hW_def + have hW_cont : βˆ€ Ο‰, Continuous (fun s => W s Ο‰) := by + intro Ο‰; simp only [hW_def] + exact ((hcont_f Ο‰).sub (hcont_g Ο‰)).comp_continuous hclamp_cont hclamp_mem + have hW_meas : βˆ€ s, Measurable (W s) := by + intro s; simp only [hW_def] + exact (hmeas_f (clamp s)).sub (hmeas_g (clamp s)) + have hW_dom : βˆ€ s, βˆ€ Ο‰, β€–W s Ο‰β€– ≀ dom Ο‰ := by + intro s Ο‰; simp only [hW_def]; exact hdom (clamp s) (hclamp_mem s) Ο‰ + -- on `[0, T]`, `W` agrees with the unclamped difference, so the integrals agree + have hQW_eq : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) = ∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€ := by + intro s hs + apply integral_congr_ae + filter_upwards with Ο‰ + simp only [hW_def, hclamp_id s hs] + -- per-`Ο‰` mild bound (unclamped) via `flow_difference_mild_bound` + have hper_w : βˆ€ Ο‰, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + β€–X_f t Ο‰ - X_g t Ο‰β€– ≀ β€–X_f 0 Ο‰ - X_g 0 Ο‰β€– + + ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–X_f s Ο‰ - X_g s Ο‰β€– + Ξ΅ s) := fun Ο‰ => + flow_difference_mild_bound b_f b_g L hL_f (fun s => X_f s Ο‰) (fun s => X_g s Ο‰) T + (hcont_f Ο‰) (hcont_g Ο‰) (hderiv_f Ο‰) (hderiv_g Ο‰) (hint Ο‰) Ξ΅ hΞ΅_int (h_diff Ο‰) + -- transfer the mild bound to the clamped flow `W` (needed by `integral_mild_bound`) + have hper_W : βˆ€ Ο‰, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + β€–W t Ο‰β€– ≀ β€–W 0 Ο‰β€– + ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–W s Ο‰β€– + Ξ΅ s) := by + intro Ο‰ t ht + have h0t : (0 : ℝ) ≀ t := ht.1 + have hWt : W t Ο‰ = X_f t Ο‰ - X_g t Ο‰ := by simp only [hW_def, hclamp_id t ht] + have hW0 : W 0 Ο‰ = X_f 0 Ο‰ - X_g 0 Ο‰ := by + simp only [hW_def, hclamp_id 0 ⟨le_refl 0, hT⟩] + have hintegrand : (∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–W s Ο‰β€– + Ξ΅ s)) + = ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–X_f s Ο‰ - X_g s Ο‰β€– + Ξ΅ s) := by + refine intervalIntegral.integral_congr (fun s hs => ?_) + rw [Set.uIcc_of_le h0t] at hs + have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨hs.1, hs.2.trans ht.2⟩ + simp only [hW_def, hclamp_id s hsT] + rw [hWt, hW0, hintegrand]; exact hper_w Ο‰ t ht + -- integrate over `Ο€` (Tonelli): `Q t ≀ Q 0 + βˆ«β‚€α΅— (LΒ·Q s + Ξ΅ s)` + have hQW := integral_mild_bound Ο€ W (L:ℝ) (NNReal.coe_nonneg L) Ξ΅ T hT + hW_cont hW_meas dom hdom_int (fun s _ Ο‰ => hW_dom s Ο‰) hΞ΅_int hΞ΅_nn hper_W + -- `Q` is globally continuous via DCT (clamped flow globally dominated) + have hQW_cont : Continuous (fun s => ∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by + refine continuous_of_dominated + (fun s => (hW_meas s).norm.aestronglyMeasurable) + (fun s => Filter.Eventually.of_forall (fun Ο‰ => ?_)) hdom_int + (Filter.Eventually.of_forall (fun Ο‰ => (hW_cont Ο‰).norm)) + rw [Real.norm_of_nonneg (norm_nonneg _)]; exact hW_dom s Ο‰ + -- collapse the integrand to `2 L Β· Q s` using the self-reference + have hmild_W : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (∫ Ο‰, β€–W t Ο‰β€– βˆ‚Ο€) ≀ (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) + + (2 * (L:ℝ)) * ∫ s in (0 : ℝ)..t, (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by + intro t ht + have h0t : (0 : ℝ) ≀ t := ht.1 + have hstep := hQW t ht + have hII_lhs : IntervalIntegrable + (fun s => (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) MeasureTheory.volume 0 t := + ((hQW_cont.intervalIntegrable 0 t).const_mul (L:ℝ)).add + (hΞ΅_int.mono_set (by + rw [Set.uIcc_of_le h0t, Set.uIcc_of_le hT] + exact Set.Icc_subset_Icc_right ht.2)) + have hII_rhs : IntervalIntegrable + (fun s => (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€)) MeasureTheory.volume 0 t := + (hQW_cont.intervalIntegrable 0 t).const_mul (2 * (L:ℝ)) + have hmono : (∫ s in (0 : ℝ)..t, ((L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + Ξ΅ s)) + ≀ ∫ s in (0 : ℝ)..t, (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by + refine intervalIntegral.integral_mono_on h0t hII_lhs hII_rhs (fun s hs => ?_) + have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨hs.1, hs.2.trans ht.2⟩ + have hΞ΅le : Ξ΅ s ≀ (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by + calc Ξ΅ s ≀ (L:ℝ) * (∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€) := h_self s hsT + _ = (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by rw [hQW_eq s hsT] + have hring : (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + = (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by ring + rw [hring]; linarith [hΞ΅le] + calc (∫ Ο‰, β€–W t Ο‰β€– βˆ‚Ο€) + ≀ (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) + + ∫ s in (0 : ℝ)..t, ((L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := hstep + _ ≀ (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) + + ∫ s in (0 : ℝ)..t, (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by linarith [hmono] + _ = (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) + + (2 * (L:ℝ)) * ∫ s in (0 : ℝ)..t, (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by + rw [intervalIntegral.integral_const_mul] + -- scalar mild Gronwall on `Q` + have hgron := gronwall_mild_le (fun s => ∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) (2 * (L:ℝ)) T + (by have := NNReal.coe_nonneg L; linarith) + (integral_nonneg (fun Ο‰ => norm_nonneg _)) + hQW_cont (fun s => integral_nonneg (fun Ο‰ => norm_nonneg _)) hmild_W + -- transfer back to the unclamped difference on `[0, T]` + intro t ht + rw [← hQW_eq t ht, ← hQW_eq 0 ⟨le_refl 0, hT⟩] + exact hgron t ht + +/-- **Piece A (Option 2): time-dependent moment-envelope growth bound.** + +Sharper sibling of `flow_distance_growth_bound_on`. Instead of a single +constant moment bound `M_ρ` (which forces the constant-sup growth constant +`C_T` and, downstream, an `M_fβ‚€`-dependent fixed-point on the curve space), +this takes a **monotone time-dependent envelope** `m : ℝ β†’ ℝ` bounding the +spatial-marginal first moment, and concludes the **time-local** Gronwall bound + + `β€–(charX t z, charV t z)β€– ≀ gronwallBound β€–zβ€– (1+L) (β€–gradW 0β€– + L Β· m t) t`, + +with the force constant `Ξ΅(t) = β€–gradW 0β€– + L Β· m t` evaluated at the SAME time +`t` (not the sup `m T`). Monotonicity of `m` lets the per-`t` Gronwall on +`[0, t]` use the endpoint value `Ξ΅(t)` while validating the derivative bound at +every `s ≀ t` (since `Ξ΅(s) ≀ Ξ΅(t)`). + +**Why this is the option-2 foundation**: integrating the conclusion over a +probability `fβ‚€` gives `M_{Φρ}(t) ≀ A(t) + B(t)Β·m(t)` with +`A(t) = M_fβ‚€Β·e^{(1+L)t} + (β€–gradW 0β€–/(1+L))(e^{(1+L)t}-1)` and +`B(t) = (L/(1+L))(e^{(1+L)t}-1)` β€” crucially an **`M_fβ‚€`-free** coefficient. +The canonical envelope `m*(t) := A(t)/(1-B(T))` is then Ξ¦-invariant under the +**data-independent** constraint `B(T) < 1`, dissolving the constant-`M` +fixed-point without a data-dependent hypothesis. (Contrast the constant-sup +bound, which feeds `m(T)` into `Ξ΅` and re-derives an `M_fβ‚€`-dependent +smallness.) -/ +theorem flow_distance_growth_bound_on_timedep + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (_hT : 0 ≀ T) + (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) + (h_cont_Icc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) + (h_deriv_Ico : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, + HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) + (Set.Ici s) s) + (m : ℝ β†’ ℝ) (hm_mono : MonotoneOn m (Set.Icc 0 T)) + (hm : βˆ€ t ∈ Set.Icc 0 T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ m t) + (h_y_int : βˆ€ t ∈ Set.Icc 0 T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) : + βˆ€ t ∈ Set.Icc 0 T, βˆ€ z : PhaseSpace d, + β€–(charX t z, charV t z)β€– ≀ + gronwallBound β€–zβ€– (1 + (L : ℝ)) (β€–gradW 0β€– + (L : ℝ) * m t) t := by + intro t ht z + set K : ℝ := 1 + (L : ℝ) with hK_def + -- m t β‰₯ 0 (moment of a probability measure is nonneg, bounded by m t). + have hmt_nn : 0 ≀ m t := + le_trans (integral_nonneg (fun y => norm_nonneg y)) (hm t ht) + set Ξ΅t : ℝ := β€–gradW 0β€– + (L : ℝ) * m t with hΞ΅t_def + have hK_pos : 0 < K := by positivity + have hΞ΅t_nn : 0 ≀ Ξ΅t := by positivity + -- Convolution force bound on [0, t], using m s ≀ m t (monotone). + have h_conv_bound : βˆ€ s ∈ Set.Icc 0 t, βˆ€ x : PhysSpace d, + β€–convolveFunctionMeasure gradW (ρ s) xβ€– ≀ Ξ΅t + (L : ℝ) * β€–xβ€– := by + intro s hs x + have hs_T : s ∈ Set.Icc 0 T := ⟨hs.1, le_trans hs.2 ht.2⟩ + exact norm_convolveFunctionMeasure_le_affine gradW L hL (ρ s) (h_int s) + (h_y_int s hs_T) (m t) ((hm s hs_T).trans (hm_mono hs_T ht hs.2)) x + -- Gronwall on [0, t] with the endpoint force constant Ξ΅t. + have ht0 : (0 : ℝ) ≀ t := ht.1 + have h_f_cont : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc 0 t) := + (h_cont_Icc z).mono (Set.Icc_subset_Icc_right ht.2) + have h_deriv : βˆ€ s ∈ Set.Ico 0 t, + HasDerivWithinAt (fun s => (charX s z, charV s z)) + (charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z)) + (Set.Ici s) s := by + intro s hs + have hs_T : s ∈ Set.Ico 0 T := ⟨hs.1, lt_of_lt_of_le hs.2 ht.2⟩ + have hderiv := h_deriv_Ico z s hs_T + unfold vlasovVectorField at hderiv + exact hderiv + have h_init_norm : β€–(charX 0 z, charV 0 z)β€– ≀ β€–zβ€– := by rw [h_init z] + have h_bound : βˆ€ s ∈ Set.Ico 0 t, + β€–(charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z))β€– ≀ + K * β€–(charX s z, charV s z)β€– + Ξ΅t := by + intro s hs + have hs_mem : s ∈ Set.Icc 0 t := ⟨hs.1, le_of_lt hs.2⟩ + simp only [Prod.norm_def, norm_neg] + have hFsz := le_max_left β€–charX s zβ€– β€–charV s zβ€– + have hGsz := le_max_right β€–charX s zβ€– β€–charV s zβ€– + have hM_nn : 0 ≀ max β€–charX s zβ€– β€–charV s zβ€– := + le_max_iff.mpr (Or.inl (norm_nonneg _)) + have h_v_le : β€–charV s zβ€– ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := + calc β€–charV s zβ€– ≀ max β€–charX s zβ€– β€–charV s zβ€– := hGsz + _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– := + le_mul_of_one_le_left hM_nn (by linarith [NNReal.coe_nonneg L]) + _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := le_add_of_nonneg_right hΞ΅t_nn + have h_conv_le : β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– ≀ + K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := + calc β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– + ≀ Ξ΅t + (L : ℝ) * β€–charX s zβ€– := h_conv_bound s hs_mem _ + _ ≀ Ξ΅t + K * max β€–charX s zβ€– β€–charV s zβ€– := by + have hLK : (L : ℝ) ≀ K := le_add_of_nonneg_left zero_le_one + linarith [mul_le_mul_of_nonneg_left hFsz (NNReal.coe_nonneg L), + mul_le_mul_of_nonneg_right hLK hM_nn] + _ = K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := by ring + exact max_le h_v_le h_conv_le + have h_grw := norm_le_gronwallBound_of_norm_deriv_right_le + h_f_cont h_deriv h_init_norm h_bound t (Set.right_mem_Icc.mpr ht0) + simpa using h_grw + +/-- **Piece A.3 (Option 2): the canonical moment envelope closes (data-free).** + +Pure-algebra companion to `flow_distance_growth_bound_on_timedep`. Under the +**`M_fβ‚€`-free** smallness `B(T) := (L/(1+L))(e^{(1+L)T}-1) < 1`, the explicit +envelope `m*(t) := gronwallBound M_fβ‚€ (1+L) g0 t / (1 - B(T))` is a Gronwall +super-solution: + +* monotone on `[0, T]`, +* dominates the initial moment `M_fβ‚€`, +* **Ξ¦-invariant** at the moment level: + `gronwallBound M_fβ‚€ (1+L) (g0 + LΒ·m* t) t ≀ m* t`. + +Composed with Piece A integrated over `fβ‚€` (which gives +`M_{Φρ}(t) ≀ gronwallBound M_fβ‚€ (1+L) (g0 + LΒ·m(t)) t`, `g0 = β€–gradW 0β€–`), this +shows the Picard iterates stay inside the fixed envelope `m*` with **no** +data-dependent hypothesis β€” the faithful dissolution of the constant-`M` +fixed-point. This lemma is the measure-free heart of the option-2 escape; +Pieces B–D thread it through the curve space, `Phi_step`, and #11. -/ +theorem gronwall_envelope_exists + (M_fβ‚€ g0 : ℝ) (hM_fβ‚€ : 0 ≀ M_fβ‚€) (hg0 : 0 ≀ g0) + (L : NNReal) (T : ℝ) (hT : 0 ≀ T) + (hB : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T) - 1) < 1) : + βˆƒ m : ℝ β†’ ℝ, MonotoneOn m (Set.Icc 0 T) ∧ + (βˆ€ t ∈ Set.Icc 0 T, M_fβ‚€ ≀ m t) ∧ + (βˆ€ t ∈ Set.Icc 0 T, + gronwallBound M_fβ‚€ (1 + (L : ℝ)) (g0 + (L : ℝ) * m t) t ≀ m t) := by + set K : ℝ := 1 + (L : ℝ) with hK_def + have hK_pos : 0 < K := by positivity + have hK_ne : K β‰  0 := ne_of_gt hK_pos + have hL_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg + -- B(t) and its monotonicity. + set Bf : ℝ β†’ ℝ := fun t => (L : ℝ) / K * (Real.exp (K * t) - 1) with hBf_def + have hBT_lt : Bf T < 1 := hB + have hD_pos : 0 < 1 - Bf T := by linarith + have hD_nn : (0 : ℝ) ≀ 1 - Bf T := hD_pos.le + have hD_ne : (1 - Bf T) β‰  0 := ne_of_gt hD_pos + have hLK_nn : 0 ≀ (L : ℝ) / K := div_nonneg hL_nn hK_pos.le + have hBf_T_nn : 0 ≀ Bf T := by + have he1 : 0 ≀ Real.exp (K * T) - 1 := by + have : (1 : ℝ) ≀ Real.exp (K * T) := Real.one_le_exp (by positivity) + linarith + exact mul_nonneg hLK_nn he1 + have hBf_le : βˆ€ t ∈ Set.Icc (0 : ℝ) T, Bf t ≀ Bf T := by + intro t ht + have hexp : Real.exp (K * t) ≀ Real.exp (K * T) := + Real.exp_le_exp.mpr (by nlinarith [ht.2, hK_pos.le]) + simp only [hBf_def] + nlinarith [hexp, hLK_nn] + -- A(t) := gronwallBound M_fβ‚€ K g0 t, expanded + nonneg + monotone. + set Af : ℝ β†’ ℝ := fun t => gronwallBound M_fβ‚€ K g0 t with hAf_def + have hAf_expand : βˆ€ t, + Af t = M_fβ‚€ * Real.exp (K * t) + g0 / K * (Real.exp (K * t) - 1) := by + intro t; simp only [hAf_def]; rw [gronwallBound_of_K_ne_0 hK_ne] + have hAf_nn : βˆ€ t ∈ Set.Icc (0 : ℝ) T, 0 ≀ Af t := by + intro t ht + rw [hAf_expand t] + have he1 : 0 ≀ Real.exp (K * t) - 1 := by + have : (1 : ℝ) ≀ Real.exp (K * t) := Real.one_le_exp (by nlinarith [ht.1, hK_pos.le]) + linarith + have hgK_nn : 0 ≀ g0 / K := div_nonneg hg0 hK_pos.le + positivity + have hAf_mono : MonotoneOn Af (Set.Icc 0 T) := by + intro s _ t _ hst + simp only [hAf_def] + exact gronwallBound_mono hM_fβ‚€ hg0 hK_pos.le hst + refine ⟨fun t => Af t / (1 - Bf T), ?_, ?_, ?_⟩ + Β· -- monotone: Af increasing, positive constant divisor. + intro s hs t ht hst + change Af s / (1 - Bf T) ≀ Af t / (1 - Bf T) + gcongr + exact hAf_mono hs ht hst + Β· -- M_fβ‚€ ≀ m t. + intro t ht + have h0_mem : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T := ⟨le_refl 0, hT⟩ + have hAf0 : Af 0 = M_fβ‚€ := by rw [hAf_expand 0]; simp [Real.exp_zero] + have h_mono : Af 0 / (1 - Bf T) ≀ Af t / (1 - Bf T) := by + gcongr + exact hAf_mono h0_mem ht ht.1 + rw [hAf0] at h_mono + have h_self : M_fβ‚€ ≀ M_fβ‚€ / (1 - Bf T) := by + rw [le_div_iffβ‚€ hD_pos]; nlinarith [hM_fβ‚€, hBf_T_nn] + linarith + Β· -- Ξ¦-invariance. + intro t ht + change gronwallBound M_fβ‚€ K (g0 + (L : ℝ) * (Af t / (1 - Bf T))) t + ≀ Af t / (1 - Bf T) + have h_lhs : gronwallBound M_fβ‚€ K (g0 + (L : ℝ) * (Af t / (1 - Bf T))) t + = Af t + Bf t * (Af t / (1 - Bf T)) := by + rw [gronwallBound_of_K_ne_0 hK_ne, hAf_expand t] + simp only [hBf_def]; ring + rw [h_lhs] + have hkey : 0 ≀ Af t * (Bf T - Bf t) := + mul_nonneg (hAf_nn t ht) (by linarith [hBf_le t ht]) + have hexpand : Af t / (1 - Bf T) - (Af t + Bf t * (Af t / (1 - Bf T))) + = Af t * (Bf T - Bf t) / (1 - Bf T) := by + field_simp + ring + linarith [div_nonneg hkey hD_pos.le, hexpand] + +/-- **Piece A.2 (Option 2): integrate the per-`z` growth bound to a moment bound.** + +The measure-level bridge between Piece A and Piece A.3: given the per-`z` +time-local growth bound (Piece A's conclusion, taken here as the hypothesis +`h_growth` so this lemma is decoupled from the flow construction), the +**position pushforward** `Measure.map (charX t Β·) fβ‚€` has first moment bounded +by the same Gronwall functional evaluated at the *initial* moment `βˆ«β€–zβ€– βˆ‚fβ‚€`: + + `∫ x, β€–xβ€– βˆ‚(Measure.map (charX t Β·) fβ‚€) ≀ gronwallBound (βˆ«β€–zβ€– βˆ‚fβ‚€) (1+L) (g0 + LΒ·m t) t`. + +Proof: `integral_map` exchanges the pushforward; `β€–charX t zβ€– ≀ β€–(charX t z, charV t z)β€–` ++ `h_growth` bounds the integrand by `gronwallBound β€–zβ€– …`, which is affine in `β€–zβ€–`, +so its `fβ‚€`-integral is `gronwallBound (βˆ«β€–zβ€–) …` (probability measure β‡’ the constant +term integrates to itself). + +Composing with `gronwall_envelope_exists` (Piece A.3): when `m = m*` the canonical +envelope and `g0 = β€–gradW 0β€–`, the RHS is `≀ m* t`, i.e. `Ξ¦` maps the envelope to +itself at the moment level β€” the measure-level statement of the data-free escape. -/ +theorem phi_moment_envelope_le {d : β„•} + (L : NNReal) (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (g0 : ℝ) (T : ℝ) (m : ℝ β†’ ℝ) + (h_growth : βˆ€ t ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, + β€–(charX t z, charV t z)β€– ≀ gronwallBound β€–zβ€– (1 + (L : ℝ)) (g0 + (L : ℝ) * m t) t) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + (h_meas : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => charX t z) fβ‚€) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, + ∫ x, β€–xβ€– βˆ‚(Measure.map (fun z : PhaseSpace d => charX t z) fβ‚€) + ≀ gronwallBound (∫ z, β€–zβ€– βˆ‚fβ‚€) (1 + (L : ℝ)) (g0 + (L : ℝ) * m t) t := by + intro t ht + set K : ℝ := 1 + (L : ℝ) with hK_def + set Ξ΅t : ℝ := g0 + (L : ℝ) * m t with hΞ΅t_def + have hK_ne : K β‰  0 := by positivity + -- gronwallBound is affine in its initial value: gb r = e^{Kt}Β·r + C. + have h_gb : βˆ€ r : ℝ, + gronwallBound r K Ξ΅t t = Real.exp (K * t) * r + Ξ΅t / K * (Real.exp (K * t) - 1) := by + intro r; rw [gronwallBound_of_K_ne_0 hK_ne]; ring + have h_dom_int : Integrable (fun z : PhaseSpace d => gronwallBound β€–zβ€– K Ξ΅t t) fβ‚€ := by + simp only [h_gb] + exact (hfβ‚€_int.const_mul _).add (integrable_const _) + have h_charX_le : βˆ€ z : PhaseSpace d, β€–charX t zβ€– ≀ gronwallBound β€–zβ€– K Ξ΅t t := fun z => + le_trans (norm_fst_le (charX t z, charV t z)) (h_growth t ht z) + have h_charX_int : Integrable (fun z : PhaseSpace d => β€–charX t zβ€–) fβ‚€ := + h_dom_int.mono' ((h_meas t ht).norm.aestronglyMeasurable) + (Filter.Eventually.of_forall fun z => by + rw [Real.norm_of_nonneg (norm_nonneg _)]; exact h_charX_le z) + rw [integral_map (h_meas t ht) continuous_norm.aestronglyMeasurable] + calc ∫ z, β€–charX t zβ€– βˆ‚fβ‚€ + ≀ ∫ z, gronwallBound β€–zβ€– K Ξ΅t t βˆ‚fβ‚€ := + integral_mono h_charX_int h_dom_int h_charX_le + _ = gronwallBound (∫ z, β€–zβ€– βˆ‚fβ‚€) K Ξ΅t t := by + simp only [h_gb] + rw [integral_add (hfβ‚€_int.const_mul _) (integrable_const _), integral_const_mul, + integral_const] + simp [measureReal_def, measure_univ] + +/-! ## Characteristic flow existence (Picard-LindelΓΆf wrapper) + +This section wraps the vendored parametric Picard-LindelΓΆf theorem +(`LeanPool.Vlasov.ForMathlib.PicardLindelof`) to extract a characteristic flow +`(charX, charV)` for the Vlasov ODE. +The four `IsPicardLindelof` hypotheses (Lipschitz-on-ball, +continuous-in-time, norm bound, contraction) are derived from +`convolveFunctionMeasure_lipschitz_in_x`, plus narrow-continuity of the +spatial-marginal curve `ρ`, plus a uniform norm bound from the +finite-mass assumption. + +The contraction condition `L Β· max(tmax βˆ’ tβ‚€, tβ‚€ βˆ’ tmin) ≀ a βˆ’ r` +pins down the local time-interval size relative to the ball radius. +For the dobrushin application we work on a finite interval `[0, T]`; +the existence theorem is parametrised by `T` and produces a flow +on `Set.Icc 0 T` (extending the local flow by stitching overlapping +windows; technically a separate iteration argument, deferred to +the proof body). + +This sub-section first establishes the **global Lipschitz constant** +for `vlasovVectorField` (a direct composition of +`convolveFunctionMeasure_lipschitz_in_x` with the 1-Lipschitz +identity on the velocity coordinate, combined via `LipschitzWith.prodMk`). +The global Lipschitz immediately restricts to any closed ball, +giving the first of the four `IsPicardLindelof` fields. + +The full `exists_vlasov_characteristicFlow` proof packages the global +norm bound into a per-window `IsPicardLindelof`, invokes the vendored +Picard-LindelΓΆf (`exists_vlasov_extend_one_window`), and stitches +`N = ⌈T/Ξ΄βŒ‰` windows per-`z` via `HasDerivWithinAt.union` under the +position/velocity inductive invariant. Downstream callers discharge its +`hR`/`hbound` hypotheses; the single-ball `hR` discharge in +`exists_vlasov_trajectory` is what introduces the +`LocalSmallnessPLBuffer L T := LΒ·TΒ² < 1` constraint β€” see that +theorem's docstring for the arbitrary-`L` discussion. -/ + +/-- Localized variant of `IsCharacteristicFlow` from `Basic.lean`: +the same initial condition + position/velocity ODEs, but quantified +over a chosen time set `s_t : Set ℝ` and initial-condition set +`s_z : Set (PhaseSpace d)`. + +The global `IsCharacteristicFlow gradW ρ charX charV` is the +specialisation `IsCharacteristicFlowOn ... Set.univ Set.univ` +(modulo the unconditional init clause). -/ +def IsCharacteristicFlowOn + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (s_t : Set ℝ) (s_z : Set (PhaseSpace d)) : Prop := + (βˆ€ z ∈ s_z, charX 0 z = z.1 ∧ charV 0 z = z.2) ∧ + (βˆ€ t ∈ s_t, βˆ€ z ∈ s_z, HasDerivAt (fun s => charX s z) (charV t z) t) ∧ + (βˆ€ t ∈ s_t, βˆ€ z ∈ s_z, HasDerivAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (ρ t) (charX t z))) t) + +/-- Monotonicity of `IsCharacteristicFlowOn` in both the time set and the +initial-condition set. Used at the end of the global existence theorem +to restrict a flow produced on `Ioo 0 (NΒ·Ξ΄)` (covering all of `[0, T]`) +down to `Ioo 0 T`. -/ +lemma IsCharacteristicFlowOn.mono + {d : β„•} + {gradW : PhysSpace d β†’ PhysSpace d} + {ρ : ℝ β†’ Measure (PhysSpace d)} + {charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d} + {s_t s_t' : Set ℝ} {s_z s_z' : Set (PhaseSpace d)} + (h : IsCharacteristicFlowOn gradW ρ charX charV s_t s_z) + (hs_t : s_t' βŠ† s_t) (hs_z : s_z' βŠ† s_z) : + IsCharacteristicFlowOn gradW ρ charX charV s_t' s_z' := by + refine ⟨fun z hz => h.1 z (hs_z hz), fun t ht z hz => ?_, fun t ht z hz => ?_⟩ + Β· exact h.2.1 t (hs_t ht) z (hs_z hz) + Β· exact h.2.2 t (hs_t ht) z (hs_z hz) + +/-- Global Lipschitz constant for the Vlasov phase-space vector field. +`b_t(x, v) = (v, -(βˆ‡W βˆ— ρ_t)(x))` is `max(1, L)`-Lipschitz when +`gradW` is `L`-Lipschitz: the velocity-side projection `(x, v) ↦ v` +is 1-Lipschitz (`LipschitzWith.prod_snd`), and the force-side map +`(x, v) ↦ -(βˆ‡W βˆ— ρ_t)(x)` is `L`-Lipschitz (compose +`convolveFunctionMeasure_lipschitz_in_x` with `Neg.neg` and +`Prod.fst`, both 1-Lipschitz). Combining the two via +`LipschitzWith.prodMk` yields `max(1, L)` on the product. -/ +lemma vlasovVectorField_lipschitzWith + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (t : ℝ) : + LipschitzWith (max 1 L) (vlasovVectorField gradW ρ t) := by + -- Force-side `x ↦ (βˆ‡W βˆ— ρ_t)(x)` is `L`-Lipschitz. + have h_conv : LipschitzWith L + (fun x : PhysSpace d => convolveFunctionMeasure gradW (ρ t) x) := + convolveFunctionMeasure_lipschitz_in_x gradW L hL (ρ t) (h_int t) + -- Negate (`Neg.neg` is 1-Lipschitz): `x ↦ -(βˆ‡W βˆ— ρ_t)(x)` is still `L`-Lipschitz. + have h_neg_conv : LipschitzWith L + (fun x : PhysSpace d => -convolveFunctionMeasure gradW (ρ t) x) := by + simpa [Function.comp_def] using LipschitzWith.id.neg.comp h_conv + -- Compose with `Prod.fst` (1-Lipschitz): `z ↦ -(βˆ‡W βˆ— ρ_t)(z.1)` is `L`-Lipschitz. + have h_force : LipschitzWith L + (fun z : PhaseSpace d => -convolveFunctionMeasure gradW (ρ t) z.1) := by + simpa [Function.comp_def] using h_neg_conv.comp + (LipschitzWith.prod_fst (Ξ± := PhysSpace d) (Ξ² := PhysSpace d)) + -- Combine velocity-side projection (1-Lipschitz) with force-side (L-Lipschitz). + exact (LipschitzWith.prod_snd (Ξ± := PhysSpace d) (Ξ² := PhysSpace d)).prodMk h_force + +/-- Pointwise norm bound for the Vlasov phase-space vector field. +`β€–b_t(x, v)β€– ≀ max(β€–vβ€–, β€–(βˆ‡W βˆ— ρ_t)(x)β€–)` for the product `max`-norm +on `PhaseSpace d = PhysSpace d Γ— PhysSpace d`. + +This is the decomposition used to derive `IsPicardLindelof.norm_le` +once a uniform bound `M` for `β€–(βˆ‡W βˆ— ρ_t)(x)β€–` on a closed ball is +known (e.g. from finite-first-moment + Lipschitz growth of `gradW`). -/ +lemma vlasovVectorField_norm_le + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) (t : ℝ) (z : PhaseSpace d) : + β€–vlasovVectorField gradW ρ t zβ€– ≀ + max β€–z.2β€– β€–convolveFunctionMeasure gradW (ρ t) z.1β€– := by + unfold vlasovVectorField + -- Prod norm is the max of component norms; neg preserves norm. + simp [Prod.norm_def, norm_neg] + +/-- **Local-flow** existence for the Vlasov ODE. + +Wraps the vendored parametric Picard-LindelΓΆf +(`IsPicardLindelof.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined`, +`LeanPool.Vlasov.ForMathlib.PicardLindelof`) +into a `HasDerivAt`-on-`Ioo`-shaped characteristic flow. The result +holds for initial conditions inside `closedBall zβ‚€ (a/2)` and for +times in `Ioo 0 Ξ΄` where `Ξ΄` is a Picard-derived constant. + +The new hypothesis `hbound` (uniform norm bound on the convolution +force on a slightly larger ball, over `[0, 1]`) is the genuine input +the Picard wrapper needs: the contraction condition + the `norm_le` +field of `IsPicardLindelof` both require a global bound on `β€–b_tβ€–`. + +The global existence form `exists_vlasov_characteristicFlow` (below) +is the stitched version on `[0, T]`, iterating this local theorem on +overlapping windows and gluing with `ODE_solution_unique`. -/ +theorem exists_vlasov_characteristicFlow_local + {d : β„•} + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (_hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + -- Local-flow data: the basepoint `zβ‚€`, the ball radius `a`, and a + -- uniform force bound `M` on `closedBall zβ‚€.1 (3a/2)` over `[0,1]`. + (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) + (M : NNReal) + (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) (1 : ℝ), + βˆ€ x ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : + βˆƒ (Ξ΄ : ℝ) (_ : 0 < Ξ΄) (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), + IsCharacteristicFlowOn gradW ρ charX charV + (Set.Ioo 0 Ξ΄) (Metric.closedBall zβ‚€ ((a : ℝ) / 2)) := by + classical + -- IsPicardLindelof parameter choices. + set K_pl : NNReal := max 1 L with hK_pl_def + set r_pl : NNReal := a / 2 with hr_pl_def + set L_pl : NNReal := β€–zβ‚€.2β€–β‚Š + a + M with hL_pl_def + -- Ξ΄ chosen to satisfy the contraction L_pl Β· Ξ΄ ≀ a βˆ’ r_pl = a/2. + set Ξ΄ : ℝ := min 1 ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) with hΞ΄_def + have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha + have h_denom_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by positivity + have h_ratio_pos : (0 : ℝ) < (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := by positivity + have hΞ΄_pos : (0 : ℝ) < Ξ΄ := lt_min one_pos h_ratio_pos + have hΞ΄_le_one : Ξ΄ ≀ 1 := min_le_left _ _ + have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := min_le_right _ _ + -- tβ‚€ ∈ Icc 0 Ξ΄. + let tβ‚€ : Set.Icc (0 : ℝ) Ξ΄ := ⟨0, Set.mem_Icc.mpr ⟨le_refl 0, le_of_lt hΞ΄_pos⟩⟩ + -- Assemble IsPicardLindelof. + have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ zβ‚€ a r_pl L_pl K_pl := by + refine ⟨?_, ?_, ?_, ?_⟩ + Β· -- (a) lipschitzOnWith via vlasovVectorField_lipschitzWith. + intro t _ + exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith + Β· -- (b) continuousOn: velocity component constant in t, force continuous by hρ_cont. + intro x _ + apply Continuous.continuousOn + simp only [vlasovVectorField] + exact Continuous.prodMk continuous_const (hρ_cont x.1).neg + Β· -- (c) norm_le. + intro t ht x hx + have h_norm_field := vlasovVectorField_norm_le gradW ρ t x + have hdist_le : dist x zβ‚€ ≀ (a : ℝ) := hx + have hdist_le_norm : β€–x - zβ‚€β€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le + have h_x2_proj : β€–x.2 - zβ‚€.2β€– ≀ β€–x - zβ‚€β€– := by + rw [Prod.norm_def]; exact le_max_right _ _ + have h_x2_bound : β€–x.2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) := by + have h1 : β€–x.2β€– = β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– := by rw [sub_add_cancel] + have h2 : β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– ≀ β€–x.2 - zβ‚€.2β€– + β€–zβ‚€.2β€– := norm_add_le _ _ + linarith [h_x2_proj, hdist_le_norm] + have h_x1_proj : dist x.1 zβ‚€.1 ≀ dist x zβ‚€ := by + simp only [Prod.dist_eq]; exact le_max_left _ _ + have h_x1_ball : x.1 ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2) := by + have hx1d : dist x.1 zβ‚€.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le + have : dist x.1 zβ‚€.1 ≀ 3 * (a : ℝ) / 2 := by + have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real + linarith + exact this + have h_t_Icc : t ∈ Set.Icc (0 : ℝ) 1 := + ⟨ht.1, le_trans ht.2 hΞ΄_le_one⟩ + have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := + hbound t h_t_Icc x.1 h_x1_ball + have h_Lpl_eq : (L_pl : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) + (M : ℝ) := by + simp [hL_pl_def, NNReal.coe_add, coe_nnnorm] + calc β€–vlasovVectorField gradW ρ t xβ€– + ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field + _ ≀ (L_pl : ℝ) := by + rw [h_Lpl_eq] + apply max_le + Β· linarith [NNReal.coe_nonneg M] + Β· linarith [norm_nonneg zβ‚€.2, NNReal.coe_nonneg a] + Β· -- (d) mul_max_le: L_pl Β· max(Ξ΄ βˆ’ 0, 0 βˆ’ 0) = L_pl Β· Ξ΄ ≀ a βˆ’ a/2 = a/2. + show (L_pl : ℝ) * max (Ξ΄ - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - 0) ≀ (a : ℝ) - (r_pl : ℝ) + have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl + simp only [htβ‚€_eq, sub_zero, sub_self, max_eq_left (le_of_lt hΞ΄_pos)] + have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by + simp [hr_pl_def, NNReal.coe_div] + ring + rw [h_a_minus_r] + -- L_pl * Ξ΄ ≀ a/2 since Ξ΄ ≀ (a/2)/(L_pl+1) and L_pl ≀ L_pl + 1. + have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg + have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] + have h_step : (L_pl : ℝ) * Ξ΄ ≀ (L_pl : ℝ) * + ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) := + mul_le_mul_of_nonneg_left hΞ΄_le_ratio h_Lpl_nn + have h_rewrite : (L_pl : ℝ) * ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) + = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by ring + have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by + rw [div_le_one h_denom_pos]; linarith + have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by + calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) + ≀ 1 * ((a : ℝ) / 2) := + mul_le_mul_of_nonneg_right h_frac_le h_a_nn + _ = (a : ℝ) / 2 := one_mul _ + linarith [h_step, h_rewrite β–Έ h_step, h_bound] + -- Invoke headline Picard-LindelΓΆf. + obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined + -- Ξ± : PhaseSpace d β†’ ℝ β†’ PhaseSpace d. Define charX, charV by projection. + refine ⟨δ, hΞ΄_pos, fun t z => (Ξ± z t).1, fun t z => (Ξ± z t).2, ?_, ?_, ?_⟩ + Β· -- Initial condition: Ξ± z 0 = z gives both component equalities. + intro z hz + have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by + have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] + rw [Metric.mem_closedBall] at hz ⊒ + rw [hreq]; exact hz + have h_init : Ξ± z (tβ‚€ : ℝ) = z := (hΞ± z hz_in_r).1 + have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl + rw [htβ‚€_eq] at h_init + refine ⟨?_, ?_⟩ + Β· change (Ξ± z 0).1 = z.1; rw [h_init] + Β· change (Ξ± z 0).2 = z.2; rw [h_init] + Β· -- Position ODE: HasDerivAt (charX Β· z) (charV t z) t. + intro t ht z hz + have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by + have : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] + rw [Metric.mem_closedBall] at hz ⊒; rw [this]; exact hz + have h_t_Icc : t ∈ Set.Icc (0 : ℝ) Ξ΄ := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ + have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc + have h_icc_nhds : Set.Icc (0 : ℝ) Ξ΄ ∈ nhds t := Icc_mem_nhds ht.1 ht.2 + have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := + h_dw.hasDerivAt h_icc_nhds + have h_proj : HasDerivAt (fun s => (Ξ± z s).1) + (vlasovVectorField gradW ρ t (Ξ± z t)).1 t := + (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + Β· -- Velocity ODE: HasDerivAt (charV Β· z) (βˆ’(βˆ‡Wβˆ—Ο)(charX t z)) t. + intro t ht z hz + have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by + have : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] + rw [Metric.mem_closedBall] at hz ⊒; rw [this]; exact hz + have h_t_Icc : t ∈ Set.Icc (0 : ℝ) Ξ΄ := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ + have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc + have h_icc_nhds : Set.Icc (0 : ℝ) Ξ΄ ∈ nhds t := Icc_mem_nhds ht.1 ht.2 + have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := + h_dw.hasDerivAt h_icc_nhds + have h_proj : HasDerivAt (fun s => (Ξ± z s).2) + (vlasovVectorField gradW ρ t (Ξ± z t)).2 t := + (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + +/-- **Per-z, time-shifted single-trajectory Picard with a uniform velocity-bound parameter.** + +Given a fixed phase-space point `w`, a starting time `t_start`, an a priori +velocity bound `V_max β‰₯ β€–w.2β€–`, and a uniform force bound around `w` on the +time interval `[t_start, t_start + 1]`, this produces a single trajectory +`Ξ² : ℝ β†’ PhaseSpace d` solving the Vlasov ODE on `Ioo t_start (t_start + Ξ΄)` +with `Ξ² t_start = w`. + +**Why `V_max` as a separate parameter:** the Picard contraction time Ξ΄ +depends on the norm-bound `L_pl := V_max + a + M` for the vector field on +the local ball. Phrasing this via an explicit `V_max β‰₯ β€–w.2β€–` rather than +the tight `β€–w.2β€–` makes Ξ΄ uniform in `w` for any iteration centered at +points `w` whose velocity component is bounded by `V_max`. This is the +input that lets the N-window iteration in +`exists_vlasov_characteristicFlow` pick a single Ξ΄ valid across all +windows (by combining with the a priori bound +`β€–w_n(z).2β€– ≀ β€–zβ‚€.2β€– + a/2 + MΒ·(T+1)` on a finite `[0, T]`-interval). + +Implementation: build an IsPicardLindelof centered at `w` over `[t_start, +t_start + Ξ΄]` with `L_pl := V_max + a + M`. Invoke the vendored headline +theorem. Take the single trajectory `Ξ² t := Ξ± w t`. -/ +lemma exists_vlasov_extend_one_window + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + (w : PhaseSpace d) (a : NNReal) (ha : 0 < a) (M : NNReal) + (V_max : NNReal) (hV : β€–w.2β€– ≀ (V_max : ℝ)) + (t_start : ℝ) + (hbound : βˆ€ t ∈ Set.Icc t_start (t_start + 1), + βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : + βˆƒ (Ξ΄ : ℝ) (_ : 0 < Ξ΄) (Ξ² : ℝ β†’ PhaseSpace d), + Ξ΄ = min 1 ((a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) ∧ + Ξ² t_start = w ∧ + (βˆ€ t ∈ Set.Ioo t_start (t_start + Ξ΄), + HasDerivAt (fun s => (Ξ² s).1) (Ξ² t).2 t ∧ + HasDerivAt (fun s => (Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) t) ∧ + (βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), + HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 + (Set.Icc t_start (t_start + Ξ΄)) t ∧ + HasDerivWithinAt (fun s => (Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) + (Set.Icc t_start (t_start + Ξ΄)) t) ∧ + (βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), Ξ² s ∈ Metric.closedBall w (a : ℝ)) := by + classical + set K_pl : NNReal := max 1 L with hK_pl_def + set r_pl : NNReal := a / 2 with hr_pl_def + set L_pl : NNReal := V_max + a + M with hL_pl_def + set Ξ΄ : ℝ := min 1 ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) with hΞ΄_def + have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha + have h_denom_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by positivity + have h_ratio_pos : (0 : ℝ) < (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := by positivity + have hΞ΄_pos : (0 : ℝ) < Ξ΄ := lt_min one_pos h_ratio_pos + have hΞ΄_le_one : Ξ΄ ≀ 1 := min_le_left _ _ + have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := min_le_right _ _ + let tβ‚€ : Set.Icc t_start (t_start + Ξ΄) := + ⟨t_start, Set.mem_Icc.mpr ⟨le_refl _, by linarith⟩⟩ + have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ w a r_pl L_pl K_pl := by + refine ⟨?_, ?_, ?_, ?_⟩ + Β· intro t _ + exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith + Β· intro x _ + apply Continuous.continuousOn + simp only [vlasovVectorField] + exact Continuous.prodMk continuous_const (hρ_cont x.1).neg + Β· intro t ht x hx + have h_norm_field := vlasovVectorField_norm_le gradW ρ t x + have hdist_le : dist x w ≀ (a : ℝ) := hx + have hdist_le_norm : β€–x - wβ€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le + have h_x2_proj : β€–x.2 - w.2β€– ≀ β€–x - wβ€– := by + rw [Prod.norm_def]; exact le_max_right _ _ + have h_x2_bound : β€–x.2β€– ≀ β€–w.2β€– + (a : ℝ) := by + have h1 : β€–x.2β€– = β€–(x.2 - w.2) + w.2β€– := by rw [sub_add_cancel] + have h2 : β€–(x.2 - w.2) + w.2β€– ≀ β€–x.2 - w.2β€– + β€–w.2β€– := norm_add_le _ _ + linarith [h_x2_proj, hdist_le_norm] + have h_x1_proj : dist x.1 w.1 ≀ dist x w := by + simp only [Prod.dist_eq]; exact le_max_left _ _ + have h_x1_ball : x.1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2) := by + rw [Metric.mem_closedBall] + have hx1d : dist x.1 w.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le + have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real + linarith + have h_t_Icc : t ∈ Set.Icc t_start (t_start + 1) := + ⟨ht.1, le_trans ht.2 (by linarith [hΞ΄_le_one])⟩ + have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := + hbound t h_t_Icc x.1 h_x1_ball + have h_Lpl_eq : (L_pl : ℝ) = (V_max : ℝ) + (a : ℝ) + (M : ℝ) := by + simp [hL_pl_def, NNReal.coe_add] + have h_x2_bound' : β€–x.2β€– ≀ (V_max : ℝ) + (a : ℝ) := + le_trans h_x2_bound (by linarith [hV]) + calc β€–vlasovVectorField gradW ρ t xβ€– + ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field + _ ≀ (L_pl : ℝ) := by + rw [h_Lpl_eq] + apply max_le + Β· linarith [NNReal.coe_nonneg M, h_x2_bound'] + Β· linarith [norm_nonneg w.2, NNReal.coe_nonneg a, NNReal.coe_nonneg V_max] + Β· show (L_pl : ℝ) * max ((t_start + Ξ΄) - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - t_start) + ≀ (a : ℝ) - (r_pl : ℝ) + have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl + simp only [htβ‚€_eq, add_sub_cancel_left, sub_self, max_eq_left (le_of_lt hΞ΄_pos)] + have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by + simp [hr_pl_def, NNReal.coe_div]; ring + rw [h_a_minus_r] + have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg + have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] + have h_step : (L_pl : ℝ) * Ξ΄ ≀ (L_pl : ℝ) * + ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) := + mul_le_mul_of_nonneg_left hΞ΄_le_ratio h_Lpl_nn + have h_rewrite : (L_pl : ℝ) * ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) + = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by ring + have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by + rw [div_le_one h_denom_pos]; linarith + have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by + calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) + ≀ 1 * ((a : ℝ) / 2) := + mul_le_mul_of_nonneg_right h_frac_le h_a_nn + _ = (a : ℝ) / 2 := one_mul _ + linarith [h_step, h_rewrite β–Έ h_step, h_bound] + obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined + have hw_in_r : w ∈ Metric.closedBall w ((r_pl : ℝ)) := by + rw [Metric.mem_closedBall, dist_self] + exact r_pl.coe_nonneg + have hΞ±_w := hΞ± w hw_in_r + refine ⟨δ, hΞ΄_pos, fun t => Ξ± w t, ?_, ?_, ?_, ?_, ?_⟩ + Β· rfl + Β· have h_init : Ξ± w (tβ‚€ : ℝ) = w := hΞ±_w.1 + have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl + rw [htβ‚€_eq] at h_init + exact h_init + Β· intro t ht + have h_t_Icc : t ∈ Set.Icc t_start (t_start + Ξ΄) := + ⟨le_of_lt ht.1, le_of_lt ht.2⟩ + have h_dw := hΞ±_w.2.1 t h_t_Icc + have h_icc_nhds : Set.Icc t_start (t_start + Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 + have h_d : HasDerivAt (Ξ± w) (vlasovVectorField gradW ρ t (Ξ± w t)) t := + h_dw.hasDerivAt h_icc_nhds + refine ⟨?_, ?_⟩ + Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).1) + (vlasovVectorField gradW ρ t (Ξ± w t)).1 t := + (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).2) + (vlasovVectorField gradW ρ t (Ξ± w t)).2 t := + (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + Β· intro t ht + have h_dw := hΞ±_w.2.1 t ht + refine ⟨?_, ?_⟩ + Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).1) + (vlasovVectorField gradW ρ t (Ξ± w t)).1 + (Set.Icc t_start (t_start + Ξ΄)) t := + (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw + simpa [vlasovVectorField] using h_proj + Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).2) + (vlasovVectorField gradW ρ t (Ξ± w t)).2 + (Set.Icc t_start (t_start + Ξ΄)) t := + (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw + simpa [vlasovVectorField] using h_proj + Β· -- confinement: Ξ² s ∈ closedBall w a (delivered by `_confined` variant) + intro s hs + exact hΞ±_w.2.2 s hs + +/-! ### Per-window helpers for the N-window induction in + `exists_vlasov_characteristicFlow`. + + These three top-level lemmas are generic in `(Ξ², ODE, confinement, + field bound, IH bound, reference point)` with no mention of the + N-window induction context (no `Ξ³_k`, `k`, `N`, `zβ‚€`). This + genericity gives each helper its own elaboration budget AND makes + them composable for future call sites β€” the Lagrangian β†’ Eulerian + chain rule, well-posedness's Banach iteration, etc. + + Composition order: Helper 1 (confinement) β†’ Helper 2 (window-wide + velocity bound) β†’ Helper 3 (endpoint position bound). +-/ + +/-- **Helper 1: Picard window confinement (projection from phase-space ball).** + +For a trajectory Ξ² satisfying the Vlasov ODE on a Picard window +`[t_start, t_start + Ξ΄]` centered at `w`, the position component +stays within the local force-bound ball: +`(Ξ² s).1 ∈ closedBall w.1 (3a/2)` for `s` in the window. + +**Argument.** The strengthened Picard-LindelΓΆf theorem +`exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined` +(`LeanPool.Vlasov.ForMathlib.PicardLindelof`) exposes +`FunSpace.compProj_mem_closedBall` at the public theorem level, +delivering `Ξ² s ∈ closedBall w a` (phase-space ball of radius `a` β€” +the outer Lipschitz radius) as a side product of the existence +guarantee. We project this to the position component via +`Prod.dist_eq` + `le_max_left`, then loosen `a ≀ 3a/2` by arithmetic. +The result is a 3-5 line projection. + +**Hypothesis `hΞ²_confined`** is supplied by Vlasov-side callers from +the widened `exists_vlasov_extend_one_window` output. The other +hypotheses (ODE, field +bound, contraction inequality) are retained for genericity / call +site compatibility; they are not consumed by the projection body but +remain available for future call sites that want to re-derive the +confinement directly (e.g. via supremum trick) without invoking +the vendored Mathlib API. -/ +lemma vlasov_window_confinement + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (_hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (_h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (_hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + (w : PhaseSpace d) (a : NNReal) (_ha : 0 < a) (M : NNReal) + (V_max : NNReal) (_hV : β€–w.2β€– ≀ (V_max : ℝ)) + (t_start Ξ΄ : ℝ) (_hΞ΄_pos : 0 < Ξ΄) (_hΞ΄_le_one : Ξ΄ ≀ 1) + (_hΞ΄_contract : Ξ΄ ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) + (_hbound : βˆ€ t ∈ Set.Icc t_start (t_start + 1), + βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) + (Ξ² : ℝ β†’ PhaseSpace d) (_hΞ²_init : Ξ² t_start = w) + (_hΞ²_ode_Icc : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), + HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 + (Set.Icc t_start (t_start + Ξ΄)) t ∧ + HasDerivWithinAt (fun s => (Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) + (Set.Icc t_start (t_start + Ξ΄)) t) + (hΞ²_confined : βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), + Ξ² s ∈ Metric.closedBall w (a : ℝ)) : + βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), + (Ξ² s).1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2) := by + intro s hs + have h_phase : Ξ² s ∈ Metric.closedBall w (a : ℝ) := hΞ²_confined s hs + rw [Metric.mem_closedBall] at h_phase ⊒ + -- dist (Ξ² s).1 w.1 ≀ dist (Ξ² s) w ≀ a ≀ 3a/2 + have h_proj : dist (Ξ² s).1 w.1 ≀ dist (Ξ² s) w := by + rw [Prod.dist_eq]; exact le_max_left _ _ + have h_a_nn : (0 : ℝ) ≀ (a : ℝ) := a.coe_nonneg + linarith + +/-- **Helper 2: Window-wide velocity bound.** + +For a trajectory Ξ² with velocity-component ODE +`(Ξ² Β· ).2' = -(βˆ‡W βˆ— ρ_Β·)((Ξ² Β·).1)` on `[t_start, t_start + Ξ΄]` and +force bound M (made applicable by `h_Ξ²_in_ball`), the velocity at +every interior `s` is bounded by `h_vel_init + M Β· (s - t_start)`. + +**Math sketch.** One application of +`Convex.norm_image_sub_le_of_norm_hasDerivWithin_le` on `(Ξ² Β· ).2` +over the convex window `Icc t_start (t_start + Ξ΄)`, with `y := s` +universally quantified: + `β€–(Ξ² s).2 - (Ξ² t_start).2β€– ≀ M Β· β€–s - t_startβ€– = M Β· (s - t_start)`. +Triangle with `β€–(Ξ² t_start).2β€– = β€–w.2β€– ≀ h_vel_init` (using `hΞ²_init`) +gives the conclusion. + +The universal quantification over `y` in the mean-value lemma is what +makes this WINDOW-WIDE from ONE invocation β€” no per-s re-application. -/ +lemma vlasov_window_velocity_bound + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (w : PhaseSpace d) (a : NNReal) (M : NNReal) + (t_start Ξ΄ : ℝ) (hΞ΄_pos : 0 < Ξ΄) (hΞ΄_le_one : Ξ΄ ≀ 1) + (h_vel_init : ℝ) (hΞ²_init_vel_bound : β€–w.2β€– ≀ h_vel_init) + (Ξ² : ℝ β†’ PhaseSpace d) (hΞ²_init : Ξ² t_start = w) + (hΞ²_ode_Icc : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), + HasDerivWithinAt (fun s => (Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) + (Set.Icc t_start (t_start + Ξ΄)) t) + (h_Ξ²_in_ball : βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), + (Ξ² s).1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2)) + (hbound : βˆ€ t ∈ Set.Icc t_start (t_start + 1), + βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : + βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), + β€–(Ξ² s).2β€– ≀ h_vel_init + (M : ℝ) * (s - t_start) := by + intro s hs + -- Convexity of the window. + have h_convex : Convex ℝ (Set.Icc t_start (t_start + Ξ΄)) := convex_Icc _ _ + have h_t_start_in : t_start ∈ Set.Icc t_start (t_start + Ξ΄) := + ⟨le_refl _, by linarith⟩ + -- Force bound on the window (via h_Ξ²_in_ball). + have h_force_window : βˆ€ u ∈ Set.Icc t_start (t_start + Ξ΄), + β€–-(convolveFunctionMeasure gradW (ρ u) (Ξ² u).1)β€– ≀ (M : ℝ) := by + intro u hu + rw [norm_neg] + have hu_time : u ∈ Set.Icc t_start (t_start + 1) := + ⟨hu.1, le_trans hu.2 (by linarith [hΞ΄_le_one])⟩ + exact hbound u hu_time (Ξ² u).1 (h_Ξ²_in_ball u hu) + -- Velocity ODE on the window. + have h_vel_ode : βˆ€ u ∈ Set.Icc t_start (t_start + Ξ΄), + HasDerivWithinAt (fun v => (Ξ² v).2) + (-(convolveFunctionMeasure gradW (ρ u) (Ξ² u).1)) + (Set.Icc t_start (t_start + Ξ΄)) u := + fun u hu => hΞ²_ode_Icc u hu + -- Apply Convex.norm_image_sub_le with x := t_start, y := s. + have h_mv : β€–(Ξ² s).2 - (Ξ² t_start).2β€– ≀ (M : ℝ) * β€–s - t_startβ€– := + h_convex.norm_image_sub_le_of_norm_hasDerivWithin_le + h_vel_ode h_force_window h_t_start_in hs + have h_diff_nn : 0 ≀ s - t_start := by linarith [hs.1] + rw [Real.norm_of_nonneg h_diff_nn] at h_mv + -- Ξ² t_start = w, so (Ξ² t_start).2 = w.2. + have h_Ξ²_t_start_vel : (Ξ² t_start).2 = w.2 := by rw [hΞ²_init] + -- Triangle: β€–(Ξ² s).2β€– ≀ β€–(Ξ² s).2 - (Ξ² t_start).2β€– + β€–(Ξ² t_start).2β€–. + have h_decomp : (Ξ² s).2 = ((Ξ² s).2 - (Ξ² t_start).2) + (Ξ² t_start).2 := + (sub_add_cancel _ _).symm + have h_triangle : β€–(Ξ² s).2β€– + ≀ β€–(Ξ² s).2 - (Ξ² t_start).2β€– + β€–(Ξ² t_start).2β€– := by + calc β€–(Ξ² s).2β€– = β€–((Ξ² s).2 - (Ξ² t_start).2) + (Ξ² t_start).2β€– := by rw [← h_decomp] + _ ≀ _ := norm_add_le _ _ + -- Combine: β€–(Ξ² s).2β€– ≀ MΒ·(s - t_start) + β€–w.2β€– ≀ h_vel_init + MΒ·(s - t_start). + rw [h_Ξ²_t_start_vel] at h_triangle + -- h_mv has `(Ξ² t_start).2`; rewrite to `w.2` for compatibility. + rw [h_Ξ²_t_start_vel] at h_mv + linarith [h_mv, hΞ²_init_vel_bound] + +/-- **Helper 3: Window endpoint position bound.** + +For a trajectory Ξ² with position-component ODE +`(Ξ² Β· ).1' = (Ξ² Β· ).2` on `[t_start, t_start + Ξ΄]` and a uniform +velocity bound `V_bound` (typically Helper 2's output composed with +a worst-case substitution), the position at `t_start + Ξ΄` is bounded +relative to an explicit reference point `x_ref`: + `β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– ≀ h_pos_init + V_bound Β· Ξ΄` +where `h_pos_init β‰₯ β€–w.1 - x_refβ€–`. + +**Math sketch.** One application of +`Convex.norm_image_sub_le_of_norm_hasDerivWithin_le` on `(Ξ² Β· ).1` +over the convex window with `x := t_start`, `y := t_start + Ξ΄`: + `β€–(Ξ² (t_start + Ξ΄)).1 - (Ξ² t_start).1β€– ≀ V_bound Β· Ξ΄` (using + `hΞ²_init` for `(Ξ² t_start).1 = w.1`). +Triangle with `β€–w.1 - x_refβ€– ≀ h_pos_init` gives the conclusion. + +**Genericity.** `x_ref : PhysSpace d` is an explicit parameter, NOT +hardcoded to the N-window induction's `zβ‚€.1`. This makes the helper +reusable for the Lagrangian β†’ Eulerian chain rule (reference point: +support of test function Ο†), well-posedness's Banach iteration +(reference point: fixed-point candidate), etc. -/ +lemma vlasov_window_position_bound + {d : β„•} + (_gradW : PhysSpace d β†’ PhysSpace d) + (_ρ : ℝ β†’ Measure (PhysSpace d)) + (w : PhaseSpace d) + (t_start Ξ΄ : ℝ) (hΞ΄_pos : 0 < Ξ΄) + (V_bound : ℝ) + (x_ref : PhysSpace d) + (h_pos_init : ℝ) (hΞ²_init_pos_bound : β€–w.1 - x_refβ€– ≀ h_pos_init) + (Ξ² : ℝ β†’ PhaseSpace d) (hΞ²_init : Ξ² t_start = w) + (hΞ²_ode_Icc : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), + HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 + (Set.Icc t_start (t_start + Ξ΄)) t) + (h_window_vel : βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), + β€–(Ξ² s).2β€– ≀ V_bound) : + β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– ≀ h_pos_init + V_bound * Ξ΄ := by + -- Convexity of the window. + have h_convex : Convex ℝ (Set.Icc t_start (t_start + Ξ΄)) := convex_Icc _ _ + have h_t_start_in : t_start ∈ Set.Icc t_start (t_start + Ξ΄) := + ⟨le_refl _, by linarith⟩ + have h_t_end_in : t_start + Ξ΄ ∈ Set.Icc t_start (t_start + Ξ΄) := + ⟨by linarith, le_refl _⟩ + -- Position ODE on the window. + have h_pos_ode : βˆ€ u ∈ Set.Icc t_start (t_start + Ξ΄), + HasDerivWithinAt (fun v => (Ξ² v).1) (Ξ² u).2 + (Set.Icc t_start (t_start + Ξ΄)) u := + fun u hu => hΞ²_ode_Icc u hu + -- Apply Convex.norm_image_sub_le with x := t_start, y := t_start + Ξ΄. + have h_mv : β€–(Ξ² (t_start + Ξ΄)).1 - (Ξ² t_start).1β€– + ≀ V_bound * β€–(t_start + Ξ΄) - t_startβ€– := + h_convex.norm_image_sub_le_of_norm_hasDerivWithin_le + h_pos_ode h_window_vel h_t_start_in h_t_end_in + have h_Ξ΄_eq : (t_start + Ξ΄) - t_start = Ξ΄ := by ring + rw [h_Ξ΄_eq, Real.norm_of_nonneg (le_of_lt hΞ΄_pos)] at h_mv + -- Ξ² t_start = w, so (Ξ² t_start).1 = w.1. + have h_Ξ²_t_start_pos : (Ξ² t_start).1 = w.1 := by rw [hΞ²_init] + rw [h_Ξ²_t_start_pos] at h_mv + -- Triangle: β€–(Ξ² (t_start+Ξ΄)).1 - x_refβ€– + -- ≀ β€–(Ξ² (t_start+Ξ΄)).1 - w.1β€– + β€–w.1 - x_refβ€– + -- ≀ V_bound Β· Ξ΄ + h_pos_init. + have h_decomp : (Ξ² (t_start + Ξ΄)).1 - x_ref + = ((Ξ² (t_start + Ξ΄)).1 - w.1) + (w.1 - x_ref) := by + rw [sub_add_sub_cancel] + have h_triangle : β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– + ≀ β€–(Ξ² (t_start + Ξ΄)).1 - w.1β€– + β€–w.1 - x_refβ€– := by + calc β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– + = β€–((Ξ² (t_start + Ξ΄)).1 - w.1) + (w.1 - x_ref)β€– := by rw [← h_decomp] + _ ≀ _ := norm_add_le _ _ + linarith [h_mv, hΞ²_init_pos_bound] + +/-- **Tight per-window Picard with an EXPLICIT step Ξ΄ and an ADAPTIVE force-window.** + +Tight form of `exists_vlasov_extend_one_window`: the force bound is required +only on `[t_start, t_start + Ξ΄]` (the actual step), not the loose unit window +`[t_start, t_start + 1]`, and `Ξ΄` is supplied by the caller (so the N-window +chain can tile exactly, `NΒ·Ξ΄ = T`, dissolving the `(T+1)Β²` β†’ `TΒ²` smallness). -/ +lemma exists_vlasov_extend_one_window_tight + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + (w : PhaseSpace d) (a : NNReal) (ha : 0 < a) (M : NNReal) + (V_max : NNReal) (hV : β€–w.2β€– ≀ (V_max : ℝ)) + (t_start : ℝ) + (Ξ΄ : ℝ) (hΞ΄_pos : 0 < Ξ΄) + (hΞ΄_le : Ξ΄ ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) + (hbound : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), + βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : + βˆƒ Ξ² : ℝ β†’ PhaseSpace d, + Ξ² t_start = w ∧ + (βˆ€ t ∈ Set.Ioo t_start (t_start + Ξ΄), + HasDerivAt (fun s => (Ξ² s).1) (Ξ² t).2 t ∧ + HasDerivAt (fun s => (Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) t) ∧ + (βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), + HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 + (Set.Icc t_start (t_start + Ξ΄)) t ∧ + HasDerivWithinAt (fun s => (Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) + (Set.Icc t_start (t_start + Ξ΄)) t) ∧ + (βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), Ξ² s ∈ Metric.closedBall w (a : ℝ)) := by + classical + set K_pl : NNReal := max 1 L with hK_pl_def + set r_pl : NNReal := a / 2 with hr_pl_def + set L_pl : NNReal := V_max + a + M with hL_pl_def + have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha + have h_denom_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by positivity + have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := hΞ΄_le + let tβ‚€ : Set.Icc t_start (t_start + Ξ΄) := + ⟨t_start, Set.mem_Icc.mpr ⟨le_refl _, by linarith⟩⟩ + have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ w a r_pl L_pl K_pl := by + refine ⟨?_, ?_, ?_, ?_⟩ + Β· intro t _ + exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith + Β· intro x _ + apply Continuous.continuousOn + simp only [vlasovVectorField] + exact Continuous.prodMk continuous_const (hρ_cont x.1).neg + Β· intro t ht x hx + have h_norm_field := vlasovVectorField_norm_le gradW ρ t x + have hdist_le : dist x w ≀ (a : ℝ) := hx + have hdist_le_norm : β€–x - wβ€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le + have h_x2_proj : β€–x.2 - w.2β€– ≀ β€–x - wβ€– := by + rw [Prod.norm_def]; exact le_max_right _ _ + have h_x2_bound : β€–x.2β€– ≀ β€–w.2β€– + (a : ℝ) := by + have h1 : β€–x.2β€– = β€–(x.2 - w.2) + w.2β€– := by rw [sub_add_cancel] + have h2 : β€–(x.2 - w.2) + w.2β€– ≀ β€–x.2 - w.2β€– + β€–w.2β€– := norm_add_le _ _ + linarith [h_x2_proj, hdist_le_norm] + have h_x1_proj : dist x.1 w.1 ≀ dist x w := by + simp only [Prod.dist_eq]; exact le_max_left _ _ + have h_x1_ball : x.1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2) := by + rw [Metric.mem_closedBall] + have hx1d : dist x.1 w.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le + have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real + linarith + have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := + hbound t ht x.1 h_x1_ball + have h_Lpl_eq : (L_pl : ℝ) = (V_max : ℝ) + (a : ℝ) + (M : ℝ) := by + simp [hL_pl_def, NNReal.coe_add] + have h_x2_bound' : β€–x.2β€– ≀ (V_max : ℝ) + (a : ℝ) := + le_trans h_x2_bound (by linarith [hV]) + calc β€–vlasovVectorField gradW ρ t xβ€– + ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field + _ ≀ (L_pl : ℝ) := by + rw [h_Lpl_eq] + apply max_le + Β· linarith [NNReal.coe_nonneg M, h_x2_bound'] + Β· linarith [norm_nonneg w.2, NNReal.coe_nonneg a, NNReal.coe_nonneg V_max] + Β· show (L_pl : ℝ) * max ((t_start + Ξ΄) - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - t_start) + ≀ (a : ℝ) - (r_pl : ℝ) + have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl + simp only [htβ‚€_eq, add_sub_cancel_left, sub_self, max_eq_left (le_of_lt hΞ΄_pos)] + have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by + simp [hr_pl_def, NNReal.coe_div]; ring + rw [h_a_minus_r] + have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg + have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] + have h_step : (L_pl : ℝ) * Ξ΄ ≀ (L_pl : ℝ) * + ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) := + mul_le_mul_of_nonneg_left hΞ΄_le_ratio h_Lpl_nn + have h_rewrite : (L_pl : ℝ) * ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) + = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by ring + have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by + rw [div_le_one h_denom_pos]; linarith + have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by + calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) + ≀ 1 * ((a : ℝ) / 2) := + mul_le_mul_of_nonneg_right h_frac_le h_a_nn + _ = (a : ℝ) / 2 := one_mul _ + linarith [h_step, h_rewrite β–Έ h_step, h_bound] + obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined + have hw_in_r : w ∈ Metric.closedBall w ((r_pl : ℝ)) := by + rw [Metric.mem_closedBall, dist_self] + exact r_pl.coe_nonneg + have hΞ±_w := hΞ± w hw_in_r + refine ⟨fun t => Ξ± w t, ?_, ?_, ?_, ?_⟩ + Β· have h_init : Ξ± w (tβ‚€ : ℝ) = w := hΞ±_w.1 + have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl + rw [htβ‚€_eq] at h_init + exact h_init + Β· intro t ht + have h_t_Icc : t ∈ Set.Icc t_start (t_start + Ξ΄) := + ⟨le_of_lt ht.1, le_of_lt ht.2⟩ + have h_dw := hΞ±_w.2.1 t h_t_Icc + have h_icc_nhds : Set.Icc t_start (t_start + Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 + have h_d : HasDerivAt (Ξ± w) (vlasovVectorField gradW ρ t (Ξ± w t)) t := + h_dw.hasDerivAt h_icc_nhds + refine ⟨?_, ?_⟩ + Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).1) + (vlasovVectorField gradW ρ t (Ξ± w t)).1 t := + (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).2) + (vlasovVectorField gradW ρ t (Ξ± w t)).2 t := + (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + Β· intro t ht + have h_dw := hΞ±_w.2.1 t ht + refine ⟨?_, ?_⟩ + Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).1) + (vlasovVectorField gradW ρ t (Ξ± w t)).1 + (Set.Icc t_start (t_start + Ξ΄)) t := + (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw + simpa [vlasovVectorField] using h_proj + Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).2) + (vlasovVectorField gradW ρ t (Ξ± w t)).2 + (Set.Icc t_start (t_start + Ξ΄)) t := + (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw + simpa [vlasovVectorField] using h_proj + Β· intro s hs + exact hΞ±_w.2.2 s hs + +/-- On the degenerate interval `Icc c c`, every function trivially has every +within-derivative at `c` (the point is not an accumulation point of the +singleton). Serves the `T = 0` branch and the tiling base case of the tight +flow construction. -/ +private lemma hasDerivWithinAt_Icc_self {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] + (f : ℝ β†’ E) (v : E) (c : ℝ) : + HasDerivWithinAt f v (Set.Icc c c) c := by + have h_notAccPt : Β¬ AccPt c (Filter.principal (Set.Icc c c)) := by + rw [accPt_iff_clusterPt, Filter.inf_principal] + simp [ClusterPt, Set.Icc_self] + rw [hasDerivWithinAt_iff_hasFDerivWithinAt] + exact HasFDerivWithinAt.of_not_accPt h_notAccPt + +/-- Adaptive-window force bound for the tight tiling: on any window +`[c, c + Ξ΄] βŠ† [0, T]` whose entry position `p` satisfies the linear drift +invariant `β€–p - zβ‚€.1β€– ≀ a/2 + V_maxΒ·c`, the global `hbound` (radius `R` from +the tight `hR`) restricts to the moving ball `closedBall p (3a/2)`. -/ +private lemma charFlowTight_window_forceBound + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (zβ‚€ : PhaseSpace d) (a M V_max R : NNReal) (T : ℝ) (hT : 0 ≀ T) + (hV_max_def : V_max = β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T) + (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) + (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) + (c Ξ΄ : ℝ) (hc_nn : 0 ≀ c) (hc_le_T : c ≀ T) (hcΞ΄_le_T : c + Ξ΄ ≀ T) + (p : PhysSpace d) + (hp : β€–p - zβ‚€.1β€– ≀ (a : ℝ) / 2 + (V_max : ℝ) * c) : + βˆ€ t ∈ Set.Icc c (c + Ξ΄), βˆ€ x ∈ Metric.closedBall p (3 * (a : ℝ) / 2), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M := by + intro t ht x hx + have h_t_in_global : t ∈ Set.Icc (0 : ℝ) T := + ⟨le_trans hc_nn ht.1, le_trans ht.2 hcΞ΄_le_T⟩ + have h_x_local : dist x p ≀ 3 * (a : ℝ) / 2 := hx + have h_pos_chain : dist x zβ‚€.1 + ≀ 3 * (a : ℝ) / 2 + ((a : ℝ) / 2 + (V_max : ℝ) * c) := by + calc dist x zβ‚€.1 + ≀ dist x p + dist p zβ‚€.1 := dist_triangle _ _ _ + _ ≀ 3 * (a : ℝ) / 2 + _ := by + rw [dist_eq_norm] + exact add_le_add h_x_local hp + have h_V_max_coe : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T := by + have h_V_def : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (T.toNNReal : ℝ) := by + simp [hV_max_def, NNReal.coe_add, coe_nnnorm, NNReal.coe_mul, NNReal.coe_div] + rw [h_V_def, Real.coe_toNNReal _ hT] + have h_V_max_nn : (0 : ℝ) ≀ (V_max : ℝ) := V_max.coe_nonneg + have h_R_expand : 2 * (a : ℝ) + (V_max : ℝ) * T ≀ R := by + have h_ring : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T) * T + = 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 := by ring + rw [h_V_max_coe, h_ring]; exact hR + have h_x_in_R : dist x zβ‚€.1 ≀ (R : ℝ) := by + have h_pos_worst : (V_max : ℝ) * c ≀ (V_max : ℝ) * T := + mul_le_mul_of_nonneg_left hc_le_T h_V_max_nn + linarith [h_pos_chain] + exact hbound t h_t_in_global x h_x_in_R + +/-- Mean-value velocity carry along one window: if `Ξ²` solves the velocity ODE +on `[c, b]` with force bounded by `Mr`, then `β€–(Ξ² s).2β€–` grows at most linearly +from its entry value. Shared by the velocity- and position-invariant steps of +`charFlowTight_window_step`. -/ +private lemma charFlowTight_window_velocity_carry + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (Ξ² : ℝ β†’ PhaseSpace d) (c b : ℝ) (hcb : c ≀ b) (Mr : ℝ) + (h_vel : βˆ€ s ∈ Set.Icc c b, + HasDerivWithinAt (fun u => (Ξ² u).2) + (-(convolveFunctionMeasure gradW (ρ s) (Ξ² s).1)) (Set.Icc c b) s) + (h_force : βˆ€ s ∈ Set.Icc c b, + β€–convolveFunctionMeasure gradW (ρ s) (Ξ² s).1β€– ≀ Mr) : + βˆ€ s ∈ Set.Icc c b, β€–(Ξ² s).2β€– ≀ β€–(Ξ² c).2β€– + Mr * (s - c) := by + intro s hs + have h_convex : Convex ℝ (Set.Icc c b) := convex_Icc _ _ + have h_c_in : c ∈ Set.Icc c b := ⟨le_refl _, hcb⟩ + have h_force_neg : βˆ€ u ∈ Set.Icc c b, + β€–-(convolveFunctionMeasure gradW (ρ u) (Ξ² u).1)β€– ≀ Mr := by + intro u hu; rw [norm_neg]; exact h_force u hu + have h_mv : β€–(Ξ² s).2 - (Ξ² c).2β€– ≀ Mr * β€–s - cβ€– := + h_convex.norm_image_sub_le_of_norm_hasDerivWithin_le h_vel h_force_neg h_c_in hs + have h_diff_nn : 0 ≀ s - c := by linarith [hs.1] + rw [Real.norm_of_nonneg h_diff_nn] at h_mv + have h_triangle : β€–(Ξ² s).2β€– ≀ β€–(Ξ² s).2 - (Ξ² c).2β€– + β€–(Ξ² c).2β€– := by + have h_decomp : (Ξ² s).2 = ((Ξ² s).2 - (Ξ² c).2) + (Ξ² c).2 := + (sub_add_cancel _ _).symm + calc β€–(Ξ² s).2β€– = β€–((Ξ² s).2 - (Ξ² c).2) + (Ξ² c).2β€– := by rw [← h_decomp] + _ ≀ _ := norm_add_le _ _ + linarith + +/-- Gluing step for the tight tiling: the `Set.piecewise (Set.Iic c)` splice of +a left solution on `[0, c]` and a right solution on `[c, b]` (agreeing at the +join) solves the characteristic ODE system on all of `[0, b]`, via +`HasDerivWithinAt.union` on `Icc 0 c βˆͺ Icc c b = Icc 0 b`. -/ +private lemma charFlowTight_piecewise_ode + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (Ξ³L Ξ² : ℝ β†’ PhaseSpace d) + (c b : ℝ) (hc_nn : 0 ≀ c) (hcb : c ≀ b) + (h_join : Ξ² c = Ξ³L c) + (h_ode_L : βˆ€ t ∈ Set.Icc (0 : ℝ) c, + HasDerivWithinAt (fun s => (Ξ³L s).1) (Ξ³L t).2 (Set.Icc (0 : ℝ) c) t ∧ + HasDerivWithinAt (fun s => (Ξ³L s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ³L t).1)) (Set.Icc (0 : ℝ) c) t) + (h_ode_R : βˆ€ t ∈ Set.Icc c b, + HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 (Set.Icc c b) t ∧ + HasDerivWithinAt (fun s => (Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) (Set.Icc c b) t) : + βˆ€ t ∈ Set.Icc (0 : ℝ) b, + HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).1) + (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 (Set.Icc (0 : ℝ) b) t ∧ + HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) + (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1)) (Set.Icc (0 : ℝ) b) t := by + classical + intro t ht + have h_left : βˆ€ y ≀ c, Set.piecewise (Set.Iic c) Ξ³L Ξ² y = Ξ³L y := fun y hy => + Set.piecewise_eq_of_mem _ _ _ hy + have h_right : βˆ€ y, c < y β†’ Set.piecewise (Set.Iic c) Ξ³L Ξ² y = Ξ² y := fun y hy => + Set.piecewise_eq_of_notMem _ _ _ (not_le.mpr hy) + have h_at_join : Set.piecewise (Set.Iic c) Ξ³L Ξ² c = Ξ³L c := h_left _ (le_refl _) + have h_on_right_Icc : βˆ€ y ∈ Set.Icc c b, + Set.piecewise (Set.Iic c) Ξ³L Ξ² y = Ξ² y := by + intro y hy + rcases eq_or_lt_of_le hy.1 with hy_eq | hy_lt + Β· rw [← hy_eq, h_at_join, h_join] + Β· exact h_right y hy_lt + have h_set_union : Set.Icc (0 : ℝ) c βˆͺ Set.Icc c b = Set.Icc (0 : ℝ) b := + Set.Icc_union_Icc_eq_Icc hc_nn hcb + have hA_pos : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).1) + (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 (Set.Icc (0 : ℝ) c) t := by + by_cases ht_left : t ≀ c + Β· have ht_in : t ∈ Set.Icc (0 : ℝ) c := ⟨ht.1, ht_left⟩ + have h_Ξ³L_pos := (h_ode_L t ht_in).1 + have h_deriv_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 = (Ξ³L t).2 := by + rw [h_left t ht_left] + rw [h_deriv_eq] + refine h_Ξ³L_pos.congr (fun y hy => ?_) ?_ + Β· rw [h_left y hy.2] + Β· rw [h_left t ht_left] + Β· rw [not_le] at ht_left + rw [hasDerivWithinAt_iff_hasFDerivWithinAt] + apply HasFDerivWithinAt.of_notMem_closure + rw [closure_Icc, Set.mem_Icc] + rintro ⟨_, _⟩; linarith + have hB_pos : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).1) + (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 (Set.Icc c b) t := by + by_cases ht_right : c ≀ t + Β· have ht_in : t ∈ Set.Icc c b := ⟨ht_right, ht.2⟩ + have h_Ξ²_pos := (h_ode_R t ht_in).1 + have h_deriv_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 = (Ξ² t).2 := by + rw [h_on_right_Icc t ht_in] + rw [h_deriv_eq] + refine h_Ξ²_pos.congr (fun y hy => ?_) ?_ + Β· rw [h_on_right_Icc y hy] + Β· rw [h_on_right_Icc t ht_in] + Β· rw [not_le] at ht_right + rw [hasDerivWithinAt_iff_hasFDerivWithinAt] + apply HasFDerivWithinAt.of_notMem_closure + rw [closure_Icc, Set.mem_Icc] + rintro ⟨_, _⟩; linarith + have hA_vel : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) + (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1)) (Set.Icc (0 : ℝ) c) t := by + by_cases ht_left : t ≀ c + Β· have ht_in : t ∈ Set.Icc (0 : ℝ) c := ⟨ht.1, ht_left⟩ + have h_Ξ³L_vel := (h_ode_L t ht_in).2 + have h_pos_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1 = (Ξ³L t).1 := by + rw [h_left t ht_left] + rw [h_pos_eq] + refine h_Ξ³L_vel.congr (fun y hy => ?_) ?_ + Β· rw [h_left y hy.2] + Β· rw [h_left t ht_left] + Β· rw [not_le] at ht_left + rw [hasDerivWithinAt_iff_hasFDerivWithinAt] + apply HasFDerivWithinAt.of_notMem_closure + rw [closure_Icc, Set.mem_Icc] + rintro ⟨_, _⟩; linarith + have hB_vel : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).2) + (-(convolveFunctionMeasure gradW (ρ t) + (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1)) (Set.Icc c b) t := by + by_cases ht_right : c ≀ t + Β· have ht_in : t ∈ Set.Icc c b := ⟨ht_right, ht.2⟩ + have h_Ξ²_vel := (h_ode_R t ht_in).2 + have h_pos_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1 = (Ξ² t).1 := by + rw [h_on_right_Icc t ht_in] + rw [h_pos_eq] + refine h_Ξ²_vel.congr (fun y hy => ?_) ?_ + Β· rw [h_on_right_Icc y hy] + Β· rw [h_on_right_Icc t ht_in] + Β· rw [not_le] at ht_right + rw [hasDerivWithinAt_iff_hasFDerivWithinAt] + apply HasFDerivWithinAt.of_notMem_closure + rw [closure_Icc, Set.mem_Icc] + rintro ⟨_, _⟩; linarith + constructor + Β· have h_union_pos := hA_pos.union hB_pos + rw [h_set_union] at h_union_pos + exact h_union_pos + Β· have h_union_vel := hA_vel.union hB_vel + rw [h_set_union] at h_union_vel + exact h_union_vel + +/-- One tiling step for the tight flow: extend a trajectory satisfying the +tight invariants on `[0, c]` to `[0, c + Ξ΄']` via +`exists_vlasov_extend_one_window_tight`, splicing with `Set.piecewise` +(`charFlowTight_piecewise_ode`) and carrying the linear velocity- and +position-drift invariants (`charFlowTight_window_velocity_carry` + +`vlasov_window_position_bound`). -/ +private lemma charFlowTight_window_step + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) + (M V_max R : NNReal) (T : ℝ) (hT : 0 ≀ T) + (hV_max_def : V_max = β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T) + (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) + (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) + (Ξ΄' : ℝ) (hΞ΄'_pos : 0 < Ξ΄') + (hΞ΄'_le_max : Ξ΄' ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) + (z : PhaseSpace d) (c : ℝ) (hc_nn : 0 ≀ c) (hcΞ΄_le_T : c + Ξ΄' ≀ T) + (Ξ³_k : ℝ β†’ PhaseSpace d) (h_Ξ³0 : Ξ³_k 0 = z) + (h_ode_k : βˆ€ t ∈ Set.Icc (0 : ℝ) c, + HasDerivWithinAt (fun s => (Ξ³_k s).1) (Ξ³_k t).2 (Set.Icc (0 : ℝ) c) t ∧ + HasDerivWithinAt (fun s => (Ξ³_k s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ³_k t).1)) (Set.Icc (0 : ℝ) c) t) + (h_vel_k : β€–(Ξ³_k c).2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * c) + (h_pos_k : β€–(Ξ³_k c).1 - zβ‚€.1β€– ≀ (a : ℝ) / 2 + (V_max : ℝ) * c) : + βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, Ξ³ 0 = z ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) (c + Ξ΄'), + HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 + (Set.Icc (0 : ℝ) (c + Ξ΄')) t ∧ + HasDerivWithinAt (fun s => (Ξ³ s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) + (Set.Icc (0 : ℝ) (c + Ξ΄')) t) ∧ + β€–(Ξ³ (c + Ξ΄')).2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (c + Ξ΄') ∧ + β€–(Ξ³ (c + Ξ΄')).1 - zβ‚€.1β€– ≀ (a : ℝ) / 2 + (V_max : ℝ) * (c + Ξ΄') := by + classical + have hc_lt_b : c < c + Ξ΄' := by linarith + have hc_le_T : c ≀ T := by linarith + have hM_nn : (0 : ℝ) ≀ (M : ℝ) := M.coe_nonneg + have h_V_max_coe : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T := by + have h_V_def : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (T.toNNReal : ℝ) := by + simp [hV_max_def, NNReal.coe_add, coe_nnnorm, NNReal.coe_mul, NNReal.coe_div] + rw [h_V_def, Real.coe_toNNReal _ hT] + have h_vel_Vmax : β€–(Ξ³_k c).2β€– ≀ (V_max : ℝ) := by + rw [h_V_max_coe] + calc β€–(Ξ³_k c).2β€– + ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * c := h_vel_k + _ ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T := by + linarith [mul_le_mul_of_nonneg_left hc_le_T hM_nn] + have hbound_local := charFlowTight_window_forceBound gradW ρ zβ‚€ a M V_max R T hT + hV_max_def hR hbound c Ξ΄' hc_nn hc_le_T hcΞ΄_le_T (Ξ³_k c).1 h_pos_k + obtain ⟨β, hΞ²_init, _hΞ²_ode_Ioo, hΞ²_ode_Icc, hΞ²_confined⟩ := + exists_vlasov_extend_one_window_tight gradW L hL ρ h_int hρ_cont + (Ξ³_k c) a ha M V_max h_vel_Vmax c Ξ΄' hΞ΄'_pos hΞ΄'_le_max hbound_local + have h_Ξ²_in_ball : βˆ€ s ∈ Set.Icc c (c + Ξ΄'), + (Ξ² s).1 ∈ Metric.closedBall (Ξ³_k c).1 (3 * (a : ℝ) / 2) := by + intro s hs + have h_phase : Ξ² s ∈ Metric.closedBall (Ξ³_k c) (a : ℝ) := hΞ²_confined s hs + rw [Metric.mem_closedBall] at h_phase ⊒ + have h_proj : dist (Ξ² s).1 (Ξ³_k c).1 ≀ dist (Ξ² s) (Ξ³_k c) := by + rw [Prod.dist_eq]; exact le_max_left _ _ + have h_a_nn : (0 : ℝ) ≀ (a : ℝ) := a.coe_nonneg + linarith + have h_force_window : βˆ€ s ∈ Set.Icc c (c + Ξ΄'), + β€–convolveFunctionMeasure gradW (ρ s) (Ξ² s).1β€– ≀ (M : ℝ) := fun s hs => + hbound_local s hs (Ξ² s).1 (h_Ξ²_in_ball s hs) + have h_vel_carry := charFlowTight_window_velocity_carry gradW ρ Ξ² c (c + Ξ΄') + (le_of_lt hc_lt_b) (M : ℝ) (fun s hs => (hΞ²_ode_Icc s hs).2) h_force_window + have h_Ξ²_c_vel : (Ξ² c).2 = (Ξ³_k c).2 := by rw [hΞ²_init] + have h_ode_pw := charFlowTight_piecewise_ode gradW ρ Ξ³_k Ξ² c (c + Ξ΄') hc_nn + (le_of_lt hc_lt_b) hΞ²_init h_ode_k hΞ²_ode_Icc + have h_right_end : Set.piecewise (Set.Iic c) Ξ³_k Ξ² (c + Ξ΄') = Ξ² (c + Ξ΄') := + Set.piecewise_eq_of_notMem _ _ _ (not_le.mpr hc_lt_b) + have h_left0 : Set.piecewise (Set.Iic c) Ξ³_k Ξ² 0 = Ξ³_k 0 := + Set.piecewise_eq_of_mem _ _ _ hc_nn + refine ⟨Set.piecewise (Set.Iic c) Ξ³_k Ξ², by rw [h_left0, h_Ξ³0], h_ode_pw, ?_, ?_⟩ + Β· -- Velocity invariant at the new endpoint, via the mean-value carry. + rw [h_right_end] + have h_carry_b := h_vel_carry (c + Ξ΄') ⟨le_of_lt hc_lt_b, le_refl _⟩ + rw [h_Ξ²_c_vel] at h_carry_b + have h_ring : (M : ℝ) * (c + Ξ΄' - c) = (M : ℝ) * Ξ΄' := by ring + rw [h_ring] at h_carry_b + calc β€–(Ξ² (c + Ξ΄')).2β€– + ≀ β€–(Ξ³_k c).2β€– + (M : ℝ) * Ξ΄' := h_carry_b + _ ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * c + (M : ℝ) * Ξ΄' := by linarith [h_vel_k] + _ = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (c + Ξ΄') := by ring + Β· -- Position invariant at the new endpoint, via the window position bound. + rw [h_right_end] + have h_window_vel_Vmax : βˆ€ s ∈ Set.Icc c (c + Ξ΄'), + β€–(Ξ² s).2β€– ≀ (V_max : ℝ) := by + intro s hs + have h_carry_s := h_vel_carry s hs + rw [h_Ξ²_c_vel] at h_carry_s + have h_s_le_T : s ≀ T := le_trans hs.2 hcΞ΄_le_T + have h_M_split : (M : ℝ) * (s - c) + (M : ℝ) * c = (M : ℝ) * s := by ring + have h_M_mono : (M : ℝ) * s ≀ (M : ℝ) * T := + mul_le_mul_of_nonneg_left h_s_le_T hM_nn + rw [h_V_max_coe] + linarith [h_carry_s, h_vel_k] + have h_pos_carry := + vlasov_window_position_bound gradW ρ (Ξ³_k c) c Ξ΄' hΞ΄'_pos + (V_max : ℝ) zβ‚€.1 ((a : ℝ) / 2 + (V_max : ℝ) * c) h_pos_k Ξ² hΞ²_init + (fun t ht => (hΞ²_ode_Icc t ht).1) h_window_vel_Vmax + calc β€–(Ξ² (c + Ξ΄')).1 - zβ‚€.1β€– + ≀ (a : ℝ) / 2 + (V_max : ℝ) * c + (V_max : ℝ) * Ξ΄' := h_pos_carry + _ = (a : ℝ) / 2 + (V_max : ℝ) * (c + Ξ΄') := by ring + +/-- Per-`z` trajectory for the tight flow: `N`-fold exact tiling of +`[0, NΒ·Ξ΄']` by windows of width `Ξ΄'`, by induction via +`charFlowTight_window_step`, carrying the tight velocity/position invariants +through the induction and discarding them at the end. -/ +private lemma charFlowTight_perZ_trajectory + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) + (M V_max R : NNReal) (T : ℝ) (hT : 0 ≀ T) + (hV_max_def : V_max = β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T) + (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) + (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) + (N : β„•) (Ξ΄' : ℝ) (hΞ΄'_pos : 0 < Ξ΄') + (hΞ΄'_le_max : Ξ΄' ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) + (hNΞ΄'_le_T : (N : ℝ) * Ξ΄' ≀ T) + (z : PhaseSpace d) (hz : z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2)) : + βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, + Ξ³ 0 = z ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄'), + HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 + (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t ∧ + HasDerivWithinAt (fun s => (Ξ³ s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) + (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t := by + suffices h_strong : βˆ€ k : β„•, k ≀ N β†’ βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, + Ξ³ 0 = z ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) ((k : ℝ) * Ξ΄'), + HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 + (Set.Icc (0 : ℝ) ((k : ℝ) * Ξ΄')) t ∧ + HasDerivWithinAt (fun s => (Ξ³ s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) + (Set.Icc (0 : ℝ) ((k : ℝ) * Ξ΄')) t) ∧ + β€–(Ξ³ ((k : ℝ) * Ξ΄')).2β€– ≀ + β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * ((k : ℝ) * Ξ΄') ∧ + β€–(Ξ³ ((k : ℝ) * Ξ΄')).1 - zβ‚€.1β€– ≀ + (a : ℝ) / 2 + (V_max : ℝ) * ((k : ℝ) * Ξ΄') by + obtain ⟨γ, hΞ³0, hode, _, _⟩ := h_strong N (le_refl N) + exact ⟨γ, hΞ³0, hode⟩ + intro k + induction k with + | zero => + intro _ + refine ⟨fun _ => z, rfl, ?_, ?_, ?_⟩ + Β· intro t ht + have ht_eq : t = 0 := le_antisymm (by simpa using ht.2) ht.1 + subst ht_eq + have h_set_eq : Set.Icc (0 : ℝ) (((0 : β„•) : ℝ) * Ξ΄') = Set.Icc (0 : ℝ) 0 := by + norm_num + rw [h_set_eq] + exact ⟨hasDerivWithinAt_Icc_self _ _ _, hasDerivWithinAt_Icc_self _ _ _⟩ + Β· have hdist : β€–z - zβ‚€β€– ≀ (a : ℝ) / 2 := by + rw [← dist_eq_norm]; exact hz + have h_z2_proj : β€–z.2 - zβ‚€.2β€– ≀ β€–z - zβ‚€β€– := by + rw [Prod.norm_def]; exact le_max_right _ _ + have h_z2_bound : β€–z.2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 := by + have h1 : β€–z.2β€– = β€–(z.2 - zβ‚€.2) + zβ‚€.2β€– := by rw [sub_add_cancel] + have h2 : β€–(z.2 - zβ‚€.2) + zβ‚€.2β€– ≀ β€–z.2 - zβ‚€.2β€– + β€–zβ‚€.2β€– := norm_add_le _ _ + linarith [h_z2_proj, hdist] + change β€–((fun _ => z) (((0 : β„•) : ℝ) * Ξ΄')).2β€– ≀ + β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (((0 : β„•) : ℝ) * Ξ΄') + simp only [Nat.cast_zero, zero_mul, mul_zero, add_zero] + linarith + Β· have hdist : β€–z - zβ‚€β€– ≀ (a : ℝ) / 2 := by + rw [← dist_eq_norm]; exact hz + have h_z1_proj : β€–z.1 - zβ‚€.1β€– ≀ β€–z - zβ‚€β€– := by + rw [Prod.norm_def]; exact le_max_left _ _ + change β€–((fun _ => z) (((0 : β„•) : ℝ) * Ξ΄')).1 - zβ‚€.1β€– ≀ + (a : ℝ) / 2 + (V_max : ℝ) * (((0 : β„•) : ℝ) * Ξ΄') + simp only [Nat.cast_zero, zero_mul, mul_zero, add_zero] + linarith + | succ k ih => + intro hk_succ_le_N + obtain ⟨γ_k, h_Ξ³0, h_ode_k, h_vel_k, h_pos_k⟩ := + ih (Nat.le_of_succ_le hk_succ_le_N) + have h_kΞ΄_nn : (0 : ℝ) ≀ (k : ℝ) * Ξ΄' := by positivity + have h_kΞ΄_succ_eq : (k : ℝ) * Ξ΄' + Ξ΄' = ((k + 1 : β„•) : ℝ) * Ξ΄' := by + push_cast; ring + have h_succ_kΞ΄_le_T : ((k + 1 : β„•) : ℝ) * Ξ΄' ≀ T := by + calc ((k + 1 : β„•) : ℝ) * Ξ΄' + ≀ (N : ℝ) * Ξ΄' := by + have h_cast : ((k + 1 : β„•) : ℝ) ≀ (N : ℝ) := by + exact_mod_cast hk_succ_le_N + exact mul_le_mul_of_nonneg_right h_cast (le_of_lt hΞ΄'_pos) + _ ≀ T := hNΞ΄'_le_T + obtain ⟨γ, hΞ³0, h_ode, h_vel, h_pos⟩ := + charFlowTight_window_step gradW L hL ρ h_int hρ_cont zβ‚€ a ha M V_max R T hT + hV_max_def hR hbound Ξ΄' hΞ΄'_pos hΞ΄'_le_max z ((k : ℝ) * Ξ΄') h_kΞ΄_nn + (by rw [h_kΞ΄_succ_eq]; exact h_succ_kΞ΄_le_T) Ξ³_k h_Ξ³0 h_ode_k h_vel_k h_pos_k + rw [← h_kΞ΄_succ_eq] + exact ⟨γ, hΞ³0, h_ode, h_vel, h_pos⟩ + +/-- **Tight global per-ball flow: `[0,T]` force-window, `TΒ²` smallness (no `+1`).** + +Tight form of `exists_vlasov_characteristicFlow`. By tiling `[0,T]` +EXACTLY (`N = ⌈T/Ξ΄_maxβŒ‰` windows of width `Ξ΄' = T/N ≀ Ξ΄_max`, so `NΒ·Ξ΄' = T`) and +calling `exists_vlasov_extend_one_window_tight` with the adaptive force-window +`[kΒ·Ξ΄', (k+1)Β·Ξ΄']`, the global force-bound is required only on `[0,T]` and the +position drift is `MΒ·TΒ²` (not `MΒ·(T+1)Β²`). Consumers' R-selection then needs only +`LΒ·TΒ² < 1`, satisfiable for any `L` (threshold `T < 1/√L`), dissolving the `L<1` +restriction. -/ +theorem exists_vlasov_characteristicFlow_tight + {d : β„•} + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (_hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) + (M : NNReal) (T : ℝ) (hT : 0 ≀ T) + (R : NNReal) + (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) + (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : + βˆƒ (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), + IsCharacteristicFlowOn gradW ρ charX charV + (Set.Ioo 0 T) (Metric.closedBall zβ‚€ ((a : ℝ) / 2)) ∧ + (βˆ€ z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2), + βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) + (Set.Icc (0 : ℝ) T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (ρ t) (charX t z))) + (Set.Icc (0 : ℝ) T) t) := by + classical + -- ============================================================ + -- Parameter setup (uniform across all windows and initial z). + -- TIGHT: V_max uses `T` (not `T+1`); EXACT tiling NΒ·Ξ΄' = T. + -- ============================================================ + set V_max : NNReal := + β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T with hV_max_def + have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha + have h_denom_pos : (0 : ℝ) < (((V_max + a + M : NNReal) : ℝ) + 1) := by positivity + set Ξ΄_max : ℝ := (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1) with hΞ΄_max_def + have hΞ΄_max_pos : (0 : ℝ) < Ξ΄_max := by rw [hΞ΄_max_def]; positivity + -- T = 0 edge case: the conclusion's intervals collapse. + rcases eq_or_lt_of_le hT with hT_eq | hT_pos + Β· -- T = 0: Ioo 0 0 = βˆ…, Icc 0 0 = {0}. Build the trivial flow Ξ³_func z s = z. + subst hT_eq + -- charX/charV constant in time, equal to z (resp. its components). + refine ⟨fun _ z => z.1, fun _ z => z.2, ⟨?_, ?_, ?_⟩, ?_⟩ + Β· intro z hz; exact ⟨rfl, rfl⟩ + Β· intro t ht z hz; exact absurd (lt_trans ht.1 ht.2) (lt_irrefl 0) + Β· intro t ht z hz; exact absurd (lt_trans ht.1 ht.2) (lt_irrefl 0) + Β· intro z hz t ht + have ht_eq : t = 0 := le_antisymm ht.2 ht.1 + subst ht_eq + exact ⟨hasDerivWithinAt_Icc_self _ _ _, hasDerivWithinAt_Icc_self _ _ _⟩ + Β· -- T > 0: EXACT tiling. + -- N := ⌈T/Ξ΄_maxβŒ‰β‚Š windows of width Ξ΄' = T/N ≀ Ξ΄_max, so NΒ·Ξ΄' = T. + set N : β„• := ⌈T / Ξ΄_maxβŒ‰β‚Š with hN_def + have hN_pos : 0 < N := by + rw [hN_def, Nat.ceil_pos] + positivity + have hN_real_pos : (0 : ℝ) < (N : ℝ) := by exact_mod_cast hN_pos + set Ξ΄' : ℝ := T / (N : ℝ) with hΞ΄'_def + have hΞ΄'_pos : (0 : ℝ) < Ξ΄' := by rw [hΞ΄'_def]; positivity + have hNΞ΄'_eq : (N : ℝ) * Ξ΄' = T := by + rw [hΞ΄'_def]; field_simp + -- Ξ΄' ≀ Ξ΄_max because N β‰₯ T/Ξ΄_max. + have hΞ΄'_le_max : Ξ΄' ≀ Ξ΄_max := by + have h_ceil : T / Ξ΄_max ≀ (N : ℝ) := Nat.le_ceil _ + rw [hΞ΄'_def, div_le_iffβ‚€ hN_real_pos] + calc T = (T / Ξ΄_max) * Ξ΄_max := by field_simp + _ ≀ (N : ℝ) * Ξ΄_max := + mul_le_mul_of_nonneg_right h_ceil (le_of_lt hΞ΄_max_pos) + _ = Ξ΄_max * (N : ℝ) := by ring + -- ============================================================ + -- Per-z induction: a curve solving the ODE on [0, NΒ·Ξ΄'] = [0, T]. + -- ============================================================ + have h_perZ : βˆ€ z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2), + βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, + Ξ³ 0 = z ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄'), + HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 + (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t ∧ + HasDerivWithinAt (fun s => (Ξ³ s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) + (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t := + fun z hz => + charFlowTight_perZ_trajectory gradW L hL ρ h_int hρ_cont zβ‚€ a ha M V_max R + T hT hV_max_def hR hbound N Ξ΄' hΞ΄'_pos + (by rw [← hΞ΄_max_def]; exact hΞ΄'_le_max) (le_of_eq hNΞ΄'_eq) z hz + -- ============================================================ + -- Bundle per-z curves into a joint flow via Classical.choose. + -- ============================================================ + let Ξ³_func : PhaseSpace d β†’ ℝ β†’ PhaseSpace d := fun z => + if hz : z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2) + then Classical.choose (h_perZ z hz) + else (fun _ => z) + have h_Icc_T_sub : Set.Icc (0 : ℝ) T βŠ† Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := + fun t ht => ⟨ht.1, le_trans ht.2 (le_of_eq hNΞ΄'_eq.symm)⟩ + have h_dw_on_big : + βˆ€ z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2), + βˆ€ t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄'), + HasDerivWithinAt (fun s => (Ξ³_func z s).1) (Ξ³_func z t).2 + (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t ∧ + HasDerivWithinAt (fun s => (Ξ³_func z s).2) + (-(convolveFunctionMeasure gradW (ρ t) (Ξ³_func z t).1)) + (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t := by + intro z hz t ht + have h_func_eq : Ξ³_func z = Classical.choose (h_perZ z hz) := by + simp only [Ξ³_func, dite_eq_left hz] + have h_ode := (Classical.choose_spec (h_perZ z hz)).2 + have h_pos_dw := (h_ode t ht).1 + have h_vel_dw := (h_ode t ht).2 + have h_eq_fun_pos : (fun s => (Ξ³_func z s).1) + = (fun s => ((Classical.choose (h_perZ z hz)) s).1) := by + funext s; rw [h_func_eq] + have h_eq_fun_vel : (fun s => (Ξ³_func z s).2) + = (fun s => ((Classical.choose (h_perZ z hz)) s).2) := by + funext s; rw [h_func_eq] + have h_eq_pt_vel : (Ξ³_func z t).2 = (Classical.choose (h_perZ z hz) t).2 := by + rw [h_func_eq] + have h_eq_pt_pos : (Ξ³_func z t).1 = (Classical.choose (h_perZ z hz) t).1 := by + rw [h_func_eq] + refine ⟨?_, ?_⟩ + Β· rw [h_eq_fun_pos, h_eq_pt_vel]; exact h_pos_dw + Β· rw [h_eq_fun_vel, h_eq_pt_pos]; exact h_vel_dw + refine ⟨fun t z => (Ξ³_func z t).1, fun t z => (Ξ³_func z t).2, + ⟨?_, ?_, ?_⟩, ?_⟩ + Β· intro z hz + have h_init : Classical.choose (h_perZ z hz) 0 = z := + (Classical.choose_spec (h_perZ z hz)).1 + have h_func_eq : Ξ³_func z = Classical.choose (h_perZ z hz) := by + simp only [Ξ³_func, dite_eq_left hz] + refine ⟨?_, ?_⟩ + Β· change (Ξ³_func z 0).1 = z.1 + rw [h_func_eq, h_init] + Β· change (Ξ³_func z 0).2 = z.2 + rw [h_func_eq, h_init] + Β· intro t ht z hz + have h_t_in : t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := by + refine ⟨le_of_lt ht.1, le_trans (le_of_lt ht.2) (le_of_eq hNΞ΄'_eq.symm)⟩ + have hT_lt_N : t < (N : ℝ) * Ξ΄' := lt_of_lt_of_le ht.2 (le_of_eq hNΞ΄'_eq.symm) + have h_icc_nhds : Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') ∈ nhds t := + Icc_mem_nhds ht.1 hT_lt_N + exact ((h_dw_on_big z hz t h_t_in).1).hasDerivAt h_icc_nhds + Β· intro t ht z hz + have h_t_in : t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := by + refine ⟨le_of_lt ht.1, le_trans (le_of_lt ht.2) (le_of_eq hNΞ΄'_eq.symm)⟩ + have hT_lt_N : t < (N : ℝ) * Ξ΄' := lt_of_lt_of_le ht.2 (le_of_eq hNΞ΄'_eq.symm) + have h_icc_nhds : Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') ∈ nhds t := + Icc_mem_nhds ht.1 hT_lt_N + exact ((h_dw_on_big z hz t h_t_in).2).hasDerivAt h_icc_nhds + Β· intro z hz t ht + have h_t_in_big : t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := + h_Icc_T_sub ht + obtain ⟨h_pos_big, h_vel_big⟩ := h_dw_on_big z hz t h_t_in_big + exact ⟨h_pos_big.mono h_Icc_T_sub, h_vel_big.mono h_Icc_T_sub⟩ + +/-- **Two-window** characteristic-flow existence. + +A flow on `Ioo 0 (2Ξ΄)` for some `Ξ΄ > 0` and initial conditions in +`closedBall zβ‚€ (a/2)`. Produces a strictly longer window than +`exists_vlasov_characteristicFlow_local` (which gave `Ioo 0 Ξ΄` with +the larger `Ξ΄ := (a/2)/(L_pl + 1)`); here we tighten the contraction +constraint to `L_pl Β· (2Ξ΄) ≀ a/2`, yielding the smaller +`Ξ΄ := (a/2)/(2Β·(L_pl + 1))` but covering a `2Ξ΄`-long interval. + +**Implementation note.** This is a single Picard call (the vendored +`_confined` wrapper) with +`tmax = 2Ξ΄`, not a literal "two-window stitch" via uniqueness on +overlapping windows. Mathematically the two are equivalent: a +single Picard with an extended `tmax` and tightened `Ξ΄` recovers the +same set of solutions that a two-window stitch would produce. The +genuine two-window stitch (per-z second Picard at varying centers +glued via `ODE_solution_unique`) becomes essential only when the +single-Picard contraction cannot be satisfied β€” i.e., when the total +time window needed exceeds the asymptotic threshold `β‰ˆ 1/2` regardless +of `a`. For the upcoming N-window induction follow-up, this single- +Picard extension is iterated, with each iteration using a per-z +center from the previous window's endpoint. -/ +theorem exists_vlasov_characteristicFlow_twoWindow + {d : β„•} + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (_hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) + (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) + (M : NNReal) + (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) (1 : ℝ), + βˆ€ x ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2), + β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : + βˆƒ (Ξ΄ : ℝ) (_ : 0 < Ξ΄) (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), + IsCharacteristicFlowOn gradW ρ charX charV + (Set.Ioo 0 (2 * Ξ΄)) (Metric.closedBall zβ‚€ ((a : ℝ) / 2)) := by + classical + -- IsPicardLindelof parameter choices. Same K_pl, r_pl, L_pl as `_local`; + -- only the time-step Ξ΄ is halved to fit the 2Ξ΄ contraction. + set K_pl : NNReal := max 1 L with hK_pl_def + set r_pl : NNReal := a / 2 with hr_pl_def + set L_pl : NNReal := β€–zβ‚€.2β€–β‚Š + a + M with hL_pl_def + -- Ξ΄ chosen so the doubled window 2Ξ΄ still satisfies L_pl Β· (2Ξ΄) ≀ a/2. + set Ξ΄ : ℝ := min (1 / 2) ((a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1))) with hΞ΄_def + have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha + have h_denom_pos : (0 : ℝ) < 2 * ((L_pl : ℝ) + 1) := by positivity + have h_ratio_pos : (0 : ℝ) < (a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)) := by positivity + have hΞ΄_pos : (0 : ℝ) < Ξ΄ := lt_min (by norm_num) h_ratio_pos + have hΞ΄_le_half : Ξ΄ ≀ 1 / 2 := min_le_left _ _ + have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)) := min_le_right _ _ + have h_2Ξ΄_pos : (0 : ℝ) < 2 * Ξ΄ := by linarith + have h_2Ξ΄_le_one : 2 * Ξ΄ ≀ 1 := by linarith + -- tβ‚€ ∈ Icc 0 (2Ξ΄). + let tβ‚€ : Set.Icc (0 : ℝ) (2 * Ξ΄) := + ⟨0, Set.mem_Icc.mpr ⟨le_refl 0, le_of_lt h_2Ξ΄_pos⟩⟩ + -- Assemble IsPicardLindelof on time window [0, 2Ξ΄]. + have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ zβ‚€ a r_pl L_pl K_pl := by + refine ⟨?_, ?_, ?_, ?_⟩ + Β· intro t _ + exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith + Β· intro x _ + apply Continuous.continuousOn + simp only [vlasovVectorField] + exact Continuous.prodMk continuous_const (hρ_cont x.1).neg + Β· -- norm_le β€” verbatim from `_local` (uses hbound on Icc 0 1, ball 3a/2). + intro t ht x hx + have h_norm_field := vlasovVectorField_norm_le gradW ρ t x + have hdist_le : dist x zβ‚€ ≀ (a : ℝ) := hx + have hdist_le_norm : β€–x - zβ‚€β€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le + have h_x2_proj : β€–x.2 - zβ‚€.2β€– ≀ β€–x - zβ‚€β€– := by + rw [Prod.norm_def]; exact le_max_right _ _ + have h_x2_bound : β€–x.2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) := by + have h1 : β€–x.2β€– = β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– := by rw [sub_add_cancel] + have h2 : β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– ≀ β€–x.2 - zβ‚€.2β€– + β€–zβ‚€.2β€– := norm_add_le _ _ + linarith [h_x2_proj, hdist_le_norm] + have h_x1_proj : dist x.1 zβ‚€.1 ≀ dist x zβ‚€ := by + simp only [Prod.dist_eq]; exact le_max_left _ _ + have h_x1_ball : x.1 ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2) := by + have hx1d : dist x.1 zβ‚€.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le + have : dist x.1 zβ‚€.1 ≀ 3 * (a : ℝ) / 2 := by + have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real + linarith + exact this + have h_t_Icc : t ∈ Set.Icc (0 : ℝ) 1 := + ⟨ht.1, le_trans ht.2 h_2Ξ΄_le_one⟩ + have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := + hbound t h_t_Icc x.1 h_x1_ball + have h_Lpl_eq : (L_pl : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) + (M : ℝ) := by + simp [hL_pl_def, NNReal.coe_add, coe_nnnorm] + calc β€–vlasovVectorField gradW ρ t xβ€– + ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field + _ ≀ (L_pl : ℝ) := by + rw [h_Lpl_eq] + apply max_le + Β· linarith [NNReal.coe_nonneg M] + Β· linarith [norm_nonneg zβ‚€.2, NNReal.coe_nonneg a] + Β· -- mul_max_le: L_pl Β· (2Ξ΄) ≀ a βˆ’ a/2 = a/2. Tighter constraint than `_local`. + show (L_pl : ℝ) * max (2 * Ξ΄ - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - 0) ≀ (a : ℝ) - (r_pl : ℝ) + have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl + simp only [htβ‚€_eq, sub_zero, sub_self, max_eq_left (le_of_lt h_2Ξ΄_pos)] + have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by + simp [hr_pl_def, NNReal.coe_div]; ring + rw [h_a_minus_r] + have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg + have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] + have h_step : (L_pl : ℝ) * (2 * Ξ΄) ≀ (L_pl : ℝ) * + (2 * ((a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)))) := by + apply mul_le_mul_of_nonneg_left _ h_Lpl_nn + linarith [hΞ΄_le_ratio] + have h_simp : (L_pl : ℝ) * + (2 * ((a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)))) + = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by + field_simp + have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by + have h_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by linarith + rw [div_le_one h_pos]; linarith + have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by + calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) + ≀ 1 * ((a : ℝ) / 2) := + mul_le_mul_of_nonneg_right h_frac_le h_a_nn + _ = (a : ℝ) / 2 := one_mul _ + linarith [h_step, h_simp β–Έ h_step, h_bound] + -- Invoke headline Picard-LindelΓΆf on the doubled window. + obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined + -- Define charX, charV by projection. + refine ⟨δ, hΞ΄_pos, fun t z => (Ξ± z t).1, fun t z => (Ξ± z t).2, ?_, ?_, ?_⟩ + Β· -- Initial condition. + intro z hz + have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by + have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] + rw [Metric.mem_closedBall] at hz ⊒ + rw [hreq]; exact hz + have h_init : Ξ± z (tβ‚€ : ℝ) = z := (hΞ± z hz_in_r).1 + have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl + rw [htβ‚€_eq] at h_init + refine ⟨?_, ?_⟩ + Β· change (Ξ± z 0).1 = z.1; rw [h_init] + Β· change (Ξ± z 0).2 = z.2; rw [h_init] + Β· -- Position ODE on Ioo 0 (2Ξ΄). + intro t ht z hz + have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by + have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] + rw [Metric.mem_closedBall] at hz ⊒; rw [hreq]; exact hz + have h_t_Icc : t ∈ Set.Icc (0 : ℝ) (2 * Ξ΄) := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ + have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc + have h_icc_nhds : Set.Icc (0 : ℝ) (2 * Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 + have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := + h_dw.hasDerivAt h_icc_nhds + have h_proj : HasDerivAt (fun s => (Ξ± z s).1) + (vlasovVectorField gradW ρ t (Ξ± z t)).1 t := + (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + Β· -- Velocity ODE on Ioo 0 (2Ξ΄). + intro t ht z hz + have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by + have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] + rw [Metric.mem_closedBall] at hz ⊒; rw [hreq]; exact hz + have h_t_Icc : t ∈ Set.Icc (0 : ℝ) (2 * Ξ΄) := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ + have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc + have h_icc_nhds : Set.Icc (0 : ℝ) (2 * Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 + have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := + h_dw.hasDerivAt h_icc_nhds + have h_proj : HasDerivAt (fun s => (Ξ± z s).2) + (vlasovVectorField gradW ρ t (Ξ± z t)).2 t := + (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d + simpa [vlasovVectorField] using h_proj + + +end Vlasov diff --git a/LeanPool/Vlasov/OT/CharacteristicFlow.lean b/LeanPool/Vlasov/OT/CharacteristicFlow.lean index ade83358bb..7d23bb5f4a 100644 --- a/LeanPool/Vlasov/OT/CharacteristicFlow.lean +++ b/LeanPool/Vlasov/OT/CharacteristicFlow.lean @@ -5,13 +5,10 @@ Authors: Joseph K. Miller -/ module -public import LeanPool.Vlasov.Basic -public import LeanPool.Vlasov.OT.Coupling -public import Mathlib.Analysis.ODE.Gronwall -import LeanPool.Vlasov.ForMathlib.PicardLindelof +public import LeanPool.Vlasov.OT.CharacteristicConstruction +import all LeanPool.Vlasov.OT.CharacteristicConstruction import Mathlib.Algebra.Order.Field.GeomSum import Mathlib.Analysis.Calculus.ParametricIntegral -import Mathlib.MeasureTheory.Integral.Prod /-! # Characteristic flow for the Vlasov ODE + Lagrangian-Eulerian equivalence @@ -53,1082 +50,24 @@ namespace Vlasov open MeasureTheory ENNReal -/-! ## Vlasov velocity field and its Lipschitz lemma -/ +-- Preserve existing private names when moving their proofs. +private alias charFlowTight_perZ_trajectory := + _root_.Vlasov.charFlowTight_perZ_trajectory -/-- The Vlasov phase-space vector field: -`b_t(x, v) := (v, βˆ’(βˆ‡W βˆ— ρ_t)(x))`. +private alias charFlowTight_piecewise_ode := + _root_.Vlasov.charFlowTight_piecewise_ode -Note that the first component is the identity in `v` (the position -ODE `x' = v`) and the second component is the mean-field force -`βˆ’βˆ‡W βˆ— ρ_t` evaluated at `x` (the velocity ODE `v' = βˆ’(βˆ‡W βˆ— ρ)(x)`). --/ -noncomputable def vlasovVectorField - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (t : ℝ) (z : PhaseSpace d) : PhaseSpace d := - (z.2, -(convolveFunctionMeasure gradW (ρ t) z.1)) - -/-- Position-side Lipschitz of the convolution `βˆ‡W βˆ— ρ`. -For `gradW` L-Lipschitz and `ρ` a probability measure with finite -first moment (which guarantees integrability of the kernel), the map -`x ↦ (βˆ‡W βˆ— ρ)(x)` is L-Lipschitz. - -Proof sketch: by `LipschitzWith.dist_le_mul` applied pointwise to -`gradW`, then integration over the probability measure `ρ`: - β€–βˆ« y, gradW(xβˆ’y) βˆ‚Ο βˆ’ ∫ y, gradW(x'βˆ’y) βˆ‚Οβ€– - = β€–βˆ« y, (gradW(xβˆ’y) βˆ’ gradW(x'βˆ’y)) βˆ‚Οβ€– - ≀ ∫ y, β€–gradW(xβˆ’y) βˆ’ gradW(x'βˆ’y)β€– βˆ‚Ο - ≀ ∫ y, L Β· β€–x βˆ’ x'β€– βˆ‚Ο - = L Β· β€–x βˆ’ x'β€– Β· ρ(univ) - = L Β· β€–x βˆ’ x'β€– (probability measure). - -The integrability hypotheses on `gradW(x βˆ’ Β·)` for two distinct `x`s -are needed for `integral_sub` and `norm_integral_le_integral_norm` -to fire. At the dobrushin call site these follow from finite first -moment of `ρ` + Lipschitz growth of `gradW`. -/ -lemma convolveFunctionMeasure_lipschitz_in_x - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] - (h_int : βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) ρ) : - LipschitzWith L (fun x => convolveFunctionMeasure gradW ρ x) := by - refine LipschitzWith.of_dist_le_mul (fun x x' => ?_) - unfold convolveFunctionMeasure - rw [dist_eq_norm, ← integral_sub (h_int x) (h_int x')] - -- Pointwise bound: β€–gradW(x βˆ’ y) βˆ’ gradW(x' βˆ’ y)β€– ≀ L Β· β€–x βˆ’ x'β€– - have h_pt : βˆ€ y, β€–gradW (x - y) - gradW (x' - y)β€– ≀ (L : ℝ) * β€–x - x'β€– := - fun y => by - have h_sub : (x - y) - (x' - y) = x - x' := by - rw [sub_sub_sub_cancel_right] - have := hL.dist_le_mul (x - y) (x' - y) - rw [dist_eq_norm, dist_eq_norm, h_sub] at this - exact this - -- Integrability of the pointwise bound function (a constant). - have h_bound_int : Integrable (fun _ : PhysSpace d => (L : ℝ) * β€–x - x'β€–) ρ := - integrable_const _ - -- Integrability of the norm of the difference, via mono'. - have h_norm_int : Integrable (fun y => β€–gradW (x - y) - gradW (x' - y)β€–) ρ := - Integrable.mono' h_bound_int ((h_int x).sub (h_int x')).norm.aestronglyMeasurable - (Filter.Eventually.of_forall fun y => by - rw [Real.norm_eq_abs, abs_of_nonneg (norm_nonneg _)] - exact h_pt y) - calc β€–βˆ« y, gradW (x - y) - gradW (x' - y) βˆ‚Οβ€– - ≀ ∫ y, β€–gradW (x - y) - gradW (x' - y)β€– βˆ‚Ο := - norm_integral_le_integral_norm _ - _ ≀ ∫ _, (L : ℝ) * β€–x - x'β€– βˆ‚Ο := - integral_mono_ae h_norm_int h_bound_int (Filter.Eventually.of_forall h_pt) - _ = (L : ℝ) * β€–x - x'β€– := by - simp [integral_const, measureReal_def, measure_univ] +private alias charFlowTight_window_forceBound := + _root_.Vlasov.charFlowTight_window_forceBound -/-! ## Flow distance growth bound (Gronwall on the characteristic ODE) +private alias charFlowTight_window_step := + _root_.Vlasov.charFlowTight_window_step -A standalone regularity theorem about `IsCharacteristicFlow`: solutions of -the characteristic ODE have at most linear growth in their initial condition, -with a constant depending on `T`, the Lipschitz constant of `gradW`, and a -uniform first-moment bound on the measure curve `ρ`. +private alias charFlowTight_window_velocity_carry := + _root_.Vlasov.charFlowTight_window_velocity_carry -Math content: Gronwall on the position-velocity pair, using - `β€–(βˆ‡W βˆ— ρ_t)(x)β€– ≀ β€–gradW 0β€– + L Β· (β€–xβ€– + βˆ«β€–yβ€–dρ_t)` -as the velocity-field bound. -/ - -/-- **`IsCharacteristicFlowOn`-flavored variant of `flow_distance_growth_bound`**. - -Same Gronwall growth bound, but for a flow specified by **boundary regularity -hypotheses** (`h_init`, `h_cont_Icc`, `h_deriv_Ico`) instead of the universal-in-`t` -ODE of `IsCharacteristicFlow`. This matches what -`exists_vlasov_characteristicFlow_global_smallT` produces (modulo deriving the -boundary regularity from `IsCharacteristicFlowOn`'s `Ioo 0 T` ODE clauses), and -mirrors the hypothesis-passing pattern of `charFlow_measurable_via_gronwall`. - -**Used by**: `Phi_step` to derive the per-`z` growth bound -(`PhiAsVlasovMeasureCurve`'s `h_growth` hypothesis); window uniqueness is a -natural secondary consumer. - -The global `flow_distance_growth_bound` follows by supplying its initial -condition, continuity and derivative statements as boundary regularity. - -**Metric-dependence note**: -This bound uses the unbounded position difference `β€–X^M(t,z) - X^{M'}(t,z)β€–`, -which forces Gronwall and produces exponential-in-`T` constants -`C_T β‰ˆ exp((1+L)Β·T)`. The `Wbar = W_{min(|x-y|,1)}` analog (Dobrushin 1979, Β§5) -uses the bounded-and-Lipschitz absorption - `|B_ΞΌ(x) - B_{ΞΌ'}(x)| ≀ max(2β€–Bβ€–_∞, C_B) Β· min(|x₁-xβ‚‚|, 1)` -and produces *linear-in-`T`* constants (Dobrushin 1979, eq. 5.7), changing this -output shape from `C_T Β· (β€–zβ€– + 1)` to a bounded analog. -/ -theorem flow_distance_growth_bound_on - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT : 0 ≀ T) - -- Boundary regularity, replacing IsCharacteristicFlow's universal ODE. - (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) - (h_cont_Icc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) - (h_deriv_Ico : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, - HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) - (Set.Ici s) s) - -- ρ regularity, identical to flow_distance_growth_bound's hypotheses. - (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) - (hM_ρ : βˆ€ t ∈ Set.Icc 0 T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ M_ρ) - (h_y_int : βˆ€ t ∈ Set.Icc 0 T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) : - βˆƒ C_T, 0 ≀ C_T ∧ - βˆ€ t ∈ Set.Icc 0 T, βˆ€ z : PhaseSpace d, - β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1) := by - -- Gronwall parameters: K = 1 + L, Ξ΅β‚€ = β€–gradW 0β€– + L * M_ρ. - set K := 1 + (L : ℝ) with hK_def - set Ξ΅β‚€ := β€–gradW 0β€– + (L : ℝ) * M_ρ with hΞ΅β‚€_def - have hK_pos : 0 < K := by positivity - have hΞ΅β‚€_nn : 0 ≀ Ξ΅β‚€ := by positivity - -- Witness: C_T = gronwallBound 1 K Ξ΅β‚€ T. - use gronwallBound 1 K Ξ΅β‚€ T - refine ⟨?_, ?_⟩ - Β· have hmono := gronwallBound_mono (by norm_num : (0 : ℝ) ≀ 1) hΞ΅β‚€_nn hK_pos.le hT - linarith [gronwallBound_x0 1 K Ξ΅β‚€] - Β· intro t ht z - -- Convolution bound: β€–(βˆ‡W βˆ— ρ_t)(x)β€– ≀ Ξ΅β‚€ + L * β€–xβ€–. - have h_conv_bound : βˆ€ s ∈ Set.Icc 0 T, βˆ€ x : PhysSpace d, - β€–convolveFunctionMeasure gradW (ρ s) xβ€– ≀ Ξ΅β‚€ + (L : ℝ) * β€–xβ€– := by - intro s hs x - unfold convolveFunctionMeasure - have h_sub_int : Integrable (fun y => β€–x - yβ€–) (ρ s) := - Integrable.mono' ((integrable_const β€–xβ€–).add (h_y_int s hs)) - ((aestronglyMeasurable_const (b := x)).sub aestronglyMeasurable_id |>.norm) - (Filter.Eventually.of_forall fun y => by - simp only [Real.norm_of_nonneg (norm_nonneg _)] - exact norm_sub_le x y) - have h_bnd_int : Integrable (fun y => β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) (ρ s) := - (integrable_const _).add (h_sub_int.const_mul _) - have h_pt : βˆ€ y : PhysSpace d, - β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€– := by - intro y - have hd := hL.dist_le_mul (x - y) 0 - simp only [dist_eq_norm, sub_zero] at hd - have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by - have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this - linarith - linarith - calc β€–βˆ« y, gradW (x - y) βˆ‚(ρ s)β€– - ≀ ∫ y, β€–gradW (x - y)β€– βˆ‚(ρ s) := norm_integral_le_integral_norm _ - _ ≀ ∫ y, (β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) βˆ‚(ρ s) := - integral_mono (h_int s x).norm h_bnd_int h_pt - _ = β€–gradW 0β€– + (L : ℝ) * ∫ y, β€–x - yβ€– βˆ‚(ρ s) := by - rw [integral_add (integrable_const _) (h_sub_int.const_mul _)] - simp [integral_const, measureReal_def, measure_univ, integral_const_mul] - _ ≀ β€–gradW 0β€– + (L : ℝ) * (β€–xβ€– + M_ρ) := by - have hint_bd : ∫ y, β€–x - yβ€– βˆ‚(ρ s) ≀ β€–xβ€– + M_ρ := by - calc ∫ y, β€–x - yβ€– βˆ‚(ρ s) - ≀ ∫ y, (β€–xβ€– + β€–yβ€–) βˆ‚(ρ s) := - integral_mono h_sub_int - ((integrable_const _).add (h_y_int s hs)) - (fun y => norm_sub_le x y) - _ = β€–xβ€– + ∫ y, β€–yβ€– βˆ‚(ρ s) := by - rw [integral_add (integrable_const _) (h_y_int s hs)] - simp [integral_const, measureReal_def, measure_univ] - _ ≀ β€–xβ€– + M_ρ := by linarith [hM_ρ s hs] - have := mul_le_mul_of_nonneg_left hint_bd L.coe_nonneg - linarith - _ = Ξ΅β‚€ + (L : ℝ) * β€–xβ€– := by - simp only [hΞ΅β‚€_def]; ring - -- Gronwall step. Boundary regularity comes from hypotheses, not from - -- IsCharacteristicFlow. - have h_f_cont : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc 0 T) := - h_cont_Icc z - have h_deriv : βˆ€ s ∈ Set.Ico 0 T, - HasDerivWithinAt (fun s => (charX s z, charV s z)) - (charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z)) - (Set.Ici s) s := by - intro s hs - have hderiv := h_deriv_Ico z s hs - -- vlasovVectorField gradW ρ s (charX s z, charV s z) = (charV s z, -conv ...) - unfold vlasovVectorField at hderiv - exact hderiv - have h_init_norm : β€–(charX 0 z, charV 0 z)β€– ≀ β€–zβ€– := by - rw [h_init z] - have h_bound : βˆ€ s ∈ Set.Ico 0 T, - β€–(charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z))β€– ≀ - K * β€–(charX s z, charV s z)β€– + Ξ΅β‚€ := by - intro s hs - have hs_mem : s ∈ Set.Icc 0 T := ⟨hs.1, le_of_lt hs.2⟩ - simp only [Prod.norm_def, norm_neg] - have hFsz := le_max_left β€–charX s zβ€– β€–charV s zβ€– - have hGsz := le_max_right β€–charX s zβ€– β€–charV s zβ€– - have hM_nn : 0 ≀ max β€–charX s zβ€– β€–charV s zβ€– := - le_max_iff.mpr (Or.inl (norm_nonneg _)) - have h_v_le : β€–charV s zβ€– ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := - calc β€–charV s zβ€– ≀ max β€–charX s zβ€– β€–charV s zβ€– := hGsz - _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– := - le_mul_of_one_le_left hM_nn (by linarith [NNReal.coe_nonneg L]) - _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := le_add_of_nonneg_right hΞ΅β‚€_nn - have h_conv_le : β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– ≀ - K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := - calc β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– - ≀ Ξ΅β‚€ + (L : ℝ) * β€–charX s zβ€– := h_conv_bound s hs_mem _ - _ ≀ Ξ΅β‚€ + K * max β€–charX s zβ€– β€–charV s zβ€– := by - have hLK : (L : ℝ) ≀ K := le_add_of_nonneg_left zero_le_one - linarith [mul_le_mul_of_nonneg_left hFsz (NNReal.coe_nonneg L), - mul_le_mul_of_nonneg_right hLK hM_nn] - _ = K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅β‚€ := by ring - exact max_le h_v_le h_conv_le - have h_grw := norm_le_gronwallBound_of_norm_deriv_right_le - h_f_cont h_deriv h_init_norm h_bound t ht - simp only [sub_zero] at h_grw - calc β€–(charX t z, charV t z)β€– - ≀ gronwallBound β€–zβ€– K Ξ΅β‚€ t := h_grw - _ ≀ gronwallBound β€–zβ€– K Ξ΅β‚€ T := - gronwallBound_mono (norm_nonneg _) hΞ΅β‚€_nn hK_pos.le ht.2 - _ ≀ gronwallBound 1 K Ξ΅β‚€ T * (β€–zβ€– + 1) := by - rw [gronwallBound_of_K_ne_0 hK_pos.ne', gronwallBound_of_K_ne_0 hK_pos.ne'] - simp only [one_mul] - have he1 : 0 ≀ Real.exp (K * T) - 1 := - by linarith [Real.one_le_exp (mul_nonneg hK_pos.le hT)] - have hΞ΅K := div_nonneg hΞ΅β‚€_nn hK_pos.le - nlinarith [norm_nonneg z, Real.exp_nonneg (K * T), - mul_nonneg hΞ΅K he1, mul_nonneg (norm_nonneg z) (mul_nonneg hΞ΅K he1)] - -/-- **Flow distance growth bound** (`L`-Lipschitz `gradW`, uniform first moment -on `ρ`). Solutions of the characteristic ODE grow at most linearly in their -initial condition: `β€–(charX t z, charV t z)β€– ≀ C_T Β· (β€–zβ€– + 1)` for some -`C_T` depending only on `T`, `L`, `β€–gradW 0β€–`, and the uniform first-moment -bound `M_ρ`. -/ -theorem flow_distance_growth_bound - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hflow : IsCharacteristicFlow gradW ρ charX charV) - (T : ℝ) (hT : 0 ≀ T) - (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) - (hM_ρ : βˆ€ t ∈ Set.Icc 0 T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ M_ρ) - (h_y_int : βˆ€ t ∈ Set.Icc 0 T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) : - βˆƒ C_T, 0 ≀ C_T ∧ - βˆ€ t ∈ Set.Icc 0 T, βˆ€ z : PhaseSpace d, - β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1) := by - obtain ⟨hflow_init, hflow_x, hflow_v⟩ := hflow - refine flow_distance_growth_bound_on gradW L hL ρ charX charV T hT - (fun z => Prod.ext (hflow_init z).1 (hflow_init z).2) ?_ ?_ - M_ρ hM_ρ_nn hM_ρ h_y_int h_int - Β· intro z - exact continuousOn_of_forall_continuousAt fun s _ => - (hflow_x s z).continuousAt.prodMk (hflow_v s z).continuousAt - Β· intro z s _ - exact ((hflow_x s z).prodMk (hflow_v s z)).hasDerivWithinAt - -/-- **Two-flow difference Gronwall bound** β€” the reusable core of the -integrated Dobrushin coupling bound. The distance between two trajectories -`Ξ¦_f Β· z₁`, `Ξ¦_g Β· zβ‚‚` of flows generated by fields `b_f, b_g` (`b_f` -`L`-Lipschitz in space) grows by Gronwall: if the field difference *at the -second trajectory* is bounded by `Ξ΅` on `[0, T]` and the initial separation by -`Ξ΄`, then `β€–Ξ¦_f t z₁ - Ξ¦_g t zβ‚‚β€– ≀ gronwallBound Ξ΄ L Ξ΅ t`. - -Mirrors `flow_distance_growth_bound`'s Gronwall structure -(`norm_le_gronwallBound_of_norm_deriv_right_le`) but for the *difference* of two -flows. In the integrated-bound application, `z₁ = Ο‰.1`, `zβ‚‚ = Ο‰.2` range over a -coupling `Ο€β‚€` of `(f 0, g 0)`, `Ξ΅ = (L : ℝ) * (wasserstein1 (f s) (g s)).toReal` -(the self-coupling diff-bound, uniform in the trajectory), and integrating this -pointwise bound over `Ο€β‚€` against the pushforward bound gives the Dobrushin -estimate `W₁(f t, g t) ≀ … Β· W₁(f 0, g 0)`. -/ -theorem flow_difference_growth_bound - {Ξ± : Type*} [NormedAddCommGroup Ξ±] [NormedSpace ℝ Ξ±] - (b_f b_g : ℝ β†’ Ξ± β†’ Ξ±) (L : NNReal) (hL_f : βˆ€ t, LipschitzWith L (b_f t)) - (Ξ¦_f Ξ¦_g : ℝ β†’ Ξ± β†’ Ξ±) (z₁ zβ‚‚ : Ξ±) - (T : ℝ) - (hcont_f : ContinuousOn (fun s => Ξ¦_f s z₁) (Set.Icc 0 T)) - (hcont_g : ContinuousOn (fun s => Ξ¦_g s zβ‚‚) (Set.Icc 0 T)) - (hΞ¦_f : βˆ€ s ∈ Set.Ico 0 T, - HasDerivWithinAt (fun u => Ξ¦_f u z₁) (b_f s (Ξ¦_f s z₁)) (Set.Ici s) s) - (hΞ¦_g : βˆ€ s ∈ Set.Ico 0 T, - HasDerivWithinAt (fun u => Ξ¦_g u zβ‚‚) (b_g s (Ξ¦_g s zβ‚‚)) (Set.Ici s) s) - (Ξ΄ Ξ΅ : ℝ) (h_init : β€–Ξ¦_f 0 z₁ - Ξ¦_g 0 zβ‚‚β€– ≀ Ξ΄) - (h_diff : βˆ€ s ∈ Set.Icc 0 T, - β€–b_f s (Ξ¦_g s zβ‚‚) - b_g s (Ξ¦_g s zβ‚‚)β€– ≀ Ξ΅) : - βˆ€ t ∈ Set.Icc 0 T, - β€–Ξ¦_f t z₁ - Ξ¦_g t zβ‚‚β€– ≀ gronwallBound Ξ΄ (L : ℝ) Ξ΅ t := by - have hcont : ContinuousOn (fun s => Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚) (Set.Icc 0 T) := - hcont_f.sub hcont_g - have hderiv : βˆ€ s ∈ Set.Ico 0 T, - HasDerivWithinAt (fun u => Ξ¦_f u z₁ - Ξ¦_g u zβ‚‚) - (b_f s (Ξ¦_f s z₁) - b_g s (Ξ¦_g s zβ‚‚)) (Set.Ici s) s := - fun s hs => (hΞ¦_f s hs).sub (hΞ¦_g s hs) - have hbound : βˆ€ s ∈ Set.Ico 0 T, - β€–b_f s (Ξ¦_f s z₁) - b_g s (Ξ¦_g s zβ‚‚)β€– ≀ - (L : ℝ) * β€–Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚β€– + Ξ΅ := by - intro s hs - have hs_icc : s ∈ Set.Icc 0 T := ⟨hs.1, hs.2.le⟩ - have h_lip : β€–b_f s (Ξ¦_f s z₁) - b_f s (Ξ¦_g s zβ‚‚)β€– ≀ - (L : ℝ) * β€–Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚β€– := by - have := (hL_f s).dist_le_mul (Ξ¦_f s z₁) (Ξ¦_g s zβ‚‚) - rwa [dist_eq_norm, dist_eq_norm] at this - calc β€–b_f s (Ξ¦_f s z₁) - b_g s (Ξ¦_g s zβ‚‚)β€– - = β€–(b_f s (Ξ¦_f s z₁) - b_f s (Ξ¦_g s zβ‚‚)) + - (b_f s (Ξ¦_g s zβ‚‚) - b_g s (Ξ¦_g s zβ‚‚))β€– := by congr 1; abel - _ ≀ β€–b_f s (Ξ¦_f s z₁) - b_f s (Ξ¦_g s zβ‚‚)β€– + - β€–b_f s (Ξ¦_g s zβ‚‚) - b_g s (Ξ¦_g s zβ‚‚)β€– := norm_add_le _ _ - _ ≀ (L : ℝ) * β€–Ξ¦_f s z₁ - Ξ¦_g s zβ‚‚β€– + Ξ΅ := - add_le_add h_lip (h_diff s hs_icc) - intro t ht - have hg := norm_le_gronwallBound_of_norm_deriv_right_le hcont hderiv h_init hbound t ht - simpa using hg - -/-- **Per-trajectory mild (integral-form) difference bound.** -Mild-form companion to `flow_difference_growth_bound`: -the raw integral inequality -`β€–Ξ³_f t βˆ’ Ξ³_g tβ€– ≀ β€–Ξ³_f 0 βˆ’ Ξ³_g 0β€– + βˆ«β‚€α΅— (Lβ€–Ξ³_f s βˆ’ Ξ³_g sβ€– + Ξ΅ s) ds`, -keeping the forcing `Ξ΅ s` *inside* the integral. After integrating this over -the base measure, the self-reference `Ξ΅ s = LΒ·W₁(f s,g s) ≀ LΒ·Q(s)` is resolved -by `gronwall_mild_le` β€” avoiding the constant-`Ξ΅` smallness that -`flow_difference_growth_bound`'s closed form would force (and the blocked -windowing that smallness needs). -/ -theorem flow_difference_mild_bound - {Ξ± : Type*} [NormedAddCommGroup Ξ±] [NormedSpace ℝ Ξ±] [CompleteSpace Ξ±] - (b_f b_g : ℝ β†’ Ξ± β†’ Ξ±) (L : NNReal) (hL_f : βˆ€ t, LipschitzWith L (b_f t)) - (Ξ³_f Ξ³_g : ℝ β†’ Ξ±) (T : ℝ) - (hcont_f : ContinuousOn Ξ³_f (Set.Icc 0 T)) - (hcont_g : ContinuousOn Ξ³_g (Set.Icc 0 T)) - (hderiv_f : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt Ξ³_f (b_f s (Ξ³_f s)) (Set.Ioi s) s) - (hderiv_g : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt Ξ³_g (b_g s (Ξ³_g s)) (Set.Ioi s) s) - (hint : IntervalIntegrable (fun s => b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) - MeasureTheory.volume 0 T) - (Ξ΅ : ℝ β†’ ℝ) (hΞ΅_int : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 T) - (h_diff : βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–b_f s (Ξ³_g s) - b_g s (Ξ³_g s)β€– ≀ Ξ΅ s) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, - β€–Ξ³_f t - Ξ³_g tβ€– ≀ β€–Ξ³_f 0 - Ξ³_g 0β€– + - ∫ s in (0 : ℝ)..t, ((L : ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) := by - intro t ht - have h0t : (0 : ℝ) ≀ t := ht.1 - have htT : t ≀ T := ht.2 - have hIcc_sub : Set.Icc (0 : ℝ) t βŠ† Set.Icc 0 T := Set.Icc_subset_Icc_right htT - have hcont_diff : ContinuousOn (fun s => Ξ³_f s - Ξ³_g s) (Set.Icc 0 t) := - (hcont_f.mono hIcc_sub).sub (hcont_g.mono hIcc_sub) - have hderiv_diff : βˆ€ s ∈ Set.Ioo (0 : ℝ) t, - HasDerivWithinAt (fun s => Ξ³_f s - Ξ³_g s) - (b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) (Set.Ioi s) s := by - intro s hs - have hs' : s ∈ Set.Ioo (0 : ℝ) T := ⟨hs.1, hs.2.trans_le htT⟩ - exact (hderiv_f s hs').sub (hderiv_g s hs') - have hint_t : IntervalIntegrable (fun s => b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) - MeasureTheory.volume 0 t := - hint.mono_set (by - rw [Set.uIcc_of_le h0t, Set.uIcc_of_le (h0t.trans htT)]; exact hIcc_sub) - have hftc := intervalIntegral.integral_eq_sub_of_hasDeriv_right_of_le h0t hcont_diff - hderiv_diff hint_t - have hsplit : βˆ€ s ∈ Set.Icc (0 : ℝ) t, - β€–b_f s (Ξ³_f s) - b_g s (Ξ³_g s)β€– ≀ (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s := by - intro s hs - have hsT : s ∈ Set.Icc (0 : ℝ) T := hIcc_sub hs - have h_lip : β€–b_f s (Ξ³_f s) - b_f s (Ξ³_g s)β€– ≀ (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– := by - have := (hL_f s).dist_le_mul (Ξ³_f s) (Ξ³_g s) - rwa [dist_eq_norm, dist_eq_norm] at this - calc β€–b_f s (Ξ³_f s) - b_g s (Ξ³_g s)β€– - = β€–(b_f s (Ξ³_f s) - b_f s (Ξ³_g s)) + (b_f s (Ξ³_g s) - b_g s (Ξ³_g s))β€– := by - congr 1; abel - _ ≀ β€–b_f s (Ξ³_f s) - b_f s (Ξ³_g s)β€– + β€–b_f s (Ξ³_g s) - b_g s (Ξ³_g s)β€– := - norm_add_le _ _ - _ ≀ (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s := add_le_add h_lip (h_diff s hsT) - have hci : IntervalIntegrable (fun s => (L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) - MeasureTheory.volume 0 t := by - refine IntervalIntegrable.add (IntervalIntegrable.const_mul ?_ (L:ℝ)) - (hΞ΅_int.mono_set (by - rw [Set.uIcc_of_le h0t, Set.uIcc_of_le (h0t.trans htT)]; exact hIcc_sub)) - refine ContinuousOn.intervalIntegrable ?_ - rw [Set.uIcc_of_le h0t]; exact hcont_diff.norm - have hnorm_le : β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– ≀ - ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) := by - calc β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– - ≀ ∫ s in (0 : ℝ)..t, β€–b_f s (Ξ³_f s) - b_g s (Ξ³_g s)β€– := - intervalIntegral.norm_integral_le_integral_norm h0t - _ ≀ ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–Ξ³_f s - Ξ³_g sβ€– + Ξ΅ s) := - intervalIntegral.integral_mono_on h0t hint_t.norm hci hsplit - have ha_le : β€–Ξ³_f t - Ξ³_g tβ€– ≀ β€–Ξ³_f 0 - Ξ³_g 0β€– + - β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– := by - have heq : (Ξ³_f t - Ξ³_g t) - (Ξ³_f 0 - Ξ³_g 0) = - ∫ s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s)) := hftc.symm - calc β€–Ξ³_f t - Ξ³_g tβ€– - = β€–(Ξ³_f 0 - Ξ³_g 0) + ((Ξ³_f t - Ξ³_g t) - (Ξ³_f 0 - Ξ³_g 0))β€– := by congr 1; abel - _ ≀ β€–Ξ³_f 0 - Ξ³_g 0β€– + β€–(Ξ³_f t - Ξ³_g t) - (Ξ³_f 0 - Ξ³_g 0)β€– := norm_add_le _ _ - _ = β€–Ξ³_f 0 - Ξ³_g 0β€– + β€–βˆ« s in (0 : ℝ)..t, (b_f s (Ξ³_f s) - b_g s (Ξ³_g s))β€– := by - rw [heq] - linarith [ha_le, hnorm_le] - -/-- **Integrate a per-trajectory mild bound over the base measure (Tonelli step).** -Given a base probability measure `Ο€` on `Ξ©` and a family `w : ℝ β†’ Ξ© β†’ Ξ±`, if each -trajectory satisfies the mild bound `β€–w t Ο‰β€– ≀ β€–w 0 Ο‰β€– + βˆ«β‚€α΅— (Lβ€–w s Ο‰β€– + Ξ΅ s) ds`, -then the integrated quantity `Q t := ∫ β€–w t Ο‰β€– βˆ‚Ο€` satisfies -`Q t ≀ Q 0 + βˆ«β‚€α΅— (L Β· Q s + Ξ΅ s) ds`. The `βˆ«β‚€α΅— Lβ€–w s Ο‰β€–` term swaps via Tonelli. -/ -theorem integral_mild_bound - {Ξ© Ξ± : Type*} [MeasurableSpace Ξ©] [NormedAddCommGroup Ξ±] - [MeasurableSpace Ξ±] [BorelSpace Ξ±] - (Ο€ : Measure Ξ©) [IsProbabilityMeasure Ο€] - (w : ℝ β†’ Ξ© β†’ Ξ±) (L : ℝ) (hL : 0 ≀ L) (Ξ΅ : ℝ β†’ ℝ) (T : ℝ) (hT : 0 ≀ T) - -- joint-measurability inputs (CarathΓ©odory: continuous-in-time + measurable-in-Ο‰) - (hw_cont : βˆ€ Ο‰, Continuous (fun s => w s Ο‰)) - (hw_meas : βˆ€ s, Measurable (w s)) - -- domination: β€–w s Ο‰β€– ≀ dom Ο‰ uniformly on [0,T], dom integrable - (dom : Ξ© β†’ ℝ) (hdom_int : Integrable dom Ο€) - (hdom : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ Ο‰, β€–w s Ο‰β€– ≀ dom Ο‰) - (hΞ΅_int : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 T) - (hΞ΅_nn : βˆ€ s ∈ Set.Icc (0 : ℝ) T, 0 ≀ Ξ΅ s) - -- the per-trajectory mild bound (e.g. from flow_difference_mild_bound) - (hper : βˆ€ Ο‰, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - β€–w t Ο‰β€– ≀ β€–w 0 Ο‰β€– + ∫ s in (0 : ℝ)..t, (L * β€–w s Ο‰β€– + Ξ΅ s)) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (∫ Ο‰, β€–w t Ο‰β€– βˆ‚Ο€) ≀ (∫ Ο‰, β€–w 0 Ο‰β€– βˆ‚Ο€) + - ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by - -- joint measurability of `(s, Ο‰) ↦ w s Ο‰` and of its norm - have hjoint : Measurable (Function.uncurry w) := - measurable_uncurry_of_continuous_of_measurable hw_cont hw_meas - have hjoint_norm : Measurable (fun p : ℝ Γ— Ξ© => β€–w p.1 p.2β€–) := hjoint.norm - -- abbreviation Q s := ∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€ - set Q : ℝ β†’ ℝ := fun s => ∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€ with hQ - intro t ht - have h0t : (0 : ℝ) ≀ t := ht.1 - have htT : t ≀ T := ht.2 - have hIcc_sub : Set.Icc (0 : ℝ) t βŠ† Set.Icc 0 T := Set.Icc_subset_Icc_right htT - -- `w 0 Β·` and `w t Β·` are integrable over Ο€ (dominated by `dom`) - have h0_mem : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T := ⟨le_refl 0, hT⟩ - have ht_mem : t ∈ Set.Icc (0 : ℝ) T := ht - have hint0 : Integrable (fun Ο‰ => β€–w 0 Ο‰β€–) Ο€ := by - refine hdom_int.mono' ((hw_meas 0).norm.aestronglyMeasurable) ?_ - filter_upwards with Ο‰ - rw [Real.norm_of_nonneg (norm_nonneg _)] - exact hdom 0 h0_mem Ο‰ - have hintt : Integrable (fun Ο‰ => β€–w t Ο‰β€–) Ο€ := by - refine hdom_int.mono' ((hw_meas t).norm.aestronglyMeasurable) ?_ - filter_upwards with Ο‰ - rw [Real.norm_of_nonneg (norm_nonneg _)] - exact hdom t ht_mem Ο‰ - -- the inner integrand `g s Ο‰ := L * β€–w s Ο‰β€– + Ξ΅ s` - set g : ℝ β†’ Ξ© β†’ ℝ := fun s Ο‰ => L * β€–w s Ο‰β€– + Ξ΅ s with hg - -- product measure for the Tonelli swap - -- `volume.restrict (Set.uIoc 0 t)` is a finite measure (`uIoc 0 t = Ioc 0 t`) - have huIoc : Set.uIoc (0 : ℝ) t = Set.Ioc 0 t := Set.uIoc_of_le h0t - have hvol_lt : MeasureTheory.volume (Set.uIoc (0 : ℝ) t) < ⊀ := by - rw [huIoc, Real.volume_Ioc]; exact ENNReal.ofReal_lt_top - have hfin_restrict : IsFiniteMeasure (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := by - refine ⟨?_⟩ - rw [Measure.restrict_apply_univ]; exact hvol_lt - -- `Ξ΅` is integrable over `volume.restrict (uIoc 0 t)` - have hΞ΅_int_t : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 t := - hΞ΅_int.mono_set (by - rw [Set.uIcc_of_le h0t, Set.uIcc_of_le hT]; exact Set.Icc_subset_Icc_right htT) - have hΞ΅_intOn : Integrable Ξ΅ (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := - hΞ΅_int_t.def' - -- AEStronglyMeasurability of `uncurry g` over the product measure - have hg_aesm : AEStronglyMeasurable (Function.uncurry g) - ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := by - have h1 : AEStronglyMeasurable (fun p : ℝ Γ— Ξ© => L * β€–w p.1 p.2β€–) - ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := - (measurable_const.mul hjoint_norm).aestronglyMeasurable - have h2 : AEStronglyMeasurable (fun p : ℝ Γ— Ξ© => Ξ΅ p.1) - ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := - hΞ΅_intOn.aestronglyMeasurable.comp_fst - exact h1.add h2 - -- product integrability of `uncurry g`, via the dominator `LΒ·dom(Ο‰) + Ξ΅(s)` - have hdom_prod : Integrable (fun p : ℝ Γ— Ξ© => L * dom p.2 + Ξ΅ p.1) - ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := - ((hdom_int.const_mul L).comp_snd - (MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t))).add (hΞ΅_intOn.comp_fst Ο€) - have hae_fst : βˆ€α΅ p : ℝ Γ— Ξ© - βˆ‚((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€), p.1 ∈ Set.uIoc (0 : ℝ) t := - (MeasureTheory.Measure.quasiMeasurePreserving_fst).tendsto_ae.eventually - (MeasureTheory.ae_restrict_mem measurableSet_uIoc) - have hg_int : Integrable (Function.uncurry g) - ((MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)).prod Ο€) := by - refine hdom_prod.mono' hg_aesm ?_ - filter_upwards [hae_fst] with p hp - have hp_icc : p.1 ∈ Set.Icc (0 : ℝ) T := by - rw [huIoc] at hp; exact ⟨le_of_lt hp.1, hp.2.trans htT⟩ - have hwle : β€–w p.1 p.2β€– ≀ dom p.2 := hdom p.1 hp_icc p.2 - have hΞ΅nn : 0 ≀ Ξ΅ p.1 := hΞ΅_nn p.1 hp_icc - have hg_nn : 0 ≀ L * β€–w p.1 p.2β€– + Ξ΅ p.1 := - add_nonneg (mul_nonneg hL (norm_nonneg _)) hΞ΅nn - change β€–L * β€–w p.1 p.2β€– + Ξ΅ p.1β€– ≀ L * dom p.2 + Ξ΅ p.1 - rw [Real.norm_of_nonneg hg_nn] - nlinarith [mul_le_mul_of_nonneg_left hwle hL] - -- inner intervalIntegral = integral against the restricted measure - have hconv : βˆ€ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) - = ∫ s, g s Ο‰ βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := by - intro Ο‰ - rw [intervalIntegral.integral_of_le h0t, ← huIoc] - -- marginal integrability `Ο‰ ↦ ∫ s, g s Ο‰` - have hmarg : Integrable - (fun Ο‰ => ∫ s, g s Ο‰ βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t))) Ο€ := - hg_int.integral_prod_right - have hinner_int : Integrable (fun Ο‰ => ∫ s in (0 : ℝ)..t, g s Ο‰) Ο€ := by - simpa only [hconv] using hmarg - -- per-`s` identity ∫ Ο‰, g s Ο‰ βˆ‚Ο€ = L Β· (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s - have hg_int_s : βˆ€ s ∈ Set.Icc (0 : ℝ) T, Integrable (fun Ο‰ => β€–w s Ο‰β€–) Ο€ := by - intro s hs - refine hdom_int.mono' ((hw_meas s).norm.aestronglyMeasurable) ?_ - filter_upwards with Ο‰ - rw [Real.norm_of_nonneg (norm_nonneg _)]; exact hdom s hs Ο‰ - have hQg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - (∫ Ο‰, g s Ο‰ βˆ‚Ο€) = L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s := by - intro s hs - simp only [hg] - rw [integral_add ((hg_int_s s hs).const_mul L) (integrable_const _), integral_const_mul] - congr 1 - simp [integral_const, measureReal_def, measure_univ] - -- the double integral, via Tonelli - have hdouble : (∫ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€) - = ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by - calc (∫ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€) - = ∫ Ο‰, (∫ s, g s Ο‰ βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t))) βˆ‚Ο€ := by - simp only [hconv] - _ = ∫ s, (∫ Ο‰, g s Ο‰ βˆ‚Ο€) βˆ‚(MeasureTheory.volume.restrict (Set.uIoc (0 : ℝ) t)) := - (MeasureTheory.integral_integral_swap hg_int).symm - _ = ∫ s in (0 : ℝ)..t, (∫ Ο‰, g s Ο‰ βˆ‚Ο€) := by - rw [huIoc, ← intervalIntegral.integral_of_le h0t] - _ = ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by - refine intervalIntegral.integral_congr (fun s hs => ?_) - rw [Set.uIcc_of_le h0t] at hs - exact hQg s ⟨hs.1, hs.2.trans htT⟩ - -- assemble - calc (∫ Ο‰, β€–w t Ο‰β€– βˆ‚Ο€) - ≀ ∫ Ο‰, (β€–w 0 Ο‰β€– + ∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€ := - integral_mono hintt (hint0.add hinner_int) (fun Ο‰ => hper Ο‰ t ht) - _ = (∫ Ο‰, β€–w 0 Ο‰β€– βˆ‚Ο€) + ∫ Ο‰, (∫ s in (0 : ℝ)..t, g s Ο‰) βˆ‚Ο€ := - integral_add hint0 hinner_int - _ = (∫ Ο‰, β€–w 0 Ο‰β€– βˆ‚Ο€) + ∫ s in (0 : ℝ)..t, (L * (∫ Ο‰, β€–w s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := by - rw [hdouble] - -/-- **Integrated coupling-Gronwall bound** (base-measure generic). - -Given a base probability measure `Ο€` on `Ξ©` and two parameter-families of -trajectories `X_f, X_g : ℝ β†’ Ξ© β†’ Ξ±` solving ODEs with `L`-Lipschitz vector fields -`b_f, b_g` on `[0, T]`, with a cross-field bound `β€–b_f s y - b_g s yβ€– ≀ Ξ΅ s` whose -amplitude `Ξ΅ s` is **self-referentially** controlled by the integrated trajectory -distance `Q s := ∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€` (i.e. `Ξ΅ s ≀ L Β· Q s`), the -integrated distance obeys the closed Gronwall bound -`Q t ≀ Q 0 Β· exp (2 L t)` on `[0, T]`. - -**Composition** (the collapse pipeline): -* per-`Ο‰`, `flow_difference_mild_bound` gives the mild integral inequality - `β€–X_f t Ο‰ - X_g t Ο‰β€– ≀ β€–X_f 0 Ο‰ - X_g 0 Ο‰β€– + βˆ«β‚€α΅— (Lβ€–X_f s Ο‰ - X_g s Ο‰β€– + Ξ΅ s)`; -* `integral_mild_bound` integrates this over `Ο€` (Tonelli on a nonnegative - integrand), yielding `Q t ≀ Q 0 + βˆ«β‚€α΅— (LΒ·Q s + Ξ΅ s)`; -* the self-reference `Ξ΅ s ≀ LΒ·Q s` collapses the integrand to `2 L Β· Q s`; -* `gronwall_mild_le` (scalar mild Gronwall) closes to `Q 0 Β· exp (2 L t)`. - -**Clamp bridge**: `integral_mild_bound` and the DCT continuity of `Q` -require *global*-in-`s` continuity, but the flow regularity is only on the -window `[0, T]`. We work with the clamped flow `s ↦ X_f (clamp s) Ο‰` (globally -continuous, agreeing with `X_f` on `[0, T]`), apply the window machinery to it, -and transfer back on `[0, T]` where `clamp = id` via integrand congruence. - -**Base-measure genericity**: `Ο€` is abstract, so this serves both the -uniqueness call site (`Ο€ = f 0`, `Q 0 = 0`, Foundation-B-free) and the -mean-field call site (`Ο€` an optimal coupling, `Q 0 = W₁(f 0, g 0)`). -/ -theorem integrated_coupling_gronwall_bound - {Ξ© Ξ± : Type*} [MeasurableSpace Ξ©] - [NormedAddCommGroup Ξ±] [NormedSpace ℝ Ξ±] [CompleteSpace Ξ±] - [MeasurableSpace Ξ±] [BorelSpace Ξ±] [MeasurableSubβ‚‚ Ξ±] - (Ο€ : Measure Ξ©) [IsProbabilityMeasure Ο€] - (X_f X_g : ℝ β†’ Ξ© β†’ Ξ±) (b_f b_g : ℝ β†’ Ξ± β†’ Ξ±) (L : NNReal) (T : ℝ) (hT : 0 ≀ T) - (hL_f : βˆ€ t, LipschitzWith L (b_f t)) - -- per-`Ο‰` flow regularity (matches `flow_difference_mild_bound`) - (hcont_f : βˆ€ Ο‰, ContinuousOn (fun s => X_f s Ο‰) (Set.Icc 0 T)) - (hcont_g : βˆ€ Ο‰, ContinuousOn (fun s => X_g s Ο‰) (Set.Icc 0 T)) - (hderiv_f : βˆ€ Ο‰, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt (fun s => X_f s Ο‰) (b_f s (X_f s Ο‰)) (Set.Ioi s) s) - (hderiv_g : βˆ€ Ο‰, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt (fun s => X_g s Ο‰) (b_g s (X_g s Ο‰)) (Set.Ioi s) s) - (hint : βˆ€ Ο‰, IntervalIntegrable - (fun s => b_f s (X_f s Ο‰) - b_g s (X_g s Ο‰)) MeasureTheory.volume 0 T) - -- measurability + domination for the Tonelli / DCT - (hmeas_f : βˆ€ s, Measurable (X_f s)) (hmeas_g : βˆ€ s, Measurable (X_g s)) - (dom : Ξ© β†’ ℝ) (hdom_int : Integrable dom Ο€) - (hdom : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– ≀ dom Ο‰) - -- the cross-field bound `Ξ΅` and its self-reference to `Q` - (Ξ΅ : ℝ β†’ ℝ) (hΞ΅_int : IntervalIntegrable Ξ΅ MeasureTheory.volume 0 T) - (hΞ΅_nn : βˆ€ s ∈ Set.Icc (0 : ℝ) T, 0 ≀ Ξ΅ s) - (h_diff : βˆ€ Ο‰, βˆ€ s ∈ Set.Icc (0 : ℝ) T, - β€–b_f s (X_g s Ο‰) - b_g s (X_g s Ο‰)β€– ≀ Ξ΅ s) - (h_self : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - Ξ΅ s ≀ (L : ℝ) * ∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (∫ Ο‰, β€–X_f t Ο‰ - X_g t Ο‰β€– βˆ‚Ο€) ≀ - (∫ Ο‰, β€–X_f 0 Ο‰ - X_g 0 Ο‰β€– βˆ‚Ο€) * Real.exp (2 * (L:ℝ) * t) := by - -- clamp into `[0, T]` (opaque; used only through its three properties) - obtain ⟨clamp, hclamp_cont, hclamp_mem, hclamp_id⟩ : - βˆƒ clamp : ℝ β†’ ℝ, Continuous clamp ∧ (βˆ€ s, clamp s ∈ Set.Icc (0 : ℝ) T) ∧ - (βˆ€ s ∈ Set.Icc (0 : ℝ) T, clamp s = s) := by - refine ⟨fun s => max 0 (min s T), ?_, ?_, ?_⟩ - Β· exact continuous_const.max (continuous_id.min continuous_const) - Β· intro s; exact ⟨le_max_left _ _, max_le hT (min_le_right _ _)⟩ - Β· intro s hs; change max 0 (min s T) = s - rw [min_eq_left hs.2, max_eq_right hs.1] - -- the clamped difference flow `W s Ο‰ = X_f (clamp s) Ο‰ - X_g (clamp s) Ο‰` - set W : ℝ β†’ Ξ© β†’ Ξ± := fun s Ο‰ => X_f (clamp s) Ο‰ - X_g (clamp s) Ο‰ with hW_def - have hW_cont : βˆ€ Ο‰, Continuous (fun s => W s Ο‰) := by - intro Ο‰; simp only [hW_def] - exact ((hcont_f Ο‰).sub (hcont_g Ο‰)).comp_continuous hclamp_cont hclamp_mem - have hW_meas : βˆ€ s, Measurable (W s) := by - intro s; simp only [hW_def] - exact (hmeas_f (clamp s)).sub (hmeas_g (clamp s)) - have hW_dom : βˆ€ s, βˆ€ Ο‰, β€–W s Ο‰β€– ≀ dom Ο‰ := by - intro s Ο‰; simp only [hW_def]; exact hdom (clamp s) (hclamp_mem s) Ο‰ - -- on `[0, T]`, `W` agrees with the unclamped difference, so the integrals agree - have hQW_eq : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) = ∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€ := by - intro s hs - apply integral_congr_ae - filter_upwards with Ο‰ - simp only [hW_def, hclamp_id s hs] - -- per-`Ο‰` mild bound (unclamped) via `flow_difference_mild_bound` - have hper_w : βˆ€ Ο‰, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - β€–X_f t Ο‰ - X_g t Ο‰β€– ≀ β€–X_f 0 Ο‰ - X_g 0 Ο‰β€– + - ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–X_f s Ο‰ - X_g s Ο‰β€– + Ξ΅ s) := fun Ο‰ => - flow_difference_mild_bound b_f b_g L hL_f (fun s => X_f s Ο‰) (fun s => X_g s Ο‰) T - (hcont_f Ο‰) (hcont_g Ο‰) (hderiv_f Ο‰) (hderiv_g Ο‰) (hint Ο‰) Ξ΅ hΞ΅_int (h_diff Ο‰) - -- transfer the mild bound to the clamped flow `W` (needed by `integral_mild_bound`) - have hper_W : βˆ€ Ο‰, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - β€–W t Ο‰β€– ≀ β€–W 0 Ο‰β€– + ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–W s Ο‰β€– + Ξ΅ s) := by - intro Ο‰ t ht - have h0t : (0 : ℝ) ≀ t := ht.1 - have hWt : W t Ο‰ = X_f t Ο‰ - X_g t Ο‰ := by simp only [hW_def, hclamp_id t ht] - have hW0 : W 0 Ο‰ = X_f 0 Ο‰ - X_g 0 Ο‰ := by - simp only [hW_def, hclamp_id 0 ⟨le_refl 0, hT⟩] - have hintegrand : (∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–W s Ο‰β€– + Ξ΅ s)) - = ∫ s in (0 : ℝ)..t, ((L:ℝ) * β€–X_f s Ο‰ - X_g s Ο‰β€– + Ξ΅ s) := by - refine intervalIntegral.integral_congr (fun s hs => ?_) - rw [Set.uIcc_of_le h0t] at hs - have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨hs.1, hs.2.trans ht.2⟩ - simp only [hW_def, hclamp_id s hsT] - rw [hWt, hW0, hintegrand]; exact hper_w Ο‰ t ht - -- integrate over `Ο€` (Tonelli): `Q t ≀ Q 0 + βˆ«β‚€α΅— (LΒ·Q s + Ξ΅ s)` - have hQW := integral_mild_bound Ο€ W (L:ℝ) (NNReal.coe_nonneg L) Ξ΅ T hT - hW_cont hW_meas dom hdom_int (fun s _ Ο‰ => hW_dom s Ο‰) hΞ΅_int hΞ΅_nn hper_W - -- `Q` is globally continuous via DCT (clamped flow globally dominated) - have hQW_cont : Continuous (fun s => ∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by - refine continuous_of_dominated - (fun s => (hW_meas s).norm.aestronglyMeasurable) - (fun s => Filter.Eventually.of_forall (fun Ο‰ => ?_)) hdom_int - (Filter.Eventually.of_forall (fun Ο‰ => (hW_cont Ο‰).norm)) - rw [Real.norm_of_nonneg (norm_nonneg _)]; exact hW_dom s Ο‰ - -- collapse the integrand to `2 L Β· Q s` using the self-reference - have hmild_W : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (∫ Ο‰, β€–W t Ο‰β€– βˆ‚Ο€) ≀ (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) - + (2 * (L:ℝ)) * ∫ s in (0 : ℝ)..t, (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by - intro t ht - have h0t : (0 : ℝ) ≀ t := ht.1 - have hstep := hQW t ht - have hII_lhs : IntervalIntegrable - (fun s => (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) MeasureTheory.volume 0 t := - ((hQW_cont.intervalIntegrable 0 t).const_mul (L:ℝ)).add - (hΞ΅_int.mono_set (by - rw [Set.uIcc_of_le h0t, Set.uIcc_of_le hT] - exact Set.Icc_subset_Icc_right ht.2)) - have hII_rhs : IntervalIntegrable - (fun s => (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€)) MeasureTheory.volume 0 t := - (hQW_cont.intervalIntegrable 0 t).const_mul (2 * (L:ℝ)) - have hmono : (∫ s in (0 : ℝ)..t, ((L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + Ξ΅ s)) - ≀ ∫ s in (0 : ℝ)..t, (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by - refine intervalIntegral.integral_mono_on h0t hII_lhs hII_rhs (fun s hs => ?_) - have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨hs.1, hs.2.trans ht.2⟩ - have hΞ΅le : Ξ΅ s ≀ (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by - calc Ξ΅ s ≀ (L:ℝ) * (∫ Ο‰, β€–X_f s Ο‰ - X_g s Ο‰β€– βˆ‚Ο€) := h_self s hsT - _ = (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by rw [hQW_eq s hsT] - have hring : (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) - = (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + (L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by ring - rw [hring]; linarith [hΞ΅le] - calc (∫ Ο‰, β€–W t Ο‰β€– βˆ‚Ο€) - ≀ (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) - + ∫ s in (0 : ℝ)..t, ((L:ℝ) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) + Ξ΅ s) := hstep - _ ≀ (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) - + ∫ s in (0 : ℝ)..t, (2 * (L:ℝ)) * (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by linarith [hmono] - _ = (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) - + (2 * (L:ℝ)) * ∫ s in (0 : ℝ)..t, (∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) := by - rw [intervalIntegral.integral_const_mul] - -- scalar mild Gronwall on `Q` - have hgron := gronwall_mild_le (fun s => ∫ Ο‰, β€–W s Ο‰β€– βˆ‚Ο€) - (∫ Ο‰, β€–W 0 Ο‰β€– βˆ‚Ο€) (2 * (L:ℝ)) T - (by have := NNReal.coe_nonneg L; linarith) - (integral_nonneg (fun Ο‰ => norm_nonneg _)) - hQW_cont (fun s => integral_nonneg (fun Ο‰ => norm_nonneg _)) hmild_W - -- transfer back to the unclamped difference on `[0, T]` - intro t ht - rw [← hQW_eq t ht, ← hQW_eq 0 ⟨le_refl 0, hT⟩] - exact hgron t ht - -/-- **Piece A (Option 2): time-dependent moment-envelope growth bound.** - -Sharper sibling of `flow_distance_growth_bound_on`. Instead of a single -constant moment bound `M_ρ` (which forces the constant-sup growth constant -`C_T` and, downstream, an `M_fβ‚€`-dependent fixed-point on the curve space), -this takes a **monotone time-dependent envelope** `m : ℝ β†’ ℝ` bounding the -spatial-marginal first moment, and concludes the **time-local** Gronwall bound - - `β€–(charX t z, charV t z)β€– ≀ gronwallBound β€–zβ€– (1+L) (β€–gradW 0β€– + L Β· m t) t`, - -with the force constant `Ξ΅(t) = β€–gradW 0β€– + L Β· m t` evaluated at the SAME time -`t` (not the sup `m T`). Monotonicity of `m` lets the per-`t` Gronwall on -`[0, t]` use the endpoint value `Ξ΅(t)` while validating the derivative bound at -every `s ≀ t` (since `Ξ΅(s) ≀ Ξ΅(t)`). - -**Why this is the option-2 foundation**: integrating the conclusion over a -probability `fβ‚€` gives `M_{Φρ}(t) ≀ A(t) + B(t)Β·m(t)` with -`A(t) = M_fβ‚€Β·e^{(1+L)t} + (β€–gradW 0β€–/(1+L))(e^{(1+L)t}-1)` and -`B(t) = (L/(1+L))(e^{(1+L)t}-1)` β€” crucially an **`M_fβ‚€`-free** coefficient. -The canonical envelope `m*(t) := A(t)/(1-B(T))` is then Ξ¦-invariant under the -**data-independent** constraint `B(T) < 1`, dissolving the constant-`M` -fixed-point without a data-dependent hypothesis. (Contrast the constant-sup -bound, which feeds `m(T)` into `Ξ΅` and re-derives an `M_fβ‚€`-dependent -smallness.) -/ -theorem flow_distance_growth_bound_on_timedep - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (_hT : 0 ≀ T) - (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) - (h_cont_Icc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) - (h_deriv_Ico : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, - HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) - (Set.Ici s) s) - (m : ℝ β†’ ℝ) (hm_mono : MonotoneOn m (Set.Icc 0 T)) - (hm : βˆ€ t ∈ Set.Icc 0 T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ m t) - (h_y_int : βˆ€ t ∈ Set.Icc 0 T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) : - βˆ€ t ∈ Set.Icc 0 T, βˆ€ z : PhaseSpace d, - β€–(charX t z, charV t z)β€– ≀ - gronwallBound β€–zβ€– (1 + (L : ℝ)) (β€–gradW 0β€– + (L : ℝ) * m t) t := by - intro t ht z - set K : ℝ := 1 + (L : ℝ) with hK_def - -- m t β‰₯ 0 (moment of a probability measure is nonneg, bounded by m t). - have hmt_nn : 0 ≀ m t := - le_trans (integral_nonneg (fun y => norm_nonneg y)) (hm t ht) - set Ξ΅t : ℝ := β€–gradW 0β€– + (L : ℝ) * m t with hΞ΅t_def - have hK_pos : 0 < K := by positivity - have hΞ΅t_nn : 0 ≀ Ξ΅t := by positivity - -- Convolution force bound on [0, t], using m s ≀ m t (monotone). - have h_conv_bound : βˆ€ s ∈ Set.Icc 0 t, βˆ€ x : PhysSpace d, - β€–convolveFunctionMeasure gradW (ρ s) xβ€– ≀ Ξ΅t + (L : ℝ) * β€–xβ€– := by - intro s hs x - have hs_T : s ∈ Set.Icc 0 T := ⟨hs.1, le_trans hs.2 ht.2⟩ - have hms_le_mt : m s ≀ m t := hm_mono hs_T ht hs.2 - unfold convolveFunctionMeasure - have h_sub_int : Integrable (fun y => β€–x - yβ€–) (ρ s) := - Integrable.mono' ((integrable_const β€–xβ€–).add (h_y_int s hs_T)) - ((aestronglyMeasurable_const (b := x)).sub aestronglyMeasurable_id |>.norm) - (Filter.Eventually.of_forall fun y => by - simp only [Real.norm_of_nonneg (norm_nonneg _)]; exact norm_sub_le x y) - have h_bnd_int : Integrable (fun y => β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) (ρ s) := - (integrable_const _).add (h_sub_int.const_mul _) - have h_pt : βˆ€ y : PhysSpace d, - β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€– := by - intro y - have hd := hL.dist_le_mul (x - y) 0 - simp only [dist_eq_norm, sub_zero] at hd - have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by - have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - linarith - calc β€–βˆ« y, gradW (x - y) βˆ‚(ρ s)β€– - ≀ ∫ y, β€–gradW (x - y)β€– βˆ‚(ρ s) := norm_integral_le_integral_norm _ - _ ≀ ∫ y, (β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) βˆ‚(ρ s) := - integral_mono (h_int s x).norm h_bnd_int h_pt - _ = β€–gradW 0β€– + (L : ℝ) * ∫ y, β€–x - yβ€– βˆ‚(ρ s) := by - rw [integral_add (integrable_const _) (h_sub_int.const_mul _)] - simp [integral_const, measureReal_def, measure_univ, integral_const_mul] - _ ≀ Ξ΅t + (L : ℝ) * β€–xβ€– := by - have h_int_le : ∫ y, β€–x - yβ€– βˆ‚(ρ s) ≀ β€–xβ€– + m t := by - calc ∫ y, β€–x - yβ€– βˆ‚(ρ s) - ≀ ∫ y, (β€–xβ€– + β€–yβ€–) βˆ‚(ρ s) := - integral_mono h_sub_int ((integrable_const _).add (h_y_int s hs_T)) - (fun y => norm_sub_le x y) - _ = β€–xβ€– + ∫ y, β€–yβ€– βˆ‚(ρ s) := by - rw [integral_add (integrable_const _) (h_y_int s hs_T)] - simp [integral_const, measureReal_def, measure_univ] - _ ≀ β€–xβ€– + m t := by linarith [hm s hs_T, hms_le_mt] - simp only [hΞ΅t_def] - nlinarith [mul_le_mul_of_nonneg_left h_int_le (NNReal.coe_nonneg L)] - -- Gronwall on [0, t] with the endpoint force constant Ξ΅t. - have ht0 : (0 : ℝ) ≀ t := ht.1 - have h_f_cont : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc 0 t) := - (h_cont_Icc z).mono (Set.Icc_subset_Icc_right ht.2) - have h_deriv : βˆ€ s ∈ Set.Ico 0 t, - HasDerivWithinAt (fun s => (charX s z, charV s z)) - (charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z)) - (Set.Ici s) s := by - intro s hs - have hs_T : s ∈ Set.Ico 0 T := ⟨hs.1, lt_of_lt_of_le hs.2 ht.2⟩ - have hderiv := h_deriv_Ico z s hs_T - unfold vlasovVectorField at hderiv - exact hderiv - have h_init_norm : β€–(charX 0 z, charV 0 z)β€– ≀ β€–zβ€– := by rw [h_init z] - have h_bound : βˆ€ s ∈ Set.Ico 0 t, - β€–(charV s z, -convolveFunctionMeasure gradW (ρ s) (charX s z))β€– ≀ - K * β€–(charX s z, charV s z)β€– + Ξ΅t := by - intro s hs - have hs_mem : s ∈ Set.Icc 0 t := ⟨hs.1, le_of_lt hs.2⟩ - simp only [Prod.norm_def, norm_neg] - have hFsz := le_max_left β€–charX s zβ€– β€–charV s zβ€– - have hGsz := le_max_right β€–charX s zβ€– β€–charV s zβ€– - have hM_nn : 0 ≀ max β€–charX s zβ€– β€–charV s zβ€– := - le_max_iff.mpr (Or.inl (norm_nonneg _)) - have h_v_le : β€–charV s zβ€– ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := - calc β€–charV s zβ€– ≀ max β€–charX s zβ€– β€–charV s zβ€– := hGsz - _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– := - le_mul_of_one_le_left hM_nn (by linarith [NNReal.coe_nonneg L]) - _ ≀ K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := le_add_of_nonneg_right hΞ΅t_nn - have h_conv_le : β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– ≀ - K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := - calc β€–convolveFunctionMeasure gradW (ρ s) (charX s z)β€– - ≀ Ξ΅t + (L : ℝ) * β€–charX s zβ€– := h_conv_bound s hs_mem _ - _ ≀ Ξ΅t + K * max β€–charX s zβ€– β€–charV s zβ€– := by - have hLK : (L : ℝ) ≀ K := le_add_of_nonneg_left zero_le_one - linarith [mul_le_mul_of_nonneg_left hFsz (NNReal.coe_nonneg L), - mul_le_mul_of_nonneg_right hLK hM_nn] - _ = K * max β€–charX s zβ€– β€–charV s zβ€– + Ξ΅t := by ring - exact max_le h_v_le h_conv_le - have h_grw := norm_le_gronwallBound_of_norm_deriv_right_le - h_f_cont h_deriv h_init_norm h_bound t (Set.right_mem_Icc.mpr ht0) - simpa using h_grw - -/-- **Piece A.3 (Option 2): the canonical moment envelope closes (data-free).** - -Pure-algebra companion to `flow_distance_growth_bound_on_timedep`. Under the -**`M_fβ‚€`-free** smallness `B(T) := (L/(1+L))(e^{(1+L)T}-1) < 1`, the explicit -envelope `m*(t) := gronwallBound M_fβ‚€ (1+L) g0 t / (1 - B(T))` is a Gronwall -super-solution: - -* monotone on `[0, T]`, -* dominates the initial moment `M_fβ‚€`, -* **Ξ¦-invariant** at the moment level: - `gronwallBound M_fβ‚€ (1+L) (g0 + LΒ·m* t) t ≀ m* t`. - -Composed with Piece A integrated over `fβ‚€` (which gives -`M_{Φρ}(t) ≀ gronwallBound M_fβ‚€ (1+L) (g0 + LΒ·m(t)) t`, `g0 = β€–gradW 0β€–`), this -shows the Picard iterates stay inside the fixed envelope `m*` with **no** -data-dependent hypothesis β€” the faithful dissolution of the constant-`M` -fixed-point. This lemma is the measure-free heart of the option-2 escape; -Pieces B–D thread it through the curve space, `Phi_step`, and #11. -/ -theorem gronwall_envelope_exists - (M_fβ‚€ g0 : ℝ) (hM_fβ‚€ : 0 ≀ M_fβ‚€) (hg0 : 0 ≀ g0) - (L : NNReal) (T : ℝ) (hT : 0 ≀ T) - (hB : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T) - 1) < 1) : - βˆƒ m : ℝ β†’ ℝ, MonotoneOn m (Set.Icc 0 T) ∧ - (βˆ€ t ∈ Set.Icc 0 T, M_fβ‚€ ≀ m t) ∧ - (βˆ€ t ∈ Set.Icc 0 T, - gronwallBound M_fβ‚€ (1 + (L : ℝ)) (g0 + (L : ℝ) * m t) t ≀ m t) := by - set K : ℝ := 1 + (L : ℝ) with hK_def - have hK_pos : 0 < K := by positivity - have hK_ne : K β‰  0 := ne_of_gt hK_pos - have hL_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg - -- B(t) and its monotonicity. - set Bf : ℝ β†’ ℝ := fun t => (L : ℝ) / K * (Real.exp (K * t) - 1) with hBf_def - have hBT_lt : Bf T < 1 := hB - have hD_pos : 0 < 1 - Bf T := by linarith - have hD_nn : (0 : ℝ) ≀ 1 - Bf T := hD_pos.le - have hD_ne : (1 - Bf T) β‰  0 := ne_of_gt hD_pos - have hLK_nn : 0 ≀ (L : ℝ) / K := div_nonneg hL_nn hK_pos.le - have hBf_T_nn : 0 ≀ Bf T := by - have he1 : 0 ≀ Real.exp (K * T) - 1 := by - have : (1 : ℝ) ≀ Real.exp (K * T) := Real.one_le_exp (by positivity) - linarith - exact mul_nonneg hLK_nn he1 - have hBf_le : βˆ€ t ∈ Set.Icc (0 : ℝ) T, Bf t ≀ Bf T := by - intro t ht - have hexp : Real.exp (K * t) ≀ Real.exp (K * T) := - Real.exp_le_exp.mpr (by nlinarith [ht.2, hK_pos.le]) - simp only [hBf_def] - nlinarith [hexp, hLK_nn] - -- A(t) := gronwallBound M_fβ‚€ K g0 t, expanded + nonneg + monotone. - set Af : ℝ β†’ ℝ := fun t => gronwallBound M_fβ‚€ K g0 t with hAf_def - have hAf_expand : βˆ€ t, - Af t = M_fβ‚€ * Real.exp (K * t) + g0 / K * (Real.exp (K * t) - 1) := by - intro t; simp only [hAf_def]; rw [gronwallBound_of_K_ne_0 hK_ne] - have hAf_nn : βˆ€ t ∈ Set.Icc (0 : ℝ) T, 0 ≀ Af t := by - intro t ht - rw [hAf_expand t] - have he1 : 0 ≀ Real.exp (K * t) - 1 := by - have : (1 : ℝ) ≀ Real.exp (K * t) := Real.one_le_exp (by nlinarith [ht.1, hK_pos.le]) - linarith - have hgK_nn : 0 ≀ g0 / K := div_nonneg hg0 hK_pos.le - positivity - have hAf_mono : MonotoneOn Af (Set.Icc 0 T) := by - intro s _ t _ hst - simp only [hAf_def] - exact gronwallBound_mono hM_fβ‚€ hg0 hK_pos.le hst - refine ⟨fun t => Af t / (1 - Bf T), ?_, ?_, ?_⟩ - Β· -- monotone: Af increasing, positive constant divisor. - intro s hs t ht hst - change Af s / (1 - Bf T) ≀ Af t / (1 - Bf T) - gcongr - exact hAf_mono hs ht hst - Β· -- M_fβ‚€ ≀ m t. - intro t ht - have h0_mem : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T := ⟨le_refl 0, hT⟩ - have hAf0 : Af 0 = M_fβ‚€ := by rw [hAf_expand 0]; simp [Real.exp_zero] - have h_mono : Af 0 / (1 - Bf T) ≀ Af t / (1 - Bf T) := by - gcongr - exact hAf_mono h0_mem ht ht.1 - rw [hAf0] at h_mono - have h_self : M_fβ‚€ ≀ M_fβ‚€ / (1 - Bf T) := by - rw [le_div_iffβ‚€ hD_pos]; nlinarith [hM_fβ‚€, hBf_T_nn] - linarith - Β· -- Ξ¦-invariance. - intro t ht - change gronwallBound M_fβ‚€ K (g0 + (L : ℝ) * (Af t / (1 - Bf T))) t - ≀ Af t / (1 - Bf T) - have h_lhs : gronwallBound M_fβ‚€ K (g0 + (L : ℝ) * (Af t / (1 - Bf T))) t - = Af t + Bf t * (Af t / (1 - Bf T)) := by - rw [gronwallBound_of_K_ne_0 hK_ne, hAf_expand t] - simp only [hBf_def]; ring - rw [h_lhs] - have hkey : 0 ≀ Af t * (Bf T - Bf t) := - mul_nonneg (hAf_nn t ht) (by linarith [hBf_le t ht]) - have hexpand : Af t / (1 - Bf T) - (Af t + Bf t * (Af t / (1 - Bf T))) - = Af t * (Bf T - Bf t) / (1 - Bf T) := by - field_simp - ring - linarith [div_nonneg hkey hD_pos.le, hexpand] - -/-- **Piece A.2 (Option 2): integrate the per-`z` growth bound to a moment bound.** - -The measure-level bridge between Piece A and Piece A.3: given the per-`z` -time-local growth bound (Piece A's conclusion, taken here as the hypothesis -`h_growth` so this lemma is decoupled from the flow construction), the -**position pushforward** `Measure.map (charX t Β·) fβ‚€` has first moment bounded -by the same Gronwall functional evaluated at the *initial* moment `βˆ«β€–zβ€– βˆ‚fβ‚€`: - - `∫ x, β€–xβ€– βˆ‚(Measure.map (charX t Β·) fβ‚€) ≀ gronwallBound (βˆ«β€–zβ€– βˆ‚fβ‚€) (1+L) (g0 + LΒ·m t) t`. - -Proof: `integral_map` exchanges the pushforward; `β€–charX t zβ€– ≀ β€–(charX t z, charV t z)β€–` -+ `h_growth` bounds the integrand by `gronwallBound β€–zβ€– …`, which is affine in `β€–zβ€–`, -so its `fβ‚€`-integral is `gronwallBound (βˆ«β€–zβ€–) …` (probability measure β‡’ the constant -term integrates to itself). - -Composing with `gronwall_envelope_exists` (Piece A.3): when `m = m*` the canonical -envelope and `g0 = β€–gradW 0β€–`, the RHS is `≀ m* t`, i.e. `Ξ¦` maps the envelope to -itself at the moment level β€” the measure-level statement of the data-free escape. -/ -theorem phi_moment_envelope_le {d : β„•} - (L : NNReal) (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (g0 : ℝ) (T : ℝ) (m : ℝ β†’ ℝ) - (h_growth : βˆ€ t ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, - β€–(charX t z, charV t z)β€– ≀ gronwallBound β€–zβ€– (1 + (L : ℝ)) (g0 + (L : ℝ) * m t) t) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - (h_meas : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => charX t z) fβ‚€) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, - ∫ x, β€–xβ€– βˆ‚(Measure.map (fun z : PhaseSpace d => charX t z) fβ‚€) - ≀ gronwallBound (∫ z, β€–zβ€– βˆ‚fβ‚€) (1 + (L : ℝ)) (g0 + (L : ℝ) * m t) t := by - intro t ht - set K : ℝ := 1 + (L : ℝ) with hK_def - set Ξ΅t : ℝ := g0 + (L : ℝ) * m t with hΞ΅t_def - have hK_ne : K β‰  0 := by positivity - -- gronwallBound is affine in its initial value: gb r = e^{Kt}Β·r + C. - have h_gb : βˆ€ r : ℝ, - gronwallBound r K Ξ΅t t = Real.exp (K * t) * r + Ξ΅t / K * (Real.exp (K * t) - 1) := by - intro r; rw [gronwallBound_of_K_ne_0 hK_ne]; ring - have h_dom_int : Integrable (fun z : PhaseSpace d => gronwallBound β€–zβ€– K Ξ΅t t) fβ‚€ := by - simp only [h_gb] - exact (hfβ‚€_int.const_mul _).add (integrable_const _) - have h_charX_le : βˆ€ z : PhaseSpace d, β€–charX t zβ€– ≀ gronwallBound β€–zβ€– K Ξ΅t t := fun z => - le_trans (norm_fst_le (charX t z, charV t z)) (h_growth t ht z) - have h_charX_int : Integrable (fun z : PhaseSpace d => β€–charX t zβ€–) fβ‚€ := - h_dom_int.mono' ((h_meas t ht).norm.aestronglyMeasurable) - (Filter.Eventually.of_forall fun z => by - rw [Real.norm_of_nonneg (norm_nonneg _)]; exact h_charX_le z) - rw [integral_map (h_meas t ht) continuous_norm.aestronglyMeasurable] - calc ∫ z, β€–charX t zβ€– βˆ‚fβ‚€ - ≀ ∫ z, gronwallBound β€–zβ€– K Ξ΅t t βˆ‚fβ‚€ := - integral_mono h_charX_int h_dom_int h_charX_le - _ = gronwallBound (∫ z, β€–zβ€– βˆ‚fβ‚€) K Ξ΅t t := by - simp only [h_gb] - rw [integral_add (hfβ‚€_int.const_mul _) (integrable_const _), integral_const_mul, - integral_const] - simp [measureReal_def, measure_univ] - -/-! ## Characteristic flow existence (Picard-LindelΓΆf wrapper) - -This section wraps the vendored parametric Picard-LindelΓΆf theorem -(`LeanPool.Vlasov.ForMathlib.PicardLindelof`) to extract a characteristic flow -`(charX, charV)` for the Vlasov ODE. -The four `IsPicardLindelof` hypotheses (Lipschitz-on-ball, -continuous-in-time, norm bound, contraction) are derived from -`convolveFunctionMeasure_lipschitz_in_x`, plus narrow-continuity of the -spatial-marginal curve `ρ`, plus a uniform norm bound from the -finite-mass assumption. - -The contraction condition `L Β· max(tmax βˆ’ tβ‚€, tβ‚€ βˆ’ tmin) ≀ a βˆ’ r` -pins down the local time-interval size relative to the ball radius. -For the dobrushin application we work on a finite interval `[0, T]`; -the existence theorem is parametrised by `T` and produces a flow -on `Set.Icc 0 T` (extending the local flow by stitching overlapping -windows; technically a separate iteration argument, deferred to -the proof body). - -This sub-section first establishes the **global Lipschitz constant** -for `vlasovVectorField` (a direct composition of -`convolveFunctionMeasure_lipschitz_in_x` with the 1-Lipschitz -identity on the velocity coordinate, combined via `LipschitzWith.prodMk`). -The global Lipschitz immediately restricts to any closed ball, -giving the first of the four `IsPicardLindelof` fields. - -The full `exists_vlasov_characteristicFlow` proof packages the global -norm bound into a per-window `IsPicardLindelof`, invokes the vendored -Picard-LindelΓΆf (`exists_vlasov_extend_one_window`), and stitches -`N = ⌈T/Ξ΄βŒ‰` windows per-`z` via `HasDerivWithinAt.union` under the -position/velocity inductive invariant. Downstream callers discharge its -`hR`/`hbound` hypotheses; the single-ball `hR` discharge in -`exists_vlasov_trajectory` is what introduces the -`LocalSmallnessPLBuffer L T := LΒ·TΒ² < 1` constraint β€” see that -theorem's docstring for the arbitrary-`L` discussion. -/ - -/-- Localized variant of `IsCharacteristicFlow` from `Basic.lean`: -the same initial condition + position/velocity ODEs, but quantified -over a chosen time set `s_t : Set ℝ` and initial-condition set -`s_z : Set (PhaseSpace d)`. - -The global `IsCharacteristicFlow gradW ρ charX charV` is the -specialisation `IsCharacteristicFlowOn ... Set.univ Set.univ` -(modulo the unconditional init clause). -/ -def IsCharacteristicFlowOn - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (s_t : Set ℝ) (s_z : Set (PhaseSpace d)) : Prop := - (βˆ€ z ∈ s_z, charX 0 z = z.1 ∧ charV 0 z = z.2) ∧ - (βˆ€ t ∈ s_t, βˆ€ z ∈ s_z, HasDerivAt (fun s => charX s z) (charV t z) t) ∧ - (βˆ€ t ∈ s_t, βˆ€ z ∈ s_z, HasDerivAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (ρ t) (charX t z))) t) - -/-- Monotonicity of `IsCharacteristicFlowOn` in both the time set and the -initial-condition set. Used at the end of the global existence theorem -to restrict a flow produced on `Ioo 0 (NΒ·Ξ΄)` (covering all of `[0, T]`) -down to `Ioo 0 T`. -/ -lemma IsCharacteristicFlowOn.mono - {d : β„•} - {gradW : PhysSpace d β†’ PhysSpace d} - {ρ : ℝ β†’ Measure (PhysSpace d)} - {charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d} - {s_t s_t' : Set ℝ} {s_z s_z' : Set (PhaseSpace d)} - (h : IsCharacteristicFlowOn gradW ρ charX charV s_t s_z) - (hs_t : s_t' βŠ† s_t) (hs_z : s_z' βŠ† s_z) : - IsCharacteristicFlowOn gradW ρ charX charV s_t' s_z' := by - refine ⟨fun z hz => h.1 z (hs_z hz), fun t ht z hz => ?_, fun t ht z hz => ?_⟩ - Β· exact h.2.1 t (hs_t ht) z (hs_z hz) - Β· exact h.2.2 t (hs_t ht) z (hs_z hz) +private alias hasDerivWithinAt_Icc_self := + _root_.Vlasov.hasDerivWithinAt_Icc_self /-! ### Localized Vlasov-solution predicates on `[0, T]` @@ -1264,1512 +203,6 @@ lemma IsLagrangianVlasovSolution.toOn {d : β„•} continuous_iff_continuousAt.mpr (fun t => (h_flow.2.2 t z).continuousAt) exact (hX.prodMk hV).continuousOn -/-- Global Lipschitz constant for the Vlasov phase-space vector field. -`b_t(x, v) = (v, -(βˆ‡W βˆ— ρ_t)(x))` is `max(1, L)`-Lipschitz when -`gradW` is `L`-Lipschitz: the velocity-side projection `(x, v) ↦ v` -is 1-Lipschitz (`LipschitzWith.prod_snd`), and the force-side map -`(x, v) ↦ -(βˆ‡W βˆ— ρ_t)(x)` is `L`-Lipschitz (compose -`convolveFunctionMeasure_lipschitz_in_x` with `Neg.neg` and -`Prod.fst`, both 1-Lipschitz). Combining the two via -`LipschitzWith.prodMk` yields `max(1, L)` on the product. -/ -lemma vlasovVectorField_lipschitzWith - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (t : ℝ) : - LipschitzWith (max 1 L) (vlasovVectorField gradW ρ t) := by - -- Force-side `x ↦ (βˆ‡W βˆ— ρ_t)(x)` is `L`-Lipschitz. - have h_conv : LipschitzWith L - (fun x : PhysSpace d => convolveFunctionMeasure gradW (ρ t) x) := - convolveFunctionMeasure_lipschitz_in_x gradW L hL (ρ t) (h_int t) - -- Negate (`Neg.neg` is 1-Lipschitz): `x ↦ -(βˆ‡W βˆ— ρ_t)(x)` is still `L`-Lipschitz. - have h_neg_conv : LipschitzWith L - (fun x : PhysSpace d => -convolveFunctionMeasure gradW (ρ t) x) := by - simpa [Function.comp_def] using LipschitzWith.id.neg.comp h_conv - -- Compose with `Prod.fst` (1-Lipschitz): `z ↦ -(βˆ‡W βˆ— ρ_t)(z.1)` is `L`-Lipschitz. - have h_force : LipschitzWith L - (fun z : PhaseSpace d => -convolveFunctionMeasure gradW (ρ t) z.1) := by - simpa [Function.comp_def] using h_neg_conv.comp - (LipschitzWith.prod_fst (Ξ± := PhysSpace d) (Ξ² := PhysSpace d)) - -- Combine velocity-side projection (1-Lipschitz) with force-side (L-Lipschitz). - exact (LipschitzWith.prod_snd (Ξ± := PhysSpace d) (Ξ² := PhysSpace d)).prodMk h_force - -/-- Pointwise norm bound for the Vlasov phase-space vector field. -`β€–b_t(x, v)β€– ≀ max(β€–vβ€–, β€–(βˆ‡W βˆ— ρ_t)(x)β€–)` for the product `max`-norm -on `PhaseSpace d = PhysSpace d Γ— PhysSpace d`. - -This is the decomposition used to derive `IsPicardLindelof.norm_le` -once a uniform bound `M` for `β€–(βˆ‡W βˆ— ρ_t)(x)β€–` on a closed ball is -known (e.g. from finite-first-moment + Lipschitz growth of `gradW`). -/ -lemma vlasovVectorField_norm_le - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) (t : ℝ) (z : PhaseSpace d) : - β€–vlasovVectorField gradW ρ t zβ€– ≀ - max β€–z.2β€– β€–convolveFunctionMeasure gradW (ρ t) z.1β€– := by - unfold vlasovVectorField - -- Prod norm is the max of component norms; neg preserves norm. - simp [Prod.norm_def, norm_neg] - -/-- **Local-flow** existence for the Vlasov ODE. - -Wraps the vendored parametric Picard-LindelΓΆf -(`IsPicardLindelof.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined`, -`LeanPool.Vlasov.ForMathlib.PicardLindelof`) -into a `HasDerivAt`-on-`Ioo`-shaped characteristic flow. The result -holds for initial conditions inside `closedBall zβ‚€ (a/2)` and for -times in `Ioo 0 Ξ΄` where `Ξ΄` is a Picard-derived constant. - -The new hypothesis `hbound` (uniform norm bound on the convolution -force on a slightly larger ball, over `[0, 1]`) is the genuine input -the Picard wrapper needs: the contraction condition + the `norm_le` -field of `IsPicardLindelof` both require a global bound on `β€–b_tβ€–`. - -The global existence form `exists_vlasov_characteristicFlow` (below) -is the stitched version on `[0, T]`, iterating this local theorem on -overlapping windows and gluing with `ODE_solution_unique`. -/ -theorem exists_vlasov_characteristicFlow_local - {d : β„•} - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (_hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - -- Local-flow data: the basepoint `zβ‚€`, the ball radius `a`, and a - -- uniform force bound `M` on `closedBall zβ‚€.1 (3a/2)` over `[0,1]`. - (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) - (M : NNReal) - (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) (1 : ℝ), - βˆ€ x ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : - βˆƒ (Ξ΄ : ℝ) (_ : 0 < Ξ΄) (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), - IsCharacteristicFlowOn gradW ρ charX charV - (Set.Ioo 0 Ξ΄) (Metric.closedBall zβ‚€ ((a : ℝ) / 2)) := by - classical - -- IsPicardLindelof parameter choices. - set K_pl : NNReal := max 1 L with hK_pl_def - set r_pl : NNReal := a / 2 with hr_pl_def - set L_pl : NNReal := β€–zβ‚€.2β€–β‚Š + a + M with hL_pl_def - -- Ξ΄ chosen to satisfy the contraction L_pl Β· Ξ΄ ≀ a βˆ’ r_pl = a/2. - set Ξ΄ : ℝ := min 1 ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) with hΞ΄_def - have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha - have h_denom_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by positivity - have h_ratio_pos : (0 : ℝ) < (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := by positivity - have hΞ΄_pos : (0 : ℝ) < Ξ΄ := lt_min one_pos h_ratio_pos - have hΞ΄_le_one : Ξ΄ ≀ 1 := min_le_left _ _ - have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := min_le_right _ _ - -- tβ‚€ ∈ Icc 0 Ξ΄. - let tβ‚€ : Set.Icc (0 : ℝ) Ξ΄ := ⟨0, Set.mem_Icc.mpr ⟨le_refl 0, le_of_lt hΞ΄_pos⟩⟩ - -- Assemble IsPicardLindelof. - have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ zβ‚€ a r_pl L_pl K_pl := by - refine ⟨?_, ?_, ?_, ?_⟩ - Β· -- (a) lipschitzOnWith via vlasovVectorField_lipschitzWith. - intro t _ - exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith - Β· -- (b) continuousOn: velocity component constant in t, force continuous by hρ_cont. - intro x _ - apply Continuous.continuousOn - simp only [vlasovVectorField] - exact Continuous.prodMk continuous_const (hρ_cont x.1).neg - Β· -- (c) norm_le. - intro t ht x hx - have h_norm_field := vlasovVectorField_norm_le gradW ρ t x - have hdist_le : dist x zβ‚€ ≀ (a : ℝ) := hx - have hdist_le_norm : β€–x - zβ‚€β€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le - have h_x2_proj : β€–x.2 - zβ‚€.2β€– ≀ β€–x - zβ‚€β€– := by - rw [Prod.norm_def]; exact le_max_right _ _ - have h_x2_bound : β€–x.2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) := by - have h1 : β€–x.2β€– = β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– := by rw [sub_add_cancel] - have h2 : β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– ≀ β€–x.2 - zβ‚€.2β€– + β€–zβ‚€.2β€– := norm_add_le _ _ - linarith [h_x2_proj, hdist_le_norm] - have h_x1_proj : dist x.1 zβ‚€.1 ≀ dist x zβ‚€ := by - simp only [Prod.dist_eq]; exact le_max_left _ _ - have h_x1_ball : x.1 ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2) := by - have hx1d : dist x.1 zβ‚€.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le - have : dist x.1 zβ‚€.1 ≀ 3 * (a : ℝ) / 2 := by - have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real - linarith - exact this - have h_t_Icc : t ∈ Set.Icc (0 : ℝ) 1 := - ⟨ht.1, le_trans ht.2 hΞ΄_le_one⟩ - have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := - hbound t h_t_Icc x.1 h_x1_ball - have h_Lpl_eq : (L_pl : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) + (M : ℝ) := by - simp [hL_pl_def, NNReal.coe_add, coe_nnnorm] - calc β€–vlasovVectorField gradW ρ t xβ€– - ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field - _ ≀ (L_pl : ℝ) := by - rw [h_Lpl_eq] - apply max_le - Β· linarith [NNReal.coe_nonneg M] - Β· linarith [norm_nonneg zβ‚€.2, NNReal.coe_nonneg a] - Β· -- (d) mul_max_le: L_pl Β· max(Ξ΄ βˆ’ 0, 0 βˆ’ 0) = L_pl Β· Ξ΄ ≀ a βˆ’ a/2 = a/2. - show (L_pl : ℝ) * max (Ξ΄ - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - 0) ≀ (a : ℝ) - (r_pl : ℝ) - have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl - simp only [htβ‚€_eq, sub_zero, sub_self, max_eq_left (le_of_lt hΞ΄_pos)] - have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by - simp [hr_pl_def, NNReal.coe_div] - ring - rw [h_a_minus_r] - -- L_pl * Ξ΄ ≀ a/2 since Ξ΄ ≀ (a/2)/(L_pl+1) and L_pl ≀ L_pl + 1. - have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg - have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] - have h_step : (L_pl : ℝ) * Ξ΄ ≀ (L_pl : ℝ) * - ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) := - mul_le_mul_of_nonneg_left hΞ΄_le_ratio h_Lpl_nn - have h_rewrite : (L_pl : ℝ) * ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) - = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by ring - have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by - rw [div_le_one h_denom_pos]; linarith - have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by - calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) - ≀ 1 * ((a : ℝ) / 2) := - mul_le_mul_of_nonneg_right h_frac_le h_a_nn - _ = (a : ℝ) / 2 := one_mul _ - linarith [h_step, h_rewrite β–Έ h_step, h_bound] - -- Invoke headline Picard-LindelΓΆf. - obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined - -- Ξ± : PhaseSpace d β†’ ℝ β†’ PhaseSpace d. Define charX, charV by projection. - refine ⟨δ, hΞ΄_pos, fun t z => (Ξ± z t).1, fun t z => (Ξ± z t).2, ?_, ?_, ?_⟩ - Β· -- Initial condition: Ξ± z 0 = z gives both component equalities. - intro z hz - have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by - have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] - rw [Metric.mem_closedBall] at hz ⊒ - rw [hreq]; exact hz - have h_init : Ξ± z (tβ‚€ : ℝ) = z := (hΞ± z hz_in_r).1 - have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl - rw [htβ‚€_eq] at h_init - refine ⟨?_, ?_⟩ - Β· change (Ξ± z 0).1 = z.1; rw [h_init] - Β· change (Ξ± z 0).2 = z.2; rw [h_init] - Β· -- Position ODE: HasDerivAt (charX Β· z) (charV t z) t. - intro t ht z hz - have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by - have : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] - rw [Metric.mem_closedBall] at hz ⊒; rw [this]; exact hz - have h_t_Icc : t ∈ Set.Icc (0 : ℝ) Ξ΄ := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ - have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc - have h_icc_nhds : Set.Icc (0 : ℝ) Ξ΄ ∈ nhds t := Icc_mem_nhds ht.1 ht.2 - have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := - h_dw.hasDerivAt h_icc_nhds - have h_proj : HasDerivAt (fun s => (Ξ± z s).1) - (vlasovVectorField gradW ρ t (Ξ± z t)).1 t := - (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - Β· -- Velocity ODE: HasDerivAt (charV Β· z) (βˆ’(βˆ‡Wβˆ—Ο)(charX t z)) t. - intro t ht z hz - have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by - have : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] - rw [Metric.mem_closedBall] at hz ⊒; rw [this]; exact hz - have h_t_Icc : t ∈ Set.Icc (0 : ℝ) Ξ΄ := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ - have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc - have h_icc_nhds : Set.Icc (0 : ℝ) Ξ΄ ∈ nhds t := Icc_mem_nhds ht.1 ht.2 - have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := - h_dw.hasDerivAt h_icc_nhds - have h_proj : HasDerivAt (fun s => (Ξ± z s).2) - (vlasovVectorField gradW ρ t (Ξ± z t)).2 t := - (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - -/-- **Per-z, time-shifted single-trajectory Picard with a uniform velocity-bound parameter.** - -Given a fixed phase-space point `w`, a starting time `t_start`, an a priori -velocity bound `V_max β‰₯ β€–w.2β€–`, and a uniform force bound around `w` on the -time interval `[t_start, t_start + 1]`, this produces a single trajectory -`Ξ² : ℝ β†’ PhaseSpace d` solving the Vlasov ODE on `Ioo t_start (t_start + Ξ΄)` -with `Ξ² t_start = w`. - -**Why `V_max` as a separate parameter:** the Picard contraction time Ξ΄ -depends on the norm-bound `L_pl := V_max + a + M` for the vector field on -the local ball. Phrasing this via an explicit `V_max β‰₯ β€–w.2β€–` rather than -the tight `β€–w.2β€–` makes Ξ΄ uniform in `w` for any iteration centered at -points `w` whose velocity component is bounded by `V_max`. This is the -input that lets the N-window iteration in -`exists_vlasov_characteristicFlow` pick a single Ξ΄ valid across all -windows (by combining with the a priori bound -`β€–w_n(z).2β€– ≀ β€–zβ‚€.2β€– + a/2 + MΒ·(T+1)` on a finite `[0, T]`-interval). - -Implementation: build an IsPicardLindelof centered at `w` over `[t_start, -t_start + Ξ΄]` with `L_pl := V_max + a + M`. Invoke the vendored headline -theorem. Take the single trajectory `Ξ² t := Ξ± w t`. -/ -lemma exists_vlasov_extend_one_window - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - (w : PhaseSpace d) (a : NNReal) (ha : 0 < a) (M : NNReal) - (V_max : NNReal) (hV : β€–w.2β€– ≀ (V_max : ℝ)) - (t_start : ℝ) - (hbound : βˆ€ t ∈ Set.Icc t_start (t_start + 1), - βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : - βˆƒ (Ξ΄ : ℝ) (_ : 0 < Ξ΄) (Ξ² : ℝ β†’ PhaseSpace d), - Ξ΄ = min 1 ((a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) ∧ - Ξ² t_start = w ∧ - (βˆ€ t ∈ Set.Ioo t_start (t_start + Ξ΄), - HasDerivAt (fun s => (Ξ² s).1) (Ξ² t).2 t ∧ - HasDerivAt (fun s => (Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) t) ∧ - (βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), - HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 - (Set.Icc t_start (t_start + Ξ΄)) t ∧ - HasDerivWithinAt (fun s => (Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) - (Set.Icc t_start (t_start + Ξ΄)) t) ∧ - (βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), Ξ² s ∈ Metric.closedBall w (a : ℝ)) := by - classical - set K_pl : NNReal := max 1 L with hK_pl_def - set r_pl : NNReal := a / 2 with hr_pl_def - set L_pl : NNReal := V_max + a + M with hL_pl_def - set Ξ΄ : ℝ := min 1 ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) with hΞ΄_def - have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha - have h_denom_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by positivity - have h_ratio_pos : (0 : ℝ) < (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := by positivity - have hΞ΄_pos : (0 : ℝ) < Ξ΄ := lt_min one_pos h_ratio_pos - have hΞ΄_le_one : Ξ΄ ≀ 1 := min_le_left _ _ - have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := min_le_right _ _ - let tβ‚€ : Set.Icc t_start (t_start + Ξ΄) := - ⟨t_start, Set.mem_Icc.mpr ⟨le_refl _, by linarith⟩⟩ - have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ w a r_pl L_pl K_pl := by - refine ⟨?_, ?_, ?_, ?_⟩ - Β· intro t _ - exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith - Β· intro x _ - apply Continuous.continuousOn - simp only [vlasovVectorField] - exact Continuous.prodMk continuous_const (hρ_cont x.1).neg - Β· intro t ht x hx - have h_norm_field := vlasovVectorField_norm_le gradW ρ t x - have hdist_le : dist x w ≀ (a : ℝ) := hx - have hdist_le_norm : β€–x - wβ€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le - have h_x2_proj : β€–x.2 - w.2β€– ≀ β€–x - wβ€– := by - rw [Prod.norm_def]; exact le_max_right _ _ - have h_x2_bound : β€–x.2β€– ≀ β€–w.2β€– + (a : ℝ) := by - have h1 : β€–x.2β€– = β€–(x.2 - w.2) + w.2β€– := by rw [sub_add_cancel] - have h2 : β€–(x.2 - w.2) + w.2β€– ≀ β€–x.2 - w.2β€– + β€–w.2β€– := norm_add_le _ _ - linarith [h_x2_proj, hdist_le_norm] - have h_x1_proj : dist x.1 w.1 ≀ dist x w := by - simp only [Prod.dist_eq]; exact le_max_left _ _ - have h_x1_ball : x.1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2) := by - rw [Metric.mem_closedBall] - have hx1d : dist x.1 w.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le - have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real - linarith - have h_t_Icc : t ∈ Set.Icc t_start (t_start + 1) := - ⟨ht.1, le_trans ht.2 (by linarith [hΞ΄_le_one])⟩ - have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := - hbound t h_t_Icc x.1 h_x1_ball - have h_Lpl_eq : (L_pl : ℝ) = (V_max : ℝ) + (a : ℝ) + (M : ℝ) := by - simp [hL_pl_def, NNReal.coe_add] - have h_x2_bound' : β€–x.2β€– ≀ (V_max : ℝ) + (a : ℝ) := - le_trans h_x2_bound (by linarith [hV]) - calc β€–vlasovVectorField gradW ρ t xβ€– - ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field - _ ≀ (L_pl : ℝ) := by - rw [h_Lpl_eq] - apply max_le - Β· linarith [NNReal.coe_nonneg M, h_x2_bound'] - Β· linarith [norm_nonneg w.2, NNReal.coe_nonneg a, NNReal.coe_nonneg V_max] - Β· show (L_pl : ℝ) * max ((t_start + Ξ΄) - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - t_start) - ≀ (a : ℝ) - (r_pl : ℝ) - have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl - simp only [htβ‚€_eq, add_sub_cancel_left, sub_self, max_eq_left (le_of_lt hΞ΄_pos)] - have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by - simp [hr_pl_def, NNReal.coe_div]; ring - rw [h_a_minus_r] - have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg - have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] - have h_step : (L_pl : ℝ) * Ξ΄ ≀ (L_pl : ℝ) * - ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) := - mul_le_mul_of_nonneg_left hΞ΄_le_ratio h_Lpl_nn - have h_rewrite : (L_pl : ℝ) * ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) - = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by ring - have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by - rw [div_le_one h_denom_pos]; linarith - have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by - calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) - ≀ 1 * ((a : ℝ) / 2) := - mul_le_mul_of_nonneg_right h_frac_le h_a_nn - _ = (a : ℝ) / 2 := one_mul _ - linarith [h_step, h_rewrite β–Έ h_step, h_bound] - obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined - have hw_in_r : w ∈ Metric.closedBall w ((r_pl : ℝ)) := by - rw [Metric.mem_closedBall, dist_self] - exact r_pl.coe_nonneg - have hΞ±_w := hΞ± w hw_in_r - refine ⟨δ, hΞ΄_pos, fun t => Ξ± w t, ?_, ?_, ?_, ?_, ?_⟩ - Β· rfl - Β· have h_init : Ξ± w (tβ‚€ : ℝ) = w := hΞ±_w.1 - have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl - rw [htβ‚€_eq] at h_init - exact h_init - Β· intro t ht - have h_t_Icc : t ∈ Set.Icc t_start (t_start + Ξ΄) := - ⟨le_of_lt ht.1, le_of_lt ht.2⟩ - have h_dw := hΞ±_w.2.1 t h_t_Icc - have h_icc_nhds : Set.Icc t_start (t_start + Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 - have h_d : HasDerivAt (Ξ± w) (vlasovVectorField gradW ρ t (Ξ± w t)) t := - h_dw.hasDerivAt h_icc_nhds - refine ⟨?_, ?_⟩ - Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).1) - (vlasovVectorField gradW ρ t (Ξ± w t)).1 t := - (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).2) - (vlasovVectorField gradW ρ t (Ξ± w t)).2 t := - (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - Β· intro t ht - have h_dw := hΞ±_w.2.1 t ht - refine ⟨?_, ?_⟩ - Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).1) - (vlasovVectorField gradW ρ t (Ξ± w t)).1 - (Set.Icc t_start (t_start + Ξ΄)) t := - (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw - simpa [vlasovVectorField] using h_proj - Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).2) - (vlasovVectorField gradW ρ t (Ξ± w t)).2 - (Set.Icc t_start (t_start + Ξ΄)) t := - (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw - simpa [vlasovVectorField] using h_proj - Β· -- confinement: Ξ² s ∈ closedBall w a (delivered by `_confined` variant) - intro s hs - exact hΞ±_w.2.2 s hs - -/-! ### Per-window helpers for the N-window induction in - `exists_vlasov_characteristicFlow`. - - These three top-level lemmas are generic in `(Ξ², ODE, confinement, - field bound, IH bound, reference point)` with no mention of the - N-window induction context (no `Ξ³_k`, `k`, `N`, `zβ‚€`). This - genericity gives each helper its own elaboration budget AND makes - them composable for future call sites β€” the Lagrangian β†’ Eulerian - chain rule, well-posedness's Banach iteration, etc. - - Composition order: Helper 1 (confinement) β†’ Helper 2 (window-wide - velocity bound) β†’ Helper 3 (endpoint position bound). --/ - -/-- **Helper 1: Picard window confinement (projection from phase-space ball).** - -For a trajectory Ξ² satisfying the Vlasov ODE on a Picard window -`[t_start, t_start + Ξ΄]` centered at `w`, the position component -stays within the local force-bound ball: -`(Ξ² s).1 ∈ closedBall w.1 (3a/2)` for `s` in the window. - -**Argument.** The strengthened Picard-LindelΓΆf theorem -`exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined` -(`LeanPool.Vlasov.ForMathlib.PicardLindelof`) exposes -`FunSpace.compProj_mem_closedBall` at the public theorem level, -delivering `Ξ² s ∈ closedBall w a` (phase-space ball of radius `a` β€” -the outer Lipschitz radius) as a side product of the existence -guarantee. We project this to the position component via -`Prod.dist_eq` + `le_max_left`, then loosen `a ≀ 3a/2` by arithmetic. -The result is a 3-5 line projection. - -**Hypothesis `hΞ²_confined`** is supplied by Vlasov-side callers from -the widened `exists_vlasov_extend_one_window` output. The other -hypotheses (ODE, field -bound, contraction inequality) are retained for genericity / call -site compatibility; they are not consumed by the projection body but -remain available for future call sites that want to re-derive the -confinement directly (e.g. via supremum trick) without invoking -the vendored Mathlib API. -/ -lemma vlasov_window_confinement - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (_hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (_h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (_hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - (w : PhaseSpace d) (a : NNReal) (_ha : 0 < a) (M : NNReal) - (V_max : NNReal) (_hV : β€–w.2β€– ≀ (V_max : ℝ)) - (t_start Ξ΄ : ℝ) (_hΞ΄_pos : 0 < Ξ΄) (_hΞ΄_le_one : Ξ΄ ≀ 1) - (_hΞ΄_contract : Ξ΄ ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) - (_hbound : βˆ€ t ∈ Set.Icc t_start (t_start + 1), - βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) - (Ξ² : ℝ β†’ PhaseSpace d) (_hΞ²_init : Ξ² t_start = w) - (_hΞ²_ode_Icc : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), - HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 - (Set.Icc t_start (t_start + Ξ΄)) t ∧ - HasDerivWithinAt (fun s => (Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) - (Set.Icc t_start (t_start + Ξ΄)) t) - (hΞ²_confined : βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), - Ξ² s ∈ Metric.closedBall w (a : ℝ)) : - βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), - (Ξ² s).1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2) := by - intro s hs - have h_phase : Ξ² s ∈ Metric.closedBall w (a : ℝ) := hΞ²_confined s hs - rw [Metric.mem_closedBall] at h_phase ⊒ - -- dist (Ξ² s).1 w.1 ≀ dist (Ξ² s) w ≀ a ≀ 3a/2 - have h_proj : dist (Ξ² s).1 w.1 ≀ dist (Ξ² s) w := by - rw [Prod.dist_eq]; exact le_max_left _ _ - have h_a_nn : (0 : ℝ) ≀ (a : ℝ) := a.coe_nonneg - linarith - -/-- **Helper 2: Window-wide velocity bound.** - -For a trajectory Ξ² with velocity-component ODE -`(Ξ² Β· ).2' = -(βˆ‡W βˆ— ρ_Β·)((Ξ² Β·).1)` on `[t_start, t_start + Ξ΄]` and -force bound M (made applicable by `h_Ξ²_in_ball`), the velocity at -every interior `s` is bounded by `h_vel_init + M Β· (s - t_start)`. - -**Math sketch.** One application of -`Convex.norm_image_sub_le_of_norm_hasDerivWithin_le` on `(Ξ² Β· ).2` -over the convex window `Icc t_start (t_start + Ξ΄)`, with `y := s` -universally quantified: - `β€–(Ξ² s).2 - (Ξ² t_start).2β€– ≀ M Β· β€–s - t_startβ€– = M Β· (s - t_start)`. -Triangle with `β€–(Ξ² t_start).2β€– = β€–w.2β€– ≀ h_vel_init` (using `hΞ²_init`) -gives the conclusion. - -The universal quantification over `y` in the mean-value lemma is what -makes this WINDOW-WIDE from ONE invocation β€” no per-s re-application. -/ -lemma vlasov_window_velocity_bound - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (w : PhaseSpace d) (a : NNReal) (M : NNReal) - (t_start Ξ΄ : ℝ) (hΞ΄_pos : 0 < Ξ΄) (hΞ΄_le_one : Ξ΄ ≀ 1) - (h_vel_init : ℝ) (hΞ²_init_vel_bound : β€–w.2β€– ≀ h_vel_init) - (Ξ² : ℝ β†’ PhaseSpace d) (hΞ²_init : Ξ² t_start = w) - (hΞ²_ode_Icc : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), - HasDerivWithinAt (fun s => (Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) - (Set.Icc t_start (t_start + Ξ΄)) t) - (h_Ξ²_in_ball : βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), - (Ξ² s).1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2)) - (hbound : βˆ€ t ∈ Set.Icc t_start (t_start + 1), - βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : - βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), - β€–(Ξ² s).2β€– ≀ h_vel_init + (M : ℝ) * (s - t_start) := by - intro s hs - -- Convexity of the window. - have h_convex : Convex ℝ (Set.Icc t_start (t_start + Ξ΄)) := convex_Icc _ _ - have h_t_start_in : t_start ∈ Set.Icc t_start (t_start + Ξ΄) := - ⟨le_refl _, by linarith⟩ - -- Force bound on the window (via h_Ξ²_in_ball). - have h_force_window : βˆ€ u ∈ Set.Icc t_start (t_start + Ξ΄), - β€–-(convolveFunctionMeasure gradW (ρ u) (Ξ² u).1)β€– ≀ (M : ℝ) := by - intro u hu - rw [norm_neg] - have hu_time : u ∈ Set.Icc t_start (t_start + 1) := - ⟨hu.1, le_trans hu.2 (by linarith [hΞ΄_le_one])⟩ - exact hbound u hu_time (Ξ² u).1 (h_Ξ²_in_ball u hu) - -- Velocity ODE on the window. - have h_vel_ode : βˆ€ u ∈ Set.Icc t_start (t_start + Ξ΄), - HasDerivWithinAt (fun v => (Ξ² v).2) - (-(convolveFunctionMeasure gradW (ρ u) (Ξ² u).1)) - (Set.Icc t_start (t_start + Ξ΄)) u := - fun u hu => hΞ²_ode_Icc u hu - -- Apply Convex.norm_image_sub_le with x := t_start, y := s. - have h_mv : β€–(Ξ² s).2 - (Ξ² t_start).2β€– ≀ (M : ℝ) * β€–s - t_startβ€– := - h_convex.norm_image_sub_le_of_norm_hasDerivWithin_le - h_vel_ode h_force_window h_t_start_in hs - have h_diff_nn : 0 ≀ s - t_start := by linarith [hs.1] - rw [Real.norm_of_nonneg h_diff_nn] at h_mv - -- Ξ² t_start = w, so (Ξ² t_start).2 = w.2. - have h_Ξ²_t_start_vel : (Ξ² t_start).2 = w.2 := by rw [hΞ²_init] - -- Triangle: β€–(Ξ² s).2β€– ≀ β€–(Ξ² s).2 - (Ξ² t_start).2β€– + β€–(Ξ² t_start).2β€–. - have h_decomp : (Ξ² s).2 = ((Ξ² s).2 - (Ξ² t_start).2) + (Ξ² t_start).2 := - (sub_add_cancel _ _).symm - have h_triangle : β€–(Ξ² s).2β€– - ≀ β€–(Ξ² s).2 - (Ξ² t_start).2β€– + β€–(Ξ² t_start).2β€– := by - calc β€–(Ξ² s).2β€– = β€–((Ξ² s).2 - (Ξ² t_start).2) + (Ξ² t_start).2β€– := by rw [← h_decomp] - _ ≀ _ := norm_add_le _ _ - -- Combine: β€–(Ξ² s).2β€– ≀ MΒ·(s - t_start) + β€–w.2β€– ≀ h_vel_init + MΒ·(s - t_start). - rw [h_Ξ²_t_start_vel] at h_triangle - -- h_mv has `(Ξ² t_start).2`; rewrite to `w.2` for compatibility. - rw [h_Ξ²_t_start_vel] at h_mv - linarith [h_mv, hΞ²_init_vel_bound] - -/-- **Helper 3: Window endpoint position bound.** - -For a trajectory Ξ² with position-component ODE -`(Ξ² Β· ).1' = (Ξ² Β· ).2` on `[t_start, t_start + Ξ΄]` and a uniform -velocity bound `V_bound` (typically Helper 2's output composed with -a worst-case substitution), the position at `t_start + Ξ΄` is bounded -relative to an explicit reference point `x_ref`: - `β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– ≀ h_pos_init + V_bound Β· Ξ΄` -where `h_pos_init β‰₯ β€–w.1 - x_refβ€–`. - -**Math sketch.** One application of -`Convex.norm_image_sub_le_of_norm_hasDerivWithin_le` on `(Ξ² Β· ).1` -over the convex window with `x := t_start`, `y := t_start + Ξ΄`: - `β€–(Ξ² (t_start + Ξ΄)).1 - (Ξ² t_start).1β€– ≀ V_bound Β· Ξ΄` (using - `hΞ²_init` for `(Ξ² t_start).1 = w.1`). -Triangle with `β€–w.1 - x_refβ€– ≀ h_pos_init` gives the conclusion. - -**Genericity.** `x_ref : PhysSpace d` is an explicit parameter, NOT -hardcoded to the N-window induction's `zβ‚€.1`. This makes the helper -reusable for the Lagrangian β†’ Eulerian chain rule (reference point: -support of test function Ο†), well-posedness's Banach iteration -(reference point: fixed-point candidate), etc. -/ -lemma vlasov_window_position_bound - {d : β„•} - (_gradW : PhysSpace d β†’ PhysSpace d) - (_ρ : ℝ β†’ Measure (PhysSpace d)) - (w : PhaseSpace d) - (t_start Ξ΄ : ℝ) (hΞ΄_pos : 0 < Ξ΄) - (V_bound : ℝ) - (x_ref : PhysSpace d) - (h_pos_init : ℝ) (hΞ²_init_pos_bound : β€–w.1 - x_refβ€– ≀ h_pos_init) - (Ξ² : ℝ β†’ PhaseSpace d) (hΞ²_init : Ξ² t_start = w) - (hΞ²_ode_Icc : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), - HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 - (Set.Icc t_start (t_start + Ξ΄)) t) - (h_window_vel : βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), - β€–(Ξ² s).2β€– ≀ V_bound) : - β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– ≀ h_pos_init + V_bound * Ξ΄ := by - -- Convexity of the window. - have h_convex : Convex ℝ (Set.Icc t_start (t_start + Ξ΄)) := convex_Icc _ _ - have h_t_start_in : t_start ∈ Set.Icc t_start (t_start + Ξ΄) := - ⟨le_refl _, by linarith⟩ - have h_t_end_in : t_start + Ξ΄ ∈ Set.Icc t_start (t_start + Ξ΄) := - ⟨by linarith, le_refl _⟩ - -- Position ODE on the window. - have h_pos_ode : βˆ€ u ∈ Set.Icc t_start (t_start + Ξ΄), - HasDerivWithinAt (fun v => (Ξ² v).1) (Ξ² u).2 - (Set.Icc t_start (t_start + Ξ΄)) u := - fun u hu => hΞ²_ode_Icc u hu - -- Apply Convex.norm_image_sub_le with x := t_start, y := t_start + Ξ΄. - have h_mv : β€–(Ξ² (t_start + Ξ΄)).1 - (Ξ² t_start).1β€– - ≀ V_bound * β€–(t_start + Ξ΄) - t_startβ€– := - h_convex.norm_image_sub_le_of_norm_hasDerivWithin_le - h_pos_ode h_window_vel h_t_start_in h_t_end_in - have h_Ξ΄_eq : (t_start + Ξ΄) - t_start = Ξ΄ := by ring - rw [h_Ξ΄_eq, Real.norm_of_nonneg (le_of_lt hΞ΄_pos)] at h_mv - -- Ξ² t_start = w, so (Ξ² t_start).1 = w.1. - have h_Ξ²_t_start_pos : (Ξ² t_start).1 = w.1 := by rw [hΞ²_init] - rw [h_Ξ²_t_start_pos] at h_mv - -- Triangle: β€–(Ξ² (t_start+Ξ΄)).1 - x_refβ€– - -- ≀ β€–(Ξ² (t_start+Ξ΄)).1 - w.1β€– + β€–w.1 - x_refβ€– - -- ≀ V_bound Β· Ξ΄ + h_pos_init. - have h_decomp : (Ξ² (t_start + Ξ΄)).1 - x_ref - = ((Ξ² (t_start + Ξ΄)).1 - w.1) + (w.1 - x_ref) := by - rw [sub_add_sub_cancel] - have h_triangle : β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– - ≀ β€–(Ξ² (t_start + Ξ΄)).1 - w.1β€– + β€–w.1 - x_refβ€– := by - calc β€–(Ξ² (t_start + Ξ΄)).1 - x_refβ€– - = β€–((Ξ² (t_start + Ξ΄)).1 - w.1) + (w.1 - x_ref)β€– := by rw [← h_decomp] - _ ≀ _ := norm_add_le _ _ - linarith [h_mv, hΞ²_init_pos_bound] - -/-- **Tight per-window Picard with an EXPLICIT step Ξ΄ and an ADAPTIVE force-window.** - -Tight form of `exists_vlasov_extend_one_window`: the force bound is required -only on `[t_start, t_start + Ξ΄]` (the actual step), not the loose unit window -`[t_start, t_start + 1]`, and `Ξ΄` is supplied by the caller (so the N-window -chain can tile exactly, `NΒ·Ξ΄ = T`, dissolving the `(T+1)Β²` β†’ `TΒ²` smallness). -/ -lemma exists_vlasov_extend_one_window_tight - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - (w : PhaseSpace d) (a : NNReal) (ha : 0 < a) (M : NNReal) - (V_max : NNReal) (hV : β€–w.2β€– ≀ (V_max : ℝ)) - (t_start : ℝ) - (Ξ΄ : ℝ) (hΞ΄_pos : 0 < Ξ΄) - (hΞ΄_le : Ξ΄ ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) - (hbound : βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), - βˆ€ x ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : - βˆƒ Ξ² : ℝ β†’ PhaseSpace d, - Ξ² t_start = w ∧ - (βˆ€ t ∈ Set.Ioo t_start (t_start + Ξ΄), - HasDerivAt (fun s => (Ξ² s).1) (Ξ² t).2 t ∧ - HasDerivAt (fun s => (Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) t) ∧ - (βˆ€ t ∈ Set.Icc t_start (t_start + Ξ΄), - HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 - (Set.Icc t_start (t_start + Ξ΄)) t ∧ - HasDerivWithinAt (fun s => (Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) - (Set.Icc t_start (t_start + Ξ΄)) t) ∧ - (βˆ€ s ∈ Set.Icc t_start (t_start + Ξ΄), Ξ² s ∈ Metric.closedBall w (a : ℝ)) := by - classical - set K_pl : NNReal := max 1 L with hK_pl_def - set r_pl : NNReal := a / 2 with hr_pl_def - set L_pl : NNReal := V_max + a + M with hL_pl_def - have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha - have h_denom_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by positivity - have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / ((L_pl : ℝ) + 1) := hΞ΄_le - let tβ‚€ : Set.Icc t_start (t_start + Ξ΄) := - ⟨t_start, Set.mem_Icc.mpr ⟨le_refl _, by linarith⟩⟩ - have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ w a r_pl L_pl K_pl := by - refine ⟨?_, ?_, ?_, ?_⟩ - Β· intro t _ - exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith - Β· intro x _ - apply Continuous.continuousOn - simp only [vlasovVectorField] - exact Continuous.prodMk continuous_const (hρ_cont x.1).neg - Β· intro t ht x hx - have h_norm_field := vlasovVectorField_norm_le gradW ρ t x - have hdist_le : dist x w ≀ (a : ℝ) := hx - have hdist_le_norm : β€–x - wβ€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le - have h_x2_proj : β€–x.2 - w.2β€– ≀ β€–x - wβ€– := by - rw [Prod.norm_def]; exact le_max_right _ _ - have h_x2_bound : β€–x.2β€– ≀ β€–w.2β€– + (a : ℝ) := by - have h1 : β€–x.2β€– = β€–(x.2 - w.2) + w.2β€– := by rw [sub_add_cancel] - have h2 : β€–(x.2 - w.2) + w.2β€– ≀ β€–x.2 - w.2β€– + β€–w.2β€– := norm_add_le _ _ - linarith [h_x2_proj, hdist_le_norm] - have h_x1_proj : dist x.1 w.1 ≀ dist x w := by - simp only [Prod.dist_eq]; exact le_max_left _ _ - have h_x1_ball : x.1 ∈ Metric.closedBall w.1 (3 * (a : ℝ) / 2) := by - rw [Metric.mem_closedBall] - have hx1d : dist x.1 w.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le - have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real - linarith - have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := - hbound t ht x.1 h_x1_ball - have h_Lpl_eq : (L_pl : ℝ) = (V_max : ℝ) + (a : ℝ) + (M : ℝ) := by - simp [hL_pl_def, NNReal.coe_add] - have h_x2_bound' : β€–x.2β€– ≀ (V_max : ℝ) + (a : ℝ) := - le_trans h_x2_bound (by linarith [hV]) - calc β€–vlasovVectorField gradW ρ t xβ€– - ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field - _ ≀ (L_pl : ℝ) := by - rw [h_Lpl_eq] - apply max_le - Β· linarith [NNReal.coe_nonneg M, h_x2_bound'] - Β· linarith [norm_nonneg w.2, NNReal.coe_nonneg a, NNReal.coe_nonneg V_max] - Β· show (L_pl : ℝ) * max ((t_start + Ξ΄) - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - t_start) - ≀ (a : ℝ) - (r_pl : ℝ) - have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl - simp only [htβ‚€_eq, add_sub_cancel_left, sub_self, max_eq_left (le_of_lt hΞ΄_pos)] - have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by - simp [hr_pl_def, NNReal.coe_div]; ring - rw [h_a_minus_r] - have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg - have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] - have h_step : (L_pl : ℝ) * Ξ΄ ≀ (L_pl : ℝ) * - ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) := - mul_le_mul_of_nonneg_left hΞ΄_le_ratio h_Lpl_nn - have h_rewrite : (L_pl : ℝ) * ((a : ℝ) / 2 / ((L_pl : ℝ) + 1)) - = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by ring - have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by - rw [div_le_one h_denom_pos]; linarith - have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by - calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) - ≀ 1 * ((a : ℝ) / 2) := - mul_le_mul_of_nonneg_right h_frac_le h_a_nn - _ = (a : ℝ) / 2 := one_mul _ - linarith [h_step, h_rewrite β–Έ h_step, h_bound] - obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined - have hw_in_r : w ∈ Metric.closedBall w ((r_pl : ℝ)) := by - rw [Metric.mem_closedBall, dist_self] - exact r_pl.coe_nonneg - have hΞ±_w := hΞ± w hw_in_r - refine ⟨fun t => Ξ± w t, ?_, ?_, ?_, ?_⟩ - Β· have h_init : Ξ± w (tβ‚€ : ℝ) = w := hΞ±_w.1 - have htβ‚€_eq : (tβ‚€ : ℝ) = t_start := rfl - rw [htβ‚€_eq] at h_init - exact h_init - Β· intro t ht - have h_t_Icc : t ∈ Set.Icc t_start (t_start + Ξ΄) := - ⟨le_of_lt ht.1, le_of_lt ht.2⟩ - have h_dw := hΞ±_w.2.1 t h_t_Icc - have h_icc_nhds : Set.Icc t_start (t_start + Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 - have h_d : HasDerivAt (Ξ± w) (vlasovVectorField gradW ρ t (Ξ± w t)) t := - h_dw.hasDerivAt h_icc_nhds - refine ⟨?_, ?_⟩ - Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).1) - (vlasovVectorField gradW ρ t (Ξ± w t)).1 t := - (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - Β· have h_proj : HasDerivAt (fun s => (Ξ± w s).2) - (vlasovVectorField gradW ρ t (Ξ± w t)).2 t := - (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - Β· intro t ht - have h_dw := hΞ±_w.2.1 t ht - refine ⟨?_, ?_⟩ - Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).1) - (vlasovVectorField gradW ρ t (Ξ± w t)).1 - (Set.Icc t_start (t_start + Ξ΄)) t := - (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw - simpa [vlasovVectorField] using h_proj - Β· have h_proj : HasDerivWithinAt (fun s => (Ξ± w s).2) - (vlasovVectorField gradW ρ t (Ξ± w t)).2 - (Set.Icc t_start (t_start + Ξ΄)) t := - (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivWithinAt t h_dw - simpa [vlasovVectorField] using h_proj - Β· intro s hs - exact hΞ±_w.2.2 s hs - -/-- On the degenerate interval `Icc c c`, every function trivially has every -within-derivative at `c` (the point is not an accumulation point of the -singleton). Serves the `T = 0` branch and the tiling base case of the tight -flow construction. -/ -private lemma hasDerivWithinAt_Icc_self {E : Type*} - [NormedAddCommGroup E] [NormedSpace ℝ E] - (f : ℝ β†’ E) (v : E) (c : ℝ) : - HasDerivWithinAt f v (Set.Icc c c) c := by - have h_notAccPt : Β¬ AccPt c (Filter.principal (Set.Icc c c)) := by - rw [accPt_iff_clusterPt, Filter.inf_principal] - simp [ClusterPt, Set.Icc_self] - rw [hasDerivWithinAt_iff_hasFDerivWithinAt] - exact HasFDerivWithinAt.of_not_accPt h_notAccPt - -/-- Adaptive-window force bound for the tight tiling: on any window -`[c, c + Ξ΄] βŠ† [0, T]` whose entry position `p` satisfies the linear drift -invariant `β€–p - zβ‚€.1β€– ≀ a/2 + V_maxΒ·c`, the global `hbound` (radius `R` from -the tight `hR`) restricts to the moving ball `closedBall p (3a/2)`. -/ -private lemma charFlowTight_window_forceBound - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (zβ‚€ : PhaseSpace d) (a M V_max R : NNReal) (T : ℝ) (hT : 0 ≀ T) - (hV_max_def : V_max = β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T) - (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) - (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) - (c Ξ΄ : ℝ) (hc_nn : 0 ≀ c) (hc_le_T : c ≀ T) (hcΞ΄_le_T : c + Ξ΄ ≀ T) - (p : PhysSpace d) - (hp : β€–p - zβ‚€.1β€– ≀ (a : ℝ) / 2 + (V_max : ℝ) * c) : - βˆ€ t ∈ Set.Icc c (c + Ξ΄), βˆ€ x ∈ Metric.closedBall p (3 * (a : ℝ) / 2), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M := by - intro t ht x hx - have h_t_in_global : t ∈ Set.Icc (0 : ℝ) T := - ⟨le_trans hc_nn ht.1, le_trans ht.2 hcΞ΄_le_T⟩ - have h_x_local : dist x p ≀ 3 * (a : ℝ) / 2 := hx - have h_pos_chain : dist x zβ‚€.1 - ≀ 3 * (a : ℝ) / 2 + ((a : ℝ) / 2 + (V_max : ℝ) * c) := by - calc dist x zβ‚€.1 - ≀ dist x p + dist p zβ‚€.1 := dist_triangle _ _ _ - _ ≀ 3 * (a : ℝ) / 2 + _ := by - rw [dist_eq_norm] - exact add_le_add h_x_local hp - have h_V_max_coe : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T := by - have h_V_def : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (T.toNNReal : ℝ) := by - simp [hV_max_def, NNReal.coe_add, coe_nnnorm, NNReal.coe_mul, NNReal.coe_div] - rw [h_V_def, Real.coe_toNNReal _ hT] - have h_V_max_nn : (0 : ℝ) ≀ (V_max : ℝ) := V_max.coe_nonneg - have h_R_expand : 2 * (a : ℝ) + (V_max : ℝ) * T ≀ R := by - have h_ring : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T) * T - = 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 := by ring - rw [h_V_max_coe, h_ring]; exact hR - have h_x_in_R : dist x zβ‚€.1 ≀ (R : ℝ) := by - have h_pos_worst : (V_max : ℝ) * c ≀ (V_max : ℝ) * T := - mul_le_mul_of_nonneg_left hc_le_T h_V_max_nn - linarith [h_pos_chain] - exact hbound t h_t_in_global x h_x_in_R - -/-- Mean-value velocity carry along one window: if `Ξ²` solves the velocity ODE -on `[c, b]` with force bounded by `Mr`, then `β€–(Ξ² s).2β€–` grows at most linearly -from its entry value. Shared by the velocity- and position-invariant steps of -`charFlowTight_window_step`. -/ -private lemma charFlowTight_window_velocity_carry - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (Ξ² : ℝ β†’ PhaseSpace d) (c b : ℝ) (hcb : c ≀ b) (Mr : ℝ) - (h_vel : βˆ€ s ∈ Set.Icc c b, - HasDerivWithinAt (fun u => (Ξ² u).2) - (-(convolveFunctionMeasure gradW (ρ s) (Ξ² s).1)) (Set.Icc c b) s) - (h_force : βˆ€ s ∈ Set.Icc c b, - β€–convolveFunctionMeasure gradW (ρ s) (Ξ² s).1β€– ≀ Mr) : - βˆ€ s ∈ Set.Icc c b, β€–(Ξ² s).2β€– ≀ β€–(Ξ² c).2β€– + Mr * (s - c) := by - intro s hs - have h_convex : Convex ℝ (Set.Icc c b) := convex_Icc _ _ - have h_c_in : c ∈ Set.Icc c b := ⟨le_refl _, hcb⟩ - have h_force_neg : βˆ€ u ∈ Set.Icc c b, - β€–-(convolveFunctionMeasure gradW (ρ u) (Ξ² u).1)β€– ≀ Mr := by - intro u hu; rw [norm_neg]; exact h_force u hu - have h_mv : β€–(Ξ² s).2 - (Ξ² c).2β€– ≀ Mr * β€–s - cβ€– := - h_convex.norm_image_sub_le_of_norm_hasDerivWithin_le h_vel h_force_neg h_c_in hs - have h_diff_nn : 0 ≀ s - c := by linarith [hs.1] - rw [Real.norm_of_nonneg h_diff_nn] at h_mv - have h_triangle : β€–(Ξ² s).2β€– ≀ β€–(Ξ² s).2 - (Ξ² c).2β€– + β€–(Ξ² c).2β€– := by - have h_decomp : (Ξ² s).2 = ((Ξ² s).2 - (Ξ² c).2) + (Ξ² c).2 := - (sub_add_cancel _ _).symm - calc β€–(Ξ² s).2β€– = β€–((Ξ² s).2 - (Ξ² c).2) + (Ξ² c).2β€– := by rw [← h_decomp] - _ ≀ _ := norm_add_le _ _ - linarith - -/-- Gluing step for the tight tiling: the `Set.piecewise (Set.Iic c)` splice of -a left solution on `[0, c]` and a right solution on `[c, b]` (agreeing at the -join) solves the characteristic ODE system on all of `[0, b]`, via -`HasDerivWithinAt.union` on `Icc 0 c βˆͺ Icc c b = Icc 0 b`. -/ -private lemma charFlowTight_piecewise_ode - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (Ξ³L Ξ² : ℝ β†’ PhaseSpace d) - (c b : ℝ) (hc_nn : 0 ≀ c) (hcb : c ≀ b) - (h_join : Ξ² c = Ξ³L c) - (h_ode_L : βˆ€ t ∈ Set.Icc (0 : ℝ) c, - HasDerivWithinAt (fun s => (Ξ³L s).1) (Ξ³L t).2 (Set.Icc (0 : ℝ) c) t ∧ - HasDerivWithinAt (fun s => (Ξ³L s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ³L t).1)) (Set.Icc (0 : ℝ) c) t) - (h_ode_R : βˆ€ t ∈ Set.Icc c b, - HasDerivWithinAt (fun s => (Ξ² s).1) (Ξ² t).2 (Set.Icc c b) t ∧ - HasDerivWithinAt (fun s => (Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ² t).1)) (Set.Icc c b) t) : - βˆ€ t ∈ Set.Icc (0 : ℝ) b, - HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).1) - (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 (Set.Icc (0 : ℝ) b) t ∧ - HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) - (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1)) (Set.Icc (0 : ℝ) b) t := by - classical - intro t ht - have h_left : βˆ€ y ≀ c, Set.piecewise (Set.Iic c) Ξ³L Ξ² y = Ξ³L y := fun y hy => - Set.piecewise_eq_of_mem _ _ _ hy - have h_right : βˆ€ y, c < y β†’ Set.piecewise (Set.Iic c) Ξ³L Ξ² y = Ξ² y := fun y hy => - Set.piecewise_eq_of_notMem _ _ _ (not_le.mpr hy) - have h_at_join : Set.piecewise (Set.Iic c) Ξ³L Ξ² c = Ξ³L c := h_left _ (le_refl _) - have h_on_right_Icc : βˆ€ y ∈ Set.Icc c b, - Set.piecewise (Set.Iic c) Ξ³L Ξ² y = Ξ² y := by - intro y hy - rcases eq_or_lt_of_le hy.1 with hy_eq | hy_lt - Β· rw [← hy_eq, h_at_join, h_join] - Β· exact h_right y hy_lt - have h_set_union : Set.Icc (0 : ℝ) c βˆͺ Set.Icc c b = Set.Icc (0 : ℝ) b := - Set.Icc_union_Icc_eq_Icc hc_nn hcb - have hA_pos : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).1) - (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 (Set.Icc (0 : ℝ) c) t := by - by_cases ht_left : t ≀ c - Β· have ht_in : t ∈ Set.Icc (0 : ℝ) c := ⟨ht.1, ht_left⟩ - have h_Ξ³L_pos := (h_ode_L t ht_in).1 - have h_deriv_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 = (Ξ³L t).2 := by - rw [h_left t ht_left] - rw [h_deriv_eq] - refine h_Ξ³L_pos.congr (fun y hy => ?_) ?_ - Β· rw [h_left y hy.2] - Β· rw [h_left t ht_left] - Β· rw [not_le] at ht_left - rw [hasDerivWithinAt_iff_hasFDerivWithinAt] - apply HasFDerivWithinAt.of_notMem_closure - rw [closure_Icc, Set.mem_Icc] - rintro ⟨_, _⟩; linarith - have hB_pos : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).1) - (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 (Set.Icc c b) t := by - by_cases ht_right : c ≀ t - Β· have ht_in : t ∈ Set.Icc c b := ⟨ht_right, ht.2⟩ - have h_Ξ²_pos := (h_ode_R t ht_in).1 - have h_deriv_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).2 = (Ξ² t).2 := by - rw [h_on_right_Icc t ht_in] - rw [h_deriv_eq] - refine h_Ξ²_pos.congr (fun y hy => ?_) ?_ - Β· rw [h_on_right_Icc y hy] - Β· rw [h_on_right_Icc t ht_in] - Β· rw [not_le] at ht_right - rw [hasDerivWithinAt_iff_hasFDerivWithinAt] - apply HasFDerivWithinAt.of_notMem_closure - rw [closure_Icc, Set.mem_Icc] - rintro ⟨_, _⟩; linarith - have hA_vel : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) - (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1)) (Set.Icc (0 : ℝ) c) t := by - by_cases ht_left : t ≀ c - Β· have ht_in : t ∈ Set.Icc (0 : ℝ) c := ⟨ht.1, ht_left⟩ - have h_Ξ³L_vel := (h_ode_L t ht_in).2 - have h_pos_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1 = (Ξ³L t).1 := by - rw [h_left t ht_left] - rw [h_pos_eq] - refine h_Ξ³L_vel.congr (fun y hy => ?_) ?_ - Β· rw [h_left y hy.2] - Β· rw [h_left t ht_left] - Β· rw [not_le] at ht_left - rw [hasDerivWithinAt_iff_hasFDerivWithinAt] - apply HasFDerivWithinAt.of_notMem_closure - rw [closure_Icc, Set.mem_Icc] - rintro ⟨_, _⟩; linarith - have hB_vel : HasDerivWithinAt (fun s => (Set.piecewise (Set.Iic c) Ξ³L Ξ² s).2) - (-(convolveFunctionMeasure gradW (ρ t) - (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1)) (Set.Icc c b) t := by - by_cases ht_right : c ≀ t - Β· have ht_in : t ∈ Set.Icc c b := ⟨ht_right, ht.2⟩ - have h_Ξ²_vel := (h_ode_R t ht_in).2 - have h_pos_eq : (Set.piecewise (Set.Iic c) Ξ³L Ξ² t).1 = (Ξ² t).1 := by - rw [h_on_right_Icc t ht_in] - rw [h_pos_eq] - refine h_Ξ²_vel.congr (fun y hy => ?_) ?_ - Β· rw [h_on_right_Icc y hy] - Β· rw [h_on_right_Icc t ht_in] - Β· rw [not_le] at ht_right - rw [hasDerivWithinAt_iff_hasFDerivWithinAt] - apply HasFDerivWithinAt.of_notMem_closure - rw [closure_Icc, Set.mem_Icc] - rintro ⟨_, _⟩; linarith - constructor - Β· have h_union_pos := hA_pos.union hB_pos - rw [h_set_union] at h_union_pos - exact h_union_pos - Β· have h_union_vel := hA_vel.union hB_vel - rw [h_set_union] at h_union_vel - exact h_union_vel - -/-- One tiling step for the tight flow: extend a trajectory satisfying the -tight invariants on `[0, c]` to `[0, c + Ξ΄']` via -`exists_vlasov_extend_one_window_tight`, splicing with `Set.piecewise` -(`charFlowTight_piecewise_ode`) and carrying the linear velocity- and -position-drift invariants (`charFlowTight_window_velocity_carry` + -`vlasov_window_position_bound`). -/ -private lemma charFlowTight_window_step - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) - (M V_max R : NNReal) (T : ℝ) (hT : 0 ≀ T) - (hV_max_def : V_max = β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T) - (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) - (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) - (Ξ΄' : ℝ) (hΞ΄'_pos : 0 < Ξ΄') - (hΞ΄'_le_max : Ξ΄' ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) - (z : PhaseSpace d) (c : ℝ) (hc_nn : 0 ≀ c) (hcΞ΄_le_T : c + Ξ΄' ≀ T) - (Ξ³_k : ℝ β†’ PhaseSpace d) (h_Ξ³0 : Ξ³_k 0 = z) - (h_ode_k : βˆ€ t ∈ Set.Icc (0 : ℝ) c, - HasDerivWithinAt (fun s => (Ξ³_k s).1) (Ξ³_k t).2 (Set.Icc (0 : ℝ) c) t ∧ - HasDerivWithinAt (fun s => (Ξ³_k s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ³_k t).1)) (Set.Icc (0 : ℝ) c) t) - (h_vel_k : β€–(Ξ³_k c).2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * c) - (h_pos_k : β€–(Ξ³_k c).1 - zβ‚€.1β€– ≀ (a : ℝ) / 2 + (V_max : ℝ) * c) : - βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, Ξ³ 0 = z ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) (c + Ξ΄'), - HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 - (Set.Icc (0 : ℝ) (c + Ξ΄')) t ∧ - HasDerivWithinAt (fun s => (Ξ³ s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) - (Set.Icc (0 : ℝ) (c + Ξ΄')) t) ∧ - β€–(Ξ³ (c + Ξ΄')).2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (c + Ξ΄') ∧ - β€–(Ξ³ (c + Ξ΄')).1 - zβ‚€.1β€– ≀ (a : ℝ) / 2 + (V_max : ℝ) * (c + Ξ΄') := by - classical - have hc_lt_b : c < c + Ξ΄' := by linarith - have hc_le_T : c ≀ T := by linarith - have hM_nn : (0 : ℝ) ≀ (M : ℝ) := M.coe_nonneg - have h_V_max_coe : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T := by - have h_V_def : (V_max : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (T.toNNReal : ℝ) := by - simp [hV_max_def, NNReal.coe_add, coe_nnnorm, NNReal.coe_mul, NNReal.coe_div] - rw [h_V_def, Real.coe_toNNReal _ hT] - have h_vel_Vmax : β€–(Ξ³_k c).2β€– ≀ (V_max : ℝ) := by - rw [h_V_max_coe] - calc β€–(Ξ³_k c).2β€– - ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * c := h_vel_k - _ ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * T := by - linarith [mul_le_mul_of_nonneg_left hc_le_T hM_nn] - have hbound_local := charFlowTight_window_forceBound gradW ρ zβ‚€ a M V_max R T hT - hV_max_def hR hbound c Ξ΄' hc_nn hc_le_T hcΞ΄_le_T (Ξ³_k c).1 h_pos_k - obtain ⟨β, hΞ²_init, _hΞ²_ode_Ioo, hΞ²_ode_Icc, hΞ²_confined⟩ := - exists_vlasov_extend_one_window_tight gradW L hL ρ h_int hρ_cont - (Ξ³_k c) a ha M V_max h_vel_Vmax c Ξ΄' hΞ΄'_pos hΞ΄'_le_max hbound_local - have h_Ξ²_in_ball : βˆ€ s ∈ Set.Icc c (c + Ξ΄'), - (Ξ² s).1 ∈ Metric.closedBall (Ξ³_k c).1 (3 * (a : ℝ) / 2) := by - intro s hs - have h_phase : Ξ² s ∈ Metric.closedBall (Ξ³_k c) (a : ℝ) := hΞ²_confined s hs - rw [Metric.mem_closedBall] at h_phase ⊒ - have h_proj : dist (Ξ² s).1 (Ξ³_k c).1 ≀ dist (Ξ² s) (Ξ³_k c) := by - rw [Prod.dist_eq]; exact le_max_left _ _ - have h_a_nn : (0 : ℝ) ≀ (a : ℝ) := a.coe_nonneg - linarith - have h_force_window : βˆ€ s ∈ Set.Icc c (c + Ξ΄'), - β€–convolveFunctionMeasure gradW (ρ s) (Ξ² s).1β€– ≀ (M : ℝ) := fun s hs => - hbound_local s hs (Ξ² s).1 (h_Ξ²_in_ball s hs) - have h_vel_carry := charFlowTight_window_velocity_carry gradW ρ Ξ² c (c + Ξ΄') - (le_of_lt hc_lt_b) (M : ℝ) (fun s hs => (hΞ²_ode_Icc s hs).2) h_force_window - have h_Ξ²_c_vel : (Ξ² c).2 = (Ξ³_k c).2 := by rw [hΞ²_init] - have h_ode_pw := charFlowTight_piecewise_ode gradW ρ Ξ³_k Ξ² c (c + Ξ΄') hc_nn - (le_of_lt hc_lt_b) hΞ²_init h_ode_k hΞ²_ode_Icc - have h_right_end : Set.piecewise (Set.Iic c) Ξ³_k Ξ² (c + Ξ΄') = Ξ² (c + Ξ΄') := - Set.piecewise_eq_of_notMem _ _ _ (not_le.mpr hc_lt_b) - have h_left0 : Set.piecewise (Set.Iic c) Ξ³_k Ξ² 0 = Ξ³_k 0 := - Set.piecewise_eq_of_mem _ _ _ hc_nn - refine ⟨Set.piecewise (Set.Iic c) Ξ³_k Ξ², by rw [h_left0, h_Ξ³0], h_ode_pw, ?_, ?_⟩ - Β· -- Velocity invariant at the new endpoint, via the mean-value carry. - rw [h_right_end] - have h_carry_b := h_vel_carry (c + Ξ΄') ⟨le_of_lt hc_lt_b, le_refl _⟩ - rw [h_Ξ²_c_vel] at h_carry_b - have h_ring : (M : ℝ) * (c + Ξ΄' - c) = (M : ℝ) * Ξ΄' := by ring - rw [h_ring] at h_carry_b - calc β€–(Ξ² (c + Ξ΄')).2β€– - ≀ β€–(Ξ³_k c).2β€– + (M : ℝ) * Ξ΄' := h_carry_b - _ ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * c + (M : ℝ) * Ξ΄' := by linarith [h_vel_k] - _ = β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (c + Ξ΄') := by ring - Β· -- Position invariant at the new endpoint, via the window position bound. - rw [h_right_end] - have h_window_vel_Vmax : βˆ€ s ∈ Set.Icc c (c + Ξ΄'), - β€–(Ξ² s).2β€– ≀ (V_max : ℝ) := by - intro s hs - have h_carry_s := h_vel_carry s hs - rw [h_Ξ²_c_vel] at h_carry_s - have h_s_le_T : s ≀ T := le_trans hs.2 hcΞ΄_le_T - have h_M_split : (M : ℝ) * (s - c) + (M : ℝ) * c = (M : ℝ) * s := by ring - have h_M_mono : (M : ℝ) * s ≀ (M : ℝ) * T := - mul_le_mul_of_nonneg_left h_s_le_T hM_nn - rw [h_V_max_coe] - linarith [h_carry_s, h_vel_k] - have h_pos_carry := - vlasov_window_position_bound gradW ρ (Ξ³_k c) c Ξ΄' hΞ΄'_pos - (V_max : ℝ) zβ‚€.1 ((a : ℝ) / 2 + (V_max : ℝ) * c) h_pos_k Ξ² hΞ²_init - (fun t ht => (hΞ²_ode_Icc t ht).1) h_window_vel_Vmax - calc β€–(Ξ² (c + Ξ΄')).1 - zβ‚€.1β€– - ≀ (a : ℝ) / 2 + (V_max : ℝ) * c + (V_max : ℝ) * Ξ΄' := h_pos_carry - _ = (a : ℝ) / 2 + (V_max : ℝ) * (c + Ξ΄') := by ring - -/-- Per-`z` trajectory for the tight flow: `N`-fold exact tiling of -`[0, NΒ·Ξ΄']` by windows of width `Ξ΄'`, by induction via -`charFlowTight_window_step`, carrying the tight velocity/position invariants -through the induction and discarding them at the end. -/ -private lemma charFlowTight_perZ_trajectory - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) - (M V_max R : NNReal) (T : ℝ) (hT : 0 ≀ T) - (hV_max_def : V_max = β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T) - (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) - (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) - (N : β„•) (Ξ΄' : ℝ) (hΞ΄'_pos : 0 < Ξ΄') - (hΞ΄'_le_max : Ξ΄' ≀ (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1)) - (hNΞ΄'_le_T : (N : ℝ) * Ξ΄' ≀ T) - (z : PhaseSpace d) (hz : z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2)) : - βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, - Ξ³ 0 = z ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄'), - HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 - (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t ∧ - HasDerivWithinAt (fun s => (Ξ³ s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) - (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t := by - suffices h_strong : βˆ€ k : β„•, k ≀ N β†’ βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, - Ξ³ 0 = z ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) ((k : ℝ) * Ξ΄'), - HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 - (Set.Icc (0 : ℝ) ((k : ℝ) * Ξ΄')) t ∧ - HasDerivWithinAt (fun s => (Ξ³ s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) - (Set.Icc (0 : ℝ) ((k : ℝ) * Ξ΄')) t) ∧ - β€–(Ξ³ ((k : ℝ) * Ξ΄')).2β€– ≀ - β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * ((k : ℝ) * Ξ΄') ∧ - β€–(Ξ³ ((k : ℝ) * Ξ΄')).1 - zβ‚€.1β€– ≀ - (a : ℝ) / 2 + (V_max : ℝ) * ((k : ℝ) * Ξ΄') by - obtain ⟨γ, hΞ³0, hode, _, _⟩ := h_strong N (le_refl N) - exact ⟨γ, hΞ³0, hode⟩ - intro k - induction k with - | zero => - intro _ - refine ⟨fun _ => z, rfl, ?_, ?_, ?_⟩ - Β· intro t ht - have ht_eq : t = 0 := le_antisymm (by simpa using ht.2) ht.1 - subst ht_eq - have h_set_eq : Set.Icc (0 : ℝ) (((0 : β„•) : ℝ) * Ξ΄') = Set.Icc (0 : ℝ) 0 := by - norm_num - rw [h_set_eq] - exact ⟨hasDerivWithinAt_Icc_self _ _ _, hasDerivWithinAt_Icc_self _ _ _⟩ - Β· have hdist : β€–z - zβ‚€β€– ≀ (a : ℝ) / 2 := by - rw [← dist_eq_norm]; exact hz - have h_z2_proj : β€–z.2 - zβ‚€.2β€– ≀ β€–z - zβ‚€β€– := by - rw [Prod.norm_def]; exact le_max_right _ _ - have h_z2_bound : β€–z.2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) / 2 := by - have h1 : β€–z.2β€– = β€–(z.2 - zβ‚€.2) + zβ‚€.2β€– := by rw [sub_add_cancel] - have h2 : β€–(z.2 - zβ‚€.2) + zβ‚€.2β€– ≀ β€–z.2 - zβ‚€.2β€– + β€–zβ‚€.2β€– := norm_add_le _ _ - linarith [h_z2_proj, hdist] - change β€–((fun _ => z) (((0 : β„•) : ℝ) * Ξ΄')).2β€– ≀ - β€–zβ‚€.2β€– + (a : ℝ) / 2 + (M : ℝ) * (((0 : β„•) : ℝ) * Ξ΄') - simp only [Nat.cast_zero, zero_mul, mul_zero, add_zero] - linarith - Β· have hdist : β€–z - zβ‚€β€– ≀ (a : ℝ) / 2 := by - rw [← dist_eq_norm]; exact hz - have h_z1_proj : β€–z.1 - zβ‚€.1β€– ≀ β€–z - zβ‚€β€– := by - rw [Prod.norm_def]; exact le_max_left _ _ - change β€–((fun _ => z) (((0 : β„•) : ℝ) * Ξ΄')).1 - zβ‚€.1β€– ≀ - (a : ℝ) / 2 + (V_max : ℝ) * (((0 : β„•) : ℝ) * Ξ΄') - simp only [Nat.cast_zero, zero_mul, mul_zero, add_zero] - linarith - | succ k ih => - intro hk_succ_le_N - obtain ⟨γ_k, h_Ξ³0, h_ode_k, h_vel_k, h_pos_k⟩ := - ih (Nat.le_of_succ_le hk_succ_le_N) - have h_kΞ΄_nn : (0 : ℝ) ≀ (k : ℝ) * Ξ΄' := by positivity - have h_kΞ΄_succ_eq : (k : ℝ) * Ξ΄' + Ξ΄' = ((k + 1 : β„•) : ℝ) * Ξ΄' := by - push_cast; ring - have h_succ_kΞ΄_le_T : ((k + 1 : β„•) : ℝ) * Ξ΄' ≀ T := by - calc ((k + 1 : β„•) : ℝ) * Ξ΄' - ≀ (N : ℝ) * Ξ΄' := by - have h_cast : ((k + 1 : β„•) : ℝ) ≀ (N : ℝ) := by - exact_mod_cast hk_succ_le_N - exact mul_le_mul_of_nonneg_right h_cast (le_of_lt hΞ΄'_pos) - _ ≀ T := hNΞ΄'_le_T - obtain ⟨γ, hΞ³0, h_ode, h_vel, h_pos⟩ := - charFlowTight_window_step gradW L hL ρ h_int hρ_cont zβ‚€ a ha M V_max R T hT - hV_max_def hR hbound Ξ΄' hΞ΄'_pos hΞ΄'_le_max z ((k : ℝ) * Ξ΄') h_kΞ΄_nn - (by rw [h_kΞ΄_succ_eq]; exact h_succ_kΞ΄_le_T) Ξ³_k h_Ξ³0 h_ode_k h_vel_k h_pos_k - rw [← h_kΞ΄_succ_eq] - exact ⟨γ, hΞ³0, h_ode, h_vel, h_pos⟩ - -/-- **Tight global per-ball flow: `[0,T]` force-window, `TΒ²` smallness (no `+1`).** - -Tight form of `exists_vlasov_characteristicFlow`. By tiling `[0,T]` -EXACTLY (`N = ⌈T/Ξ΄_maxβŒ‰` windows of width `Ξ΄' = T/N ≀ Ξ΄_max`, so `NΒ·Ξ΄' = T`) and -calling `exists_vlasov_extend_one_window_tight` with the adaptive force-window -`[kΒ·Ξ΄', (k+1)Β·Ξ΄']`, the global force-bound is required only on `[0,T]` and the -position drift is `MΒ·TΒ²` (not `MΒ·(T+1)Β²`). Consumers' R-selection then needs only -`LΒ·TΒ² < 1`, satisfiable for any `L` (threshold `T < 1/√L`), dissolving the `L<1` -restriction. -/ -theorem exists_vlasov_characteristicFlow_tight - {d : β„•} - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (_hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) - (M : NNReal) (T : ℝ) (hT : 0 ≀ T) - (R : NNReal) - (hR : 2 * (a : ℝ) + (β€–zβ‚€.2β€– + (a : ℝ) / 2) * T + (M : ℝ) * T ^ 2 ≀ R) - (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - βˆ€ x ∈ Metric.closedBall zβ‚€.1 (R : ℝ), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : - βˆƒ (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), - IsCharacteristicFlowOn gradW ρ charX charV - (Set.Ioo 0 T) (Metric.closedBall zβ‚€ ((a : ℝ) / 2)) ∧ - (βˆ€ z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2), - βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) - (Set.Icc (0 : ℝ) T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (ρ t) (charX t z))) - (Set.Icc (0 : ℝ) T) t) := by - classical - -- ============================================================ - -- Parameter setup (uniform across all windows and initial z). - -- TIGHT: V_max uses `T` (not `T+1`); EXACT tiling NΒ·Ξ΄' = T. - -- ============================================================ - set V_max : NNReal := - β€–zβ‚€.2β€–β‚Š + a / 2 + M * Real.toNNReal T with hV_max_def - have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha - have h_denom_pos : (0 : ℝ) < (((V_max + a + M : NNReal) : ℝ) + 1) := by positivity - set Ξ΄_max : ℝ := (a : ℝ) / 2 / (((V_max + a + M : NNReal) : ℝ) + 1) with hΞ΄_max_def - have hΞ΄_max_pos : (0 : ℝ) < Ξ΄_max := by rw [hΞ΄_max_def]; positivity - -- T = 0 edge case: the conclusion's intervals collapse. - rcases eq_or_lt_of_le hT with hT_eq | hT_pos - Β· -- T = 0: Ioo 0 0 = βˆ…, Icc 0 0 = {0}. Build the trivial flow Ξ³_func z s = z. - subst hT_eq - -- charX/charV constant in time, equal to z (resp. its components). - refine ⟨fun _ z => z.1, fun _ z => z.2, ⟨?_, ?_, ?_⟩, ?_⟩ - Β· intro z hz; exact ⟨rfl, rfl⟩ - Β· intro t ht z hz; exact absurd (lt_trans ht.1 ht.2) (lt_irrefl 0) - Β· intro t ht z hz; exact absurd (lt_trans ht.1 ht.2) (lt_irrefl 0) - Β· intro z hz t ht - have ht_eq : t = 0 := le_antisymm ht.2 ht.1 - subst ht_eq - exact ⟨hasDerivWithinAt_Icc_self _ _ _, hasDerivWithinAt_Icc_self _ _ _⟩ - Β· -- T > 0: EXACT tiling. - -- N := ⌈T/Ξ΄_maxβŒ‰β‚Š windows of width Ξ΄' = T/N ≀ Ξ΄_max, so NΒ·Ξ΄' = T. - set N : β„• := ⌈T / Ξ΄_maxβŒ‰β‚Š with hN_def - have hN_pos : 0 < N := by - rw [hN_def, Nat.ceil_pos] - positivity - have hN_real_pos : (0 : ℝ) < (N : ℝ) := by exact_mod_cast hN_pos - set Ξ΄' : ℝ := T / (N : ℝ) with hΞ΄'_def - have hΞ΄'_pos : (0 : ℝ) < Ξ΄' := by rw [hΞ΄'_def]; positivity - have hNΞ΄'_eq : (N : ℝ) * Ξ΄' = T := by - rw [hΞ΄'_def]; field_simp - -- Ξ΄' ≀ Ξ΄_max because N β‰₯ T/Ξ΄_max. - have hΞ΄'_le_max : Ξ΄' ≀ Ξ΄_max := by - have h_ceil : T / Ξ΄_max ≀ (N : ℝ) := Nat.le_ceil _ - rw [hΞ΄'_def, div_le_iffβ‚€ hN_real_pos] - calc T = (T / Ξ΄_max) * Ξ΄_max := by field_simp - _ ≀ (N : ℝ) * Ξ΄_max := - mul_le_mul_of_nonneg_right h_ceil (le_of_lt hΞ΄_max_pos) - _ = Ξ΄_max * (N : ℝ) := by ring - -- ============================================================ - -- Per-z induction: a curve solving the ODE on [0, NΒ·Ξ΄'] = [0, T]. - -- ============================================================ - have h_perZ : βˆ€ z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2), - βˆƒ Ξ³ : ℝ β†’ PhaseSpace d, - Ξ³ 0 = z ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄'), - HasDerivWithinAt (fun s => (Ξ³ s).1) (Ξ³ t).2 - (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t ∧ - HasDerivWithinAt (fun s => (Ξ³ s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ³ t).1)) - (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t := - fun z hz => - charFlowTight_perZ_trajectory gradW L hL ρ h_int hρ_cont zβ‚€ a ha M V_max R - T hT hV_max_def hR hbound N Ξ΄' hΞ΄'_pos - (by rw [← hΞ΄_max_def]; exact hΞ΄'_le_max) (le_of_eq hNΞ΄'_eq) z hz - -- ============================================================ - -- Bundle per-z curves into a joint flow via Classical.choose. - -- ============================================================ - let Ξ³_func : PhaseSpace d β†’ ℝ β†’ PhaseSpace d := fun z => - if hz : z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2) - then Classical.choose (h_perZ z hz) - else (fun _ => z) - have h_Icc_T_sub : Set.Icc (0 : ℝ) T βŠ† Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := - fun t ht => ⟨ht.1, le_trans ht.2 (le_of_eq hNΞ΄'_eq.symm)⟩ - have h_dw_on_big : - βˆ€ z ∈ Metric.closedBall zβ‚€ ((a : ℝ) / 2), - βˆ€ t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄'), - HasDerivWithinAt (fun s => (Ξ³_func z s).1) (Ξ³_func z t).2 - (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t ∧ - HasDerivWithinAt (fun s => (Ξ³_func z s).2) - (-(convolveFunctionMeasure gradW (ρ t) (Ξ³_func z t).1)) - (Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄')) t := by - intro z hz t ht - have h_func_eq : Ξ³_func z = Classical.choose (h_perZ z hz) := by - simp only [Ξ³_func, dite_eq_left hz] - have h_ode := (Classical.choose_spec (h_perZ z hz)).2 - have h_pos_dw := (h_ode t ht).1 - have h_vel_dw := (h_ode t ht).2 - have h_eq_fun_pos : (fun s => (Ξ³_func z s).1) - = (fun s => ((Classical.choose (h_perZ z hz)) s).1) := by - funext s; rw [h_func_eq] - have h_eq_fun_vel : (fun s => (Ξ³_func z s).2) - = (fun s => ((Classical.choose (h_perZ z hz)) s).2) := by - funext s; rw [h_func_eq] - have h_eq_pt_vel : (Ξ³_func z t).2 = (Classical.choose (h_perZ z hz) t).2 := by - rw [h_func_eq] - have h_eq_pt_pos : (Ξ³_func z t).1 = (Classical.choose (h_perZ z hz) t).1 := by - rw [h_func_eq] - refine ⟨?_, ?_⟩ - Β· rw [h_eq_fun_pos, h_eq_pt_vel]; exact h_pos_dw - Β· rw [h_eq_fun_vel, h_eq_pt_pos]; exact h_vel_dw - refine ⟨fun t z => (Ξ³_func z t).1, fun t z => (Ξ³_func z t).2, - ⟨?_, ?_, ?_⟩, ?_⟩ - Β· intro z hz - have h_init : Classical.choose (h_perZ z hz) 0 = z := - (Classical.choose_spec (h_perZ z hz)).1 - have h_func_eq : Ξ³_func z = Classical.choose (h_perZ z hz) := by - simp only [Ξ³_func, dite_eq_left hz] - refine ⟨?_, ?_⟩ - Β· change (Ξ³_func z 0).1 = z.1 - rw [h_func_eq, h_init] - Β· change (Ξ³_func z 0).2 = z.2 - rw [h_func_eq, h_init] - Β· intro t ht z hz - have h_t_in : t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := by - refine ⟨le_of_lt ht.1, le_trans (le_of_lt ht.2) (le_of_eq hNΞ΄'_eq.symm)⟩ - have hT_lt_N : t < (N : ℝ) * Ξ΄' := lt_of_lt_of_le ht.2 (le_of_eq hNΞ΄'_eq.symm) - have h_icc_nhds : Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') ∈ nhds t := - Icc_mem_nhds ht.1 hT_lt_N - exact ((h_dw_on_big z hz t h_t_in).1).hasDerivAt h_icc_nhds - Β· intro t ht z hz - have h_t_in : t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := by - refine ⟨le_of_lt ht.1, le_trans (le_of_lt ht.2) (le_of_eq hNΞ΄'_eq.symm)⟩ - have hT_lt_N : t < (N : ℝ) * Ξ΄' := lt_of_lt_of_le ht.2 (le_of_eq hNΞ΄'_eq.symm) - have h_icc_nhds : Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') ∈ nhds t := - Icc_mem_nhds ht.1 hT_lt_N - exact ((h_dw_on_big z hz t h_t_in).2).hasDerivAt h_icc_nhds - Β· intro z hz t ht - have h_t_in_big : t ∈ Set.Icc (0 : ℝ) ((N : ℝ) * Ξ΄') := - h_Icc_T_sub ht - obtain ⟨h_pos_big, h_vel_big⟩ := h_dw_on_big z hz t h_t_in_big - exact ⟨h_pos_big.mono h_Icc_T_sub, h_vel_big.mono h_Icc_T_sub⟩ - -/-- **Two-window** characteristic-flow existence. - -A flow on `Ioo 0 (2Ξ΄)` for some `Ξ΄ > 0` and initial conditions in -`closedBall zβ‚€ (a/2)`. Produces a strictly longer window than -`exists_vlasov_characteristicFlow_local` (which gave `Ioo 0 Ξ΄` with -the larger `Ξ΄ := (a/2)/(L_pl + 1)`); here we tighten the contraction -constraint to `L_pl Β· (2Ξ΄) ≀ a/2`, yielding the smaller -`Ξ΄ := (a/2)/(2Β·(L_pl + 1))` but covering a `2Ξ΄`-long interval. - -**Implementation note.** This is a single Picard call (the vendored -`_confined` wrapper) with -`tmax = 2Ξ΄`, not a literal "two-window stitch" via uniqueness on -overlapping windows. Mathematically the two are equivalent: a -single Picard with an extended `tmax` and tightened `Ξ΄` recovers the -same set of solutions that a two-window stitch would produce. The -genuine two-window stitch (per-z second Picard at varying centers -glued via `ODE_solution_unique`) becomes essential only when the -single-Picard contraction cannot be satisfied β€” i.e., when the total -time window needed exceeds the asymptotic threshold `β‰ˆ 1/2` regardless -of `a`. For the upcoming N-window induction follow-up, this single- -Picard extension is iterated, with each iteration using a per-z -center from the previous window's endpoint. -/ -theorem exists_vlasov_characteristicFlow_twoWindow - {d : β„•} - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (_hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ t) x)) - (zβ‚€ : PhaseSpace d) (a : NNReal) (ha : 0 < a) - (M : NNReal) - (hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) (1 : ℝ), - βˆ€ x ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2), - β€–convolveFunctionMeasure gradW (ρ t) xβ€– ≀ M) : - βˆƒ (Ξ΄ : ℝ) (_ : 0 < Ξ΄) (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), - IsCharacteristicFlowOn gradW ρ charX charV - (Set.Ioo 0 (2 * Ξ΄)) (Metric.closedBall zβ‚€ ((a : ℝ) / 2)) := by - classical - -- IsPicardLindelof parameter choices. Same K_pl, r_pl, L_pl as `_local`; - -- only the time-step Ξ΄ is halved to fit the 2Ξ΄ contraction. - set K_pl : NNReal := max 1 L with hK_pl_def - set r_pl : NNReal := a / 2 with hr_pl_def - set L_pl : NNReal := β€–zβ‚€.2β€–β‚Š + a + M with hL_pl_def - -- Ξ΄ chosen so the doubled window 2Ξ΄ still satisfies L_pl Β· (2Ξ΄) ≀ a/2. - set Ξ΄ : ℝ := min (1 / 2) ((a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1))) with hΞ΄_def - have ha_real : (0 : ℝ) < (a : ℝ) := by exact_mod_cast ha - have h_denom_pos : (0 : ℝ) < 2 * ((L_pl : ℝ) + 1) := by positivity - have h_ratio_pos : (0 : ℝ) < (a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)) := by positivity - have hΞ΄_pos : (0 : ℝ) < Ξ΄ := lt_min (by norm_num) h_ratio_pos - have hΞ΄_le_half : Ξ΄ ≀ 1 / 2 := min_le_left _ _ - have hΞ΄_le_ratio : Ξ΄ ≀ (a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)) := min_le_right _ _ - have h_2Ξ΄_pos : (0 : ℝ) < 2 * Ξ΄ := by linarith - have h_2Ξ΄_le_one : 2 * Ξ΄ ≀ 1 := by linarith - -- tβ‚€ ∈ Icc 0 (2Ξ΄). - let tβ‚€ : Set.Icc (0 : ℝ) (2 * Ξ΄) := - ⟨0, Set.mem_Icc.mpr ⟨le_refl 0, le_of_lt h_2Ξ΄_pos⟩⟩ - -- Assemble IsPicardLindelof on time window [0, 2Ξ΄]. - have hpl : IsPicardLindelof (vlasovVectorField gradW ρ) tβ‚€ zβ‚€ a r_pl L_pl K_pl := by - refine ⟨?_, ?_, ?_, ?_⟩ - Β· intro t _ - exact (vlasovVectorField_lipschitzWith gradW L hL ρ h_int t).lipschitzOnWith - Β· intro x _ - apply Continuous.continuousOn - simp only [vlasovVectorField] - exact Continuous.prodMk continuous_const (hρ_cont x.1).neg - Β· -- norm_le β€” verbatim from `_local` (uses hbound on Icc 0 1, ball 3a/2). - intro t ht x hx - have h_norm_field := vlasovVectorField_norm_le gradW ρ t x - have hdist_le : dist x zβ‚€ ≀ (a : ℝ) := hx - have hdist_le_norm : β€–x - zβ‚€β€– ≀ (a : ℝ) := by rwa [dist_eq_norm] at hdist_le - have h_x2_proj : β€–x.2 - zβ‚€.2β€– ≀ β€–x - zβ‚€β€– := by - rw [Prod.norm_def]; exact le_max_right _ _ - have h_x2_bound : β€–x.2β€– ≀ β€–zβ‚€.2β€– + (a : ℝ) := by - have h1 : β€–x.2β€– = β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– := by rw [sub_add_cancel] - have h2 : β€–(x.2 - zβ‚€.2) + zβ‚€.2β€– ≀ β€–x.2 - zβ‚€.2β€– + β€–zβ‚€.2β€– := norm_add_le _ _ - linarith [h_x2_proj, hdist_le_norm] - have h_x1_proj : dist x.1 zβ‚€.1 ≀ dist x zβ‚€ := by - simp only [Prod.dist_eq]; exact le_max_left _ _ - have h_x1_ball : x.1 ∈ Metric.closedBall zβ‚€.1 (3 * (a : ℝ) / 2) := by - have hx1d : dist x.1 zβ‚€.1 ≀ (a : ℝ) := le_trans h_x1_proj hdist_le - have : dist x.1 zβ‚€.1 ≀ 3 * (a : ℝ) / 2 := by - have ha_nn : (0 : ℝ) ≀ (a : ℝ) := le_of_lt ha_real - linarith - exact this - have h_t_Icc : t ∈ Set.Icc (0 : ℝ) 1 := - ⟨ht.1, le_trans ht.2 h_2Ξ΄_le_one⟩ - have h_force_bound : β€–convolveFunctionMeasure gradW (ρ t) x.1β€– ≀ (M : ℝ) := - hbound t h_t_Icc x.1 h_x1_ball - have h_Lpl_eq : (L_pl : ℝ) = β€–zβ‚€.2β€– + (a : ℝ) + (M : ℝ) := by - simp [hL_pl_def, NNReal.coe_add, coe_nnnorm] - calc β€–vlasovVectorField gradW ρ t xβ€– - ≀ max β€–x.2β€– β€–convolveFunctionMeasure gradW (ρ t) x.1β€– := h_norm_field - _ ≀ (L_pl : ℝ) := by - rw [h_Lpl_eq] - apply max_le - Β· linarith [NNReal.coe_nonneg M] - Β· linarith [norm_nonneg zβ‚€.2, NNReal.coe_nonneg a] - Β· -- mul_max_le: L_pl Β· (2Ξ΄) ≀ a βˆ’ a/2 = a/2. Tighter constraint than `_local`. - show (L_pl : ℝ) * max (2 * Ξ΄ - (tβ‚€ : ℝ)) ((tβ‚€ : ℝ) - 0) ≀ (a : ℝ) - (r_pl : ℝ) - have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl - simp only [htβ‚€_eq, sub_zero, sub_self, max_eq_left (le_of_lt h_2Ξ΄_pos)] - have h_a_minus_r : (a : ℝ) - (r_pl : ℝ) = (a : ℝ) / 2 := by - simp [hr_pl_def, NNReal.coe_div]; ring - rw [h_a_minus_r] - have h_Lpl_nn : (0 : ℝ) ≀ (L_pl : ℝ) := L_pl.coe_nonneg - have h_a_nn : (0 : ℝ) ≀ (a : ℝ) / 2 := by linarith [ha_real] - have h_step : (L_pl : ℝ) * (2 * Ξ΄) ≀ (L_pl : ℝ) * - (2 * ((a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)))) := by - apply mul_le_mul_of_nonneg_left _ h_Lpl_nn - linarith [hΞ΄_le_ratio] - have h_simp : (L_pl : ℝ) * - (2 * ((a : ℝ) / 2 / (2 * ((L_pl : ℝ) + 1)))) - = (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) := by - field_simp - have h_frac_le : (L_pl : ℝ) / ((L_pl : ℝ) + 1) ≀ 1 := by - have h_pos : (0 : ℝ) < (L_pl : ℝ) + 1 := by linarith - rw [div_le_one h_pos]; linarith - have h_bound : (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) ≀ (a : ℝ) / 2 := by - calc (L_pl : ℝ) / ((L_pl : ℝ) + 1) * ((a : ℝ) / 2) - ≀ 1 * ((a : ℝ) / 2) := - mul_le_mul_of_nonneg_right h_frac_le h_a_nn - _ = (a : ℝ) / 2 := one_mul _ - linarith [h_step, h_simp β–Έ h_step, h_bound] - -- Invoke headline Picard-LindelΓΆf on the doubled window. - obtain ⟨α, hα⟩ := hpl.exists_forall_mem_closedBall_eq_forall_mem_Icc_hasDerivWithinAt_confined - -- Define charX, charV by projection. - refine ⟨δ, hΞ΄_pos, fun t z => (Ξ± z t).1, fun t z => (Ξ± z t).2, ?_, ?_, ?_⟩ - Β· -- Initial condition. - intro z hz - have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by - have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] - rw [Metric.mem_closedBall] at hz ⊒ - rw [hreq]; exact hz - have h_init : Ξ± z (tβ‚€ : ℝ) = z := (hΞ± z hz_in_r).1 - have htβ‚€_eq : (tβ‚€ : ℝ) = 0 := rfl - rw [htβ‚€_eq] at h_init - refine ⟨?_, ?_⟩ - Β· change (Ξ± z 0).1 = z.1; rw [h_init] - Β· change (Ξ± z 0).2 = z.2; rw [h_init] - Β· -- Position ODE on Ioo 0 (2Ξ΄). - intro t ht z hz - have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by - have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] - rw [Metric.mem_closedBall] at hz ⊒; rw [hreq]; exact hz - have h_t_Icc : t ∈ Set.Icc (0 : ℝ) (2 * Ξ΄) := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ - have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc - have h_icc_nhds : Set.Icc (0 : ℝ) (2 * Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 - have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := - h_dw.hasDerivAt h_icc_nhds - have h_proj : HasDerivAt (fun s => (Ξ± z s).1) - (vlasovVectorField gradW ρ t (Ξ± z t)).1 t := - (hasFDerivAt_fst (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - Β· -- Velocity ODE on Ioo 0 (2Ξ΄). - intro t ht z hz - have hz_in_r : z ∈ Metric.closedBall zβ‚€ (r_pl : ℝ) := by - have hreq : (r_pl : ℝ) = (a : ℝ) / 2 := by simp [hr_pl_def, NNReal.coe_div] - rw [Metric.mem_closedBall] at hz ⊒; rw [hreq]; exact hz - have h_t_Icc : t ∈ Set.Icc (0 : ℝ) (2 * Ξ΄) := ⟨le_of_lt ht.1, le_of_lt ht.2⟩ - have h_dw := (hΞ± z hz_in_r).2.1 t h_t_Icc - have h_icc_nhds : Set.Icc (0 : ℝ) (2 * Ξ΄) ∈ nhds t := Icc_mem_nhds ht.1 ht.2 - have h_d : HasDerivAt (Ξ± z) (vlasovVectorField gradW ρ t (Ξ± z t)) t := - h_dw.hasDerivAt h_icc_nhds - have h_proj : HasDerivAt (fun s => (Ξ± z s).2) - (vlasovVectorField gradW ρ t (Ξ± z t)).2 t := - (hasFDerivAt_snd (E := PhysSpace d) (F := PhysSpace d)).comp_hasDerivAt t h_d - simpa [vlasovVectorField] using h_proj - - /-! ## Lagrangian β†’ Eulerian: pushforward solves weak Vlasov The pushforward `vlasovSolutionViaPushforward charX charV fβ‚€` satisfies @@ -3347,41 +780,8 @@ lemma vlasov_trajectory_lipschitz_bound_on have h_conv_bound : βˆ€ s ∈ Set.Icc 0 T, βˆ€ x : PhysSpace d, β€–convolveFunctionMeasure gradW (ρ s) xβ€– ≀ Ξ΅β‚€ + (L : ℝ) * β€–xβ€– := by intro s hs x - unfold convolveFunctionMeasure - have h_sub_int : Integrable (fun y => β€–x - yβ€–) (ρ s) := - Integrable.mono' ((integrable_const β€–xβ€–).add (h_y_int s hs)) - ((aestronglyMeasurable_const (b := x)).sub aestronglyMeasurable_id |>.norm) - (Filter.Eventually.of_forall fun y => by - simp only [Real.norm_of_nonneg (norm_nonneg _)]; exact norm_sub_le x y) - have h_pt : βˆ€ y : PhysSpace d, - β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€– := by - intro y - have hd := hL.dist_le_mul (x - y) 0 - simp only [dist_eq_norm, sub_zero] at hd - have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by - have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - linarith - have h_bnd_int : Integrable (fun y => β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) (ρ s) := - (integrable_const _).add (h_sub_int.const_mul _) - calc β€–βˆ« y, gradW (x - y) βˆ‚(ρ s)β€– - ≀ ∫ y, β€–gradW (x - y)β€– βˆ‚(ρ s) := norm_integral_le_integral_norm _ - _ ≀ ∫ y, (β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) βˆ‚(ρ s) := - integral_mono (h_int s x).norm h_bnd_int (fun y => h_pt y) - _ = β€–gradW 0β€– + (L : ℝ) * ∫ y, β€–x - yβ€– βˆ‚(ρ s) := by - rw [integral_add (integrable_const _) (h_sub_int.const_mul _)] - simp [integral_const, measureReal_def, measure_univ, integral_const_mul] - _ ≀ Ξ΅β‚€ + (L : ℝ) * β€–xβ€– := by - have h_int_le : ∫ y, β€–x - yβ€– βˆ‚(ρ s) ≀ β€–xβ€– + M_ρ := by - calc ∫ y, β€–x - yβ€– βˆ‚(ρ s) - ≀ ∫ y, (β€–xβ€– + β€–yβ€–) βˆ‚(ρ s) := - integral_mono h_sub_int ((integrable_const _).add (h_y_int s hs)) - (fun y => norm_sub_le x y) - _ = β€–xβ€– + ∫ y, β€–yβ€– βˆ‚(ρ s) := by - rw [integral_add (integrable_const _) (h_y_int s hs)] - simp [integral_const, measureReal_def, measure_univ] - _ ≀ β€–xβ€– + M_ρ := by linarith [hM_ρ s hs] - simp only [Ξ΅β‚€]; linarith [mul_le_mul_of_nonneg_left h_int_le (NNReal.coe_nonneg L)] + exact norm_convolveFunctionMeasure_le_affine gradW L hL (ρ s) (h_int s) + (h_y_int s hs) M_ρ (hM_ρ s hs) x -- Step 3: Choose nhd = Ioo (t/2) ((t+T)/2) βŠ† Ioo 0 T. t/2 < t (since t>0) and -- t < (t+T)/2 (since t < T), so t ∈ nhd; further nhd βŠ† Icc 0 T for bounding. refine ⟨Set.Ioo (t / 2) ((t + T) / 2), diff --git a/LeanPool/Vlasov/OT/Continuation.lean b/LeanPool/Vlasov/OT/Continuation.lean new file mode 100644 index 0000000000..a2b16afa29 --- /dev/null +++ b/LeanPool/Vlasov/OT/Continuation.lean @@ -0,0 +1,2912 @@ +/- +Copyright (c) 2026 Joseph K. Miller. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph K. Miller +-/ +module + +public import LeanPool.Vlasov.OT.LocalWellPosedness +import Mathlib.Analysis.Calculus.FDeriv.Extend + +/-! +# Continuation of local Vlasov solutions + +Boundary gluing and iteration extend a local Lagrangian solution to any finite +horizon. Stability and the global theorem use this continuation independently. +-/ + +@[expose] public section + +namespace Vlasov + +open MeasureTheory ENNReal + +/-! ## Banked infrastructure: localized `hasDerivAt_of_hasDerivAt_of_ne` -/ +-- Generic real-analysis helper banked for `vlasovWellPosedness_glue` case (a)'s substantive +-- close. Mathlib's `hasDerivAt_of_hasDerivAt_of_ne` +-- (Mathlib/Analysis/Calculus/FDeriv/Extend.lean) requires a UNIVERSAL +-- `βˆ€ y β‰  x, HasDerivAt f (g y) y` hypothesis; the `vlasovWellPosedness_glue` setting only +-- gives HasDerivAt on a bounded interval `Ioo 0 (T + T_0)`. This helper +-- localizes the Mathlib pattern to a neighborhood-eventually hypothesis, +-- enabling case (a)'s close via union of one-sided extension lemmas. + +section HasDerivAtPunctured +open scoped Topology +open Filter + +/-- Local version of `hasDerivAt_of_hasDerivAt_of_ne` (Mathlib/Analysis/Calculus/ +FDeriv/Extend.lean): if `f : ℝ β†’ ℝ` has HasDerivAt with derivative `g(y)` at +every `y β‰  xβ‚€` in some neighborhood of `xβ‚€`, and both `f` and `g` are continuous +at `xβ‚€`, then `f` has HasDerivAt with derivative `g(xβ‚€)` at `xβ‚€`. + +The proof composes `hasDerivWithinAt_Iic_of_tendsto_deriv` (left side) + +`hasDerivWithinAt_Ici_of_tendsto_deriv` (right side) + `HasDerivWithinAt.union`, +following the Mathlib lemma's proof structure but with locally-quantified +hypothesis (enabling use when the punctured-HasDerivAt holds only on a bounded +interval, not all of ℝ). -/ +theorem hasDerivAt_of_hasDerivAt_of_ne_in_nhds + {f g : ℝ β†’ ℝ} {xβ‚€ : ℝ} + (h_diff_ne : βˆ€αΆ  y in 𝓝 xβ‚€, y β‰  xβ‚€ β†’ HasDerivAt f (g y) y) + (hf : ContinuousAt f xβ‚€) (hg : ContinuousAt g xβ‚€) : + HasDerivAt f (g xβ‚€) xβ‚€ := by + -- Extract an open ball around xβ‚€ on which the punctured HasDerivAt holds. + obtain ⟨U, hU_sub, hU_open, hxβ‚€_U⟩ := mem_nhds_iff.mp h_diff_ne + obtain ⟨Ρ, Ξ΅_pos, hΡ⟩ := Metric.isOpen_iff.mp hU_open xβ‚€ hxβ‚€_U + -- Right side: HasDerivWithinAt on Ici xβ‚€ via hasDerivWithinAt_Ici_of_tendsto_deriv. + have h_right : HasDerivWithinAt f (g xβ‚€) (Set.Ici xβ‚€) xβ‚€ := by + have hs_right : Set.Ioo xβ‚€ (xβ‚€ + Ξ΅) ∈ 𝓝[>] xβ‚€ := + Ioo_mem_nhdsGT (by linarith : xβ‚€ < xβ‚€ + Ξ΅) + have h_diff_right : DifferentiableOn ℝ f (Set.Ioo xβ‚€ (xβ‚€ + Ξ΅)) := by + intro y hy + have hy_U : y ∈ U := hΞ΅ (by + rw [Metric.mem_ball, Real.dist_eq, abs_lt] + exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) + exact (hU_sub hy_U (ne_of_gt hy.1)).differentiableAt.differentiableWithinAt + apply hasDerivWithinAt_Ici_of_tendsto_deriv h_diff_right hf.continuousWithinAt hs_right + have h_g_tendsto : Tendsto g (𝓝[>] xβ‚€) (𝓝 (g xβ‚€)) := tendsto_inf_left hg + apply h_g_tendsto.congr' + apply mem_of_superset hs_right + intro y hy + have hy_U : y ∈ U := hΞ΅ (by + rw [Metric.mem_ball, Real.dist_eq, abs_lt] + exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) + exact (hU_sub hy_U (ne_of_gt hy.1)).deriv.symm + -- Left side: symmetric. + have h_left : HasDerivWithinAt f (g xβ‚€) (Set.Iic xβ‚€) xβ‚€ := by + have hs_left : Set.Ioo (xβ‚€ - Ξ΅) xβ‚€ ∈ 𝓝[<] xβ‚€ := + Ioo_mem_nhdsLT (by linarith : xβ‚€ - Ξ΅ < xβ‚€) + have h_diff_left : DifferentiableOn ℝ f (Set.Ioo (xβ‚€ - Ξ΅) xβ‚€) := by + intro y hy + have hy_U : y ∈ U := hΞ΅ (by + rw [Metric.mem_ball, Real.dist_eq, abs_lt] + exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) + exact (hU_sub hy_U (ne_of_lt hy.2)).differentiableAt.differentiableWithinAt + apply hasDerivWithinAt_Iic_of_tendsto_deriv h_diff_left hf.continuousWithinAt hs_left + have h_g_tendsto : Tendsto g (𝓝[<] xβ‚€) (𝓝 (g xβ‚€)) := tendsto_inf_left hg + apply h_g_tendsto.congr' + apply mem_of_superset hs_left + intro y hy + have hy_U : y ∈ U := hΞ΅ (by + rw [Metric.mem_ball, Real.dist_eq, abs_lt] + exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) + exact (hU_sub hy_U (ne_of_lt hy.2)).deriv.symm + -- Union via Set.Iic_union_Ici = Set.univ β†’ HasDerivAt at xβ‚€. + simpa using h_left.union h_right + +end HasDerivAtPunctured + +/-! ## Variable-`T_target` continuation via fixed-`T_0` iteration -/ +-- Composes `vlasovWellPosedness_local` against itself to extend the local +-- solution from `[0, T_0]` to `[0, T_target]` for any `T_target > 0`. The +-- contraction time `T_0` is *fixed* (depends only on `L`, not on iteration- +-- accumulated moment bounds) β€” see the docstring on `vlasovWellPosedness_local` +-- (above) for why fixed-`T_0` is the correct iteration shape (the +-- `Phi_supW1_contraction` factor `q` depends only on `L` and `T`). +-- +-- Two sub-theorems: +-- * `vlasovWellPosedness_glue`: extend a solution on `[0, T]` by one +-- window of length `T_0`, gluing at `t = T`. +-- * `vlasovWellPosedness_forward`: `Nat.rec` iteration of `vlasovWellPosedness_glue` +-- to reach any `T_target`. +-- +-- The universal-in-`t` bridge (below) then goes from +-- `IsLagrangianVlasovSolutionOn` (any `T_target`) to +-- `IsLagrangianVlasovSolution` (universal-in-`t`), and uniqueness follows. + +/-- The `t = T` seam of the glue: both one-sided derivatives of the spliced +flow at the junction agree (`g`'s flow starts at the identity on +`f_prev T`'s data), so `HasDerivWithinAt.union` on `Iic T βˆͺ Ici T = univ` +gives the two-sided derivative, restricted back to `Icc 0 (T + T_0)`. -/ +private lemma vlasovWellPosedness_glue_boundary_seam {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) + (f_prev g f_next : ℝ β†’ Measure (PhaseSpace d)) + (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hdef_f : f_next = fun t => if t ≀ T then f_prev t else g (t - T)) + (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) + (Set.Icc 0 T) t) + (hg_boundary : βˆ€ (w : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T_0 β†’ + HasDerivWithinAt (fun s => charX_g s w) (charV_g t w) (Set.Icc 0 T_0) t ∧ + HasDerivWithinAt (fun s => charV_g s w) + (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t w))) + (Set.Icc 0 T_0) t) + (hg_init : g 0 = f_prev T) + (hg_init_cond : βˆ€ (w : PhaseSpace d), charX_g 0 w = w.1 ∧ charV_g 0 w = w.2) + (z : PhaseSpace d) : + HasDerivWithinAt + (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_prev T z) (Set.Icc 0 (T + T_0)) T ∧ + HasDerivWithinAt + (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) (charX_prev T z))) + (Set.Icc 0 (T + T_0)) T := by + have hT_in : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_bX := (h_prev_boundary z T hT_in).1 + have h_bV := (h_prev_boundary z T hT_in).2 + have h0_T0_in : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ + have h_g_bX := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_T0_in).1 + have h_g_bV := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_T0_in).2 + have h_nhd_L : Set.Icc 0 T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT_pos + have h_nhd_R : Set.Icc 0 T_0 ∈ nhdsWithin (0 : ℝ) (Set.Ici 0) := Icc_mem_nhdsGE hT_0_pos + -- charX: left one-sided + have hX_Lic := h_bX.mono_of_mem_nhdsWithin h_nhd_L + have hX_left : HasDerivWithinAt + (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_prev T z) (Set.Iic T) T := + hX_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) Set.self_mem_Iic + -- charX: right one-sided via chain rule on g's boundary + have hX_Ici0 := h_g_bX.mono_of_mem_nhdsWithin h_nhd_R + have h_sub_R : HasDerivWithinAt (Β· - T) 1 (Set.Ici T) T := + ((hasDerivAt_id' T).sub_const T).hasDerivWithinAt + have h_mapR : Set.MapsTo (Β· - T) (Set.Ici T) (Set.Ici 0) := + fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) + have h_chainX : HasDerivWithinAt + (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_g 0 (charX_prev T z, charV_prev T z)) (Set.Ici T) T := by + have := HasDerivWithinAt.scomp_of_eq T hX_Ici0 h_sub_R h_mapR (sub_self T).symm + simpa [Function.comp_def, one_smul] using this + have hVg0_eq : charV_g 0 (charX_prev T z, charV_prev T z) = charV_prev T z := + (hg_init_cond (charX_prev T z, charV_prev T z)).2 + rw [hVg0_eq] at h_chainX + have hX_right : HasDerivWithinAt + (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_prev T z) (Set.Ici T) T := + h_chainX.congr_of_mem + (fun s hs => by + by_cases hle : s ≀ T + Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) + simp [heq, sub_self, + (hg_init_cond (charX_prev T z, charV_prev T z)).1] + Β· simp [hle]) + Set.self_mem_Ici + have hX_union := hX_left.union hX_right + rw [Set.Iic_union_Ici] at hX_union + -- charV: analogously + have hV_Lic := h_bV.mono_of_mem_nhdsWithin h_nhd_L + have hV_left : HasDerivWithinAt + (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) (charX_prev T z))) + (Set.Iic T) T := by + simp only [hdef_f, ite_eq_left (le_refl T)] + exact hV_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) Set.self_mem_Iic + have hV_Ici0 := h_g_bV.mono_of_mem_nhdsWithin h_nhd_R + have h_chainV : HasDerivWithinAt + (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW + (spatialMarginal (g 0)) + (charX_g 0 (charX_prev T z, charV_prev T z)))) + (Set.Ici T) T := by + have := HasDerivWithinAt.scomp_of_eq T hV_Ici0 h_sub_R h_mapR (sub_self T).symm + simpa [Function.comp_def, one_smul] using this + have hXg0_eq : charX_g 0 (charX_prev T z, charV_prev T z) = charX_prev T z := + (hg_init_cond (charX_prev T z, charV_prev T z)).1 + have hg0_spat : spatialMarginal (g 0) = spatialMarginal (f_prev T) := + congrArg spatialMarginal hg_init + have hfnextT : spatialMarginal (f_next T) = spatialMarginal (f_prev T) := + congrArg spatialMarginal (by rw [hdef_f]; simp only [ite_eq_left (le_refl T)]) + rw [hXg0_eq, hg0_spat, ← hfnextT] at h_chainV + have hV_right : HasDerivWithinAt + (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) (charX_prev T z))) + (Set.Ici T) T := + h_chainV.congr_of_mem + (fun s hs => by + by_cases hle : s ≀ T + Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) + simp [heq, sub_self, + (hg_init_cond (charX_prev T z, charV_prev T z)).2] + Β· simp [hle]) + Set.self_mem_Ici + have hV_union := hV_left.union hV_right + rw [Set.Iic_union_Ici] at hV_union + exact ⟨hX_union.hasDerivAt Filter.univ_mem |>.hasDerivWithinAt, + hV_union.hasDerivAt Filter.univ_mem |>.hasDerivWithinAt⟩ + +private lemma vlasovWellPosedness_glue_boundary {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) + (f_prev g f_next : ℝ β†’ Measure (PhaseSpace d)) + (charX_prev charV_prev charX_g charV_g charX_next charV_next : + ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hdef_X : charX_next = fun t z => + if t ≀ T then charX_prev t z else charX_g (t - T) (charX_prev T z, charV_prev T z)) + (hdef_V : charV_next = fun t z => + if t ≀ T then charV_prev t z else charV_g (t - T) (charX_prev T z, charV_prev T z)) + (hdef_f : f_next = fun t => if t ≀ T then f_prev t else g (t - T)) + (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) + (Set.Icc 0 T) t) + (hg_boundary : βˆ€ (w : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T_0 β†’ + HasDerivWithinAt (fun s => charX_g s w) (charV_g t w) (Set.Icc 0 T_0) t ∧ + HasDerivWithinAt (fun s => charV_g s w) + (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t w))) + (Set.Icc 0 T_0) t) + (hg_init : g 0 = f_prev T) + (hg_init_cond : βˆ€ (w : PhaseSpace d), charX_g 0 w = w.1 ∧ charV_g 0 w = w.2) : + βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) (T + T_0) β†’ + HasDerivWithinAt (fun s => charX_next s z) (charV_next t z) (Set.Icc 0 (T + T_0)) t ∧ + HasDerivWithinAt (fun s => charV_next s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next t)) (charX_next t z))) + (Set.Icc 0 (T + T_0)) t := by + subst hdef_X hdef_V + intro z t ht + simp only [] + -- Abbreviate the initial phase-space point for g + have hzβ‚€_def : (charX_prev T z, charV_prev T z) = (charX_prev T z, charV_prev T z) := rfl + by_cases ht_le : t ≀ T + Β· -- t ≀ T: use h_prev_boundary + upgrade to Icc 0 (T + T_0) + simp only [ite_eq_left ht_le] + have ht_in : t ∈ Set.Icc (0 : ℝ) T := ⟨ht.1, ht_le⟩ + have h_bX := (h_prev_boundary z t ht_in).1 + have h_bV := (h_prev_boundary z t ht_in).2 + by_cases ht_eqT : t = T + Β· -- t = T: the seam case, extracted as `_glue_boundary_seam`. + rw [ht_eqT] + exact vlasovWellPosedness_glue_boundary_seam gradW hT_pos hT_0_pos f_prev g f_next + charX_prev charV_prev charX_g charV_g hdef_f h_prev_boundary hg_boundary + hg_init hg_init_cond z + Β· -- t < T: use mono_of_mem_nhdsWithin to extend to Icc 0 (T + T_0) + have ht_ltT : t < T := lt_of_le_of_ne ht_le ht_eqT + -- Get Icc 0 T ∈ nhdsWithin t (Icc 0 (T + T_0)) + have h_mem : Set.Icc (0 : ℝ) T ∈ nhdsWithin t (Set.Icc 0 (T + T_0)) := by + rcases eq_or_lt_of_le ht.1 with rfl | ht_pos + Β· exact (nhdsWithin_mono 0 Set.Icc_subset_Ici_self) (Icc_mem_nhdsGE hT_pos) + Β· exact mem_nhdsWithin_of_mem_nhds (Icc_mem_nhds ht_pos ht_ltT) + -- Upgrade HasDerivWithinAt from Icc 0 T to Icc 0 (T + T_0) + have hX_big := h_bX.mono_of_mem_nhdsWithin h_mem + have hV_big := h_bV.mono_of_mem_nhdsWithin h_mem + -- Congr: charX_next = charX_prev on Icc 0 T (within Icc 0 (T+T_0)) + have hX_ev : (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + =αΆ [nhdsWithin t (Set.Icc 0 (T + T_0))] (charX_prev Β· z) := + Filter.Eventually.mono h_mem (fun s hs => by simp [hs.2]) + have hV_ev : (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + =αΆ [nhdsWithin t (Set.Icc 0 (T + T_0))] (charV_prev Β· z) := + Filter.Eventually.mono h_mem (fun s hs => by simp [hs.2]) + -- f_next t = f_prev t, so marginals match + have hfnext : f_next t = f_prev t := by rw [hdef_f]; simp only [ite_eq_left ht_le] + have hfnext_spat : spatialMarginal (f_next t) = spatialMarginal (f_prev t) := + congrArg spatialMarginal hfnext + rw [← hfnext_spat] at hV_big + constructor + Β· exact hX_big.congr_of_eventuallyEq_of_mem hX_ev ht + Β· exact hV_big.congr_of_eventuallyEq_of_mem hV_ev ht + Β· -- T < t: use hg_boundary + chain rule + push Not at ht_le + simp only [ite_eq_right (not_le.mpr ht_le)] + have htT_mem : t - T ∈ Set.Icc (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ + have h_bdry_gX := (hg_boundary (charX_prev T z, charV_prev T z) (t - T) htT_mem).1 + have h_bdry_gV := (hg_boundary (charX_prev T z, charV_prev T z) (t - T) htT_mem).2 + by_cases ht_ltTT0 : t < T + T_0 + Β· -- t ∈ Ioo T (T + T_0): interior case, use HasDerivAt + congr + have htT_Ioo : t - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith⟩ + have hX_da := h_bdry_gX.hasDerivAt (Icc_mem_nhds htT_Ioo.1 htT_Ioo.2) + have hV_da := h_bdry_gV.hasDerivAt (Icc_mem_nhds htT_Ioo.1 htT_Ioo.2) + have h_sub : HasDerivAt (Β· - T) 1 t := (hasDerivAt_id' t).sub_const T + have h_chainX : HasDerivAt (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_g (t - T) (charX_prev T z, charV_prev T z)) t := by + have := HasDerivAt.scomp_of_eq t hX_da h_sub rfl + simpa [Function.comp_def, one_smul] using this + have h_chainV : HasDerivAt (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW + (spatialMarginal (g (t - T))) + (charX_g (t - T) (charX_prev T z, charV_prev T z)))) t := by + have := HasDerivAt.scomp_of_eq t hV_da h_sub rfl + simpa [Function.comp_def, one_smul] using this + -- f_next t = g (t - T), so marginals match + have h_fnext_t : f_next t = g (t - T) := by + rw [hdef_f]; simp only [ite_eq_right (not_le.mpr ht_le)] + rw [← congrArg spatialMarginal h_fnext_t] at h_chainV + -- piecewise = charX_g (Β· - T) (charX_prev T z, charV_prev T z) near t (since T < t) + have h_ev_gt : βˆ€αΆ  s in nhds t, T < s := eventually_gt_nhds ht_le + have hX_ev : (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + =αΆ [nhds t] (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) := + Filter.Eventually.mono h_ev_gt (fun s hs => by simp [not_le.mpr hs]) + have hV_ev : (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + =αΆ [nhds t] (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) := + Filter.Eventually.mono h_ev_gt (fun s hs => by simp [not_le.mpr hs]) + exact ⟨(h_chainX.congr_of_eventuallyEq hX_ev).hasDerivWithinAt, + (h_chainV.congr_of_eventuallyEq hV_ev).hasDerivWithinAt⟩ + Β· -- t = T + T_0: endpoint, use mono_of_mem_nhdsWithin + chain rule + mono + push Not at ht_ltTT0 + have htT0 : t = T + T_0 := le_antisymm ht.2 ht_ltTT0 + rw [show t - T = T_0 from by linarith] at h_bdry_gX h_bdry_gV + -- Upgrade to Iic T_0 via Icc_mem_nhdsLE + have h_nhd_LE : Set.Icc 0 T_0 ∈ nhdsWithin T_0 (Set.Iic T_0) := Icc_mem_nhdsLE hT_0_pos + have hX_Lic := h_bdry_gX.mono_of_mem_nhdsWithin h_nhd_LE + have hV_Lic := h_bdry_gV.mono_of_mem_nhdsWithin h_nhd_LE + -- Chain rule: (Β· - T) maps Iic (T + T_0) to Iic T_0 + have h_sub_LE : HasDerivWithinAt (Β· - T) 1 (Set.Iic (T + T_0)) (T + T_0) := + ((hasDerivAt_id' (T + T_0)).sub_const T).hasDerivWithinAt.mono + (fun _ _ => Set.mem_univ _) + have h_mapLE : Set.MapsTo (Β· - T) (Set.Iic (T + T_0)) (Set.Iic T_0) := + fun s hs => Set.mem_Iic.mpr (by linarith [Set.mem_Iic.mp hs]) + have h_chainX : HasDerivWithinAt + (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_g T_0 (charX_prev T z, charV_prev T z)) (Set.Iic (T + T_0)) (T + T_0) := by + have := HasDerivWithinAt.scomp_of_eq (T + T_0) hX_Lic h_sub_LE h_mapLE + (show T_0 = (T + T_0) - T by ring) + simpa [Function.comp_def, one_smul] using this + have h_chainV : HasDerivWithinAt + (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW + (spatialMarginal (g T_0)) + (charX_g T_0 (charX_prev T z, charV_prev T z)))) + (Set.Iic (T + T_0)) (T + T_0) := by + have := HasDerivWithinAt.scomp_of_eq (T + T_0) hV_Lic h_sub_LE h_mapLE + (show T_0 = (T + T_0) - T by ring) + simpa [Function.comp_def, one_smul] using this + -- Congr: near T+T_0 within Iic (T+T_0), points > T eventually + have h_ev_gt2 : βˆ€αΆ  s in nhdsWithin (T + T_0) (Set.Iic (T + T_0)), T < s := + (eventually_gt_nhds (show T < T + T_0 by linarith)).filter_mono nhdsWithin_le_nhds + have hX_ev2 : (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + =αΆ [nhdsWithin (T + T_0) (Set.Iic (T + T_0))] + (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) := + Filter.Eventually.mono h_ev_gt2 (fun s hs => by simp [not_le.mpr hs]) + have hV_ev2 : (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + =αΆ [nhdsWithin (T + T_0) (Set.Iic (T + T_0))] + (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) := + Filter.Eventually.mono h_ev_gt2 (fun s hs => by simp [not_le.mpr hs]) + have h_Iic_sub : Set.Icc 0 (T + T_0) βŠ† Set.Iic (T + T_0) := Set.Icc_subset_Iic_self + have h_TT0_Iic : (T + T_0) ∈ Set.Iic (T + T_0) := Set.mem_Iic.mpr (le_refl _) + -- f_next (T + T_0) = g T_0 + have h_fnext_TT0 : f_next (T + T_0) = g T_0 := by + simp [hdef_f, not_le.mpr (show T < T + T_0 by linarith)] + constructor + Β· have h_cX : HasDerivWithinAt + (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_g T_0 (charX_prev T z, charV_prev T z)) + (Set.Icc 0 (T + T_0)) (T + T_0) := + (h_chainX.congr_of_eventuallyEq_of_mem hX_ev2 h_TT0_Iic).mono h_Iic_sub + rw [htT0] + rw [show T + T_0 - T = T_0 from by ring] + exact h_cX + Β· have h_cV : HasDerivWithinAt + (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW + (spatialMarginal (g T_0)) + (charX_g T_0 (charX_prev T z, charV_prev T z)))) + (Set.Icc 0 (T + T_0)) (T + T_0) := + (h_chainV.congr_of_eventuallyEq_of_mem hV_ev2 h_TT0_Iic).mono h_Iic_sub + rw [htT0] + rw [h_fnext_TT0] + rw [show T + T_0 - T = T_0 from by ring] + exact h_cV + + +/-- **Route 2 inner kernel for `glue_step` `h_cont_g`** (LEFT / `Iic T`): continuity +at the seam `T` of `s ↦ (βˆ‡W βˆ— ΞΌ_s)(charX s z)`, where the window measure curve `ΞΌ` is +the flow-pushforward of `fβ‚€`. + +Proven from PROVEN tools only (no deferred OT). The pushforward rewrite +`(βˆ‡W βˆ— ΞΌ_s)(x) = ∫ z', gradW (x βˆ’ charX s z') βˆ‚fβ‚€` (`integral_map`) turns the +moving-measure convolution into a fixed-`fβ‚€` integral with moving integrand, closed by +dominated convergence: convergence from the flow's seam continuity `h_charX_cont`, +domination from the Gronwall growth bound `hC_T` (Piece A) against `fβ‚€`'s finite first +moment. This is the structural reason `h_cont_g` does NOT need the general narrowβ†’W₁ +kernel β€” its consumer carries a pushforward representation. -/ +lemma flowConv_continuousWithinAt_Iic_seam + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (charX : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (ΞΌ : ℝ β†’ Measure (PhysSpace d)) + (h_push : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + ΞΌ s = Measure.map (fun z : PhaseSpace d => charX s z) fβ‚€) + (h_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => charX s z) fβ‚€) + (h_charX_cont : βˆ€ z : PhaseSpace d, + ContinuousWithinAt (fun s => charX s z) (Set.Icc (0 : ℝ) T) T) + (C_T : ℝ) (_hC_T_nn : 0 ≀ C_T) + (hC_T : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1)) + (z : PhaseSpace d) : + ContinuousWithinAt (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) + (Set.Iic T) T := by + have h_nhd_L : Set.Icc (0 : ℝ) T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT + have hgradW_cont : Continuous gradW := hL.continuous + have hL_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg + -- Pushforward rewrite of the convolution, eventually in s (on the window). + have h_eq : (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) + =αΆ [nhdsWithin T (Set.Iic T)] + (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) := by + apply Filter.Eventually.mono h_nhd_L + intro s hs + change ∫ y, gradW (charX s z - y) βˆ‚(ΞΌ s) + = ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€ + rw [h_push s hs] + exact integral_map (h_aemeas s hs) + (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable + -- The rewritten fβ‚€-integral is continuous at T by dominated convergence. + have h_cont_rhs : ContinuousWithinAt + (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) (Set.Iic T) T := by + apply continuousWithinAt_of_dominated + (bound := fun z' => β€–gradW 0β€– + (L : ℝ) * (C_T * (β€–zβ€– + 1)) + + (L : ℝ) * (C_T * (β€–z'β€– + 1))) + Β· -- AEStronglyMeasurable in z', eventually in s + apply Filter.Eventually.mono h_nhd_L + intro s hs + exact (hgradW_cont.measurable.comp_aemeasurable + (aemeasurable_const.sub (h_aemeas s hs))).aestronglyMeasurable + Β· -- pointwise dominator bound, eventually in s + apply Filter.Eventually.mono h_nhd_L + intro s hs + apply Filter.Eventually.of_forall + intro z' + have h1 : β€–gradW (charX s z - charX s z')β€– + ≀ β€–gradW 0β€– + (L : ℝ) * β€–charX s z - charX s z'β€– := by + have hd := hL.dist_le_mul (charX s z - charX s z') 0 + simp only [dist_eq_norm, sub_zero] at hd + have htri : β€–gradW (charX s z - charX s z')β€– + ≀ β€–gradW 0β€– + β€–gradW (charX s z - charX s z') - gradW 0β€– := by + have := norm_add_le (gradW (charX s z - charX s z') - gradW 0) (gradW 0) + simp only [sub_add_cancel] at this; linarith + linarith + have h2 : β€–charX s z - charX s z'β€– ≀ β€–charX s zβ€– + β€–charX s z'β€– := norm_sub_le _ _ + have h3 : β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1) := hC_T s hs z + have h4 : β€–charX s z'β€– ≀ C_T * (β€–z'β€– + 1) := hC_T s hs z' + nlinarith [mul_le_mul_of_nonneg_left (h2.trans (add_le_add h3 h4)) hL_nn] + Β· -- integrability of the dominator + apply Integrable.add (integrable_const _) + exact ((hfβ‚€_int.add (integrable_const (1 : ℝ))).const_mul C_T).const_mul (L : ℝ) + Β· -- pointwise continuity in s, a.e. z' + apply Filter.Eventually.of_forall + intro z' + have hcz : ContinuousWithinAt (fun s => charX s z) (Set.Iic T) T := + (h_charX_cont z).mono_of_mem_nhdsWithin h_nhd_L + have hcz' : ContinuousWithinAt (fun s => charX s z') (Set.Iic T) T := + (h_charX_cont z').mono_of_mem_nhdsWithin h_nhd_L + exact hgradW_cont.continuousAt.comp_continuousWithinAt (hcz.sub hcz') + -- Bridge value at T and conclude. + have h_val_T : convolveFunctionMeasure gradW (ΞΌ T) (charX T z) + = ∫ z', gradW (charX T z - charX T z') βˆ‚fβ‚€ := by + have hT_mem : T ∈ Set.Icc (0 : ℝ) T := ⟨hT.le, le_refl T⟩ + change ∫ y, gradW (charX T z - y) βˆ‚(ΞΌ T) + = ∫ z', gradW (charX T z - charX T z') βˆ‚fβ‚€ + rw [h_push T hT_mem] + exact integral_map (h_aemeas T hT_mem) + (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable + exact h_cont_rhs.congr_of_eventuallyEq h_eq h_val_T + +/-- **Route 2 inner kernel for `glue_step` `h_cont_g`** (RIGHT / `Ici a`): the +exact mirror of `flowConv_continuousWithinAt_Iic_seam`, but on `Set.Ici a` over a +generic window `[a, b]` with the seam at the lower endpoint `a`. Same proof shape; +the only set-dependent swaps are `Iic T β†’ Ici a`, `Icc_mem_nhdsLE β†’ Icc_mem_nhdsGE`, +and the window `[0, T] β†’ [a, b]`. Used for the RIGHT side of the seam at `T` where +`charX` is the composed position flow `Z_s z = charX_g (s-T) (charX_prev T z, …)` and +`ΞΌ s = spatialMarginal (g (s-T))` is its pushforward of `fβ‚€`. -/ +lemma flowConv_continuousWithinAt_Ici_seam + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (charX : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {a b : ℝ} (hab : a < b) + (ΞΌ : ℝ β†’ Measure (PhysSpace d)) + (h_push : βˆ€ s ∈ Set.Icc a b, + ΞΌ s = Measure.map (fun z : PhaseSpace d => charX s z) fβ‚€) + (h_aemeas : βˆ€ s ∈ Set.Icc a b, + AEMeasurable (fun z : PhaseSpace d => charX s z) fβ‚€) + (h_charX_cont : βˆ€ z : PhaseSpace d, + ContinuousWithinAt (fun s => charX s z) (Set.Ici a) a) + (C_T : ℝ) (_hC_T_nn : 0 ≀ C_T) + (hC_T : βˆ€ s ∈ Set.Icc a b, βˆ€ z : PhaseSpace d, β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1)) + (z : PhaseSpace d) : + ContinuousWithinAt (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) + (Set.Ici a) a := by + have h_nhd_R : Set.Icc a b ∈ nhdsWithin a (Set.Ici a) := Icc_mem_nhdsGE hab + have hgradW_cont : Continuous gradW := hL.continuous + have hL_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg + -- Pushforward rewrite of the convolution, eventually in s (on the window). + have h_eq : (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) + =αΆ [nhdsWithin a (Set.Ici a)] + (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) := by + apply Filter.Eventually.mono h_nhd_R + intro s hs + change ∫ y, gradW (charX s z - y) βˆ‚(ΞΌ s) + = ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€ + rw [h_push s hs] + exact integral_map (h_aemeas s hs) + (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable + -- The rewritten fβ‚€-integral is continuous at a by dominated convergence. + have h_cont_rhs : ContinuousWithinAt + (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) (Set.Ici a) a := by + apply continuousWithinAt_of_dominated + (bound := fun z' => β€–gradW 0β€– + (L : ℝ) * (C_T * (β€–zβ€– + 1)) + + (L : ℝ) * (C_T * (β€–z'β€– + 1))) + Β· -- AEStronglyMeasurable in z', eventually in s + apply Filter.Eventually.mono h_nhd_R + intro s hs + exact (hgradW_cont.measurable.comp_aemeasurable + (aemeasurable_const.sub (h_aemeas s hs))).aestronglyMeasurable + Β· -- pointwise dominator bound, eventually in s + apply Filter.Eventually.mono h_nhd_R + intro s hs + apply Filter.Eventually.of_forall + intro z' + have h1 : β€–gradW (charX s z - charX s z')β€– + ≀ β€–gradW 0β€– + (L : ℝ) * β€–charX s z - charX s z'β€– := by + have hd := hL.dist_le_mul (charX s z - charX s z') 0 + simp only [dist_eq_norm, sub_zero] at hd + have htri : β€–gradW (charX s z - charX s z')β€– + ≀ β€–gradW 0β€– + β€–gradW (charX s z - charX s z') - gradW 0β€– := by + have := norm_add_le (gradW (charX s z - charX s z') - gradW 0) (gradW 0) + simp only [sub_add_cancel] at this; linarith + linarith + have h2 : β€–charX s z - charX s z'β€– ≀ β€–charX s zβ€– + β€–charX s z'β€– := norm_sub_le _ _ + have h3 : β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1) := hC_T s hs z + have h4 : β€–charX s z'β€– ≀ C_T * (β€–z'β€– + 1) := hC_T s hs z' + nlinarith [mul_le_mul_of_nonneg_left (h2.trans (add_le_add h3 h4)) hL_nn] + Β· -- integrability of the dominator + apply Integrable.add (integrable_const _) + exact ((hfβ‚€_int.add (integrable_const (1 : ℝ))).const_mul C_T).const_mul (L : ℝ) + Β· -- pointwise continuity in s, a.e. z' + apply Filter.Eventually.of_forall + intro z' + have hcz : ContinuousWithinAt (fun s => charX s z) (Set.Ici a) a := h_charX_cont z + have hcz' : ContinuousWithinAt (fun s => charX s z') (Set.Ici a) a := h_charX_cont z' + exact hgradW_cont.continuousAt.comp_continuousWithinAt (hcz.sub hcz') + -- Bridge value at a and conclude. + have h_val_a : convolveFunctionMeasure gradW (ΞΌ a) (charX a z) + = ∫ z', gradW (charX a z - charX a z') βˆ‚fβ‚€ := by + have ha_mem : a ∈ Set.Icc a b := ⟨le_refl a, hab.le⟩ + change ∫ y, gradW (charX a z - y) βˆ‚(ΞΌ a) + = ∫ z', gradW (charX a z - charX a z') βˆ‚fβ‚€ + rw [h_push a ha_mem] + exact integral_map (h_aemeas a ha_mem) + (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable + exact h_cont_rhs.congr_of_eventuallyEq h_eq h_val_a + +/-- gradW-kernel integrability on the spatial marginals of a finite-first-moment +curve (window-generic over the curve `ΞΌ`). The first-moment transfer to the +marginal feeds `integrable_gradW_shift`. -/ +private lemma dobrushinFlow_marginal_gradW_integrable + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (T : ℝ) (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) + (hΞΌ_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (ΞΌ t)) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, βˆ€ (x_pt : PhysSpace d), + Integrable (fun y => gradW (x_pt - y)) (spatialMarginal (ΞΌ t)) := by + intro t ht x_pt + have : IsProbabilityMeasure (ΞΌ t) := (hΞΌ_mom t ht).1 + have : IsProbabilityMeasure (spatialMarginal (ΞΌ t)) := + (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + have h_y_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (ΞΌ t)) := by + unfold spatialMarginal + rw [integrable_map_measure + (by exact (continuous_norm.measurable).aestronglyMeasurable) + measurable_fst.aemeasurable] + refine Integrable.mono' (hΞΌ_mom t ht).2 + ((continuous_norm.comp continuous_fst).aestronglyMeasurable) + (Filter.Eventually.of_forall fun z => ?_) + change |β€–z.1β€–| ≀ β€–zβ€– + rw [abs_of_nonneg (norm_nonneg _)]; exact norm_fst_le z + exact integrable_gradW_shift gradW L hL (spatialMarginal (ΞΌ t)) h_y_int x_pt + +/-- First-moment integrability transfers to the spatial marginal: +`∫ β€–zβ€– βˆ‚ΞΌ < ∞` gives `∫ β€–yβ€– βˆ‚(spatialMarginal ΞΌ) < ∞`. -/ +private lemma vlasovGlue_marginal_norm_integrable + {d : β„•} + (ΞΌ : Measure (PhaseSpace d)) (hΞΌ : HasFiniteFirstMoment ΞΌ) : + Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal ΞΌ) := by + have : IsProbabilityMeasure ΞΌ := hΞΌ.1 + unfold spatialMarginal + rw [integrable_map_measure + (by exact (continuous_norm.measurable).aestronglyMeasurable) + measurable_fst.aemeasurable] + refine Integrable.mono' hΞΌ.2 + ((continuous_norm.comp continuous_fst).aestronglyMeasurable) + (Filter.Eventually.of_forall fun z => ?_) + change |β€–z.1β€–| ≀ β€–zβ€– + rw [abs_of_nonneg (norm_nonneg _)]; exact norm_fst_le z + +/-- Continuity of the spatial-gradient component `gradXΟ†` of a smooth test +function `Ο†` on phase space. -/ +private lemma vlasovGlue_gradXΟ†_continuous + {d : β„•} + (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) + (gradXΟ† : PhaseSpace d β†’ PhysSpace d) + (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) : + Continuous gradXΟ† := by + have hfderiv_X : βˆ€ z : PhaseSpace d, + fderiv ℝ (fun x => Ο† (x, z.2)) z.1 = + (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := + fun z => by + have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := + (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt + have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := + hasFDerivAt_prodMk_left z.1 z.2 + exact (h1.comp z.1 h2).fderiv + have heqX : gradXΟ† = fun z => gradient (fun x => Ο† (x, z.2)) z.1 := + funext hgradXΟ† + rw [heqX] + simp_rw [gradient, hfderiv_X] + exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp + ((ContinuousLinearMap.isBoundedLinearMap_comp_right + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))).continuous.comp + (hΟ†_smooth.continuous_fderiv (by simp))) + +/-- Continuity of the velocity-gradient component `gradVΟ†` of a smooth test +function `Ο†` on phase space. -/ +private lemma vlasovGlue_gradVΟ†_continuous + {d : β„•} + (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) + (gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : + Continuous gradVΟ† := by + have hfderiv_V : βˆ€ z : PhaseSpace d, + fderiv ℝ (fun v => Ο† (z.1, v)) z.2 = + (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := + fun z => by + have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := + (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt + have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := + hasFDerivAt_prodMk_right z.1 z.2 + exact (h1.comp z.2 h2).fderiv + have heqV : gradVΟ† = fun z => gradient (fun v => Ο† (z.1, v)) z.2 := + funext hgradVΟ† + rw [heqV] + simp_rw [gradient, hfderiv_V] + exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp + ((ContinuousLinearMap.isBoundedLinearMap_comp_right + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))).continuous.comp + (hΟ†_smooth.continuous_fderiv (by simp))) + +/-- Uniform sup-bound on both gradient components of a compactly supported +smooth test function: `β€–βˆ‡_x Ο†β€–, β€–βˆ‡_v Ο†β€– ≀ M_Ο† := sup β€–fderiv Ο†β€–`. -/ +private lemma vlasovGlue_gradΟ†_bound + {d : β„•} + (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) + (hΟ†_compact : HasCompactSupport Ο†) + (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) + (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : + βˆƒ M_Ο† : ℝ, (βˆ€ z : PhaseSpace d, β€–gradXΟ† zβ€– ≀ M_Ο†) ∧ + (βˆ€ z : PhaseSpace d, β€–gradVΟ† zβ€– ≀ M_Ο†) := by + have hfderiv_cont : Continuous (fderiv ℝ Ο†) := + hΟ†_smooth.continuous_fderiv (by norm_num) + have hfderiv_compact : HasCompactSupport (fderiv ℝ Ο†) := + HasCompactSupport.fderiv (π•œ := ℝ) hΟ†_compact + obtain ⟨M_Ο†, hM_Ο†βŸ© := hfderiv_cont.bounded_above_of_compact_support hfderiv_compact + refine ⟨M_Ο†, fun z => ?_, fun z => ?_⟩ + Β· have hfd : fderiv ℝ (fun x => Ο† (x, z.2)) z.1 = + (fderiv ℝ Ο† z).comp + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := by + have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := + (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt + have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := + hasFDerivAt_prodMk_left z.1 z.2 + exact (h1.comp z.1 h2).fderiv + rw [hgradXΟ† z, gradient, hfd, + (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.norm_map] + refine le_trans (ContinuousLinearMap.opNorm_comp_le _ _) ?_ + refine le_trans (mul_le_mul_of_nonneg_left + (ContinuousLinearMap.norm_inl_le_one (π•œ := ℝ) + (E := PhysSpace d) (F := PhysSpace d)) (norm_nonneg _)) ?_ + rw [mul_one]; exact hM_Ο† z + Β· have hfd : fderiv ℝ (fun v => Ο† (z.1, v)) z.2 = + (fderiv ℝ Ο† z).comp + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := by + have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := + (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt + have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := + hasFDerivAt_prodMk_right z.1 z.2 + exact (h1.comp z.2 h2).fderiv + rw [hgradVΟ† z, gradient, hfd, + (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.norm_map] + refine le_trans (ContinuousLinearMap.opNorm_comp_le _ _) ?_ + refine le_trans (mul_le_mul_of_nonneg_left + (ContinuousLinearMap.norm_inr_le_one (π•œ := ℝ) + (E := PhysSpace d) (F := PhysSpace d)) (norm_nonneg _)) ?_ + rw [mul_one]; exact hM_Ο† z + +/-- Convolution force bound from a first-moment envelope: +`β€–(gradW ⋆ ρ) xβ€– ≀ β€–gradW 0β€– + LΒ·β€–xβ€– + LΒ·M` for a probability measure `ρ` +with `∫ β€–yβ€– βˆ‚Ο ≀ M`. -/ +private lemma vlasovGlue_conv_force_bound + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] + (M : ℝ) (hM : ∫ y, β€–yβ€– βˆ‚Ο ≀ M) + (h_y_int : Integrable (fun y : PhysSpace d => β€–yβ€–) ρ) + (h_int : βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) ρ) + (x : PhysSpace d) : + β€–convolveFunctionMeasure gradW ρ xβ€– + ≀ β€–gradW 0β€– + (L : ℝ) * β€–xβ€– + (L : ℝ) * M := by + unfold convolveFunctionMeasure + have h_sub_int : Integrable (fun y => β€–x - yβ€–) ρ := + Integrable.mono' ((integrable_const β€–xβ€–).add h_y_int) + ((aestronglyMeasurable_const (b := x)).sub aestronglyMeasurable_id |>.norm) + (Filter.Eventually.of_forall fun y => by + simp only [Real.norm_of_nonneg (norm_nonneg _)]; exact norm_sub_le x y) + have h_pt : βˆ€ y : PhysSpace d, + β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€– := by + intro y + have hd := hL.dist_le_mul (x - y) 0 + simp only [dist_eq_norm, sub_zero] at hd + have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by + have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) + simp only [sub_add_cancel] at this; linarith + linarith + have h_bnd_int : + Integrable (fun y => β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) ρ := + (integrable_const _).add (h_sub_int.const_mul _) + calc β€–βˆ« y, gradW (x - y) βˆ‚Οβ€– + ≀ ∫ y, β€–gradW (x - y)β€– βˆ‚Ο := + norm_integral_le_integral_norm _ + _ ≀ ∫ y, (β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) βˆ‚Ο := + integral_mono (h_int x).norm h_bnd_int h_pt + _ = β€–gradW 0β€– + (L : ℝ) * ∫ y, β€–x - yβ€– βˆ‚Ο := by + rw [integral_add (integrable_const _) (h_sub_int.const_mul _)] + simp [integral_const, measureReal_def, measure_univ, integral_const_mul] + _ ≀ β€–gradW 0β€– + (L : ℝ) * β€–xβ€– + (L : ℝ) * M := by + have h_int_le : ∫ y, β€–x - yβ€– βˆ‚Ο ≀ β€–xβ€– + M := by + calc ∫ y, β€–x - yβ€– βˆ‚Ο + ≀ ∫ y, (β€–xβ€– + β€–yβ€–) βˆ‚Ο := + integral_mono h_sub_int ((integrable_const _).add h_y_int) + (fun y => norm_sub_le x y) + _ = β€–xβ€– + ∫ y, β€–yβ€– βˆ‚Ο := by + rw [integral_add (integrable_const _) h_y_int] + simp [integral_const, measureReal_def, measure_univ] + _ ≀ β€–xβ€– + M := by linarith + nlinarith [mul_le_mul_of_nonneg_left h_int_le L.coe_nonneg] + +/-- Window growth bound for a characteristic flow given boundary regularity: +clamps the marginal curve into `[0, T]` (for the universal probability +instance), derives the interior `IsCharacteristicFlowOn` from the boundary +bundle, and applies `characteristicFlow_boundary_regularity` + +`flow_distance_growth_bound_on`. Returns the linear growth constant `C` +together with per-`z` window continuity of the joint flow curve. -/ +private lemma vlasovGlue_flow_growthBound + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT_pos : 0 < T) + (hΞΌ_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (ΞΌ t)) + (hM : βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (ΞΌ t)) ≀ M) + (h_ic : βˆ€ z : PhaseSpace d, charX 0 z = z.1 ∧ charV 0 z = z.2) + (h_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (ΞΌ t)) (charX t z))) + (Set.Icc 0 T) t) : + βˆƒ C : ℝ, 0 ≀ C ∧ + (βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, + β€–(charX s z, charV s z)β€– ≀ C * (β€–zβ€– + 1)) ∧ + (βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) := by + obtain ⟨M, hM_nn, hM_bd⟩ := hM + set clampT : ℝ β†’ ℝ := fun t => max 0 (min t T) with hclampT_def + have hclampT_mem : βˆ€ t, clampT t ∈ Set.Icc (0 : ℝ) T := by + intro t + simp only [hclampT_def, Set.mem_Icc] + exact ⟨le_max_left _ _, max_le hT_pos.le (min_le_right _ _)⟩ + have hclampT_id : βˆ€ t ∈ Set.Icc (0 : ℝ) T, clampT t = t := by + intro t ht + simp only [hclampT_def, min_eq_left ht.2, max_eq_right ht.1] + set ρc : ℝ β†’ Measure (PhysSpace d) := + fun t => spatialMarginal (ΞΌ (clampT t)) with hρc_def + have hρc_isProb : βˆ€ t, IsProbabilityMeasure (ρc t) := by + intro t + have : IsProbabilityMeasure (ΞΌ (clampT t)) := + (hΞΌ_mom (clampT t) (hclampT_mem t)).1 + exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + have hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(ρc t) ≀ M := by + intro t _ht + rw [hρc_def] + exact hM_bd (clampT t) (hclampT_mem t) + have h_y_int_ρc : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) (ρc t) := by + intro t ht + have h_eq : ρc t = spatialMarginal (ΞΌ t) := by + simp only [hρc_def, hclampT_id t ht] + rw [h_eq] + exact vlasovGlue_marginal_norm_integrable (ΞΌ t) (hΞΌ_mom t ht) + have h_int_ρc : βˆ€ t (x : PhysSpace d), + Integrable (fun y => gradW (x - y)) (ρc t) := + fun t x => by + have := dobrushinFlow_marginal_gradW_integrable gradW L hL T ΞΌ hΞΌ_mom + (clampT t) (hclampT_mem t) x + simpa only [hρc_def] using this + have h_bdry_ρc : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (ρc t) (charX t z))) + (Set.Icc 0 T) t := by + intro z t ht + have h_eq : ρc t = spatialMarginal (ΞΌ t) := by + simp only [hρc_def, hclampT_id t ht] + rw [h_eq] + exact h_boundary z t ht + have h_flow_ρc : IsCharacteristicFlowOn gradW ρc charX charV + (Set.Ioo 0 T) Set.univ := by + refine ⟨fun z _ => h_ic z, fun t ht z _ => ?_, fun t ht z _ => ?_⟩ + Β· have ht_Icc : t ∈ Set.Icc (0 : ℝ) T := ⟨ht.1.le, ht.2.le⟩ + exact ((h_bdry_ρc z t ht_Icc).1).hasDerivAt (Icc_mem_nhds ht.1 ht.2) + Β· have ht_Icc : t ∈ Set.Icc (0 : ℝ) T := ⟨ht.1.le, ht.2.le⟩ + exact ((h_bdry_ρc z t ht_Icc).2).hasDerivAt (Icc_mem_nhds ht.1 ht.2) + obtain ⟨h_init_ρc, h_cont_Icc_ρc, h_deriv_Ico_ρc⟩ := + characteristicFlow_boundary_regularity gradW ρc charX charV T hT_pos.le + h_flow_ρc h_bdry_ρc + obtain ⟨C, hC_nn, hC_pair⟩ := + flow_distance_growth_bound_on gradW L hL ρc charX charV T hT_pos.le + h_init_ρc h_cont_Icc_ρc h_deriv_Ico_ρc M hM_nn hM_ρ h_y_int_ρc h_int_ρc + exact ⟨C, hC_nn, hC_pair, h_cont_Icc_ρc⟩ + +/-- Generic seam continuity of the force-integral functional +`s ↦ ∫ βŸͺV s z, βˆ‡β‚“Ο†(Ξ¦ s z)⟫ βˆ’ βŸͺ(gradW ⋆ ρ s)(X s z), βˆ‡α΅₯Ο†(Ξ¦ s z)⟫ βˆ‚fβ‚€` +at a window endpoint, by dominated convergence. `S` is the one-sided +neighborhood filter set (`Iic T` or `Ici T`), `W` the compact window +(`Icc 0 T` or `Icc T (T+Tβ‚€)`) carrying the uniform data: a linear growth +bound `C` on the flow, a moment envelope `M` on the marginal curve `ρ`, and +kernel integrability. Instantiated on the LEFT by `f_prev`'s window flow and +on the RIGHT by the composed flow off `g`. -/ +private lemma vlasovGlue_seam_forceIntegral_cont + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (hgradXΟ†_cont : Continuous gradXΟ†) (hgradVΟ†_cont : Continuous gradVΟ†) + (M_Ο† : ℝ) + (hgradXΟ†_bd : βˆ€ z : PhaseSpace d, β€–gradXΟ† zβ€– ≀ M_Ο†) + (hgradVΟ†_bd : βˆ€ z : PhaseSpace d, β€–gradVΟ† zβ€– ≀ M_Ο†) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (X V : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (Tβ‚€ : ℝ) (S : Set ℝ) (W : Set ℝ) + (hW_nhd : W ∈ nhdsWithin Tβ‚€ S) + (hρ_prob : βˆ€ s ∈ W, IsProbabilityMeasure (ρ s)) + (M : ℝ) (hM : βˆ€ s ∈ W, ∫ y, β€–yβ€– βˆ‚(ρ s) ≀ M) + (h_y_int : βˆ€ s ∈ W, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ s)) + (h_int : βˆ€ s ∈ W, βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) (ρ s)) + (C : ℝ) + (hC_pair : βˆ€ s ∈ W, βˆ€ z : PhaseSpace d, β€–(X s z, V s z)β€– ≀ C * (β€–zβ€– + 1)) + (h_aemeas : βˆ€ s ∈ W, AEMeasurable (fun z : PhaseSpace d => (X s z, V s z)) fβ‚€) + (h_X_cont : βˆ€ z : PhaseSpace d, ContinuousWithinAt (fun s => X s z) S Tβ‚€) + (h_V_cont : βˆ€ z : PhaseSpace d, ContinuousWithinAt (fun s => V s z) S Tβ‚€) + (h_conv_cwn : βˆ€ z : PhaseSpace d, ContinuousWithinAt + (fun s => convolveFunctionMeasure gradW (ρ s) (X s z)) S Tβ‚€) : + ContinuousWithinAt + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ s) (X s z)) + (gradVΟ† (X s z, V s z))) βˆ‚fβ‚€) S Tβ‚€ := by + set bound_fn : PhaseSpace d β†’ ℝ := fun z => + M_Ο† * (C * (β€–zβ€– + 1)) + + (β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M) * M_Ο† + with hbound_def + have hbound_int : Integrable bound_fn fβ‚€ := by + have ha : Integrable + (fun z : PhaseSpace d => + (M_Ο† * C + L * M_Ο† * C) * β€–zβ€– + + (M_Ο† * C + (β€–gradW 0β€– + L * C + L * M) * M_Ο†)) fβ‚€ := + (hfβ‚€_int.const_mul _).add (integrable_const _) + refine ha.congr (Filter.Eventually.of_forall fun z => ?_) + simp only [hbound_def]; ring + have h_conv_force : βˆ€ s ∈ W, βˆ€ x : PhysSpace d, + β€–convolveFunctionMeasure gradW (ρ s) xβ€– + ≀ β€–gradW 0β€– + (L : ℝ) * β€–xβ€– + (L : ℝ) * M := by + intro s hs x + have := hρ_prob s hs + exact vlasovGlue_conv_force_bound gradW L hL (ρ s) M (hM s hs) + (h_y_int s hs) (h_int s hs) x + have hB : βˆ€ s ∈ W, βˆ€ z : PhaseSpace d, + β€–@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ s) (X s z)) + (gradVΟ† (X s z, V s z))β€– ≀ bound_fn z := by + intro s hs z + have hV : β€–V s zβ€– ≀ C * (β€–zβ€– + 1) := + le_trans (norm_snd_le (X s z, V s z)) (hC_pair s hs z) + have hX : β€–X s zβ€– ≀ C * (β€–zβ€– + 1) := + le_trans (norm_fst_le (X s z, V s z)) (hC_pair s hs z) + have ht1 : β€–@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z))β€– + ≀ M_Ο† * (C * (β€–zβ€– + 1)) := by + refine le_trans (norm_inner_le_norm _ _) ?_ + have := mul_le_mul hV (hgradXΟ†_bd (X s z, V s z)) + (norm_nonneg _) (le_trans (norm_nonneg _) hV) + calc β€–V s zβ€– * β€–gradXΟ† (X s z, V s z)β€– + ≀ (C * (β€–zβ€– + 1)) * M_Ο† := this + _ = M_Ο† * (C * (β€–zβ€– + 1)) := by ring + have ht2 : β€–@inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ s) (X s z)) + (gradVΟ† (X s z, V s z))β€– + ≀ (β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M) * M_Ο† := by + refine le_trans (norm_inner_le_norm _ _) ?_ + have hc : β€–convolveFunctionMeasure gradW (ρ s) (X s z)β€– + ≀ β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M := by + refine le_trans (h_conv_force s hs (X s z)) ?_ + have := mul_le_mul_of_nonneg_left hX L.coe_nonneg + linarith + have hcnn : 0 ≀ β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M := + le_trans (norm_nonneg _) hc + exact mul_le_mul hc (hgradVΟ†_bd (X s z, V s z)) (norm_nonneg _) hcnn + calc β€–_ - _β€– + ≀ β€–@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z))β€– + + β€–@inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ s) (X s z)) + (gradVΟ† (X s z, V s z))β€– := norm_sub_le _ _ + _ ≀ bound_fn z := by simp only [hbound_def]; linarith + apply continuousWithinAt_of_dominated (bound := bound_fn) + Β· -- AEStronglyMeasurable in z, eventually in s + apply Filter.Eventually.mono hW_nhd + intro s hs + have h_aem_pair := h_aemeas s hs + have h_aem_X : AEMeasurable (fun z : PhaseSpace d => X s z) fβ‚€ := + measurable_fst.comp_aemeasurable h_aem_pair + have h_aem_V : AEMeasurable (fun z : PhaseSpace d => V s z) fβ‚€ := + measurable_snd.comp_aemeasurable h_aem_pair + have h1 : AEStronglyMeasurable + (fun z : PhaseSpace d => @inner ℝ (PhysSpace d) _ (V s z) + (gradXΟ† (X s z, V s z))) fβ‚€ := by + have hg : AEMeasurable (fun z : PhaseSpace d => gradXΟ† (X s z, V s z)) fβ‚€ := + hgradXΟ†_cont.measurable.comp_aemeasurable (h_aem_X.prodMk h_aem_V) + exact (continuous_inner.measurable.comp_aemeasurable + (h_aem_V.prodMk hg)).aestronglyMeasurable + have h2 : AEStronglyMeasurable + (fun z : PhaseSpace d => @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ s) (X s z)) + (gradVΟ† (X s z, V s z))) fβ‚€ := by + have hconv_aem : AEMeasurable + (fun z : PhaseSpace d => convolveFunctionMeasure gradW (ρ s) (X s z)) fβ‚€ := by + have hconv_cont' : Continuous (fun x : PhysSpace d => + convolveFunctionMeasure gradW (ρ s) x) := by + have := hρ_prob s hs + exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL + (ρ s) (h_int s hs)).continuous + exact hconv_cont'.measurable.comp_aemeasurable h_aem_X + have hg : AEMeasurable (fun z : PhaseSpace d => gradVΟ† (X s z, V s z)) fβ‚€ := + hgradVΟ†_cont.measurable.comp_aemeasurable (h_aem_X.prodMk h_aem_V) + exact (continuous_inner.measurable.comp_aemeasurable + (hconv_aem.prodMk hg)).aestronglyMeasurable + exact h1.sub h2 + Β· -- dominator bound, eventually in s + apply Filter.Eventually.mono hW_nhd + intro s hs + exact Filter.Eventually.of_forall fun z => hB s hs z + Β· exact hbound_int + Β· -- pointwise continuity in s, for every z + apply Filter.Eventually.of_forall + intro z + have h_pair_cwn : ContinuousWithinAt (fun s => (X s z, V s z)) S Tβ‚€ := + (h_X_cont z).prodMk (h_V_cont z) + have h_gX_cwn : ContinuousWithinAt + (fun s => gradXΟ† (X s z, V s z)) S Tβ‚€ := + hgradXΟ†_cont.continuousAt.comp_continuousWithinAt h_pair_cwn + have h_gV_cwn : ContinuousWithinAt + (fun s => gradVΟ† (X s z, V s z)) S Tβ‚€ := + hgradVΟ†_cont.continuousAt.comp_continuousWithinAt h_pair_cwn + have h_term1 : ContinuousWithinAt + (fun s => @inner ℝ (PhysSpace d) _ (V s z) + (gradXΟ† (X s z, V s z))) S Tβ‚€ := + (h_V_cont z).inner h_gX_cwn + have h_term2 : ContinuousWithinAt + (fun s => @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ s) (X s z)) + (gradVΟ† (X s z, V s z))) S Tβ‚€ := + (h_conv_cwn z).inner h_gV_cwn + exact h_term1.sub h_term2 + +/-- LEFT seam continuity of the force-integral functional at `T`: on `Iic T` +the glued solution agrees with `f_prev` (via `hf_next_le`), whose window +pushforward representation reduces the claim to the generic seam DCT lemma +`vlasovGlue_seam_forceIntegral_cont` on `f_prev`'s window flow. -/ +private lemma vlasovGlue_seam_contLeft + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT_pos : 0 < T) + (f_prev : ℝ β†’ Measure (PhaseSpace d)) + (h_prev_init : f_prev 0 = fβ‚€) + (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) + (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) + (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) + (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) + (Set.Icc 0 T) t) + (h_prev_ic : βˆ€ z : PhaseSpace d, charX_prev 0 z = z.1 ∧ charV_prev 0 z = z.2) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (Ο† : PhaseSpace d β†’ ℝ) + (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) (hΟ†_compact : HasCompactSupport Ο†) + (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) + (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : + ContinuousWithinAt + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) (Set.Iic T) T := by + have h_nhd_L : Set.Icc (0 : ℝ) T ∈ nhdsWithin T (Set.Iic T) := + Icc_mem_nhdsLE hT_pos + have hgradXΟ†_cont : Continuous gradXΟ† := + vlasovGlue_gradXΟ†_continuous Ο† hΟ†_smooth gradXΟ† hgradXΟ† + have hgradVΟ†_cont : Continuous gradVΟ† := + vlasovGlue_gradVΟ†_continuous Ο† hΟ†_smooth gradVΟ† hgradVΟ† + have h_int_marg := dobrushinFlow_marginal_gradW_integrable gradW L hL T + f_prev h_prev_mom + have h_push_marg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + spatialMarginal (f_prev s) + = Measure.map (fun z : PhaseSpace d => charX_prev s z) fβ‚€ := by + intro s hs + have h_pair_aem : AEMeasurable + (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas s hs + unfold spatialMarginal + rw [h_prev_push s hs, h_prev_init, + AEMeasurable.map_map_of_aemeasurable measurable_fst.aemeasurable h_pair_aem] + rfl + have h_aemeas_marg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => charX_prev s z) fβ‚€ := by + intro s hs + have h_pair_aem : AEMeasurable + (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas s hs + exact measurable_fst.comp_aemeasurable h_pair_aem + obtain ⟨M_ρ, hM_ρ_nn, hM_ρ⟩ := hM_prev + have h_y_int_marg : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (f_prev t)) := + fun t ht => vlasovGlue_marginal_norm_integrable (f_prev t) (h_prev_mom t ht) + obtain ⟨C_T, hC_T_nn, hC_T_pair, h_cont_Icc_prev⟩ := + vlasovGlue_flow_growthBound gradW L hL f_prev charX_prev charV_prev + T hT_pos h_prev_mom ⟨M_ρ, hM_ρ_nn, hM_ρ⟩ h_prev_ic h_prev_boundary + have hC_T : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, + β€–charX_prev s zβ€– ≀ C_T * (β€–zβ€– + 1) := by + intro s hs z + exact le_trans (norm_fst_le (charX_prev s z, charV_prev s z)) + (hC_T_pair s hs z) + have h_conv_z_cont : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + Continuous (fun z : PhaseSpace d => + convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) z.1) := by + intro s hs + have : IsProbabilityMeasure (f_prev s) := (h_prev_mom s hs).1 + have : IsProbabilityMeasure (spatialMarginal (f_prev s)) := + (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL + (spatialMarginal (f_prev s)) (h_int_marg s hs)).continuous.comp continuous_fst + have h_integrand_cont : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + Continuous (fun z : PhaseSpace d => + @inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) z.1) + (gradVΟ† z)) := by + intro s hs + exact (continuous_snd.inner hgradXΟ†_cont).sub + ((h_conv_z_cont s hs).inner hgradVΟ†_cont) + have h_eq_L : (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) + =αΆ [nhdsWithin T (Set.Iic T)] + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev s z) + (gradXΟ† (charX_prev s z, charV_prev s z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) + (charX_prev s z)) + (gradVΟ† (charX_prev s z, charV_prev s z))) βˆ‚fβ‚€) := by + apply Filter.Eventually.mono h_nhd_L + intro s hs + have h_fnext : f_next s = f_prev s := hf_next_le s hs.2 + have h_marg : spatialMarginal (f_next s) = spatialMarginal (f_prev s) := + congrArg spatialMarginal h_fnext + have h_aemeas_fβ‚€ : AEMeasurable + (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas s hs + change (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) + = ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev s z) + (gradXΟ† (charX_prev s z, charV_prev s z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) + (charX_prev s z)) + (gradVΟ† (charX_prev s z, charV_prev s z))) βˆ‚fβ‚€ + have h_meq : f_next s + = Measure.map + (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := by + rw [h_fnext, h_prev_push s hs, h_prev_init] + rw [h_marg, h_meq, + integral_map h_aemeas_fβ‚€ + (h_integrand_cont s hs).aestronglyMeasurable] + obtain ⟨M_Ο†, hgradXΟ†_bd, hgradVΟ†_bd⟩ := + vlasovGlue_gradΟ†_bound Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† + have h_X_cont : βˆ€ z : PhaseSpace d, + ContinuousWithinAt (fun s => charX_prev s z) (Set.Iic T) T := fun z => + ((h_prev_boundary z T + ⟨hT_pos.le, le_refl T⟩).1.continuousWithinAt).mono_of_mem_nhdsWithin h_nhd_L + have h_V_cont : βˆ€ z : PhaseSpace d, + ContinuousWithinAt (fun s => charV_prev s z) (Set.Iic T) T := fun z => + ((h_prev_boundary z T + ⟨hT_pos.le, le_refl T⟩).2.continuousWithinAt).mono_of_mem_nhdsWithin h_nhd_L + have h_conv_cwn : βˆ€ z : PhaseSpace d, ContinuousWithinAt + (fun s => convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) + (charX_prev s z)) (Set.Iic T) T := fun z => + flowConv_continuousWithinAt_Iic_seam gradW L hL charX_prev fβ‚€ + hfβ‚€_int hT_pos (fun s => spatialMarginal (f_prev s)) + h_push_marg h_aemeas_marg + (fun z' => (h_cont_Icc_prev z').continuousWithinAt + (Set.right_mem_Icc.mpr hT_pos.le) |>.fst) C_T hC_T_nn hC_T z + have h_cont_pf : ContinuousWithinAt + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev s z) + (gradXΟ† (charX_prev s z, charV_prev s z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) + (charX_prev s z)) + (gradVΟ† (charX_prev s z, charV_prev s z))) βˆ‚fβ‚€) + (Set.Iic T) T := + vlasovGlue_seam_forceIntegral_cont gradW L hL fβ‚€ hfβ‚€_int gradXΟ† gradVΟ† + hgradXΟ†_cont hgradVΟ†_cont M_Ο† hgradXΟ†_bd hgradVΟ†_bd + (fun s => spatialMarginal (f_prev s)) charX_prev charV_prev + T (Set.Iic T) (Set.Icc 0 T) h_nhd_L + (fun s hs => by + have : IsProbabilityMeasure (f_prev s) := (h_prev_mom s hs).1 + exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance) + M_ρ hM_ρ h_y_int_marg h_int_marg C_T hC_T_pair + (fun s hs => h_prev_init β–Έ h_prev_aemeas s hs) + h_X_cont h_V_cont h_conv_cwn + have h_val_T : (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next T)) z.1) + (gradVΟ† z)) βˆ‚(f_next T)) + = ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev T z) + (gradXΟ† (charX_prev T z, charV_prev T z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_prev T)) + (charX_prev T z)) + (gradVΟ† (charX_prev T z, charV_prev T z))) βˆ‚fβ‚€ := by + have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_fnext_T : f_next T = f_prev T := hf_next_le T (le_refl T) + have h_marg : spatialMarginal (f_next T) = spatialMarginal (f_prev T) := + congrArg spatialMarginal h_fnext_T + have h_aemeas_fβ‚€_T : AEMeasurable + (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas T hT_Icc + have h_meq : f_next T + = Measure.map + (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := by + rw [h_fnext_T, h_prev_push T hT_Icc, h_prev_init] + rw [h_marg, h_meq, + integral_map h_aemeas_fβ‚€_T (h_integrand_cont T hT_Icc).aestronglyMeasurable] + exact h_cont_pf.congr_of_eventuallyEq h_eq_L h_val_T + +/-- A shifted flow curve `s ↦ Ξ¦ (s βˆ’ T) w` is continuous within `Ici T` at `T` +when the unshifted curve has a one-sided derivative at `0` on `[0, T_0]`. -/ +private lemma vlasovGlue_shifted_flow_contWithin + {d : β„•} + (charW : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (w : PhaseSpace d) {vβ‚€ : PhysSpace d} + (T : ℝ) {T_0 : ℝ} (hT_0_pos : 0 < T_0) + (hb : HasDerivWithinAt (fun s => charW s w) vβ‚€ (Set.Icc 0 T_0) 0) : + ContinuousWithinAt (fun s => charW (s - T) w) (Set.Ici T) T := by + have h_nhdsW_0 : Set.Icc (0 : ℝ) T_0 ∈ nhdsWithin 0 (Set.Ici 0) := + Icc_mem_nhdsGE hT_0_pos + have h_cont : ContinuousWithinAt (fun s => charW s w) (Set.Ici 0) 0 := + hb.continuousWithinAt.mono_of_mem_nhdsWithin h_nhdsW_0 + have h_sub_cont : ContinuousWithinAt (fun s : ℝ => s - T) (Set.Ici T) T := + ((continuous_id.sub continuous_const).continuousAt).continuousWithinAt + have h_sub_maps : Set.MapsTo (fun s : ℝ => s - T) (Set.Ici T) (Set.Ici 0) := + fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) + exact ContinuousWithinAt.comp_of_eq h_cont h_sub_cont h_sub_maps (sub_self T) + +/-- Composed-pushforward infrastructure on the glued window `[T, T+T_0]`: +`g (sβˆ’T)` is the pushforward of `fβ‚€` by the composed phase-space flow +(`g`'s window flow after the outer time-`T` map `(XT, VT)`), its spatial +marginal is the pushforward by the composed position map, and both composed +maps are a.e.-measurable. -/ +private lemma vlasovGlue_composed_pushforward + {d : β„•} + (fβ‚€ : Measure (PhaseSpace d)) + (g : ℝ β†’ Measure (PhaseSpace d)) + (f_prevT : Measure (PhaseSpace d)) + (charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (XT VT : PhaseSpace d β†’ PhysSpace d) + {T T_0 : ℝ} + (h_outer_aemeas : AEMeasurable (fun z : PhaseSpace d => (XT z, VT z)) fβ‚€) + (h_prevT_push : f_prevT = Measure.map (fun z : PhaseSpace d => (XT z, VT z)) fβ‚€) + (hg_init : g 0 = f_prevT) + (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) + (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) : + (βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => + (charX_g Ο„ (XT z, VT z), charV_g Ο„ (XT z, VT z))) fβ‚€) ∧ + (βˆ€ s ∈ Set.Icc T (T + T_0), + g (s - T) = Measure.map (fun z : PhaseSpace d => + (charX_g (s - T) (XT z, VT z), charV_g (s - T) (XT z, VT z))) fβ‚€) ∧ + (βˆ€ s ∈ Set.Icc T (T + T_0), + spatialMarginal (g (s - T)) = Measure.map (fun z : PhaseSpace d => + charX_g (s - T) (XT z, VT z)) fβ‚€) ∧ + (βˆ€ s ∈ Set.Icc T (T + T_0), + AEMeasurable (fun z : PhaseSpace d => charX_g (s - T) (XT z, VT z)) fβ‚€) := by + have h_g_at_aemeas : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => (charX_g Ο„ z, charV_g Ο„ z)) + (Measure.map (fun z : PhaseSpace d => (XT z, VT z)) fβ‚€) := by + intro Ο„ hΟ„ + have := hg_aemeas_ex Ο„ hΟ„ + rw [hg_init, h_prevT_push] at this + exact this + have h_comp_aemeas : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => + (charX_g Ο„ (XT z, VT z), charV_g Ο„ (XT z, VT z))) fβ‚€ := by + intro Ο„ hΟ„ + exact (h_g_at_aemeas Ο„ hΟ„).comp_aemeasurable h_outer_aemeas + have h_push_comp : βˆ€ s ∈ Set.Icc T (T + T_0), + g (s - T) = Measure.map (fun z : PhaseSpace d => + (charX_g (s - T) (XT z, VT z), charV_g (s - T) (XT z, VT z))) fβ‚€ := by + intro s hs + have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + rw [hg_push_ex (s - T) hsT_Icc, hg_init, h_prevT_push, + AEMeasurable.map_map_of_aemeasurable + (h_g_at_aemeas (s - T) hsT_Icc) h_outer_aemeas] + rfl + refine ⟨h_comp_aemeas, h_push_comp, fun s hs => ?_, fun s hs => ?_⟩ + Β· have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + unfold spatialMarginal + rw [h_push_comp s hs, + AEMeasurable.map_map_of_aemeasurable measurable_fst.aemeasurable + (h_comp_aemeas (s - T) hsT_Icc)] + rfl + Β· have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + exact measurable_fst.comp_aemeasurable (h_comp_aemeas (s - T) hsT_Icc) + +/-- Pointwise composed-pushforward rewrite of the force integral on the glued +window: for `s ∈ [T, T+T_0]` the integral of the force integrand against +`f_next s` equals the integral of the flow-composed integrand against `fβ‚€`. +Serves both the eventually-equal rewrite and the value-at-`T` bridge of the +RIGHT seam close. -/ +private lemma vlasovGlue_composed_integral_eq + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (fβ‚€ : Measure (PhaseSpace d)) + {T T_0 : ℝ} (hT_pos : 0 < T) + (f_prev g : ℝ β†’ Measure (PhaseSpace d)) + (h_prev_init : f_prev 0 = fβ‚€) + (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (hg_init : g 0 = f_prev T) + (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_T : f_next T = f_prev T) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) + (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (h_comp_aemeas : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => + (charX_g Ο„ (charX_prev T z, charV_prev T z), + charV_g Ο„ (charX_prev T z, charV_prev T z))) fβ‚€) + (h_g_push_comp : βˆ€ s ∈ Set.Icc T (T + T_0), + g (s - T) = Measure.map (fun z : PhaseSpace d => + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€) + (h_integrand_cont : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + Continuous (fun z : PhaseSpace d => + @inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (g Ο„)) z.1) + (gradVΟ† z))) + (s : ℝ) (hs : s ∈ Set.Icc T (T + T_0)) : + (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) + = ∫ z, (@inner ℝ (PhysSpace d) _ + (charV_g (s - T) (charX_prev T z, charV_prev T z)) + (gradXΟ† (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) + (charX_g (s - T) (charX_prev T z, charV_prev T z))) + (gradVΟ† (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z)))) βˆ‚fβ‚€ := by + have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + by_cases hs_eq : s = T + Β· -- s = T: f_next T = f_prev T = composed pushforward (collapse g at 0 = id) + have hs_T_zero : s - T = 0 := by rw [hs_eq]; exact sub_self T + have h_fnext_s : f_next s = f_prev T := by + rw [hs_eq]; exact hf_next_T + have h_marg_eq : spatialMarginal (f_next s) = spatialMarginal (g (s - T)) := by + rw [h_fnext_s, hs_T_zero, hg_init] + have h_meq : f_next s = Measure.map + (fun z : PhaseSpace d => + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := by + rw [h_fnext_s, h_prev_push T hT_Icc, h_prev_init] + apply Measure.map_congr + apply Filter.Eventually.of_forall + intro z + simp only [hs_T_zero, (hg_init_cond _).1, (hg_init_cond _).2] + rw [h_marg_eq, h_meq, + integral_map (h_comp_aemeas (s - T) hsT_Icc) + (h_integrand_cont (s - T) hsT_Icc).aestronglyMeasurable] + Β· -- s > T: f_next s = g (s βˆ’ T) = composed pushforward + have hs_gt : T < s := lt_of_le_of_ne hs.1 (Ne.symm hs_eq) + have h_fnext_s : f_next s = g (s - T) := hf_next_gt s hs_gt + have h_marg_eq : spatialMarginal (f_next s) = spatialMarginal (g (s - T)) := + congrArg spatialMarginal h_fnext_s + have h_meq : f_next s = Measure.map + (fun z : PhaseSpace d => + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := by + rw [h_fnext_s]; exact h_g_push_comp s hs + rw [h_marg_eq, h_meq, + integral_map (h_comp_aemeas (s - T) hsT_Icc) + (h_integrand_cont (s - T) hsT_Icc).aestronglyMeasurable] + +/-- RIGHT seam continuity of the force-integral functional at `T`: on `Ici T` +the glued solution is `g (Β·βˆ’T)` (via `hf_next_T`/`hf_next_gt`), represented as +the composed pushforward of `fβ‚€` by `g`'s window flow after `f_prev`'s time-`T` +flow; the claim reduces to the generic seam DCT lemma +`vlasovGlue_seam_forceIntegral_cont` on the composed flow. -/ +private lemma vlasovGlue_seam_contRight + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT_pos : 0 < T) {T_0 : ℝ} (hT_0_pos : 0 < T_0) + (f_prev : ℝ β†’ Measure (PhaseSpace d)) + (h_prev_init : f_prev 0 = fβ‚€) + (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) + (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) + (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) + (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) + (Set.Icc 0 T) t) + (h_prev_ic : βˆ€ z : PhaseSpace d, charX_prev 0 z = z.1 ∧ charV_prev 0 z = z.2) + (g : ℝ β†’ Measure (PhaseSpace d)) + (charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hg_init : g 0 = f_prev T) + (hg_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, HasFiniteFirstMoment (g t)) + (hg_mom_unif : βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (g t)) ≀ M) + (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) + (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) + (hg_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + HasDerivWithinAt (fun s => charX_g s z) (charV_g t z) (Set.Icc 0 T_0) t ∧ + HasDerivWithinAt (fun s => charV_g s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t z))) + (Set.Icc 0 T_0) t) + (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_T : f_next T = f_prev T) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) + (Ο† : PhaseSpace d β†’ ℝ) + (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) (hΟ†_compact : HasCompactSupport Ο†) + (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) + (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : + ContinuousWithinAt + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) (Set.Ici T) T := by + have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_nhd_R : Set.Icc T (T + T_0) ∈ nhdsWithin T (Set.Ici T) := + Icc_mem_nhdsGE (by linarith : T < T + T_0) + have h_outer_aemeas : AEMeasurable + (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas T hT_Icc + set Zpos : ℝ β†’ PhaseSpace d β†’ PhysSpace d := + fun s z => charX_g (s - T) (charX_prev T z, charV_prev T z) with hZpos_def + set Zvel : ℝ β†’ PhaseSpace d β†’ PhysSpace d := + fun s z => charV_g (s - T) (charX_prev T z, charV_prev T z) with hZvel_def + have hgradXΟ†_cont : Continuous gradXΟ† := + vlasovGlue_gradXΟ†_continuous Ο† hΟ†_smooth gradXΟ† hgradXΟ† + have hgradVΟ†_cont : Continuous gradVΟ† := + vlasovGlue_gradVΟ†_continuous Ο† hΟ†_smooth gradVΟ† hgradVΟ† + have h_int_marg_g := dobrushinFlow_marginal_gradW_integrable gradW L hL T_0 + g hg_mom + -- Composed pushforward of g's spatial marginal (hoisted helper), bridged to + -- the Zpos/Zvel forms. + have h_prevT_push : f_prev T + = Measure.map (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := by + rw [h_prev_push T hT_Icc, h_prev_init] + obtain ⟨h_comp_aemeas, h_g_push_comp', h_push_marg', h_aemeas_marg'⟩ := + vlasovGlue_composed_pushforward fβ‚€ g (f_prev T) charX_g charV_g + (charX_prev T) (charV_prev T) h_outer_aemeas h_prevT_push hg_init + hg_push_ex hg_aemeas_ex + have h_g_push_comp : βˆ€ s ∈ Set.Icc T (T + T_0), + g (s - T) = Measure.map + (fun z : PhaseSpace d => (Zpos s z, Zvel s z)) fβ‚€ := by + intro s hs + simpa only [hZpos_def, hZvel_def] using h_g_push_comp' s hs + have h_push_marg : βˆ€ s ∈ Set.Icc T (T + T_0), + spatialMarginal (g (s - T)) + = Measure.map (fun z : PhaseSpace d => Zpos s z) fβ‚€ := by + intro s hs + simpa only [hZpos_def] using h_push_marg' s hs + have h_aemeas_marg : βˆ€ s ∈ Set.Icc T (T + T_0), + AEMeasurable (fun z : PhaseSpace d => Zpos s z) fβ‚€ := by + intro s hs + simpa only [hZpos_def] using h_aemeas_marg' s hs + -- Composed growth bound: Piece A on g over [0,T_0] composed with Piece A on + -- prev at T (both via the hoisted clamp construction). + obtain ⟨C_prev, hC_prev_nn, hC_prev_pair, _h_cont_Icc_prev⟩ := + vlasovGlue_flow_growthBound gradW L hL f_prev charX_prev charV_prev + T hT_pos h_prev_mom hM_prev h_prev_ic h_prev_boundary + obtain ⟨C_g, hC_g_nn, hC_g_pair, _h_cont_Icc_g⟩ := + vlasovGlue_flow_growthBound gradW L hL g charX_g charV_g + T_0 hT_0_pos hg_mom hg_mom_unif hg_init_cond hg_boundary + obtain ⟨M_g, _hM_g_nn, hM_g_bd⟩ := hg_mom_unif + have h_y_int_marg_g : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (g Ο„)) := + fun Ο„ hΟ„ => vlasovGlue_marginal_norm_integrable (g Ο„) (hg_mom Ο„ hΟ„) + set C_comp : ℝ := C_g * C_prev + C_g with hC_comp_def + have hC_comp_nn : 0 ≀ C_comp := by positivity + have hC_comp_pair : βˆ€ s ∈ Set.Icc T (T + T_0), βˆ€ z : PhaseSpace d, + β€–(Zpos s z, Zvel s z)β€– ≀ C_comp * (β€–zβ€– + 1) := by + intro s hs z + have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + have h_prev : β€–(charX_prev T z, charV_prev T z)β€– ≀ C_prev * (β€–zβ€– + 1) := + hC_prev_pair T hT_Icc z + have h_g : β€–(charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))β€– + ≀ C_g * (β€–(charX_prev T z, charV_prev T z)β€– + 1) := + hC_g_pair (s - T) hsT_Icc (charX_prev T z, charV_prev T z) + have hz1 : (0 : ℝ) ≀ β€–zβ€– + 1 := by positivity + calc β€–(Zpos s z, Zvel s z)β€– + = β€–(charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))β€– := by + simp only [hZpos_def, hZvel_def] + _ ≀ C_g * (β€–(charX_prev T z, charV_prev T z)β€– + 1) := h_g + _ ≀ C_g * (C_prev * (β€–zβ€– + 1) + 1) := by + apply mul_le_mul_of_nonneg_left _ hC_g_nn; linarith + _ ≀ C_comp * (β€–zβ€– + 1) := by + simp only [hC_comp_def] + nlinarith [mul_nonneg hC_g_nn (norm_nonneg z), + mul_nonneg (mul_nonneg hC_g_nn hC_prev_nn) hz1] + have hC_comp_X : βˆ€ s ∈ Set.Icc T (T + T_0), βˆ€ z : PhaseSpace d, + β€–Zpos s zβ€– ≀ C_comp * (β€–zβ€– + 1) := by + intro s hs z + exact le_trans (norm_fst_le (Zpos s z, Zvel s z)) (hC_comp_pair s hs z) + -- Seam continuity of the composed flow at T (hoisted shift helper). + have h_Zpos_cont : βˆ€ z : PhaseSpace d, + ContinuousWithinAt (fun s => Zpos s z) (Set.Ici T) T := by + intro z + have := vlasovGlue_shifted_flow_contWithin charX_g + (charX_prev T z, charV_prev T z) T hT_0_pos + (hg_boundary (charX_prev T z, charV_prev T z) 0 ⟨le_refl 0, hT_0_pos.le⟩).1 + simpa only [hZpos_def] using this + have h_Zvel_cont : βˆ€ z : PhaseSpace d, + ContinuousWithinAt (fun s => Zvel s z) (Set.Ici T) T := by + intro z + have := vlasovGlue_shifted_flow_contWithin charV_g + (charX_prev T z, charV_prev T z) T hT_0_pos + (hg_boundary (charX_prev T z, charV_prev T z) 0 ⟨le_refl 0, hT_0_pos.le⟩).2 + simpa only [hZvel_def] using this + -- Continuity of the un-pushed integrand in z (for integral_map's + -- AEStronglyMeasurable side). + have h_conv_z_cont : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + Continuous (fun z : PhaseSpace d => + convolveFunctionMeasure gradW (spatialMarginal (g Ο„)) z.1) := by + intro Ο„ hΟ„ + have : IsProbabilityMeasure (g Ο„) := (hg_mom Ο„ hΟ„).1 + have : IsProbabilityMeasure (spatialMarginal (g Ο„)) := + (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL + (spatialMarginal (g Ο„)) (h_int_marg_g Ο„ hΟ„)).continuous.comp continuous_fst + have h_integrand_cont : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, + Continuous (fun z : PhaseSpace d => + @inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (g Ο„)) z.1) + (gradVΟ† z)) := by + intro Ο„ hΟ„ + exact (continuous_snd.inner hgradXΟ†_cont).sub + ((h_conv_z_cont Ο„ hΟ„).inner hgradVΟ†_cont) + -- Eventually-equal rewrite to the composed-pushforward form (pointwise helper). + have h_intg_eq := vlasovGlue_composed_integral_eq gradW fβ‚€ hT_pos f_prev g + h_prev_init charX_prev charV_prev charX_g charV_g h_prev_push hg_init + hg_init_cond f_next hf_next_T hf_next_gt gradXΟ† gradVΟ† h_comp_aemeas + h_g_push_comp' h_integrand_cont + have h_eq_R : (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) + =αΆ [nhdsWithin T (Set.Ici T)] + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (Zvel s z) + (gradXΟ† (Zpos s z, Zvel s z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) + (Zpos s z)) + (gradVΟ† (Zpos s z, Zvel s z))) βˆ‚fβ‚€) := by + apply Filter.Eventually.mono h_nhd_R + intro s hs + simpa only [hZpos_def, hZvel_def] using h_intg_eq s hs + obtain ⟨M_Ο†, hgradXΟ†_bd, hgradVΟ†_bd⟩ := + vlasovGlue_gradΟ†_bound Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† + -- DCT via the generic seam lemma on the composed flow. + have h_conv_cwn : βˆ€ z : PhaseSpace d, ContinuousWithinAt + (fun s => convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) + (Zpos s z)) (Set.Ici T) T := fun z => + flowConv_continuousWithinAt_Ici_seam gradW L hL Zpos fβ‚€ + hfβ‚€_int (by linarith : T < T + T_0) + (fun s => spatialMarginal (g (s - T))) + h_push_marg h_aemeas_marg h_Zpos_cont C_comp hC_comp_nn hC_comp_X z + have h_aemeas_W : βˆ€ s ∈ Set.Icc T (T + T_0), + AEMeasurable (fun z : PhaseSpace d => (Zpos s z, Zvel s z)) fβ‚€ := by + intro s hs + have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + simpa only [hZpos_def, hZvel_def] using h_comp_aemeas (s - T) hsT_Icc + have h_cont_pf : ContinuousWithinAt + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (Zvel s z) + (gradXΟ† (Zpos s z, Zvel s z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) + (Zpos s z)) + (gradVΟ† (Zpos s z, Zvel s z))) βˆ‚fβ‚€) + (Set.Ici T) T := + vlasovGlue_seam_forceIntegral_cont gradW L hL fβ‚€ hfβ‚€_int gradXΟ† gradVΟ† + hgradXΟ†_cont hgradVΟ†_cont M_Ο† hgradXΟ†_bd hgradVΟ†_bd + (fun s => spatialMarginal (g (s - T))) Zpos Zvel + T (Set.Ici T) (Set.Icc T (T + T_0)) h_nhd_R + (fun s hs => by + have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + have : IsProbabilityMeasure (g (s - T)) := (hg_mom (s - T) hsT_Icc).1 + exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance) + M_g + (fun s hs => hM_g_bd (s - T) ⟨by linarith [hs.1], by linarith [hs.2]⟩) + (fun s hs => h_y_int_marg_g (s - T) ⟨by linarith [hs.1], by linarith [hs.2]⟩) + (fun s hs => h_int_marg_g (s - T) ⟨by linarith [hs.1], by linarith [hs.2]⟩) + C_comp hC_comp_pair h_aemeas_W h_Zpos_cont h_Zvel_cont h_conv_cwn + -- Value at T bridge (pointwise helper at s = T). + have h_val_T : (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next T)) z.1) + (gradVΟ† z)) βˆ‚(f_next T)) + = ∫ z, (@inner ℝ (PhysSpace d) _ (Zvel T z) + (gradXΟ† (Zpos T z, Zvel T z)) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (g (T - T))) + (Zpos T z)) + (gradVΟ† (Zpos T z, Zvel T z))) βˆ‚fβ‚€ := by + simpa only [hZpos_def, hZvel_def] using + h_intg_eq T ⟨le_refl T, by linarith⟩ + exact h_cont_pf.congr_of_eventuallyEq h_eq_R h_val_T + +/-- `HasDerivAt` of the glued position flow at interior times of the extended +window: piecewise from `f_prev`'s flow (`t < T`), the two-sided union of the +boundary bundles (`t = T`), and `g`'s shifted flow (`t > T`). Pure ODE gluing β€” +takes only the position projections of the flow hypotheses. -/ +private lemma vlasovGlue_flowX_hasDerivAt + {d : β„•} + (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) + (h_prev_flowX : βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z : PhaseSpace d, + HasDerivAt (fun s => charX_prev s z) (charV_prev t z) t) + (h_prev_boundaryX : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t) + (hg_boundaryX : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + HasDerivWithinAt (fun s => charX_g s z) (charV_g t z) (Set.Icc 0 T_0) t) + (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) + (t : ℝ) (ht : t ∈ Set.Ioo (0 : ℝ) (T + T_0)) (z : PhaseSpace d) : + HasDerivAt (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + (if t ≀ T then charV_prev t z + else charV_g (t - T) (charX_prev T z, charV_prev T z)) t := by + by_cases ht_le : t ≀ T + Β· simp only [ite_eq_left ht_le] + -- Sub-case: t < T (strict interior) vs t = T (boundary) + by_cases ht_lt : t < T + Β· -- t < T strict: piecewise function = charX_prev Β· z near t + have h_ev : (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] + (fun s => charX_prev s z) := by + apply Filter.Eventually.mono (eventually_lt_nhds ht_lt) + intro s hs; simp [le_of_lt hs] + exact ((h_prev_flowX t ⟨ht.1, ht_lt⟩ z).congr_of_eventuallyEq h_ev) + Β· -- t = T: boundary HasDerivAt via HasDerivWithinAt.union (Iic T βˆͺ Ici T = univ) + push Not at ht_lt + have h_t_eq : t = T := le_antisymm ht_le ht_lt + have hT_in : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_bX := h_prev_boundaryX z T hT_in + have h0_T0_in : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ + have h_g_bX := hg_boundaryX (charX_prev T z, charV_prev T z) 0 h0_T0_in + have h_nhd_L : Set.Icc 0 T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT_pos + have h_nhd_R : Set.Icc 0 T_0 ∈ nhdsWithin (0 : ℝ) (Set.Ici 0) := + Icc_mem_nhdsGE hT_0_pos + -- LEFT: HasDerivWithinAt charX_prev on Iic T at T + have hX_Lic := h_bX.mono_of_mem_nhdsWithin h_nhd_L + have hX_left : HasDerivWithinAt + (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_prev T z) (Set.Iic T) T := + hX_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) Set.self_mem_Iic + -- RIGHT: chain rule from g's boundary at 0 + have hX_Ici0 := h_g_bX.mono_of_mem_nhdsWithin h_nhd_R + have h_sub_R : HasDerivWithinAt (Β· - T) 1 (Set.Ici T) T := + ((hasDerivAt_id' T).sub_const T).hasDerivWithinAt + have h_mapR : Set.MapsTo (Β· - T) (Set.Ici T) (Set.Ici 0) := + fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) + have h_chainX : HasDerivWithinAt + (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_g 0 (charX_prev T z, charV_prev T z)) (Set.Ici T) T := by + have := HasDerivWithinAt.scomp_of_eq T hX_Ici0 h_sub_R h_mapR (sub_self T).symm + simpa [Function.comp_def, one_smul] using this + have hVg0_eq : charV_g 0 (charX_prev T z, charV_prev T z) = charV_prev T z := + (hg_init_cond (charX_prev T z, charV_prev T z)).2 + rw [hVg0_eq] at h_chainX + have hX_right : HasDerivWithinAt + (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_prev T z) (Set.Ici T) T := + h_chainX.congr_of_mem + (fun s hs => by + by_cases hle : s ≀ T + Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) + simp [heq, sub_self, + (hg_init_cond (charX_prev T z, charV_prev T z)).1] + Β· simp [hle]) + Set.self_mem_Ici + have hX_union := hX_left.union hX_right + rw [Set.Iic_union_Ici] at hX_union + rw [h_t_eq] + exact hX_union.hasDerivAt Filter.univ_mem + Β· simp only [ite_eq_right ht_le] + push Not at ht_le + -- t > T: use hg_boundaryX at (t - T) with chain rule for (s ↦ s - T) + have htT_mem : t - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ + have h_g_deriv : HasDerivAt (fun s => charX_g s (charX_prev T z, charV_prev T z)) + (charV_g (t - T) (charX_prev T z, charV_prev T z)) (t - T) := + (hg_boundaryX (charX_prev T z, charV_prev T z) (t - T) + (Set.Ioo_subset_Icc_self htT_mem)).hasDerivAt + (Icc_mem_nhds htT_mem.1 htT_mem.2) + have h_sub : HasDerivAt (Β· - T) 1 t := (hasDerivAt_id' t).sub_const T + have h_chain : HasDerivAt (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) + (charV_g (t - T) (charX_prev T z, charV_prev T z)) t := by + have := HasDerivAt.scomp_of_eq t h_g_deriv h_sub rfl + simpa [Function.comp_def, one_smul] using this + have h_ev : (fun s => if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] + (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) := by + apply Filter.Eventually.mono (eventually_gt_nhds ht_le) + intro s hs; simp [not_le.mpr hs] + exact h_chain.congr_of_eventuallyEq h_ev + +/-- `HasDerivAt` of the glued velocity flow at interior times of the extended +window, with the force term against the glued measure `f_next` (consumed only +through its value hypotheses). Mirrors `vlasovGlue_flowX_hasDerivAt` with the +velocity projections and the marginal bridges. -/ +private lemma vlasovGlue_flowV_hasDerivAt + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (f_prev g : ℝ β†’ Measure (PhaseSpace d)) + (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) + (h_prev_flowV : βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z : PhaseSpace d, + HasDerivAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) + (charX_prev t z))) t) + (h_prev_boundaryV : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) + (Set.Icc 0 T) t) + (hg_boundaryV : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + HasDerivWithinAt (fun s => charV_g s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t z))) + (Set.Icc 0 T_0) t) + (hg_init : g 0 = f_prev T) + (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) + (t : ℝ) (ht : t ∈ Set.Ioo (0 : ℝ) (T + T_0)) (z : PhaseSpace d) : + HasDerivAt (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next t)) + (if t ≀ T then charX_prev t z + else charX_g (t - T) (charX_prev T z, charV_prev T z)))) t := by + by_cases ht_le : t ≀ T + Β· simp only [ite_eq_left ht_le] + -- Sub-case: t < T (strict interior) vs t = T (boundary) + by_cases ht_lt : t < T + Β· -- t < T strict: piecewise function = charV_prev Β· z near t + have h_ev : (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] + (fun s => charV_prev s z) := by + apply Filter.Eventually.mono (eventually_lt_nhds ht_lt) + intro s hs; simp [le_of_lt hs] + have h_fnext_t : f_next t = f_prev t := hf_next_le t ht_le + have h_prev_deriv := h_prev_flowV t ⟨ht.1, ht_lt⟩ z + have h_eq_marg : spatialMarginal (f_prev t) = spatialMarginal (f_next t) := + congrArg spatialMarginal h_fnext_t.symm + simp only [h_eq_marg] at h_prev_deriv + exact h_prev_deriv.congr_of_eventuallyEq h_ev + Β· -- t = T: boundary HasDerivAt via HasDerivWithinAt.union (same as charX case) + push Not at ht_lt + have h_t_eq : t = T := le_antisymm ht_le ht_lt + have hT_in : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_bV := h_prev_boundaryV z T hT_in + have h0_T0_in : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ + have h_g_bV := hg_boundaryV (charX_prev T z, charV_prev T z) 0 h0_T0_in + have h_nhd_L : Set.Icc 0 T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT_pos + have h_nhd_R : Set.Icc 0 T_0 ∈ nhdsWithin (0 : ℝ) (Set.Ici 0) := + Icc_mem_nhdsGE hT_0_pos + -- Bridge f_prev T ↔ f_next T (for spatial marginal in goal vs h_bV) + have hfnextT : f_next T = f_prev T := hf_next_le T (le_refl T) + have hfnextT_spat : spatialMarginal (f_next T) = spatialMarginal (f_prev T) := + congrArg spatialMarginal hfnextT + -- LEFT: HasDerivWithinAt charV_prev on Iic T at T + have hV_Lic := h_bV.mono_of_mem_nhdsWithin h_nhd_L + have hV_left : HasDerivWithinAt + (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) + (charX_prev T z))) + (Set.Iic T) T := by + rw [hfnextT_spat] + exact hV_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) + Set.self_mem_Iic + -- RIGHT: chain rule from g's boundary at 0 + have hV_Ici0 := h_g_bV.mono_of_mem_nhdsWithin h_nhd_R + have h_sub_R : HasDerivWithinAt (Β· - T) 1 (Set.Ici T) T := + ((hasDerivAt_id' T).sub_const T).hasDerivWithinAt + have h_mapR : Set.MapsTo (Β· - T) (Set.Ici T) (Set.Ici 0) := + fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) + have h_chainV : HasDerivWithinAt + (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW + (spatialMarginal (g 0)) + (charX_g 0 (charX_prev T z, charV_prev T z)))) + (Set.Ici T) T := by + have := HasDerivWithinAt.scomp_of_eq T hV_Ici0 h_sub_R h_mapR (sub_self T).symm + simpa [Function.comp_def, one_smul] using this + have hXg0_eq : charX_g 0 (charX_prev T z, charV_prev T z) = charX_prev T z := + (hg_init_cond (charX_prev T z, charV_prev T z)).1 + have hg0_spat : spatialMarginal (g 0) = spatialMarginal (f_prev T) := + congrArg spatialMarginal hg_init + rw [hXg0_eq, hg0_spat, ← hfnextT_spat] at h_chainV + have hV_right : HasDerivWithinAt + (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) + (charX_prev T z))) + (Set.Ici T) T := + h_chainV.congr_of_mem + (fun s hs => by + by_cases hle : s ≀ T + Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) + simp [heq, sub_self, + (hg_init_cond (charX_prev T z, charV_prev T z)).2] + Β· simp [hle]) + Set.self_mem_Ici + have hV_union := hV_left.union hV_right + rw [Set.Iic_union_Ici] at hV_union + rw [h_t_eq] + exact hV_union.hasDerivAt Filter.univ_mem + Β· simp only [ite_eq_right ht_le] + push Not at ht_le + -- t > T: use hg_boundaryV at (t - T) + have htT_mem : t - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ + have h_g_deriv : HasDerivAt (fun s => charV_g s (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (g (t - T))) + (charX_g (t - T) (charX_prev T z, charV_prev T z)))) (t - T) := + (hg_boundaryV (charX_prev T z, charV_prev T z) (t - T) + (Set.Ioo_subset_Icc_self htT_mem)).hasDerivAt + (Icc_mem_nhds htT_mem.1 htT_mem.2) + have h_sub : HasDerivAt (Β· - T) 1 t := (hasDerivAt_id' t).sub_const T + have h_chain : HasDerivAt (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) + (-(convolveFunctionMeasure gradW (spatialMarginal (g (t - T))) + (charX_g (t - T) (charX_prev T z, charV_prev T z)))) t := by + have := HasDerivAt.scomp_of_eq t h_g_deriv h_sub rfl + simpa [Function.comp_def, one_smul] using this + -- f_next t = g (t - T) when t > T + have h_fnext_t : f_next t = g (t - T) := hf_next_gt t ht_le + -- Rewrite derivative value: g (t-T) β†’ f_next t + rw [← congrArg spatialMarginal h_fnext_t] at h_chain + have h_ev : (fun s => if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] + (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) := by + apply Filter.Eventually.mono (eventually_gt_nhds ht_le) + intro s hs; simp [not_le.mpr hs] + exact h_chain.congr_of_eventuallyEq h_ev + +/-- The weak PDE holds at every time `t' β‰  T` near the seam: to the left the +glued solution is `f_prev` (use its weak PDE), to the right it is `g (Β·βˆ’T)` +(use `g`'s weak PDE with the shift chain rule). -/ +private lemma vlasovGlue_diff_ne + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (f_prev g : ℝ β†’ Measure (PhaseSpace d)) + {T T_0 : ℝ} + (h_prev_vlasov : IsVlasovSolutionOn gradW f_prev T) + (h_g_vlasov : IsVlasovSolutionOn gradW g T_0) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) + (Ο† : PhaseSpace d β†’ ℝ) + (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) (hΟ†_compact : HasCompactSupport Ο†) + (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) + (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : + βˆ€ t' ∈ Set.Ioo (0 : ℝ) (T + T_0), t' β‰  T β†’ HasDerivAt + (fun s => ∫ z, Ο† z βˆ‚f_next s) + ((∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next t')) z.1) + (gradVΟ† z)) βˆ‚(f_next t')) + 0) t' := by + intro t' ht' ht'_ne + rcases lt_or_gt_of_ne ht'_ne with ht'_lt | ht'_gt + Β· -- t' < T: use h_prev_vlasov + bridge f_next = f_prev on left of T + have ht'_prev : t' ∈ Set.Ioo (0 : ℝ) T := ⟨ht'.1, ht'_lt⟩ + have h_ev : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhds t'] + (fun s => ∫ z, Ο† z βˆ‚f_prev s) := by + apply Filter.Eventually.mono (eventually_lt_nhds ht'_lt) + intro s hs; simp [hf_next_le s (le_of_lt hs)] + have h_fnext_t' : f_next t' = f_prev t' := hf_next_le t' (le_of_lt ht'_lt) + have h_deriv := h_prev_vlasov Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† + hgradXΟ† hgradVΟ† t' ht'_prev + rw [show (fun _ => (0 : ℝ)) t' = 0 from rfl, add_zero] at h_deriv + have h_marg : spatialMarginal (f_next t') = spatialMarginal (f_prev t') := + congrArg spatialMarginal h_fnext_t' + rw [add_zero, h_marg, h_fnext_t'] + exact h_deriv.congr_of_eventuallyEq h_ev + Β· -- t' > T: use h_g_vlasov + chain rule + bridge f_next = g (Β·-T) + have ht'_g : t' - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht'.2]⟩ + have h_ev : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhds t'] + (fun s => ∫ z, Ο† z βˆ‚g (s - T)) := by + apply Filter.Eventually.mono (eventually_gt_nhds ht'_gt) + intro s hs; simp [hf_next_gt s hs] + have h_fnext_t' : f_next t' = g (t' - T) := hf_next_gt t' ht'_gt + have h_g_deriv := h_g_vlasov Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† + hgradXΟ† hgradVΟ† (t' - T) ht'_g + rw [show (fun _ => (0 : ℝ)) (t' - T) = 0 from rfl, add_zero] at h_g_deriv + have h_sub : HasDerivAt (Β· - T) 1 t' := (hasDerivAt_id' t').sub_const T + have h_chain : HasDerivAt (fun s => ∫ z, Ο† z βˆ‚g (s - T)) + (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (g (t' - T))) z.1) + (gradVΟ† z)) βˆ‚g (t' - T)) t' := by + have := HasDerivAt.comp_of_eq t' h_g_deriv h_sub rfl + simpa [Function.comp_def, mul_one] using this + have h_marg : spatialMarginal (f_next t') = spatialMarginal (g (t' - T)) := + congrArg spatialMarginal h_fnext_t' + rw [add_zero, h_marg, h_fnext_t'] + exact h_chain.congr_of_eventuallyEq h_ev + +/-- LEFT seam continuity of the plain test-function integral at `T`: on `Iic T` +the glued solution agrees with `f_prev`; DCT with the constant dominator `CΟ†` +against the window pushforward. -/ +private lemma vlasovGlue_intCont_left + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + {T : ℝ} (hT_pos : 0 < T) + (f_prev : ℝ β†’ Measure (PhaseSpace d)) + (h_prev_init : f_prev 0 = fβ‚€) + (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) + (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) + (Set.Icc 0 T) t) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_cont : Continuous Ο†) + (CΟ† : ℝ) (hCΟ† : βˆ€ z : PhaseSpace d, β€–Ο† zβ€– ≀ CΟ†) : + ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) (Set.Iic T) T := by + have h_nhd_L : Set.Icc (0 : ℝ) T ∈ nhdsWithin T (Set.Iic T) := + Icc_mem_nhdsLE hT_pos + -- Equation: f_next = f_prev = pushforward of fβ‚€ on Icc 0 T + have h_eq_L : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhdsWithin T (Set.Iic T)] + (fun s => ∫ z, Ο† (charX_prev s z, charV_prev s z) βˆ‚fβ‚€) := by + apply Filter.Eventually.mono h_nhd_L + intro s hs + change ∫ z, Ο† z βˆ‚f_next s = ∫ z, Ο† (charX_prev s z, charV_prev s z) βˆ‚fβ‚€ + have h_fnext : f_next s = f_prev s := hf_next_le s hs.2 + have h_aemeas_fβ‚€ : AEMeasurable + (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas s hs + rw [h_fnext, h_prev_push s hs, h_prev_init] + exact integral_map h_aemeas_fβ‚€ hΟ†_cont.aestronglyMeasurable + -- DCT for the pushforward-composed form + have h_cont_pf : ContinuousWithinAt + (fun s => ∫ z, Ο† (charX_prev s z, charV_prev s z) βˆ‚fβ‚€) (Set.Iic T) T := by + apply continuousWithinAt_of_dominated (bound := fun _ => CΟ†) + Β· apply Filter.Eventually.mono h_nhd_L + intro s hs + have h_pair_aem : AEMeasurable + (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas s hs + exact (hΟ†_cont.measurable.comp_aemeasurable h_pair_aem).aestronglyMeasurable + Β· apply Filter.Eventually.mono h_nhd_L + intro s _ + exact Filter.Eventually.of_forall fun z => hCΟ† _ + Β· exact integrable_const _ + Β· apply Filter.Eventually.of_forall + intro z + have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_bX := (h_prev_boundary z T hT_Icc).1 + have h_bV := (h_prev_boundary z T hT_Icc).2 + have h_pair_Icc : ContinuousWithinAt + (fun s => (charX_prev s z, charV_prev s z)) (Set.Icc 0 T) T := + h_bX.continuousWithinAt.prodMk h_bV.continuousWithinAt + have h_pair_Iic : ContinuousWithinAt + (fun s => (charX_prev s z, charV_prev s z)) (Set.Iic T) T := + h_pair_Icc.mono_of_mem_nhdsWithin h_nhd_L + exact hΟ†_cont.continuousAt.comp_continuousWithinAt h_pair_Iic + -- Value at T: bridge via the pushforward formula + have h_val_T : (∫ z, Ο† z βˆ‚f_next T) + = ∫ z, Ο† (charX_prev T z, charV_prev T z) βˆ‚fβ‚€ := by + have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_fnext_T : f_next T = f_prev T := hf_next_le T (le_refl T) + have h_aemeas_fβ‚€_T : AEMeasurable + (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas T hT_Icc + rw [h_fnext_T, h_prev_push T hT_Icc, h_prev_init] + exact integral_map h_aemeas_fβ‚€_T hΟ†_cont.aestronglyMeasurable + exact h_cont_pf.congr_of_eventuallyEq h_eq_L h_val_T + +/-- RIGHT seam continuity of the plain test-function integral at `T`: on +`Ici T` the glued solution is the composed pushforward off `g`; DCT with the +constant dominator `CΟ†`. -/ +private lemma vlasovGlue_intCont_right + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + {T : ℝ} (hT_pos : 0 < T) {T_0 : ℝ} (hT_0_pos : 0 < T_0) + (f_prev : ℝ β†’ Measure (PhaseSpace d)) + (h_prev_init : f_prev 0 = fβ‚€) + (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) + (g : ℝ β†’ Measure (PhaseSpace d)) + (charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hg_init : g 0 = f_prev T) + (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) + (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) + (hg_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + HasDerivWithinAt (fun s => charX_g s z) (charV_g t z) (Set.Icc 0 T_0) t ∧ + HasDerivWithinAt (fun s => charV_g s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t z))) + (Set.Icc 0 T_0) t) + (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_T : f_next T = f_prev T) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) + (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_cont : Continuous Ο†) + (CΟ† : ℝ) (hCΟ† : βˆ€ z : PhaseSpace d, β€–Ο† zβ€– ≀ CΟ†) : + ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) (Set.Ici T) T := by + have h_nhd_R : Set.Icc T (T + T_0) ∈ nhdsWithin T (Set.Ici T) := + Icc_mem_nhdsGE (by linarith : T < T + T_0) + have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have h_outer_aemeas : AEMeasurable + (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := + h_prev_init β–Έ h_prev_aemeas T hT_Icc + -- Eventually-equal: f_next s = composed pushforward on Icc T (T+T_0) + have h_eq_R : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhdsWithin T (Set.Ici T)] + (fun s => ∫ z, Ο† + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€) := by + apply Filter.Eventually.mono h_nhd_R + intro s hs + change ∫ z, Ο† z βˆ‚f_next s = ∫ z, Ο† + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€ + have hs_T : T ≀ s := hs.1 + have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith, by linarith [hs.2]⟩ + by_cases hs_eq : s = T + Β· -- s = T: f_next s = f_next T = f_prev T = (charX_prev T, charV_prev T)#fβ‚€ + -- RHS at s = T uses hg_init_cond to collapse (charX_g 0, charV_g 0) = id + have hs_T_zero : s - T = 0 := by rw [hs_eq]; exact sub_self T + have h_fnext_s : f_next s = f_prev T := by + rw [hs_eq]; exact hf_next_T + rw [h_fnext_s, h_prev_push T hT_Icc, h_prev_init, + integral_map h_outer_aemeas hΟ†_cont.aestronglyMeasurable] + congr 1 + funext z + rw [hs_T_zero, (hg_init_cond _).1, (hg_init_cond _).2] + Β· -- s > T: f_next s = g (s - T) = composed pushforward + have hs_gt : T < s := lt_of_le_of_ne hs_T (Ne.symm hs_eq) + have h_fnext_s : f_next s = g (s - T) := hf_next_gt s hs_gt + rw [h_fnext_s, hg_push_ex (s - T) hsT_Icc, hg_init, + h_prev_push T hT_Icc, h_prev_init] + have h_g_at_sT : AEMeasurable + (fun z : PhaseSpace d => (charX_g (s - T) z, charV_g (s - T) z)) + (Measure.map (fun z : PhaseSpace d => + (charX_prev T z, charV_prev T z)) fβ‚€) := by + have := hg_aemeas_ex (s - T) hsT_Icc + rw [hg_init, h_prev_push T hT_Icc, h_prev_init] at this + exact this + have h_comp_aem : AEMeasurable + (fun z : PhaseSpace d => + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := + h_g_at_sT.comp_aemeasurable h_outer_aemeas + rw [AEMeasurable.map_map_of_aemeasurable h_g_at_sT h_outer_aemeas] + exact integral_map h_comp_aem hΟ†_cont.aestronglyMeasurable + -- DCT for the composed-pushforward form + have h_cont_pf : ContinuousWithinAt + (fun s => ∫ z, Ο† + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€) + (Set.Ici T) T := by + apply continuousWithinAt_of_dominated (bound := fun _ => CΟ†) + Β· apply Filter.Eventually.mono h_nhd_R + intro s hs + have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := + ⟨by linarith [hs.1], by linarith [hs.2]⟩ + have h_g_at_sT : AEMeasurable + (fun z : PhaseSpace d => (charX_g (s - T) z, charV_g (s - T) z)) + (Measure.map (fun z : PhaseSpace d => + (charX_prev T z, charV_prev T z)) fβ‚€) := by + have := hg_aemeas_ex (s - T) hsT_Icc + rw [hg_init, h_prev_push T hT_Icc, h_prev_init] at this + exact this + have h_comp_aem : AEMeasurable + (fun z : PhaseSpace d => + (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := + h_g_at_sT.comp_aemeasurable h_outer_aemeas + exact (hΟ†_cont.measurable.comp_aemeasurable h_comp_aem).aestronglyMeasurable + Β· apply Filter.Eventually.mono h_nhd_R + intro s _ + exact Filter.Eventually.of_forall fun z => hCΟ† _ + Β· exact integrable_const _ + Β· -- Pointwise continuity: chain rule for (Β· - T) at T with charX_g/charV_g at 0 + apply Filter.Eventually.of_forall + intro z + have h0_Icc : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ + have h_g_bX := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_Icc).1 + have h_g_bV := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_Icc).2 + have h_nhdsW_0 : Set.Icc (0 : ℝ) T_0 ∈ nhdsWithin 0 (Set.Ici 0) := + Icc_mem_nhdsGE hT_0_pos + have h_g_bX_cont : ContinuousWithinAt + (fun s' => charX_g s' (charX_prev T z, charV_prev T z)) + (Set.Ici 0) 0 := + h_g_bX.continuousWithinAt.mono_of_mem_nhdsWithin h_nhdsW_0 + have h_g_bV_cont : ContinuousWithinAt + (fun s' => charV_g s' (charX_prev T z, charV_prev T z)) + (Set.Ici 0) 0 := + h_g_bV.continuousWithinAt.mono_of_mem_nhdsWithin h_nhdsW_0 + have h_sub_cont : ContinuousWithinAt (fun s : ℝ => s - T) (Set.Ici T) T := + ((continuous_id.sub continuous_const).continuousAt).continuousWithinAt + have h_sub_maps : Set.MapsTo (fun s : ℝ => s - T) (Set.Ici T) (Set.Ici 0) := + fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) + have h_chainX : ContinuousWithinAt + (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) + (Set.Ici T) T := + ContinuousWithinAt.comp_of_eq h_g_bX_cont h_sub_cont h_sub_maps (sub_self T) + have h_chainV : ContinuousWithinAt + (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) + (Set.Ici T) T := + ContinuousWithinAt.comp_of_eq h_g_bV_cont h_sub_cont h_sub_maps (sub_self T) + have h_pair : ContinuousWithinAt + (fun s => (charX_g (s - T) (charX_prev T z, charV_prev T z), + charV_g (s - T) (charX_prev T z, charV_prev T z))) + (Set.Ici T) T := + h_chainX.prodMk h_chainV + exact hΟ†_cont.continuousAt.comp_continuousWithinAt h_pair + -- Value at T: integrate the s = T case + have h_val_T : (∫ z, Ο† z βˆ‚f_next T) = ∫ z, Ο† + (charX_g (T - T) (charX_prev T z, charV_prev T z), + charV_g (T - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€ := by + rw [hf_next_T, h_prev_push T hT_Icc, h_prev_init, + integral_map h_outer_aemeas hΟ†_cont.aestronglyMeasurable] + congr 1; funext z + rw [show T - T = (0 : ℝ) from sub_self T, + (hg_init_cond _).1, (hg_init_cond _).2] + exact h_cont_pf.congr_of_eventuallyEq h_eq_R h_val_T + +/-- Pushforward equation for the glued solution against the glued piecewise +flow, on the extended window. Serves both `IsLagrangianVlasovSolutionOn`'s +pushforward conjunct and the explicit conjunct (v). -/ +private lemma vlasovGlue_pushforward_eq + {d : β„•} + (f_prev g : ℝ β†’ Measure (PhaseSpace d)) + (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + {T T_0 : ℝ} (hT_pos : 0 < T) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) + (hg_init : g 0 = f_prev T) + (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, + g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) + (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) + (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) (T + T_0)) : + f_next t = Measure.map (fun z : PhaseSpace d => + ((if t ≀ T then charX_prev t z + else charX_g (t - T) (charX_prev T z, charV_prev T z)), + (if t ≀ T then charV_prev t z + else charV_g (t - T) (charX_prev T z, charV_prev T z)))) (f_next 0) := by + rw [hf_next_le 0 hT_pos.le] + by_cases ht_le : t ≀ T + Β· simp only [ite_eq_left ht_le] + rw [hf_next_le t ht_le] + exact h_prev_push t ⟨ht.1, ht_le⟩ + Β· simp only [ite_eq_right ht_le] + push Not at ht_le + rw [hf_next_gt t ht_le] + have hT_mem : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have htT_mem : t - T ∈ Set.Icc (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ + rw [hg_push_ex (t - T) htT_mem, hg_init, h_prev_push T hT_mem] + have h_prev_T_aemeas := h_prev_aemeas T hT_mem + have h_g_at_tT := hg_aemeas_ex (t - T) htT_mem + rw [hg_init, h_prev_push T hT_mem] at h_g_at_tT + rw [AEMeasurable.map_map_of_aemeasurable h_g_at_tT h_prev_T_aemeas] + rfl + +/-- AEMeasurability of the glued piecewise flow against `f_next 0` on the +extended window. Serves both `IsLagrangianVlasovSolutionOn`'s conjunct and +the explicit conjunct (vi). -/ +private lemma vlasovGlue_flow_aemeasurable + {d : β„•} + (f_prev g : ℝ β†’ Measure (PhaseSpace d)) + (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + {T T_0 : ℝ} (hT_pos : 0 < T) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) + (hg_init : g 0 = f_prev T) + (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, + AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (s : ℝ) (hs : s ∈ Set.Icc (0 : ℝ) (T + T_0)) : + AEMeasurable (fun z : PhaseSpace d => + ((if s ≀ T then charX_prev s z + else charX_g (s - T) (charX_prev T z, charV_prev T z)), + (if s ≀ T then charV_prev s z + else charV_g (s - T) (charX_prev T z, charV_prev T z)))) (f_next 0) := by + rw [hf_next_le 0 hT_pos.le] + by_cases hs_le : s ≀ T + Β· simp only [ite_eq_left hs_le] + exact h_prev_aemeas s ⟨hs.1, hs_le⟩ + Β· simp only [ite_eq_right hs_le] + push Not at hs_le + have hT_mem : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ + have hsT_mem : s - T ∈ Set.Icc (0 : ℝ) T_0 := ⟨by linarith, by linarith [hs.2]⟩ + have h_g_at_sT := hg_aemeas_ex (s - T) hsT_mem + rw [hg_init, h_prev_push T hT_mem] at h_g_at_sT + exact h_g_at_sT.comp_aemeasurable (h_prev_aemeas T hT_mem) + +/-- Finite first moment of the glued solution on the extended window, +piecewise from the two window moment hypotheses. -/ +private lemma vlasovGlue_moment + {d : β„•} + (f_prev g : ℝ β†’ Measure (PhaseSpace d)) + {T T_0 : ℝ} + (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) + (hg_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, HasFiniteFirstMoment (g t)) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) : + βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), HasFiniteFirstMoment (f_next t) := by + intro t ht + by_cases ht_le : t ≀ T + Β· rw [hf_next_le t ht_le] + exact h_prev_mom t ⟨ht.1, ht_le⟩ + Β· push Not at ht_le + rw [hf_next_gt t ht_le] + exact hg_mom (t - T) ⟨by linarith, by linarith [ht.2]⟩ + +/-- FLAT uniform first-moment bound on the glued solution's spatial marginal: +`max` of the two window envelopes, no cross-term. -/ +private lemma vlasovGlue_moment_flat + {d : β„•} + (f_prev g : ℝ β†’ Measure (PhaseSpace d)) + {T T_0 : ℝ} + (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) + (hg_mom_unif : βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (g t)) ≀ M) + (f_next : ℝ β†’ Measure (PhaseSpace d)) + (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) + (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) : + βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), + ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_next t)) ≀ M := by + obtain ⟨M_prev, hM_prev_nn, hM_prev_bd⟩ := hM_prev + obtain ⟨M_g, _hM_g_nn, hM_g_bd⟩ := hg_mom_unif + refine ⟨max M_prev M_g, le_trans hM_prev_nn (le_max_left _ _), fun t ht => ?_⟩ + by_cases ht_le : t ≀ T + Β· rw [hf_next_le t ht_le] + exact le_trans (hM_prev_bd t ⟨ht.1, ht_le⟩) (le_max_left _ _) + Β· push Not at ht_le + rw [hf_next_gt t ht_le] + exact le_trans (hM_g_bd (t - T) ⟨by linarith, by linarith [ht.2]⟩) (le_max_right _ _) + +/-- **One-window glue step.** + +Given a solution `f_prev : ℝ β†’ Measure (PhaseSpace d)` on `[0, T]` +satisfying the local-existence conjuncts (initial condition + finite first +moment + `IsLagrangianVlasovSolutionOn`), and a window length `T_0` +satisfying the smallness constraints `LocalSmallnessPLBuffer L T_0` + +`LocalSmallnessContraction L T_0`, produces a glued solution +`f_next : ℝ β†’ Measure (PhaseSpace d)` on `[0, T + T_0]` that agrees with +`f_prev` on `[0, T]`. + +**Proof strategy**: + +1. Shift the initial condition: apply `vlasovWellPosedness_local` to + `f_prev T` (which has finite first moment by `h_prev_mom T`) with + window length `T_0`. Gives a solution `g : ℝ β†’ Measure (PhaseSpace d)` + on `[0, T_0]` with `g 0 = f_prev T`. + +2. Glue: define `f_next t := if t ≀ T then f_prev t else g (t - T)`. + Agreement at `t = T` is by `g 0 = f_prev T`. + +3. Verify the four output conjuncts: + - Initial: `f_next 0 = f_prev 0 = fβ‚€`. + - Moment: piecewise from `h_prev_mom` and `g`'s moment bound. + - `IsLagrangianVlasovSolutionOn` on `[0, T + T_0]`: + * `IsVlasovSolutionOn`: weak PDE on `Ioo 0 (T + T_0)` β€” split at `T`, + use `h_prev_lag.1` for `Ioo 0 T` part and `g`'s for `Ioo T (T+T_0)`, + continuity at `T` from the integral being continuous. + * Flow: glue the per-window flows via standard ODE composition + (charX_next(t, z) := if t ≀ T then charX_prev(t, z) else + charX_g(t - T, (charX_prev(T, z), charV_prev(T, z)))). + * Pushforward equation: holds piecewise. + * AEMeasurable witness: composition of AEMeasurable maps. -/ +theorem vlasovWellPosedness_glue + {d : β„•} [NeZero d] + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) + (hfβ‚€ : HasFiniteFirstMoment fβ‚€) + {T : ℝ} (hT_pos : 0 < T) + (f_prev : ℝ β†’ Measure (PhaseSpace d)) + (h_prev_init : f_prev 0 = fβ‚€) + (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) + -- FLAT (window-constant) uniform first-moment bound on f_prev's spatial marginal. + (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) + -- Explicit flow witnesses for f_prev (avoids witness-identity issues with + -- IsLagrangianVlasovSolutionOn) + (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_prev_vlasov : IsVlasovSolutionOn gradW f_prev T) + (h_prev_flow : IsCharacteristicFlowOn gradW (fun t => spatialMarginal (f_prev t)) + charX_prev charV_prev (Set.Ioo 0 T) Set.univ) + (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f_prev t = + Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) + (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) + (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ + HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV_prev s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) + (Set.Icc 0 T) t) + (h_prev_ic : βˆ€ z : PhaseSpace d, charX_prev 0 z = z.1 ∧ charV_prev 0 z = z.2) + {T_0 : ℝ} (hT_0_pos : 0 < T_0) + (hT_0_small_PL : LocalSmallnessPLBuffer L T_0) + (hT_0_small_con : LocalSmallnessContraction L T_0) + (hT_0_small_B : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) < 1) : + βˆƒ (f_next : ℝ β†’ Measure (PhaseSpace d)) + (charX_next charV_next : ℝ β†’ PhaseSpace d β†’ PhysSpace d), + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, f_next t = f_prev t) ∧ + f_next 0 = fβ‚€ ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), HasFiniteFirstMoment (f_next t)) ∧ + -- FLAT (window-constant) uniform first-moment bound on the spatial marginal. + (βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_next t)) ≀ M) ∧ + IsLagrangianVlasovSolutionOn gradW f_next (T + T_0) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), + f_next t = + Measure.map (fun z : PhaseSpace d => (charX_next t z, charV_next t z)) (f_next 0)) ∧ + (βˆ€ s ∈ Set.Icc (0 : ℝ) (T + T_0), + AEMeasurable (fun z : PhaseSpace d => (charX_next s z, charV_next s z)) (f_next 0)) ∧ + (βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) (T + T_0) β†’ + HasDerivWithinAt (fun s => charX_next s z) (charV_next t z) (Set.Icc 0 (T + T_0)) t ∧ + HasDerivWithinAt (fun s => charV_next s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f_next t)) (charX_next t z))) + (Set.Icc 0 (T + T_0)) t) ∧ + (βˆ€ z : PhaseSpace d, charX_next 0 z = z.1 ∧ charV_next 0 z = z.2) := by + -- The gluing closes the boundary at `t = T` by combining the boundary + -- regularity bundles from both windows: HasDerivWithinAt at T from the + -- LEFT (via f_prev's boundary bundle at endpoint T) and HasDerivWithinAt + -- at 0 from the RIGHT (via g's boundary bundle at endpoint 0), giving + -- HasDerivAt at t = T in `f_next`'s frame. + -- + -- Step 1: invoke vlasovWellPosedness_local on f_prev T to get g on [0, T_0] + have h_prev_T_mom : HasFiniteFirstMoment (f_prev T) := + h_prev_mom T (Set.right_mem_Icc.mpr hT_pos.le) + obtain ⟨g, charX_g, charV_g, hg_init, hg_mom, hg_mom_unif, hg_lag, hg_push_ex, hg_aemeas_ex, + hg_boundary, hg_init_cond⟩ := + vlasovWellPosedness_local W gradW hgradW L hL + (f_prev T) h_prev_T_mom hT_0_pos hT_0_small_PL hT_0_small_con hT_0_small_B + -- Step 2: define the glued solution piecewise + let f_next : ℝ β†’ Measure (PhaseSpace d) := + fun t => if t ≀ T then f_prev t else g (t - T) + -- Step 3: verify the output conjuncts + -- Piecewise flow: for t ≀ T use charX_prev, for t > T compose with charX_g shifted + let charX_next : ℝ β†’ PhaseSpace d β†’ PhysSpace d := fun t z => + if t ≀ T then charX_prev t z else charX_g (t - T) (charX_prev T z, charV_prev T z) + let charV_next : ℝ β†’ PhaseSpace d β†’ PhysSpace d := fun t z => + if t ≀ T then charV_prev t z else charV_g (t - T) (charX_prev T z, charV_prev T z) + have h_g_vlasov : IsVlasovSolutionOn gradW g T_0 := hg_lag.1 + refine ⟨f_next, charX_next, charV_next, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + Β· -- Conjunct (i): agreement on [0, T] + intro t ht + simp only [f_next] + have ht_le : t ≀ T := ht.2 + simp [ht_le] + Β· -- Conjunct (ii): initial condition f_next 0 = fβ‚€ + simp only [f_next] + have h0_le : (0 : ℝ) ≀ T := hT_pos.le + simp [h0_le, h_prev_init] + Β· -- Conjunct (iii): HasFiniteFirstMoment on [0, T + T_0] (hoisted helper) + exact vlasovGlue_moment f_prev g h_prev_mom hg_mom f_next + (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) + Β· -- Conjunct (iiiβ€²): FLAT uniform first-moment bound (hoisted helper) + exact vlasovGlue_moment_flat f_prev g hM_prev hg_mom_unif f_next + (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) + Β· -- Conjunct (iv): IsLagrangianVlasovSolutionOn gradW f_next (T + T_0) + refine ⟨?_, charX_next, charV_next, ?_, ?_, ?_⟩ + Β· -- IsVlasovSolutionOn gradW f_next (T + T_0) + -- Sub-sorry: PDE gluing β€” on Ioo 0 (T + T_0), piecewise from h_prev_vlasov and h_g_vlasov + -- Sub-sorry (a): IsVlasovSolutionOn for the glued solution. + -- Strategy: for t ∈ Ioo 0 T use h_prev_vlasov (with f_next = f_prev near t); + -- for t ∈ Ioo T (T+T_0) use h_g_vlasov shifted (f_next t = g (t-T)); + -- at t = T use continuity of t ↦ ∫ Ο† βˆ‚f_next t from both sides. + have h_vlasov_glue : IsVlasovSolutionOn gradW f_next (T + T_0) := by + intro Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht + -- Off-seam weak PDE at every t' β‰  T (hoisted helper); the two strict + -- branches consume it directly, the seam derives its eventual form. + have h_diff_ne := vlasovGlue_diff_ne gradW f_prev g + h_prev_vlasov h_g_vlasov f_next (fun s hs => ite_eq_left hs) + (fun s hs => ite_eq_right (not_le.mpr hs)) Ο† hΟ†_smooth hΟ†_compact + gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† + by_cases ht_lt : t < T + Β· -- t ∈ Ioo 0 T: off-seam weak PDE + rw [show (fun _ => (0 : ℝ)) t = 0 from rfl] + exact h_diff_ne t ht (ne_of_lt ht_lt) + Β· by_cases ht_gt : T < t + Β· -- t ∈ Ioo T (T + T_0): off-seam weak PDE + rw [show (fun _ => (0 : ℝ)) t = 0 from rfl] + exact h_diff_ne t ht (ne_of_gt ht_gt) + Β· -- t = T: boundary case via `hasDerivAt_of_hasDerivAt_of_ne_in_nhds`. + -- Three sub-arguments: (1) HasDerivAt at every nearby t' β‰  T from the + -- off-seam helper; (2) ContinuousAt of the integral function at T; + -- (3) ContinuousAt of the derivative function at T. + push Not at ht_gt + have h_t_eq : t = T := le_antisymm ht_gt (not_lt.mp ht_lt) + -- Step 1: HasDerivAt at every nearby t' β‰  T, in eventual form. + have h_diff_ne_ev : βˆ€αΆ  t' in nhds T, t' β‰  T β†’ HasDerivAt + (fun s => ∫ z, Ο† z βˆ‚f_next s) + ((∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next t')) z.1) + (gradVΟ† z)) βˆ‚(f_next t')) + 0) t' := by + have hU_mem : Set.Ioo (0 : ℝ) (T + T_0) ∈ nhds T := + Ioo_mem_nhds hT_pos (by linarith) + exact Filter.Eventually.mono hU_mem (fun t' ht' => h_diff_ne t' ht') + -- Step 2: ContinuousAt of integral function at T. + -- Decomposed into LEFT (Iic T) + RIGHT (Ici T) closes, joined via + -- `Iic_union_Ici = univ`. + have hΟ†_cont : Continuous Ο† := hΟ†_smooth.continuous + obtain ⟨CΟ†, hCΟ†βŸ© := hΟ†_cont.bounded_above_of_compact_support hΟ†_compact + obtain ⟨hfβ‚€_prob, hfβ‚€_int⟩ := hfβ‚€ + have : IsProbabilityMeasure fβ‚€ := hfβ‚€_prob + -- LEFT side: substantive close via DCT on f_prev's pushforward. + have h_cont_f_left : ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) + (Set.Iic T) T := + vlasovGlue_intCont_left gradW fβ‚€ hT_pos f_prev h_prev_init + charX_prev charV_prev h_prev_push h_prev_aemeas h_prev_boundary + f_next (fun s hs => ite_eq_left hs) Ο† hΟ†_cont CΟ† hCΟ† + -- RIGHT side: substantive close via DCT on the composed pushforward + -- (charX_g (s-T), charV_g (s-T)) ∘ (charX_prev T, charV_prev T). + -- At s = T, hg_init_cond bridges (charX_g 0, charV_g 0) = id, matching f_prev T. + have h_cont_f_right : ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) + (Set.Ici T) T := + vlasovGlue_intCont_right gradW fβ‚€ hT_pos hT_0_pos f_prev h_prev_init + charX_prev charV_prev h_prev_push h_prev_aemeas g charX_g charV_g + hg_init hg_push_ex hg_aemeas_ex hg_boundary hg_init_cond + f_next (ite_eq_left (le_refl T)) (fun s hs => ite_eq_right (not_le.mpr hs)) + Ο† hΟ†_cont CΟ† hCΟ† + -- Combine via union + have h_cont_f : ContinuousAt (fun s => ∫ z, Ο† z βˆ‚f_next s) T := by + have h_union := h_cont_f_left.union h_cont_f_right + rw [Set.Iic_union_Ici] at h_union + exact h_union.continuousAt Filter.univ_mem + -- Step 3: ContinuousAt of the derivative functional at the seam T. + -- Mirror `h_cont_f`'s one-sided-union structure (Iic/Ici + + -- `Set.Iic_union_Ici`). Each side discharges by push-to-fβ‚€ + + -- DCT; the integrand's force term carries + -- `convolveFunctionMeasure gradW (spatialMarginal (f_next Β·)) z.1`, whose + -- seam continuity closes from PROVEN TOOLS via the pushforward + -- representation: `f_prev`/`g` are flow-pushforwards of `fβ‚€`, so the + -- convolution rewrites by `integral_map` to a fixed-`fβ‚€` integral, closed + -- by the inner kernels `flowConv_continuousWithinAt_{Iic,Ici}_seam` + -- (Piece-A-dominated DCT). LEFT uses `spatialMarginal (f_prev Β·)`, + -- RIGHT the composed flow off `g`. + have h_cont_g : ContinuousAt (fun t' => + (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next t')) z.1) + (gradVΟ† z)) βˆ‚(f_next t')) + 0) T := by + simp only [add_zero] + -- LEFT side (s ≀ T): f_next = f_prev = pushforward of fβ‚€; force term + -- uses `spatialMarginal (f_prev Β·)`. Discharge: push-to-fβ‚€ + DCT. + have h_left : ContinuousWithinAt + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) (Set.Iic T) T := + vlasovGlue_seam_contLeft gradW L hL fβ‚€ hfβ‚€_int hT_pos f_prev h_prev_init + h_prev_mom hM_prev charX_prev charV_prev h_prev_push h_prev_aemeas + h_prev_boundary h_prev_ic f_next (fun s hs => ite_eq_left hs) + Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† + -- RIGHT side (s β‰₯ T): f_next = g (Β·βˆ’T) = composed pushforward; symmetric + -- to `h_left`. The flow is the COMPOSED phase-space flow + -- `Ξ¦_s z = (charX_g (sβˆ’T) (charX_prev T z, charV_prev T z), + -- charV_g (sβˆ’T) (charX_prev T z, charV_prev T z))`, and the + -- position part `Z_s z = charX_g (sβˆ’T) (charX_prev T z, charV_prev T z)` + -- is what the force-term convolution sees. Pushforward, AEMeasurability, + -- and seam continuity are copied/adapted from the PROVEN + -- `h_cont_f_right` (composed-pushforward machinery); the growth bound is + -- the composed Piece A (g over [0,T_0] ∘ prev at T); the force-term seam + -- continuity uses the `Ici` sibling kernel `flowConv_continuousWithinAt_Ici_seam`. + have h_right : ContinuousWithinAt + (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) + (gradVΟ† z)) βˆ‚(f_next s)) (Set.Ici T) T := + vlasovGlue_seam_contRight gradW L hL fβ‚€ hfβ‚€_int hT_pos hT_0_pos + f_prev h_prev_init h_prev_mom hM_prev charX_prev charV_prev + h_prev_push h_prev_aemeas h_prev_boundary h_prev_ic + g charX_g charV_g hg_init hg_mom hg_mom_unif hg_push_ex + hg_aemeas_ex hg_boundary hg_init_cond f_next + (ite_eq_left (le_refl T)) (fun s hs => ite_eq_right (not_le.mpr hs)) + Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† + have h_union := h_left.union h_right + rw [Set.Iic_union_Ici] at h_union + exact h_union.continuousAt Filter.univ_mem + -- Step 4: Apply the localized helper. + rw [h_t_eq] + exact hasDerivAt_of_hasDerivAt_of_ne_in_nhds h_diff_ne_ev h_cont_f h_cont_g + exact h_vlasov_glue + Β· -- IsCharacteristicFlowOn for the glued flow + -- Sub-sorry: flow initial condition + HasDerivAt for piecewise flow + have h_flow_glue : IsCharacteristicFlowOn gradW + (fun t => spatialMarginal (f_next t)) charX_next charV_next + (Set.Ioo 0 (T + T_0)) Set.univ := by + refine ⟨?_, ?_, ?_⟩ + Β· -- Initial condition: charX_next 0 z = z.1 ∧ charV_next 0 z = z.2 + intro z _ + simp only [charX_next, charV_next, ite_eq_left hT_pos.le] + exact h_prev_flow.1 z (Set.mem_univ z) + Β· -- HasDerivAt charX_next at t for t ∈ Ioo 0 (T + T_0) (hoisted helper) + intro t ht z _ + simp only [charX_next, charV_next] + exact vlasovGlue_flowX_hasDerivAt charX_prev charV_prev charX_g charV_g + hT_pos hT_0_pos + (fun t' ht' z' => h_prev_flow.2.1 t' ht' z' (Set.mem_univ z')) + (fun z' t' ht' => (h_prev_boundary z' t' ht').1) + (fun z' t' ht' => (hg_boundary z' t' ht').1) + hg_init_cond t ht z + Β· -- HasDerivAt charV_next at t for t ∈ Ioo 0 (T + T_0) (hoisted helper) + intro t ht z _ + simp only [charX_next, charV_next] + exact vlasovGlue_flowV_hasDerivAt gradW f_prev g charX_prev charV_prev + charX_g charV_g hT_pos hT_0_pos + (fun t' ht' z' => h_prev_flow.2.2 t' ht' z' (Set.mem_univ z')) + (fun z' t' ht' => (h_prev_boundary z' t' ht').2) + (fun z' t' ht' => (hg_boundary z' t' ht').2) + hg_init hg_init_cond f_next (fun s hs => ite_eq_left hs) + (fun s hs => ite_eq_right (not_le.mpr hs)) t ht z + exact h_flow_glue + Β· -- Pushforward equation for f_next on Icc 0 (T + T_0) (hoisted helper) + intro t ht + simp only [charX_next, charV_next] + exact vlasovGlue_pushforward_eq f_prev g charX_prev charV_prev charX_g charV_g + hT_pos h_prev_push h_prev_aemeas hg_init hg_push_ex hg_aemeas_ex f_next + (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) t ht + Β· -- AEMeasurability ∧ boundary ContinuousOn on Icc 0 (T + T_0). + refine ⟨?_, ?_⟩ + Β· -- AEMeasurability of the glued flow (hoisted helper). + intro s hs + simp only [charX_next, charV_next] + exact vlasovGlue_flow_aemeasurable f_prev g charX_prev charV_prev + charX_g charV_g hT_pos h_prev_push h_prev_aemeas hg_init hg_aemeas_ex + f_next (fun s' hs' => ite_eq_left hs') s hs + Β· -- Boundary ContinuousOn on Icc 0 (T + T_0): project the boundary bundle. + intro z s hs + exact ((vlasovWellPosedness_glue_boundary gradW hT_pos hT_0_pos f_prev g f_next + charX_prev charV_prev charX_g charV_g charX_next charV_next rfl rfl rfl + h_prev_boundary hg_boundary hg_init hg_init_cond z s hs).1.continuousWithinAt.prodMk + (vlasovWellPosedness_glue_boundary gradW hT_pos hT_0_pos f_prev g f_next + charX_prev charV_prev charX_g charV_g charX_next charV_next rfl rfl rfl + h_prev_boundary hg_boundary hg_init hg_init_cond z s hs).2.continuousWithinAt) + Β· -- Conjunct (v): explicit pushforward for charX_next charV_next (hoisted helper) + intro t ht + simp only [charX_next, charV_next] + exact vlasovGlue_pushforward_eq f_prev g charX_prev charV_prev charX_g charV_g + hT_pos h_prev_push h_prev_aemeas hg_init hg_push_ex hg_aemeas_ex f_next + (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) t ht + Β· -- Conjunct (vi): AEMeasurable for charX_next charV_next (hoisted helper) + intro s hs + simp only [charX_next, charV_next] + exact vlasovGlue_flow_aemeasurable f_prev g charX_prev charV_prev + charX_g charV_g hT_pos h_prev_push h_prev_aemeas hg_init hg_aemeas_ex + f_next (fun s' hs' => ite_eq_left hs') s hs + Β· -- Conjunct (vii): boundary bundle for charX_next charV_next on Icc 0 (T + T_0) + exact vlasovWellPosedness_glue_boundary gradW hT_pos hT_0_pos f_prev g f_next + charX_prev charV_prev charX_g charV_g charX_next charV_next rfl rfl rfl + h_prev_boundary hg_boundary hg_init hg_init_cond + Β· -- Conjunct (viii): initial condition for charX_next charV_next + intro z + simp only [charX_next, charV_next, ite_eq_left hT_pos.le] + exact h_prev_ic z + +/-- For every positive Lipschitz constant there is a window length satisfying all +three per-window smallness constraints β€” the PL buffer, the contraction, and the +envelope closure. Pure threshold arithmetic: `T_0 := min(1/√L, T_0_con, T_0_env)/2` +with each threshold positive for every `L > 0` (no `L < 1` restriction). -/ +lemma exists_localSmallness_window (L : NNReal) (hL_pos : (0 : ℝ) < L) : + βˆƒ T_0 : ℝ, 0 < T_0 ∧ LocalSmallnessPLBuffer L T_0 ∧ LocalSmallnessContraction L T_0 ∧ + (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) < 1 := by + let T_0_PL : ℝ := 1 / Real.sqrt L + let T_0_con : ℝ := Real.log (max 1 (L : ℝ) / (L : ℝ) + 1) / max 1 (L : ℝ) + let T_0_env : ℝ := Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) / (1 + (L : ℝ)) + let T_0 : ℝ := min (min T_0_PL T_0_con) T_0_env / 2 + have hL_nn : (0 : ℝ) ≀ L := NNReal.coe_nonneg L + have hL_ne : (L : ℝ) β‰  0 := ne_of_gt hL_pos + have hsqrtL_pos : 0 < Real.sqrt (L : ℝ) := Real.sqrt_pos.mpr hL_pos + have hs_eq : (Real.sqrt (L : ℝ)) ^ 2 = (L : ℝ) := Real.sq_sqrt hL_nn + have hK_pos : (0 : ℝ) < max 1 (L : ℝ) := lt_of_lt_of_le one_pos (le_max_left _ _) + have hT_0_PL_pos : 0 < T_0_PL := by + change 0 < 1 / Real.sqrt (L : ℝ); positivity + have hKL_gt1 : 1 < max 1 (L : ℝ) / (L : ℝ) + 1 := by + have : 0 < max 1 (L : ℝ) / (L : ℝ) := div_pos hK_pos hL_pos + linarith + have hT_0_con_pos : 0 < T_0_con := + div_pos (Real.log_pos hKL_gt1) hK_pos + have h_1L_pos : (0 : ℝ) < 1 + (L : ℝ) := by linarith [hL_pos] + have hT_0_env_pos : 0 < T_0_env := by + change 0 < Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) / (1 + (L : ℝ)) + have h_arg_gt1 : 1 < 1 + (1 + (L : ℝ)) / (L : ℝ) := by + have : 0 < (1 + (L : ℝ)) / (L : ℝ) := by positivity + linarith + exact div_pos (Real.log_pos h_arg_gt1) h_1L_pos + have hT_0_min_pos : 0 < min (min T_0_PL T_0_con) T_0_env := + lt_min (lt_min hT_0_PL_pos hT_0_con_pos) hT_0_env_pos + have hT0_pos : 0 < T_0 := by + change 0 < min (min T_0_PL T_0_con) T_0_env / 2; linarith + have hTL_T0_PL : LocalSmallnessPLBuffer L T_0 := by + change (L : ℝ) * T_0 ^ 2 < 1 + have h_T_0_le : T_0 ≀ 1 / (2 * Real.sqrt (L : ℝ)) := by + change min (min T_0_PL T_0_con) T_0_env / 2 ≀ 1 / (2 * Real.sqrt (L : ℝ)) + have h_min_le : min (min T_0_PL T_0_con) T_0_env ≀ T_0_PL := + le_trans (min_le_left _ _) (min_le_left _ _) + have hrw : (1 : ℝ) / (2 * Real.sqrt (L : ℝ)) = (1 / Real.sqrt (L : ℝ)) / 2 := by + rw [div_div, mul_comm (2 : ℝ) (Real.sqrt (L : ℝ))] + rw [hrw] + have hTPL : T_0_PL = 1 / Real.sqrt (L : ℝ) := rfl + rw [hTPL] at h_min_le; linarith + have h_T_0_nn : 0 ≀ T_0 := le_of_lt hT0_pos + have h_sq_le : T_0 ^ 2 ≀ (1 / (2 * Real.sqrt (L : ℝ))) ^ 2 := + pow_le_pow_leftβ‚€ h_T_0_nn h_T_0_le 2 + have h_mul_le : (L : ℝ) * T_0 ^ 2 ≀ (L : ℝ) * (1 / (2 * Real.sqrt (L : ℝ))) ^ 2 := + mul_le_mul_of_nonneg_left h_sq_le hL_nn + have h_eq : (L : ℝ) * (1 / (2 * Real.sqrt (L : ℝ))) ^ 2 = 1 / 4 := by + rw [div_pow, one_pow, mul_pow, hs_eq]; field_simp; ring + rw [h_eq] at h_mul_le; linarith + have hTL_T0_con : LocalSmallnessContraction L T_0 := by + change (L : ℝ) * (Real.exp ((max 1 (L : ℝ)) * T_0) - 1) / (max 1 (L : ℝ)) < 1 + set K : ℝ := max 1 (L : ℝ) with hK_def + have h_T_0_lt : T_0 < T_0_con := by + change min (min T_0_PL T_0_con) T_0_env / 2 < T_0_con + have h_min_le : min (min T_0_PL T_0_con) T_0_env ≀ T_0_con := + le_trans (min_le_left _ _) (min_le_right _ _) + linarith + have hKL1_pos : (0 : ℝ) < K / (L : ℝ) + 1 := by + have : 0 < K / (L : ℝ) := div_pos hK_pos hL_pos + linarith + have h_KT0_lt : K * T_0 < Real.log (K / (L : ℝ) + 1) := by + have hTcon : T_0_con = Real.log (K / (L : ℝ) + 1) / K := rfl + rw [hTcon] at h_T_0_lt + have hh := (lt_div_iffβ‚€ hK_pos).mp h_T_0_lt + nlinarith [hh] + have h_exp_lt : Real.exp (K * T_0) < K / (L : ℝ) + 1 := by + have := Real.exp_lt_exp.mpr h_KT0_lt + rwa [Real.exp_log hKL1_pos] at this + have h_sub_lt : Real.exp (K * T_0) - 1 < K / (L : ℝ) := by linarith + have h_num_lt : (L : ℝ) * (Real.exp (K * T_0) - 1) < K := by + have := mul_lt_mul_of_pos_left h_sub_lt hL_pos + rwa [mul_div_cancelβ‚€ _ hL_ne] at this + rw [div_lt_one hK_pos] + exact h_num_lt + have hTL_T0_B : + (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) < 1 := by + have hL_ne : (L : ℝ) β‰  0 := ne_of_gt hL_pos + have h_1L_ne : (1 + (L : ℝ)) β‰  0 := ne_of_gt h_1L_pos + have h_ratio_pos : (0 : ℝ) < (1 + (L : ℝ)) / (L : ℝ) := div_pos h_1L_pos hL_pos + have h_arg_pos : (0 : ℝ) < 1 + (1 + (L : ℝ)) / (L : ℝ) := by linarith + have h_T_0_lt_env : T_0 < T_0_env := by + change min (min T_0_PL T_0_con) T_0_env / 2 < T_0_env + have h_min_le : min (min T_0_PL T_0_con) T_0_env ≀ T_0_env := min_le_right _ _ + linarith + have h_lin_lt : (1 + (L : ℝ)) * T_0 + < Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) := by + have h_env_eq : (1 + (L : ℝ)) * T_0_env + = Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) := by + change (1 + (L : ℝ)) * + (Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) / (1 + (L : ℝ))) + = Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) + field_simp + calc (1 + (L : ℝ)) * T_0 + < (1 + (L : ℝ)) * T_0_env := mul_lt_mul_of_pos_left h_T_0_lt_env h_1L_pos + _ = Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) := h_env_eq + have h_exp_lt : Real.exp ((1 + (L : ℝ)) * T_0) + < 1 + (1 + (L : ℝ)) / (L : ℝ) := by + calc Real.exp ((1 + (L : ℝ)) * T_0) + < Real.exp (Real.log (1 + (1 + (L : ℝ)) / (L : ℝ))) := + Real.exp_lt_exp.mpr h_lin_lt + _ = 1 + (1 + (L : ℝ)) / (L : ℝ) := Real.exp_log h_arg_pos + have h_diff_lt : Real.exp ((1 + (L : ℝ)) * T_0) - 1 < (1 + (L : ℝ)) / (L : ℝ) := by + linarith + have hcoef_pos : (0 : ℝ) < (L : ℝ) / (1 + (L : ℝ)) := div_pos hL_pos h_1L_pos + calc (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) + < (L : ℝ) / (1 + (L : ℝ)) * ((1 + (L : ℝ)) / (L : ℝ)) := + mul_lt_mul_of_pos_left h_diff_lt hcoef_pos + _ = 1 := by field_simp + exact ⟨T_0, hT0_pos, hTL_T0_PL, hTL_T0_con, hTL_T0_B⟩ + +/-- **Forward iteration to arbitrary `T_target`.** + +Extends the local-existence theorem from its small-`T` smallness window +to any `T_target > 0`, by iterating the local theorem with shifted initial +data at a fixed step `T_0` depending only on `L` (no `L < 1` hypothesis). + +**Proof strategy**: + +1. Pick `T_0 := min(T_0_PL, T_0_con, T_0_env) / 2`, with `T_0_PL := 1/√L` + (the PL-buffer threshold for `L Β· T_0Β² < 1`), `T_0_con`/`T_0_env` the + contraction/envelope thresholds. Each is positive for every `L > 0`, so + `T_0 > 0` and all three smallness constraints hold. + +2. Pick `N := ⌈T_target / T_0βŒ‰β‚Š` so that `N Β· T_0 β‰₯ T_target`. + +3. `Nat.rec` construction: a solution holding the conjuncts at `T = nΒ·T_0`. + - Base case: apply `vlasovWellPosedness_local` directly. + - Step case (`n β†’ n+1`): apply `vlasovWellPosedness_glue` to extend. + +4. Take `f := f_N` and verify the conjuncts for `T_target ≀ N Β· T_0` via + `IsLagrangianVlasovSolutionOn`'s monotonicity in `T` (project down). -/ +theorem vlasovWellPosedness_forward + {d : β„•} [NeZero d] + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (hL_pos : (0 : ℝ) < L) + (fβ‚€ : Measure (PhaseSpace d)) + (hfβ‚€ : HasFiniteFirstMoment fβ‚€) + {T_target : ℝ} (hT_target : 0 < T_target) : + βˆƒ f : ℝ β†’ Measure (PhaseSpace d), + f 0 = fβ‚€ ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T_target, HasFiniteFirstMoment (f t)) ∧ + IsLagrangianVlasovSolutionOn gradW f T_target := by + -- T_0 must satisfy the PL-buffer, contraction, and envelope constraints β€” + -- all supplied by the pure-arithmetic `exists_localSmallness_window`. + obtain ⟨T_0, hT0_pos, hTL_T0_PL, hTL_T0_con, hTL_T0_B⟩ := + exists_localSmallness_window L hL_pos + -- Step 2: N = ⌈T_target / T_0βŒ‰β‚Š windows of size T_0 cover T_target. + let N : β„• := ⌈T_target / T_0βŒ‰β‚Š + have hN_pos : 0 < N := by + change 0 < ⌈T_target / T_0βŒ‰β‚Š + rw [Nat.ceil_pos] + exact div_pos hT_target hT0_pos + have hN_covers : T_target ≀ (N : ℝ) * T_0 := by + have hle := Nat.le_ceil (T_target / T_0) + have hT0_pos' := hT0_pos + calc T_target = T_target / T_0 * T_0 := by field_simp + _ ≀ (⌈T_target / T_0βŒ‰β‚Š : ℝ) * T_0 := + mul_le_mul_of_nonneg_right hle (le_of_lt hT0_pos) + -- Step 3: Induction on n : β„• β€” solution exists on [0, (n+1)Β·T_0]. + -- The induction carries explicit flow witnesses (charX, charV) and the full + -- 7-component bundle to enable vlasovWellPosedness_glue calls without witness-identity issues. + let T_n := fun n : β„• => ((n + 1 : β„•) : ℝ) * T_0 + have h_ind : βˆ€ n : β„•, + βˆƒ (f : ℝ β†’ Measure (PhaseSpace d)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), + f 0 = fβ‚€ ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) (T_n n), HasFiniteFirstMoment (f t)) ∧ + -- FLAT (window-constant) uniform first-moment bound on the spatial marginal. + (βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) (T_n n), ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M) ∧ + IsVlasovSolutionOn gradW f (T_n n) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) (T_n n), + f t = Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) (f 0)) ∧ + (βˆ€ s ∈ Set.Icc (0 : ℝ) (T_n n), + AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) (f 0)) ∧ + (βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) (T_n n) β†’ + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 (T_n n)) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f t)) (charX t z))) + (Set.Icc 0 (T_n n)) t) ∧ + (βˆ€ z : PhaseSpace d, charX 0 z = z.1 ∧ charV 0 z = z.2) := by + intro n + induction n with + | zero => + -- Base: n = 0, need solution on [0, 1Β·T_0] = [0, T_0]. + simp only [T_n, zero_add, Nat.cast_one, one_mul] + obtain ⟨f, charX, charV, hf_init, hf_mom, hf_mom_unif, hf_lag, hf_push, hf_aemeas, + hf_boundary, hf_ic⟩ := + vlasovWellPosedness_local W gradW hgradW L hL fβ‚€ hfβ‚€ hT0_pos hTL_T0_PL hTL_T0_con hTL_T0_B + exact ⟨f, charX, charV, hf_init, hf_mom, hf_mom_unif, hf_lag.1, hf_push, hf_aemeas, + hf_boundary, hf_ic⟩ + | succ n ih => + -- Step: n+1 β†’ (n+2)Β·T_0. Use vlasovWellPosedness_glue with T = (n+1)Β·T_0 > 0. + obtain ⟨f_n, charX_n, charV_n, hfn_init, hfn_mom, hfn_mom_unif, hfn_vlasov, + hfn_push, hfn_aemeas, hfn_boundary, hfn_ic⟩ := ih + simp only [T_n] at hfn_mom hfn_mom_unif hfn_vlasov hfn_push hfn_aemeas hfn_boundary + have hT_n_pos : (0 : ℝ) < ((n + 1 : β„•) : ℝ) * T_0 := + mul_pos (by exact_mod_cast Nat.succ_pos n) hT0_pos + -- Derive IsCharacteristicFlowOn from h_prev_boundary + hasDerivAt + -- (interior points t ∈ Ioo 0 T_n have Icc 0 T_n ∈ 𝓝 t, so HasDerivWithinAt β†’ HasDerivAt) + have hfn_flow : IsCharacteristicFlowOn gradW (fun t => spatialMarginal (f_n t)) + charX_n charV_n (Set.Ioo 0 (((n + 1 : β„•) : ℝ) * T_0)) Set.univ := by + refine ⟨fun z _ => hfn_ic z, ?_, ?_⟩ + Β· intro t ht z _ + exact ((hfn_boundary z t (Set.Ioo_subset_Icc_self ht)).1).hasDerivAt + (Icc_mem_nhds ht.1 ht.2) + Β· intro t ht z _ + exact ((hfn_boundary z t (Set.Ioo_subset_Icc_self ht)).2).hasDerivAt + (Icc_mem_nhds ht.1 ht.2) + obtain ⟨f_next, charX_next, charV_next, _h_agree, h_init, h_mom, h_mom_unif, h_lag, + h_push, h_aemeas, h_boundary, h_ic⟩ := + vlasovWellPosedness_glue W gradW hgradW L hL fβ‚€ hfβ‚€ hT_n_pos + f_n hfn_init hfn_mom hfn_mom_unif + charX_n charV_n hfn_vlasov hfn_flow + hfn_push hfn_aemeas hfn_boundary hfn_ic + hT0_pos hTL_T0_PL hTL_T0_con hTL_T0_B + -- Need: T_n (n+1) = T_n n + T_0 + have h_T_eq : T_n (n + 1) = T_n n + T_0 := by + simp only [T_n]; push_cast; ring + refine ⟨f_next, charX_next, charV_next, h_init, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + Β· rw [h_T_eq]; exact h_mom + Β· rw [h_T_eq]; exact h_mom_unif + Β· rw [h_T_eq]; exact h_lag.1 + Β· rw [h_T_eq]; exact h_push + Β· rw [h_T_eq]; exact h_aemeas + Β· rw [h_T_eq]; exact h_boundary + Β· exact h_ic + -- Step 4: Apply h_ind at n = N - 1 (since N β‰₯ 1). + have hN_pred : N - 1 + 1 = N := Nat.succ_pred_eq_of_pos hN_pos + obtain ⟨f, charX_f, charV_f, hf_init, hf_mom, _hf_mom_unif, hf_vlasov, + hf_push, hf_aemeas, hf_boundary, hf_ic⟩ := h_ind (N - 1) + simp only [T_n] at hf_mom hf_vlasov hf_push hf_aemeas hf_boundary + rw [hN_pred] at hf_mom hf_vlasov hf_push hf_aemeas hf_boundary + -- Step 5: Restrict from [0, NΒ·T_0] down to [0, T_target]. + refine ⟨f, hf_init, ?_, ?_⟩ + Β· -- Moment bound on [0, T_target] βŠ† [0, NΒ·T_0]. + intro t ht + exact hf_mom t ⟨ht.1, le_trans ht.2 hN_covers⟩ + Β· -- IsLagrangianVlasovSolutionOn on [0, T_target] ≀ [0, NΒ·T_0]. + -- Derive IsCharacteristicFlowOn for T_target from hf_boundary (restrict to Ioo 0 T_target). + have hf_flow : IsCharacteristicFlowOn gradW (fun t => spatialMarginal (f t)) + charX_f charV_f (Set.Ioo 0 T_target) Set.univ := by + refine ⟨fun z _ => hf_ic z, ?_, ?_⟩ + Β· intro t ht z _ + have ht_lt_NT0 : t < (N : ℝ) * T_0 := lt_of_lt_of_le ht.2 hN_covers + exact ((hf_boundary z t ⟨le_of_lt ht.1, le_of_lt ht_lt_NT0⟩).1).hasDerivAt + (Icc_mem_nhds ht.1 ht_lt_NT0) + Β· intro t ht z _ + have ht_lt_NT0 : t < (N : ℝ) * T_0 := lt_of_lt_of_le ht.2 hN_covers + exact ((hf_boundary z t ⟨le_of_lt ht.1, le_of_lt ht_lt_NT0⟩).2).hasDerivAt + (Icc_mem_nhds ht.1 ht_lt_NT0) + refine ⟨?_, charX_f, charV_f, ?_, ?_, ?_⟩ + Β· -- IsVlasovSolutionOn: restrict Ioo 0 T_target βŠ† Ioo 0 (NΒ·T_0) + intro Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht + exact hf_vlasov Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t + ⟨ht.1, lt_of_lt_of_le ht.2 hN_covers⟩ + Β· exact hf_flow + Β· -- pushforward eq: restrict Icc 0 T_target βŠ† Icc 0 (NΒ·T_0) + intro t ht + exact hf_push t ⟨ht.1, le_trans ht.2 hN_covers⟩ + Β· -- AEMeasurable ∧ boundary ContinuousOn, restricted to Icc 0 T_target. + refine ⟨?_, ?_⟩ + Β· intro s hs + exact hf_aemeas s ⟨hs.1, le_trans hs.2 hN_covers⟩ + Β· intro z + have h_big : ContinuousOn (fun s => (charX_f s z, charV_f s z)) + (Set.Icc 0 ((N : ℝ) * T_0)) := fun t ht => + ((hf_boundary z t ht).1.continuousWithinAt).prodMk + ((hf_boundary z t ht).2.continuousWithinAt) + exact h_big.mono (fun t ht => ⟨ht.1, le_trans ht.2 hN_covers⟩) + +end Vlasov diff --git a/LeanPool/Vlasov/OT/FlowDifferentiability.lean b/LeanPool/Vlasov/OT/FlowDifferentiability.lean new file mode 100644 index 0000000000..d826d877d3 --- /dev/null +++ b/LeanPool/Vlasov/OT/FlowDifferentiability.lean @@ -0,0 +1,1400 @@ +/- +Copyright (c) 2026 Joseph K. Miller. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph K. Miller +-/ +module + +public import LeanPool.Vlasov.OT.FrozenField +public import LeanPool.Vlasov.ForMathlib.VariationalEquation +import all LeanPool.Vlasov.ForMathlib.VariationalEquation +import Mathlib.Algebra.Order.Ring.Star +import Mathlib.Analysis.Calculus.InverseFunctionTheorem.ContDiff + +/-! +# Differentiability and inversion of the frozen Vlasov flow + +The variational equation gives the spatial and joint derivatives of the flow and +its inverse. The Jacobian and explicit fundamental matrix remain together so +their generated proof declarations are shared as before. +-/ + +@[expose] public section + +namespace Vlasov + +open MeasureTheory + +variable {d : β„•} [NeZero d] + +/-- **C3 D1 (Jacobian).** The phase-space Jacobian `A(s, p) = D_w b(s, p)` of the frozen Vlasov +field at the base point `p`: the block continuous-linear map `Ξ΄ ↦ (Ξ΄.2, βˆ’(D_x conv ρ_s)(p.1)Β·Ξ΄.1)`, +where `D_x conv ρ_s (p.1) = ∫ y, fderiv ℝ gradW (p.1 βˆ’ y) βˆ‚Ο_s` (F1). This is the coefficient of +the linear variational ODE `M' = A(s, Ξ¦_s z)Β·M`; `vlasovVectorField_hasFDerivAt_in_z` (F2) says it +is the FrΓ©chet derivative of `vlasovVectorField gradW ρ s` at `p.2`. -/ +noncomputable def vlasovFieldJacobian (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) (p : ℝ Γ— PhaseSpace d) : PhaseSpace d β†’L[ℝ] PhaseSpace d := + (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod + (-((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) + +omit [NeZero d] in +/-- Joint continuity of the Jacobian on `Icc 0 T Γ—Λ’ univ`. +Express the block map as a sum of continuous compositions of the convolution derivative. -/ +lemma vlasovFieldJacobian_continuousOn + (gradW : PhysSpace d β†’ PhysSpace d) (ρ : ℝ β†’ Measure (PhysSpace d)) (T : ℝ) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) : + ContinuousOn (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := by + have hg_cont : Continuous (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) := + continuous_fst.prodMk (continuous_fst.comp continuous_snd) + have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d))) := + fun p hp => ⟨hp.1, Set.mem_univ _⟩ + have hD2 : ContinuousOn + (fun p : ℝ Γ— PhaseSpace d => ∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ Set.univ) := + hρD_cont.comp hg_cont.continuousOn hmaps + have hDcomp : ContinuousOn + (fun p : ℝ Γ— PhaseSpace d => -((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) (Set.Icc 0 T Γ—Λ’ Set.univ) := + (hD2.clm_comp continuousOn_const).neg + have heq : (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) = fun p => + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)).comp + (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) + + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)).comp + (-((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) := by + funext p; ext x <;> simp [vlasovFieldJacobian] + rw [heq]; exact continuousOn_const.add (continuousOn_const.clm_comp hDcomp) + +omit [NeZero d] in +/-- **C3 D1a β€” the uniform-over-compact first-order Taylor remainder of the Vlasov field.** + +For a fixed initial point `z`, the first-order remainder of the frozen field `b(s,Β·)` at the moving +base point `Ξ¦_s z := (charX s z, charV s z)`, +`R(s,w) = b(s,w) βˆ’ b(s,Ξ¦_s z) βˆ’ A(s,Ξ¦_s z)Β·(w βˆ’ Ξ¦_s z)`, is `o(β€–w βˆ’ Ξ¦_s zβ€–)` **uniformly in +`s ∈ [0,T]`**: for every `Ξ· > 0` there is a single `Ξ΄ > 0` (independent of `s`) with +`β€–R(s,w)β€– ≀ Ξ·Β·β€–w βˆ’ Ξ¦_s zβ€–` whenever `β€–w βˆ’ Ξ¦_s zβ€– ≀ Ξ΄`. + +This uniformity is the load-bearing analytic core of D1 (the variational-equation difference +quotient): it is what lets GrΓΆnwall bound `Ξ¦_t(z+h) βˆ’ Ξ¦_t(z) βˆ’ M_t(z)Β·h` by `o(β€–hβ€–)` *uniformly +along the trajectory*. Proof: the flow image `{Ξ¦_s z : s ∈ [0,T]}` is compact (continuous image of +`[0,T]`), `A = D_w b` is jointly `(s,w)`-continuous (from `hρD_cont`), so `A` is **uniformly** +continuous on the compact tube `Ξ“ = {(s, Ξ¦_s z + e) : s ∈ [0,T], β€–eβ€– ≀ 1}` (Heine–Cantor); the +mean-value inequality on `closedBall (Ξ¦_s z) Ξ΄` then converts the modulus into the remainder +bound. -/ +lemma vlasovField_taylorRemainder_uniform + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) (z : PhaseSpace d) + (hcontIcc : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) : + βˆ€ Ξ· : ℝ, 0 < Ξ· β†’ βˆƒ Ξ΄ : ℝ, 0 < Ξ΄ ∧ βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ w : PhaseSpace d, + β€–w - (charX s z, charV s z)β€– ≀ Ξ΄ β†’ + β€–vlasovVectorField gradW ρ s w - vlasovVectorField gradW ρ s (charX s z, charV s z) + - (vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z))) (w - (charX s z, charV s z))β€– + ≀ Ξ· * β€–w - (charX s z, charV s z)β€– := by + set Ξ¦ : ℝ β†’ PhaseSpace d := fun s => (charX s z, charV s z) with hΞ¦ + -- F2: the field is differentiable in the phase variable with derivative `vlasovFieldJacobian`. + have hF2 : βˆ€ s (w : PhaseSpace d), + HasFDerivAt (vlasovVectorField gradW ρ s) (vlasovFieldJacobian gradW ρ (s, w)) w := + fun s w => vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s w + -- Joint continuity of the Jacobian on `Icc 0 T Γ—Λ’ Set.univ` (from `hρD_cont`). + have hg_cont : Continuous (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) := + continuous_fst.prodMk (continuous_fst.comp continuous_snd) + have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d))) := + fun p hp => ⟨hp.1, Set.mem_univ _⟩ + have hD2 : ContinuousOn + (fun p : ℝ Γ— PhaseSpace d => ∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ Set.univ) := + hρD_cont.comp hg_cont.continuousOn hmaps + have hDcomp : ContinuousOn + (fun p : ℝ Γ— PhaseSpace d => -((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) (Set.Icc 0 T Γ—Λ’ Set.univ) := + (hD2.clm_comp continuousOn_const).neg + have heq : (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) = fun p => + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)).comp + (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) + + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)).comp + (-((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) := by + funext p; ext x <;> simp [vlasovFieldJacobian] + have hAj_cont : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) + (Set.Icc 0 T Γ—Λ’ Set.univ) := by + rw [heq]; exact continuousOn_const.add (continuousOn_const.clm_comp hDcomp) + -- The compact tube `Ξ“ = {(s, Ξ¦ s + e) : s ∈ [0,T], β€–eβ€– ≀ 1}`. + set ball1 : Set (PhaseSpace d) := Metric.closedBall 0 1 with hball1 + have hmap : ContinuousOn (fun q : ℝ Γ— PhaseSpace d => ((q.1, Ξ¦ q.1 + q.2) : ℝ Γ— PhaseSpace d)) + (Set.Icc 0 T Γ—Λ’ ball1) := + continuousOn_fst.prodMk + ((hcontIcc.comp continuousOn_fst (fun q hq => hq.1)).add continuousOn_snd) + set Ξ“ : Set (ℝ Γ— PhaseSpace d) := + (fun q : ℝ Γ— PhaseSpace d => ((q.1, Ξ¦ q.1 + q.2) : ℝ Γ— PhaseSpace d)) '' (Set.Icc 0 T Γ—Λ’ ball1) + with hΞ“ + have hΞ“compact : IsCompact Ξ“ := + (isCompact_Icc.prod (isCompact_closedBall 0 1)).image_of_continuousOn hmap + have hΞ“sub : Ξ“ βŠ† Set.Icc 0 T Γ—Λ’ Set.univ := by + rintro _ ⟨q, hq, rfl⟩; exact ⟨hq.1, Set.mem_univ _⟩ + have hUC : UniformContinuousOn (fun p => vlasovFieldJacobian gradW ρ p) Ξ“ := + hΞ“compact.uniformContinuousOn_of_continuous (hAj_cont.mono hΞ“sub) + have hmemΞ“ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ e : PhaseSpace d, β€–eβ€– ≀ 1 β†’ + ((s, Ξ¦ s + e) : ℝ Γ— PhaseSpace d) ∈ Ξ“ := by + intro s hs e he + exact ⟨(s, e), ⟨hs, by simpa [hball1, Metric.mem_closedBall, dist_eq_norm] using he⟩, rfl⟩ + -- Extract the uniform-continuity modulus. + intro Ξ· hΞ· + obtain βŸ¨Ξ΄β‚€, hΞ΄β‚€, H⟩ := Metric.uniformContinuousOn_iff_le.mp hUC Ξ· hΞ· + refine ⟨min Ξ΄β‚€ 1, lt_min hΞ΄β‚€ one_pos, ?_⟩ + intro s hs w hw + -- Mean value on the convex ball `C = closedBall (Ξ¦ s) (min Ξ΄β‚€ 1)`. + set C : Set (PhaseSpace d) := Metric.closedBall (Ξ¦ s) (min Ξ΄β‚€ 1) with hC + have hΞ¦mem : Ξ¦ s ∈ C := Metric.mem_closedBall_self (le_min hΞ΄β‚€.le zero_le_one) + have hwmem : w ∈ C := by + rw [hC, Metric.mem_closedBall, dist_eq_norm]; exact hw + -- The fderiv bound on `C` from uniform continuity. + have hbound : βˆ€ w' ∈ C, + β€–vlasovFieldJacobian gradW ρ (s, w') - vlasovFieldJacobian gradW ρ (s, Ξ¦ s)β€– ≀ Ξ· := by + intro w' hw' + have hw'norm : β€–w' - Ξ¦ sβ€– ≀ min Ξ΄β‚€ 1 := by + rw [← dist_eq_norm]; rw [hC, Metric.mem_closedBall] at hw'; exact hw' + have hw'le1 : β€–w' - Ξ¦ sβ€– ≀ 1 := hw'norm.trans (min_le_right _ _) + have hmem1 : ((s, w') : ℝ Γ— PhaseSpace d) ∈ Ξ“ := by + have := hmemΞ“ s hs (w' - Ξ¦ s) hw'le1 + rwa [add_sub_cancel] at this + have hmem2 : ((s, Ξ¦ s) : ℝ Γ— PhaseSpace d) ∈ Ξ“ := by + have := hmemΞ“ s hs 0 (by simp) + rwa [add_zero] at this + have hdist : dist ((s, w') : ℝ Γ— PhaseSpace d) (s, Ξ¦ s) ≀ Ξ΄β‚€ := by + rw [Prod.dist_eq] + simp only [dist_self, max_le_iff] + refine ⟨hΞ΄β‚€.le, ?_⟩ + rw [dist_eq_norm]; exact hw'norm.trans (min_le_left _ _) + have := H _ hmem1 _ hmem2 hdist + rwa [dist_eq_norm] at this + -- Apply the mean value inequality to `g u = b(s,u) βˆ’ A(s,Ξ¦ s)Β·u`. + have hg : βˆ€ w' ∈ C, HasFDerivWithinAt + (fun u => vlasovVectorField gradW ρ s u - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) u) + (vlasovFieldJacobian gradW ρ (s, w') - vlasovFieldJacobian gradW ρ (s, Ξ¦ s)) C w' := by + intro w' _ + have h1 := hF2 s w' + have h2 : HasFDerivAt (fun u => vlasovFieldJacobian gradW ρ (s, Ξ¦ s) u) + (vlasovFieldJacobian gradW ρ (s, Ξ¦ s)) w' := + (vlasovFieldJacobian gradW ρ (s, Ξ¦ s)).hasFDerivAt + exact (h1.sub h2).hasFDerivWithinAt + have hmv := (convex_closedBall (Ξ¦ s) (min Ξ΄β‚€ 1)).norm_image_sub_le_of_norm_hasFDerivWithin_le + hg hbound hΞ¦mem hwmem + -- Rewrite `g w βˆ’ g (Ξ¦ s)` as the remainder. + have hReq : (vlasovVectorField gradW ρ s w - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) w) + - (vlasovVectorField gradW ρ s (Ξ¦ s) - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) (Ξ¦ s)) + = vlasovVectorField gradW ρ s w - vlasovVectorField gradW ρ s (Ξ¦ s) + - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) (w - Ξ¦ s) := by + rw [map_sub]; abel + simpa only [hReq] using hmv + +/-- **C3 V2 β€” the explicit fundamental matrix** (Route A, lesson L14): the canonical Dyson-series +solution of `M' = A(t)Β·M`, `M 0 = id`, as a *function* (not a `choose`-d witness), so its +parameter-regularity is accessible. -/ +noncomputable def fundamentalMatrix {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F] + (A : ℝ β†’ (F β†’L[ℝ] F)) : ℝ β†’ (F β†’L[ℝ] F) := + fun t => βˆ‘' n, picardIter (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) + (ContinuousLinearMap.id ℝ F) n t + +/-- `fundamentalMatrix A` solves the fundamental-matrix IVP on `[0,T]` (the non-existential form of +`exists_fundamentalMatrix`; same proof through the picardSum lemmas). -/ +lemma fundamentalMatrix_spec {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] + (A : ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (hA : ContinuousOn A (Set.Icc 0 T)) : + fundamentalMatrix A 0 = ContinuousLinearMap.id ℝ F ∧ + ContinuousOn (fundamentalMatrix A) (Set.Icc 0 T) ∧ + βˆ€ t ∈ Set.Icc 0 T, HasDerivWithinAt (fundamentalMatrix A) + ((A t).comp (fundamentalMatrix A t)) (Set.Icc 0 T) t := by + unfold fundamentalMatrix + simpa only [ContinuousLinearMap.compL_apply] using + picardSum_spec (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) T hT + ((ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA) + (ContinuousLinearMap.id ℝ F) + +/-- **C3 V2 β€” the fundamental matrix is continuous in a PARAMETER** (closes V2 via Route A). +Specialises `picardSum_continuous_param_Icc` to `π’œ := compL∘A`, `xβ‚€ := id`; the `compL` factor is +`1`-bounded so the `K`-bound transfers from `A`. -/ +lemma fundamentalMatrix_continuous_param + {Z F : Type*} [TopologicalSpace Z] [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] + (A : Z β†’ ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hA_contOn : ContinuousOn (fun p : Z Γ— ℝ => A p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) + (hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ K) + (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : + Continuous (fun z => fundamentalMatrix (A z) t) := by + have hπ’œ_contOn : ContinuousOn + (fun p : Z Γ— ℝ => ContinuousLinearMap.compL ℝ F F F (A p.1 p.2)) + (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := + (ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA_contOn + have hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, + β€–ContinuousLinearMap.compL ℝ F F F (A z s)β€– ≀ K := by + intro z s hs + refine le_trans ?_ (hA_bound z s hs) + refine ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg _) (fun g => ?_) + rw [ContinuousLinearMap.compL_apply] + exact (A z s).opNorm_comp_le g + exact picardSum_continuous_param_Icc (fun z s => ContinuousLinearMap.compL ℝ F F F (A z s)) + (ContinuousLinearMap.id ℝ F) T hT K hK hπ’œ_contOn hπ’œ_bound t ht + +/-- **Step 3 (i) β€” the fundamental matrix is jointly `(z,s)`-continuous.** Joint companion of +`fundamentalMatrix_continuous_param`; specialises `picardSum_continuous_param_Icc_joint` to +`π’œ := compL∘A`, `xβ‚€ := id`. This is the partial-`z`-derivative continuity input to the joint +`CΒΉ`-ness of the forward flow `(s,z) ↦ Ξ¦_s z` (Step 3 (iii)). -/ +lemma fundamentalMatrix_continuous_param_joint + {Z F : Type*} [TopologicalSpace Z] [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] + (A : Z β†’ ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) + (hA_contOn : ContinuousOn (fun p : Z Γ— ℝ => A p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) + (hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ K) : + ContinuousOn (fun p : Z Γ— ℝ => fundamentalMatrix (A p.1) p.2) + (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by + have hπ’œ_contOn : ContinuousOn + (fun p : Z Γ— ℝ => ContinuousLinearMap.compL ℝ F F F (A p.1 p.2)) + (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := + (ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA_contOn + have hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, + β€–ContinuousLinearMap.compL ℝ F F F (A z s)β€– ≀ K := by + intro z s hs + refine le_trans ?_ (hA_bound z s hs) + refine ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg _) (fun g => ?_) + rw [ContinuousLinearMap.compL_apply] + exact (A z s).opNorm_comp_le g + exact picardSum_continuous_param_Icc_joint + (fun z s => ContinuousLinearMap.compL ℝ F F F (A z s)) + (ContinuousLinearMap.id ℝ F) T hT K hK hπ’œ_contOn hπ’œ_bound + +section CharFlowDeriv +open Filter Topology + +omit [NeZero d] in +/-- **C3 D1 β€” the difference-quotient heart of the variational equation.** + +Given the fundamental matrix `Mz` of the linear variational ODE `M' = A(s, Ξ¦_s z)Β·M`, `M 0 = id` +(coefficient `A = vlasovFieldJacobian`), the time-`t` flow map `w ↦ (charX t w, charV t w)` is +FrΓ©chet-differentiable **at the fixed point `z`** with derivative exactly `Mz t`. + +This is the load-bearing difference-quotient estimate `Ξ¦_t(z+h) βˆ’ Ξ¦_t(z) βˆ’ Mz tΒ·h = o(β€–hβ€–)`. +The matrix is threaded as an explicit hypothesis (rather than `choose`-d) so the proof can use its +ODE/continuity data directly. + +**Proof plan (route b β€” GrΓΆnwall on the linearisation remainder).** Reduce via +`hasFDerivAt_iff_isLittleO_nhds_zero` + `Asymptotics.isLittleO_iff` to: `βˆ€ c>0, βˆ€αΆ  h, β€–Ξ¦_t(z+h) βˆ’ +Ξ¦_t(z) βˆ’ Mz tΒ·hβ€– ≀ cβ€–hβ€–`. For fixed small `h`, the two curves `u_h(s) := Ξ¦_s(z+h) βˆ’ Ξ¦_s(z)` +(approximate) and `m_h(s) := Mz sΒ·h` (exact) both solve `w' = A(s, Ξ¦_s z)Β·w` from the same datum +`h` (`Ξ¦_0 = id`, `Mz 0 = id`): +* `m_h` is exact β€” its defect is `0` (its derivative `(AΒ·Mz)(s)Β·h = A(s)Β·m_h(s)` by `hMzderiv` + + `HasDerivWithinAt.clm_apply`). +* `u_h`'s defect is the Taylor remainder `R(s, Ξ¦_s(z+h))`, bounded by `Ξ·Β·β€–u_h(s)β€–` (D1a, + `vlasovField_taylorRemainder_uniform`) once `β€–u_h(s)β€– ≀ Ξ΄(Ξ·)`, which holds with + `β€–u_h(s)β€– ≀ exp(K T)Β·β€–hβ€–` (flow Lipschitz-in-`z`, `charFlow_lipschitzInZ_via_gronwall_Ioo`) for + `β€–hβ€–` small. So `Ξ΅f = Ξ·Β·exp(K T)Β·β€–hβ€–`, uniform in `s`. +The frozen field's two-sided ODE holds only on `Ioo 0 T`, so apply +`dist_le_of_approx_trajectories_ODE` on `[sβ‚€, t]` (`sβ‚€ ∈ Ioo 0 t`) and take `sβ‚€ β†’ 0⁺` (the initial +defect `dist(u_h sβ‚€, m_h sβ‚€) β†’ 0` by continuity), giving `β€–u_h t βˆ’ m_h tβ€– ≀ gronwallBound 0 K Ξ΅f t = +Ξ΅fΒ·(exp(K t)βˆ’1)/K`. Since `Ξ·` is arbitrary this is `o(β€–hβ€–)`. `K := max 1 L` is the uniform field +Lipschitz constant; `β€–A(s,Β·)β€– ≀ K` via `norm_fderiv_le_of_lipschitz`. (`hcontIcc` is universal in +the initial point because the `sβ‚€β†’0⁺` limit needs continuity of `Ξ¦_Β·(z+h)`, M2.) -/ +theorem charFlow_hasFDerivAt_of_fundamentalMatrix + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT : 0 < T) + (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) + (z : PhaseSpace d) + (hcontIcc : βˆ€ z' : PhaseSpace d, + ContinuousOn (fun s => (charX s z', charV s z')) (Set.Icc (0 : ℝ) T)) + (Mz : ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d)) + (hMz0 : Mz 0 = ContinuousLinearMap.id ℝ (PhaseSpace d)) + (hMzcont : ContinuousOn Mz (Set.Icc 0 T)) + (hMzderiv : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt Mz + ((vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z))).comp (Mz s)) + (Set.Icc 0 T) s) : + βˆ€ t ∈ Set.Ioo (0 : ℝ) T, HasFDerivAt (fun w => (charX t w, charV t w)) (Mz t) z := by + intro t ht + set Kr : ℝ := ((max 1 L : NNReal) : ℝ) with hKr + have hKr1 : (1:ℝ) ≀ Kr := by rw [hKr]; exact_mod_cast le_max_left 1 L + have hKrpos : (0 : ℝ) < Kr := lt_of_lt_of_le one_pos hKr1 + set Ξ¦ : ℝ β†’ PhaseSpace d := fun s => (charX s z, charV s z) with hΞ¦ + have hF2 : βˆ€ s (w : PhaseSpace d), + HasFDerivAt (vlasovVectorField gradW ρ s) (vlasovFieldJacobian gradW ρ (s, w)) w := + fun s w => vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s w + have hVF_lip : βˆ€ s, LipschitzWith (max 1 L) (vlasovVectorField gradW ρ s) := fun s => + vlasovVectorField_lipschitzWith gradW L hL ρ h_int s + set vlin : ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := fun s => vlasovFieldJacobian gradW ρ (s, Ξ¦ s) + with hvlin + have hvlin_norm : βˆ€ s, β€–vlin sβ€– ≀ Kr := by + intro s + change β€–vlasovFieldJacobian gradW ρ (s, Ξ¦ s)β€– ≀ Kr + rw [← (hF2 s (Ξ¦ s)).fderiv] + exact norm_fderiv_le_of_lipschitz ℝ (hVF_lip s) + have hvlin_lip : βˆ€ s, LipschitzWith (max 1 L) (vlin s) := by + intro s + refine LipschitzWith.of_dist_le_mul (fun x y => ?_) + rw [dist_eq_norm, dist_eq_norm, ← map_sub] + calc β€–vlin s (x - y)β€– ≀ β€–vlin sβ€– * β€–x - yβ€– := (vlin s).le_opNorm _ + _ ≀ Kr * β€–x - yβ€– := mul_le_mul_of_nonneg_right (hvlin_norm s) (norm_nonneg _) + clear_value vlin + have h_init : βˆ€ z' : PhaseSpace d, (charX 0 z', charV 0 z') = z' := fun z' => + Prod.ext_iff.mpr ⟨(hflow.1 z' (Set.mem_univ z')).1, (hflow.1 z' (Set.mem_univ z')).2⟩ + have h_derivAt : βˆ€ z', βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivAt (fun s => (charX s z', charV s z')) + (vlasovVectorField gradW ρ s (charX s z', charV s z')) s := fun z' s hs => + HasDerivAt.prodMk (hflow.2.1 s hs z' (Set.mem_univ z')) (hflow.2.2 s hs z' (Set.mem_univ z')) + have hgron := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT.le + h_init hcontIcc (fun z' s hs => (h_derivAt z' s hs).hasDerivWithinAt) + rw [hasFDerivAt_iff_isLittleO_nhds_zero, Asymptotics.isLittleO_iff] + intro c hc + set Cexp : ℝ := Real.exp (Kr * T) with hCexp + have hCexp_pos : 0 < Cexp := Real.exp_pos _ + set Cgron : ℝ := (Real.exp (Kr * t) - 1) / Kr with hCgron + have hCgron_nonneg : 0 ≀ Cgron := by + rw [hCgron]; apply div_nonneg _ hKrpos.le + simp only [sub_nonneg]; exact Real.one_le_exp (mul_nonneg hKrpos.le ht.1.le) + set G : ℝ := Cexp * Cgron with hG + have hG_nonneg : 0 ≀ G := mul_nonneg hCexp_pos.le hCgron_nonneg + set Ξ· : ℝ := c / (G + 1) with hΞ· + have hΞ·_pos : 0 < Ξ· := by rw [hΞ·]; positivity + obtain ⟨δη, hδη_pos, hδη⟩ := vlasovField_taylorRemainder_uniform gradW hgradW_C1 L hL ρ h_int + charX charV T z (hcontIcc z) hρD_cont Ξ· hΞ·_pos + refine Metric.eventually_nhds_iff.mpr + ⟨δη / (Cexp + 1), div_pos hδη_pos (by linarith [hCexp_pos]), ?_⟩ + intro h hh + rw [dist_zero_right] at hh + have hCexph : Cexp * β€–hβ€– ≀ δη := by + have hle : β€–hβ€– * (Cexp + 1) ≀ δη := by rw [← le_div_iffβ‚€ (by linarith [hCexp_pos])]; exact hh.le + nlinarith [norm_nonneg h, hCexp_pos, hle] + set uh : ℝ β†’ PhaseSpace d := fun s => (charX s (z + h), charV s (z + h)) - (charX s z, charV s z) + with huh + set mh : ℝ β†’ PhaseSpace d := fun s => (Mz s) h with hmh + set Ξ΅f : ℝ := Ξ· * Cexp * β€–hβ€– with hΞ΅f + have huh_cont : ContinuousOn uh (Set.Icc 0 T) := (hcontIcc (z + h)).sub (hcontIcc z) + have hmh_cont : ContinuousOn mh (Set.Icc 0 T) := hMzcont.clm_apply continuousOn_const + have huh_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–uh sβ€– ≀ Cexp * β€–hβ€– := by + intro s hs + change β€–(charX s (z + h), charV s (z + h)) - (charX s z, charV s z)β€– ≀ Cexp * β€–hβ€– + rw [← dist_eq_norm] + calc dist ((charX s (z + h), charV s (z + h)) : PhaseSpace d) (charX s z, charV s z) + ≀ dist (z + h) z * Real.exp (Kr * (s - 0)) := hgron s hs (z + h) z + _ = β€–hβ€– * Real.exp (Kr * s) := by rw [dist_eq_norm, add_sub_cancel_left, sub_zero] + _ ≀ β€–hβ€– * Cexp := by + refine mul_le_mul_of_nonneg_left ?_ (norm_nonneg h) + rw [hCexp]; exact Real.exp_le_exp.mpr (mul_le_mul_of_nonneg_left hs.2 hKrpos.le) + _ = Cexp * β€–hβ€– := mul_comm _ _ + have huh_derivAt : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt uh + (vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) + - vlasovVectorField gradW ρ s (charX s z, charV s z)) s := fun s hs => + (h_derivAt (z + h) s hs).sub (h_derivAt z s hs) + have hmh_derivAt : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt mh ((vlin s) (mh s)) s := by + intro s hs + have hMz_at : HasDerivAt Mz ((vlin s).comp (Mz s)) s := by + simp only [hvlin] + exact (hMzderiv s (Set.Ioo_subset_Icc_self hs)).hasDerivAt (Icc_mem_nhds hs.1 hs.2) + have hck := hMz_at.clm_apply (hasDerivAt_const s h) + simpa only [ContinuousLinearMap.comp_apply, map_zero, add_zero] using hck + have hdefect : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + dist (vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) + - vlasovVectorField gradW ρ s (charX s z, charV s z)) (vlin s (uh s)) ≀ Ξ΅f := by + intro s hs + have hsIcc : s ∈ Set.Icc (0 : ℝ) T := Set.Ioo_subset_Icc_self hs + have huhs_le : β€–uh sβ€– ≀ δη := le_trans (huh_bound s hsIcc) hCexph + have hR := hδη s hsIcc (charX s (z + h), charV s (z + h)) huhs_le + rw [dist_eq_norm]; simp only [hvlin] + calc β€–vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) + - vlasovVectorField gradW ρ s (charX s z, charV s z) + - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) (uh s)β€– + ≀ Ξ· * β€–uh sβ€– := hR + _ ≀ Ξ· * (Cexp * β€–hβ€–) := mul_le_mul_of_nonneg_left (huh_bound s hsIcc) hΞ·_pos.le + _ = Ξ΅f := by rw [hΞ΅f]; ring + have huh0 : uh 0 = h := by + change (charX 0 (z + h), charV 0 (z + h)) - (charX 0 z, charV 0 z) = h + rw [h_init (z + h), h_init z, add_sub_cancel_left] + have hmh0 : mh 0 = h := by change (Mz 0) h = h; rw [hMz0]; rfl + have hlim : dist (uh t) (mh t) ≀ gronwallBound 0 Kr Ξ΅f t := by + have := gronwall_diffQuotient_bound vlin (max 1 L) hvlin_lip uh mh + (fun s => vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) + - vlasovVectorField gradW ρ s (charX s z, charV s z)) Ξ΅f T t ht + huh_cont hmh_cont huh_derivAt hmh_derivAt hdefect (huh0.trans hmh0.symm) + rwa [← hKr] at this + have hgb_val : gronwallBound 0 Kr Ξ΅f t = Ξ΅f * Cgron := by + rw [gronwallBound_of_K_ne_0 hKrpos.ne']; simp only [zero_mul, zero_add]; rw [hCgron]; ring + have hΞ·G : Ξ· * G ≀ c := by + rw [hΞ·]; rw [div_mul_eq_mul_div, div_le_iffβ‚€ (by linarith [hG_nonneg] : (0 : ℝ) < G + 1)] + nlinarith [hG_nonneg, hc.le] + change β€–(charX t (z + h), charV t (z + h)) - (charX t z, charV t z) - (Mz t) hβ€– ≀ c * β€–hβ€– + rw [show (charX t (z + h), charV t (z + h)) - (charX t z, charV t z) - (Mz t) h + = uh t - mh t from rfl, ← dist_eq_norm] + calc dist (uh t) (mh t) + ≀ gronwallBound 0 Kr Ξ΅f t := hlim + _ = Ξ΅f * Cgron := hgb_val + _ = Ξ· * G * β€–hβ€– := by rw [hΞ΅f, hG]; ring + _ ≀ c * β€–hβ€– := mul_le_mul_of_nonneg_right hΞ·G (norm_nonneg h) + +end CharFlowDeriv + +omit [NeZero d] in +/-- **C3 #3 β€” the variational equation (`HasFDerivAt` of the flow in its initial point).** + +For the frozen field `b(t,Β·) = vlasovVectorField gradW ρ t` with `gradW ∈ CΒΉ` (supplied by the +consumer via `assW2_contDiff_gradW`), the time-`t` characteristic map +`z ↦ (charX t z, charV t z)` is FrΓ©chet-differentiable in the initial point `z`, with a derivative +`Dflow t z` that is continuous in `z` (so the flow map is `CΒΉ` in `z`). The derivative solves the +linear matrix variational ODE `M' = (D_z b(t, Ξ¦_t z)) Β· M`, `M_0 = id`. + +**This was the load-bearing research gap** β€” Mathlib has no CΒΉ-dependence-of-an-ODE-flow-on-its- +initial-condition lemma β€” now proven (axiom-clean) via route (b) +(`charFlow_lipschitzInZ_via_gronwall_Ioo`, `CharacteristicFlow.lean`, is the Lipschitz-in-`z` +scaffold; Mathlib Gronwall + the vendored `IsPicardLindelof` confinement are the analytic inputs): +3.1 existence/uniqueness of the continuous matrix solution `M_t(z)` of the variational ODE +(`fundamentalMatrix`); 3.2 joint `(t,z)` continuity of `M` (`fundamentalMatrix_continuous_param`); +3.3 the difference-quotient estimate `Ξ¦_t(z+h) βˆ’ Ξ¦_t(z) βˆ’ M_t(z)Β·h = o(β€–hβ€–)` uniformly on compacts +(Gronwall on the linearization remainder, using `gradW ∈ CΒΉ`, +`charFlow_hasFDerivAt_of_fundamentalMatrix`); 3.4 assembled into `HasFDerivAt`. + +The `HasFDerivAt`/continuity *conclusion* is route-independent, so this interface is stable; the +universal-`t` probability instance + force-integrability `h_int` are the field-regularity inputs +the proof consumes (the window-only application clamps, L11, at the grind). + +**`hρD_cont` (joint continuity of the convolution-derivative field).** This is the regularity that +makes the variational coefficient `A(s,z) = D_z b(s, Ξ¦_s z)` continuous in `s` β€” its only non-flow +varying part is `D_x conv(ρ_s)(x) = ∫ fderiv gradW (x βˆ’ y) βˆ‚Ο_s`, evaluated at the *moving* point +`Ξ¦_s z`, so per-`x` continuity is not enough; joint `(s,x)`-continuity is needed. Note the +asymmetry with the *field*: `∫ gradW(xβˆ’y) dρ_s` gets joint continuity for free (per-`x` continuity ++ uniform Lipschitz-in-`x`, `convolveFunctionMeasure_lipschitz_in_x`), but the *derivative* field is +NOT uniformly Lipschitz in `x` (that needs `W ∈ CΒ³`; `AssW2` gives only `CΒ²`), so its joint +continuity must be supplied. + +**Option-B note (running β€” eventual extension).** `hρD_cont` is, in the complete theory, NOT a new +assumption: it is *derivable* from **narrow continuity of `s ↦ ρ_s`** (since `fderiv gradW` is +bounded continuous, `β€–Β·β€– ≀ L`), which is in turn derivable from `IsVlasovSolutionOn` + tightness +(the uniform moment bound) via the standard **"`C_c^∞`-continuity + tight ⟹ narrow-continuity"** +upgrade β€” a self-contained measure-theory lemma not yet in the codebase. We thread it as a +hypothesis (Option A) to unblock the variational-equation grind; folding it into a derived fact +(so the bridge assumes only the weak solution + moments) is the **Option-B extension**, tracked as +a follow-up. -/ +theorem charFlow_hasFDerivAt_in_initialPoint + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT : 0 < T) + (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) + (hcontIcc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : + βˆƒ Dflow : ℝ β†’ PhaseSpace d β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d), + (βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z : PhaseSpace d, + HasFDerivAt (fun w => (charX t w, charV t w)) (Dflow t z) z) ∧ + (βˆ€ t ∈ Set.Ioo (0 : ℝ) T, Continuous (Dflow t)) := by + -- **Reduction (Route A β€” explicit fundamental matrix, lesson L14).** `M z := fundamentalMatrix + -- (A z)` with `A z s := vlasovFieldJacobian gradW ρ (s, Ξ¦_s z)`; its ODE/continuity + -- data come from + -- `fundamentalMatrix_spec` (feeds D1), and `z ↦ M z t` continuity (V2) from + -- `fundamentalMatrix_continuous_param` β€” the parameter-regularity an existential + -- `choose` could not + -- supply. `Dflow t z := fundamentalMatrix (A z) t`. + set A : PhaseSpace d β†’ ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := + fun z s => vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z)) with hA_def + have hAcont : βˆ€ z : PhaseSpace d, ContinuousOn (A z) (Set.Icc 0 T) := fun z => + vlasovVariationalCoeff_continuousOn gradW ρ charX charV T z (hcontIcc z) hρD_cont + refine ⟨fun t z => fundamentalMatrix (A z) t, ?_, ?_⟩ + Β· -- **D1** β€” `charFlow_hasFDerivAt_of_fundamentalMatrix` fed by `fundamentalMatrix_spec`. + intro t ht z + obtain ⟨h0, hcont, hderiv⟩ := fundamentalMatrix_spec (A z) T hT.le (hAcont z) + exact charFlow_hasFDerivAt_of_fundamentalMatrix gradW hgradW_C1 L hL ρ charX charV T hT hflow + h_int hρD_cont z hcontIcc (fundamentalMatrix (A z)) h0 hcont hderiv t ht + Β· -- **V2** β€” `fundamentalMatrix_continuous_param`: flow joint continuity β‡’ `A` jointly continuous + -- β‡’ `z ↦ M z t` continuous. + intro t ht + -- Flow joint continuity `(z,s) ↦ Ξ¦_s z` on `univ Γ—Λ’ Icc 0 T` (GrΓΆnwall Lipschitz-in-`z` from + -- `hflow` + per-`z` continuity in `s`). + have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := fun z => + Prod.ext_iff.mpr ⟨(hflow.1 z (Set.mem_univ z)).1, (hflow.1 z (Set.mem_univ z)).2⟩ + have h_deriv : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt (fun s => (charX s z, charV s z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s := fun z s hs => + (HasDerivAt.prodMk (hflow.2.1 s hs z (Set.mem_univ z)) + (hflow.2.2 s hs z (Set.mem_univ z))).hasDerivWithinAt + have hgron := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT.le + h_init hcontIcc h_deriv + have hflowjoint : ContinuousOn + (fun p : PhaseSpace d Γ— ℝ => (charX p.2 p.1, charV p.2 p.1)) (Set.univ Γ—Λ’ Set.Icc 0 T) := by + refine continuousOn_prod_of_lipschitz_continuousOn (fun z s => (charX s z, charV s z)) T + (Real.exp (((max 1 L : NNReal) : ℝ) * T)) (fun s hs z₁ zβ‚‚ => ?_) hcontIcc + calc dist ((charX s z₁, charV s z₁) : PhaseSpace d) (charX s zβ‚‚, charV s zβ‚‚) + ≀ dist z₁ zβ‚‚ * Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) := hgron s hs z₁ zβ‚‚ + _ = Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) * dist z₁ zβ‚‚ := by ring + _ ≀ Real.exp (((max 1 L : NNReal) : ℝ) * T) * dist z₁ zβ‚‚ := by + refine mul_le_mul_of_nonneg_right (Real.exp_le_exp.mpr ?_) dist_nonneg + have hsT : s - 0 ≀ T := by simp only [sub_zero]; exact hs.2 + exact mul_le_mul_of_nonneg_left hsT (by positivity) + -- `A` jointly continuous (Jacobian along the flow) and uniformly bounded by `max 1 L`. + have hg : ContinuousOn + (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) + (Set.univ Γ—Λ’ Set.Icc 0 T) := continuousOn_snd.prodMk hflowjoint + have hmapsg : Set.MapsTo + (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) + (Set.univ Γ—Λ’ Set.Icc 0 T) (Set.Icc 0 T Γ—Λ’ Set.univ) := fun p hp => ⟨hp.2, Set.mem_univ _⟩ + have hA_contOn : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => A p.1 p.2) + (Set.univ Γ—Λ’ Set.Icc 0 T) := + (vlasovFieldJacobian_continuousOn gradW ρ T hρD_cont).comp hg hmapsg + have hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ ((max 1 L : NNReal) : ℝ) := by + intro z s _ + have heq : A z s = fderiv ℝ (vlasovVectorField gradW ρ s) (charX s z, charV s z) := by + simp only [hA_def] + exact (vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s + (charX s z, charV s z)).fderiv.symm + rw [heq] + exact norm_fderiv_le_of_lipschitz ℝ (vlasovVectorField_lipschitzWith gradW L hL ρ h_int s) + exact fundamentalMatrix_continuous_param A T hT.le ((max 1 L : NNReal) : ℝ) (by positivity) + hA_contOn hA_bound t (Set.Ioo_subset_Icc_self ht) + +open Filter Topology in +omit [NeZero d] in +/-- **Step 1 (dual core) β€” lower GrΓΆnwall / anti-Lipschitz bound on the characteristic flow.** +For `t ∈ (0,T)`, the flow `Ξ¦_t : z ↦ (charX t z, charV t z)` satisfies +`dist z₁ zβ‚‚ ≀ dist (Ξ¦_t z₁) (Ξ¦_t zβ‚‚) Β· exp(K t)` (K = max 1 L), i.e. `Ξ¦_t` is `AntilipschitzWith`. +This is the keystone of the two-time-flow inverse construction (Step 2): bi-Lipschitz makes `Ξ¦_t` +injective with closed range and `M_t = DΞ¦_t` invertible (no Liouville needed). + +Proof: time-reverse the two trajectories on each `[sβ‚€,t] βŠ† (0,T)` (so they solve +`w' = βˆ’b_{sβ‚€+tβˆ’r}(w)`, still K-Lipschitz) and apply the existing forward +`dist_le_of_trajectories_ODE`; take `sβ‚€β†’0⁺`. `h_deriv2` is the two-sided `HasDerivAt` on the open +interval, supplied by `IsCharacteristicFlowOn`. -/ +theorem charFlow_antilipschitzInZ_via_gronwall_Ioo + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) + (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) + (h_cont_Icc : βˆ€ z, ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) + (h_deriv2 : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) s) : + βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z₁ zβ‚‚ : PhaseSpace d, + dist z₁ zβ‚‚ ≀ + dist ((charX t z₁, charV t z₁) : PhaseSpace d) (charX t zβ‚‚, charV t zβ‚‚) + * Real.exp (((max 1 L : NNReal) : ℝ) * (t - 0)) := by + intro t ht z₁ zβ‚‚ + set K : NNReal := max 1 L with hK_def + have h_vf_lip : βˆ€ s, LipschitzWith K (vlasovVectorField gradW ρ s) := fun s => + vlasovVectorField_lipschitzWith gradW L hL ρ h_int s + set F : ℝ β†’ PhaseSpace d := fun s => (charX s z₁, charV s z₁) with hF_def + set G : ℝ β†’ PhaseSpace d := fun s => (charX s zβ‚‚, charV s zβ‚‚) with hG_def + -- Per-`sβ‚€` antilipschitz bound on `[sβ‚€, t]`. + have h_perS0 : βˆ€ sβ‚€ ∈ Set.Ioo (0 : ℝ) t, + dist (F sβ‚€) (G sβ‚€) ≀ dist (F t) (G t) * Real.exp ((K : ℝ) * (t - sβ‚€)) := by + intro sβ‚€ hsβ‚€ + have hsub_Ioo : Set.Icc sβ‚€ t βŠ† Set.Ioo (0 : ℝ) T := fun r hr => + ⟨lt_of_lt_of_le hsβ‚€.1 hr.1, lt_of_le_of_lt hr.2 ht.2⟩ + have hsub_Icc : Set.Icc sβ‚€ t βŠ† Set.Icc (0 : ℝ) T := fun r hr => + ⟨le_of_lt (lt_of_lt_of_le hsβ‚€.1 hr.1), le_of_lt (lt_of_le_of_lt hr.2 ht.2)⟩ + have hrefl_mem : βˆ€ r ∈ Set.Icc sβ‚€ t, sβ‚€ + t - r ∈ Set.Icc sβ‚€ t := by + intro r hr; exact ⟨by linarith [hr.2], by linarith [hr.1]⟩ + have hrefl_cont : ContinuousOn (fun r : ℝ => sβ‚€ + t - r) (Set.Icc sβ‚€ t) := + (continuous_const.sub continuous_id).continuousOn + set vr : ℝ β†’ PhaseSpace d β†’ PhaseSpace d := + fun r w => -(vlasovVectorField gradW ρ (sβ‚€ + t - r) w) with hvr_def + have hvr_lip : βˆ€ r, LipschitzWith K (vr r) := fun r => (h_vf_lip (sβ‚€ + t - r)).neg + have hFr_cont : ContinuousOn (fun r => F (sβ‚€ + t - r)) (Set.Icc sβ‚€ t) := + (h_cont_Icc z₁).comp hrefl_cont (fun r hr => hsub_Icc (hrefl_mem r hr)) + have hGr_cont : ContinuousOn (fun r => G (sβ‚€ + t - r)) (Set.Icc sβ‚€ t) := + (h_cont_Icc zβ‚‚).comp hrefl_cont (fun r hr => hsub_Icc (hrefl_mem r hr)) + have hFr' : βˆ€ r ∈ Set.Ico sβ‚€ t, + HasDerivWithinAt (fun r => F (sβ‚€ + t - r)) (vr r (F (sβ‚€ + t - r))) (Set.Ici r) r := by + intro r hr + have hrIoo : sβ‚€ + t - r ∈ Set.Ioo (0 : ℝ) T := + hsub_Ioo ⟨by linarith [hr.2], by linarith [hr.1]⟩ + have hlin : HasDerivAt (fun r : ℝ => sβ‚€ + t - r) (-1) r := by + simpa using (hasDerivAt_id r).const_sub (sβ‚€ + t) + have key : HasDerivAt (fun r => F (sβ‚€ + t - r)) + ((-1 : ℝ) β€’ vlasovVectorField gradW ρ (sβ‚€ + t - r) (F (sβ‚€ + t - r))) r := + HasDerivAt.scomp_of_eq r (h_deriv2 z₁ (sβ‚€ + t - r) hrIoo) hlin rfl + simp only [neg_one_smul] at key + exact key.hasDerivWithinAt + have hGr' : βˆ€ r ∈ Set.Ico sβ‚€ t, + HasDerivWithinAt (fun r => G (sβ‚€ + t - r)) (vr r (G (sβ‚€ + t - r))) (Set.Ici r) r := by + intro r hr + have hrIoo : sβ‚€ + t - r ∈ Set.Ioo (0 : ℝ) T := + hsub_Ioo ⟨by linarith [hr.2], by linarith [hr.1]⟩ + have hlin : HasDerivAt (fun r : ℝ => sβ‚€ + t - r) (-1) r := by + simpa using (hasDerivAt_id r).const_sub (sβ‚€ + t) + have key : HasDerivAt (fun r => G (sβ‚€ + t - r)) + ((-1 : ℝ) β€’ vlasovVectorField gradW ρ (sβ‚€ + t - r) (G (sβ‚€ + t - r))) r := + HasDerivAt.scomp_of_eq r (h_deriv2 zβ‚‚ (sβ‚€ + t - r) hrIoo) hlin rfl + simp only [neg_one_smul] at key + exact key.hasDerivWithinAt + have hgron := dist_le_of_trajectories_ODE hvr_lip hFr_cont hFr' hGr_cont hGr' + (le_refl (dist (F (sβ‚€ + t - sβ‚€)) (G (sβ‚€ + t - sβ‚€)))) t ⟨hsβ‚€.2.le, le_refl t⟩ + simp only [show sβ‚€ + t - t = sβ‚€ from by ring, show sβ‚€ + t - sβ‚€ = t from by ring] at hgron + exact hgron + -- `sβ‚€ β†’ 0⁺` limit. + have hfilt : (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)).NeBot := left_nhdsWithin_Ioo_neBot ht.1 + have hIoo_sub_Icc : Set.Ioo (0 : ℝ) t βŠ† Set.Icc (0 : ℝ) T := fun s hs => + ⟨hs.1.le, le_of_lt (lt_trans hs.2 ht.2)⟩ + have h_tendsto_F : Tendsto F (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) (nhds z₁) := by + have hcw : ContinuousWithinAt F (Set.Icc (0 : ℝ) T) 0 := + (h_cont_Icc z₁) 0 ⟨le_refl 0, le_of_lt (lt_trans ht.1 ht.2)⟩ + have h0 : Tendsto F (nhdsWithin (0 : ℝ) (Set.Icc 0 T)) (nhds (F 0)) := hcw + rw [show F 0 = z₁ from h_init z₁] at h0 + exact h0.mono_left (nhdsWithin_mono 0 hIoo_sub_Icc) + have h_tendsto_G : Tendsto G (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) (nhds zβ‚‚) := by + have hcw : ContinuousWithinAt G (Set.Icc (0 : ℝ) T) 0 := + (h_cont_Icc zβ‚‚) 0 ⟨le_refl 0, le_of_lt (lt_trans ht.1 ht.2)⟩ + have h0 : Tendsto G (nhdsWithin (0 : ℝ) (Set.Icc 0 T)) (nhds (G 0)) := hcw + rw [show G 0 = zβ‚‚ from h_init zβ‚‚] at h0 + exact h0.mono_left (nhdsWithin_mono 0 hIoo_sub_Icc) + have h_tendsto_lhs : Tendsto (fun sβ‚€ => dist (F sβ‚€) (G sβ‚€)) + (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) (nhds (dist z₁ zβ‚‚)) := + h_tendsto_F.dist h_tendsto_G + have h_tendsto_rhs : Tendsto (fun sβ‚€ => dist (F t) (G t) * Real.exp ((K : ℝ) * (t - sβ‚€))) + (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) + (nhds (dist (F t) (G t) * Real.exp ((K : ℝ) * (t - 0)))) := by + have hcont : Continuous (fun sβ‚€ : ℝ => dist (F t) (G t) * Real.exp ((K : ℝ) * (t - sβ‚€))) := by + fun_prop + exact (hcont.tendsto 0).mono_left nhdsWithin_le_nhds + exact le_of_tendsto_of_tendsto h_tendsto_lhs h_tendsto_rhs + (eventually_nhdsWithin_of_forall h_perS0) + +section Step2Inverse +open Filter Topology + +/-- **Step 2a (dual core, generic) β€” antilipschitz map β‡’ antilipschitz derivative.** +If `f` is antilipschitz and FrΓ©chet-differentiable at `x`, its derivative `f'` is antilipschitz +(hence injective) with the same constant. `f' u` is the limit of slopes `nβ€’(f(x+n⁻¹‒u)βˆ’f x)`, each +of norm `β‰₯ β€–uβ€–/C` by antilipschitz; pass to the limit. (Mathlib lacks this producer.) -/ +theorem antilipschitzWith_fderiv_of_antilipschitz + {E F : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] + [NormedAddCommGroup F] [NormedSpace ℝ F] + {f : E β†’ F} {f' : E β†’L[ℝ] F} {x : E} {C : NNReal} + (hf : AntilipschitzWith C f) (hf' : HasFDerivAt f f' x) : + AntilipschitzWith C f' := by + refine AntilipschitzWith.of_le_mul_dist (fun v w => ?_) + rw [dist_eq_norm, dist_eq_norm, ← map_sub] + set u := v - w with hu + have hc : Tendsto (fun n : β„• => β€–((n : ℝ))β€–) atTop atTop := by + simpa [Real.norm_natCast] using tendsto_natCast_atTop_atTop (R := ℝ) + have hlim := hf'.lim u hc + have hbd : βˆ€αΆ  n : β„• in atTop, + β€–uβ€– ≀ (C : ℝ) * β€–(n : ℝ) β€’ (f (x + ((n : ℝ))⁻¹ β€’ u) - f x)β€– := by + filter_upwards [eventually_gt_atTop 0] with n hn + have hn0 : (0 : ℝ) < (n : ℝ) := by exact_mod_cast hn + have hd := hf.le_mul_dist (x + ((n : ℝ))⁻¹ β€’ u) x + rw [dist_eq_norm, dist_eq_norm, add_sub_cancel_left, norm_smul, norm_inv, + Real.norm_natCast] at hd + rw [norm_smul, Real.norm_natCast] + calc β€–uβ€– = (n : ℝ) * ((n : ℝ)⁻¹ * β€–uβ€–) := by + rw [← mul_assoc, mul_inv_cancelβ‚€ (ne_of_gt hn0), one_mul] + _ ≀ (n : ℝ) * ((C : ℝ) * β€–f (x + ((n : ℝ))⁻¹ β€’ u) - f xβ€–) := + mul_le_mul_of_nonneg_left hd (le_of_lt hn0) + _ = (C : ℝ) * ((n : ℝ) * β€–f (x + ((n : ℝ))⁻¹ β€’ u) - f xβ€–) := by ring + have hlim2 : Tendsto (fun n : β„• => (C : ℝ) * β€–(n : ℝ) β€’ (f (x + ((n : ℝ))⁻¹ β€’ u) - f x)β€–) + atTop (𝓝 ((C : ℝ) * β€–f' uβ€–)) := hlim.norm.const_mul (C : ℝ) + exact ge_of_tendsto hlim2 hbd + +/-- **Step 2 (dual core, generic) β€” global `CΒΉ` inverse of an antilipschitz `CΒΉ` self-map.** +If `Ξ¦ : E β†’ E` (finite-dim) is `CΒΉ` (derivative `M z` at `z`), antilipschitz, and Lipschitz, then +each `M z` is invertible, `Ξ¦` is bijective, and the global inverse `Ξ¨` is Lipschitz with +`HasFDerivAt Ξ¨ (M (Ξ¨ w))⁻¹ w`. No Liouville/Hadamard: open range +(`isOpenMap_of_hasStrictFDerivAt_equiv`) + closed range (`AntilipschitzWith.isClosed_range`) β‡’ +clopen β‡’ surjective; inverse derivative from `HasStrictFDerivAt.to_local_left_inverse`. -/ +theorem exists_global_c1_inverse_of_antilipschitz + {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [FiniteDimensional ℝ E] + {Ξ¦ : E β†’ E} {M : E β†’ (E β†’L[ℝ] E)} {Ca Cl : NNReal} + (hderiv : βˆ€ z, HasFDerivAt Ξ¦ (M z) z) + (hM_cont : Continuous M) + (hanti : AntilipschitzWith Ca Ξ¦) + (hlip : LipschitzWith Cl Ξ¦) : + βˆƒ (Ξ¨ : E β†’ E) (e : E β†’ E ≃L[ℝ] E), + (βˆ€ z, ((e z : E β†’L[ℝ] E)) = M z) ∧ + Function.LeftInverse Ξ¨ Ξ¦ ∧ Function.RightInverse Ξ¨ Ξ¦ ∧ + LipschitzWith Ca Ξ¨ ∧ + (βˆ€ w, HasFDerivAt Ξ¨ ((e (Ξ¨ w)).symm : E β†’L[ℝ] E) w) := by + classical + have hMz_anti : βˆ€ z, AntilipschitzWith Ca (M z) := fun z => + antilipschitzWith_fderiv_of_antilipschitz hanti (hderiv z) + have hker : βˆ€ z, LinearMap.ker (M z : E β†’β‚—[ℝ] E) = βŠ₯ := fun z => + LinearMap.ker_eq_bot.mpr (hMz_anti z).injective + have hsurj_lin : βˆ€ z, LinearMap.range (M z : E β†’β‚—[ℝ] E) = ⊀ := fun z => + LinearMap.range_eq_top.mpr (LinearMap.injective_iff_surjective.mp (hMz_anti z).injective) + set e : βˆ€ z, E ≃L[ℝ] E := fun z => + ContinuousLinearEquiv.ofBijective (M z) (hker z) (hsurj_lin z) with he_def + have he_coe : βˆ€ z, ((e z : E β†’L[ℝ] E)) = M z := fun _ => rfl + have hC1 : ContDiff ℝ 1 Ξ¦ := contDiff_one_iff_hasFDerivAt.mpr ⟨M, hM_cont, hderiv⟩ + have hstrict : βˆ€ z, HasStrictFDerivAt Ξ¦ ((e z : E β†’L[ℝ] E)) z := fun z => by + rw [he_coe z]; exact hC1.contDiffAt.hasStrictFDerivAt' (hderiv z) (by norm_num) + have hopen : IsOpenMap Ξ¦ := isOpenMap_of_hasStrictFDerivAt_equiv hstrict + have hrange_open : IsOpen (Set.range Ξ¦) := hopen.isOpen_range + have hrange_closed : IsClosed (Set.range Ξ¦) := hanti.isClosed_range hlip.uniformContinuous + have hrange_univ : Set.range Ξ¦ = Set.univ := + IsClopen.eq_univ ⟨hrange_closed, hrange_open⟩ ⟨Φ 0, Set.mem_range_self 0⟩ + have hsurj : Function.Surjective Ξ¦ := Set.range_eq_univ.mp hrange_univ + have hinj : Function.Injective Ξ¦ := hanti.injective + set Ξ¨ : E β†’ E := Function.invFun Ξ¦ with hΞ¨_def + have hLeft : Function.LeftInverse Ξ¨ Ξ¦ := Function.leftInverse_invFun hinj + have hRight : Function.RightInverse Ξ¨ Ξ¦ := Function.rightInverse_invFun hsurj + have hΞ¨_lip : LipschitzWith Ca Ξ¨ := by + refine LipschitzWith.of_dist_le_mul (fun w₁ wβ‚‚ => ?_) + have h := hanti.le_mul_dist (Ξ¨ w₁) (Ξ¨ wβ‚‚) + rwa [hRight w₁, hRight wβ‚‚] at h + have hΞ¨_deriv : βˆ€ w, HasFDerivAt Ξ¨ ((e (Ξ¨ w)).symm : E β†’L[ℝ] E) w := by + intro w + have hz : Ξ¦ (Ξ¨ w) = w := hRight w + have hev : βˆ€αΆ  x in 𝓝 (Ξ¨ w), Ξ¨ (Ξ¦ x) = x := Filter.Eventually.of_forall hLeft + have hsymm := (hstrict (Ξ¨ w)).to_local_left_inverse hev + rw [hz] at hsymm + exact hsymm.hasFDerivAt + exact ⟨Ψ, e, he_coe, hLeft, hRight, hΞ¨_lip, hΞ¨_deriv⟩ + +end Step2Inverse + +omit [NeZero d] in +/-- **Step 2 (dual core) β€” the characteristic flow `Ξ¦_t` is a `CΒΉ` diffeomorphism on `(0,T)`.** +Instantiates the generic global-inverse machinery at `Ξ¦_t := (charX t, charV t)`: its derivative +`e z` (= `#3`'s `Dflow t z`) is invertible, `Ξ¦_t` is bijective, and the inverse `Ξ¨` is continuous +with `HasFDerivAt Ξ¨ (e (Ξ¨ w))⁻¹ w`. `hanti` comes from Step 1 +(`charFlow_antilipschitzInZ_via_gronwall_Ioo`), `hlip` from the existing upper GrΓΆnwall bound +(`charFlow_lipschitzInZ_via_gronwall_Ioo`), the derivative family from `#3`. -/ +theorem exists_charFlow_inverse_On + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT : 0 < T) + (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) + (hcontIcc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : + βˆ€ t ∈ Set.Ioo (0 : ℝ) T, + βˆƒ (Ξ¨ : PhaseSpace d β†’ PhaseSpace d) + (e : PhaseSpace d β†’ (PhaseSpace d ≃L[ℝ] PhaseSpace d)), + (βˆ€ z, HasFDerivAt (fun w => (charX t w, charV t w)) + ((e z : PhaseSpace d β†’L[ℝ] PhaseSpace d)) z) ∧ + Function.LeftInverse Ξ¨ (fun z => (charX t z, charV t z)) ∧ + Function.RightInverse Ξ¨ (fun z => (charX t z, charV t z)) ∧ + Continuous Ξ¨ ∧ + (βˆ€ w, HasFDerivAt Ξ¨ ((e (Ξ¨ w)).symm : PhaseSpace d β†’L[ℝ] PhaseSpace d) w) := by + have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := fun z => + Prod.ext_iff.mpr (hflow.1 z (Set.mem_univ z)) + have h_deriv2 : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) s := fun z s hs => + HasDerivAt.prodMk (hflow.2.1 s hs z (Set.mem_univ z)) (hflow.2.2 s hs z (Set.mem_univ z)) + have h_deriv_Ioo : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s := fun z s hs => + (h_deriv2 z s hs).hasDerivWithinAt + obtain ⟨Dflow, hDeriv, hCont⟩ := charFlow_hasFDerivAt_in_initialPoint gradW hgradW_C1 L hL ρ + charX charV T hT hflow h_int hρD_cont hcontIcc + intro t ht + set K : ℝ := ((max 1 L : NNReal) : ℝ) with hK + have hCcoe : (((Real.exp (K * t)).toNNReal : NNReal) : ℝ) = Real.exp (K * t) := + Real.coe_toNNReal _ (le_of_lt (Real.exp_pos _)) + have hderiv : βˆ€ z, HasFDerivAt (fun z => (charX t z, charV t z)) (Dflow t z) z := fun z => + hDeriv t ht z + have hM_cont : Continuous (Dflow t) := hCont t ht + have hanti : AntilipschitzWith (Real.exp (K * t)).toNNReal + (fun z => (charX t z, charV t z)) := by + refine AntilipschitzWith.of_le_mul_dist (fun z₁ zβ‚‚ => ?_) + have h1 := charFlow_antilipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T + h_init hcontIcc h_deriv2 t ht z₁ zβ‚‚ + rw [sub_zero] at h1 + rw [hCcoe, mul_comm] + exact h1 + have hlip : LipschitzWith (Real.exp (K * t)).toNNReal + (fun z => (charX t z, charV t z)) := by + refine LipschitzWith.of_dist_le_mul (fun z₁ zβ‚‚ => ?_) + have h1 := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT.le + h_init hcontIcc h_deriv_Ioo t (Set.Ioo_subset_Icc_self ht) z₁ zβ‚‚ + rw [sub_zero] at h1 + rw [hCcoe, mul_comm] + exact h1 + obtain ⟨Ψ, e, he_coe, hLeft, hRight, hΞ¨lip, hΞ¨deriv⟩ := + exists_global_c1_inverse_of_antilipschitz hderiv hM_cont hanti hlip + refine ⟨Ψ, e, ?_, hLeft, hRight, hΞ¨lip.continuous, hΞ¨deriv⟩ + intro z; rw [he_coe z]; exact hderiv z + +section Step3Joint +open Filter Topology Asymptotics + + +end Step3Joint + +omit [NeZero d] in +/-- **Step 3 β€” the forward flow `(s,z) ↦ Ξ¦_s z` is jointly continuous** on `Icc 0 T Γ—Λ’ univ` +(`(s,z)`-order). Gronwall Lipschitz-in-`z` (uniform over `[0,T]`) + per-`z` continuity-in-`s`, via +the generic `continuousOn_prod_of_lipschitz_continuousOn`, then a prod-order swap. Extracted from +`#3`'s V2-branch pattern so the joint `CΒΉ`-ness (Step 3 (iii)) can reuse it directly. -/ +lemma charFlow_continuousOn_joint + (gradW : PhysSpace d β†’ PhysSpace d) (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) (hT : 0 ≀ T) + (hinit : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) + (hcontIcc : βˆ€ z, ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) + (hderiv : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt (fun s => (charX s z, charV s z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s) : + ContinuousOn (fun p : ℝ Γ— PhaseSpace d => (charX p.1 p.2, charV p.1 p.2)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := by + have hgron := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT + hinit hcontIcc hderiv + have hjoint_zs : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => (charX p.2 p.1, charV p.2 p.1)) + (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by + refine continuousOn_prod_of_lipschitz_continuousOn (fun z s => (charX s z, charV s z)) T + (Real.exp (((max 1 L : NNReal) : ℝ) * T)) (fun s hs z₁ zβ‚‚ => ?_) hcontIcc + calc dist ((charX s z₁, charV s z₁) : PhaseSpace d) (charX s zβ‚‚, charV s zβ‚‚) + ≀ dist z₁ zβ‚‚ * Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) := hgron s hs z₁ zβ‚‚ + _ = Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) * dist z₁ zβ‚‚ := by ring + _ ≀ Real.exp (((max 1 L : NNReal) : ℝ) * T) * dist z₁ zβ‚‚ := by + refine mul_le_mul_of_nonneg_right (Real.exp_le_exp.mpr ?_) dist_nonneg + have hsT : s - 0 ≀ T := by simp only [sub_zero]; exact hs.2 + exact mul_le_mul_of_nonneg_left hsT (by positivity) + have hswap : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := (continuous_snd.prodMk continuous_fst).continuousOn + have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := + fun p hp => ⟨Set.mem_univ _, hp.1⟩ + exact hjoint_zs.comp hswap hmaps + +omit [NeZero d] in +/-- **Step 3 (ii) β€” the field along the flow `(s,z) ↦ b_s(Ξ¦_s z)` is jointly continuous** on +`Icc 0 T Γ—Λ’ univ`. First component `charV` from flow joint continuity; second component +`-(βˆ‡W βˆ— ρ_s)(charX s z)` from `(s,x) ↦ (βˆ‡Wβˆ—Ο_s)(x)` jointly continuous (equi-Lipschitz-in-`x` from +`convolveFunctionMeasure_lipschitz_in_x` + continuous-in-`s` from `hf_cont`) composed with the flow. +This is the partial-`s`-derivative continuity input to the joint `CΒΉ`-ness (Step 3 (iii)). -/ +lemma vlasovField_along_flow_continuousOn + (gradW : PhysSpace d β†’ PhysSpace d) (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) + (hflowjoint : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => (charX p.1 p.2, charV p.1 p.2)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ)) : + ContinuousOn (fun p : ℝ Γ— PhaseSpace d => + vlasovVectorField gradW ρ p.1 (charX p.1 p.2, charV p.1 p.2)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := by + have hcomp1 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => charV p.1 p.2) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := continuous_snd.comp_continuousOn hflowjoint + have hcharX : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => charX p.1 p.2) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := continuous_fst.comp_continuousOn hflowjoint + have hconv_joint : ContinuousOn + (fun p : PhysSpace d Γ— ℝ => convolveFunctionMeasure gradW (ρ p.2) p.1) + (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := + continuousOn_prod_of_lipschitz_continuousOn + (fun (x : PhysSpace d) (s : ℝ) => convolveFunctionMeasure gradW (ρ s) x) T (L:ℝ) + (fun s _ x₁ xβ‚‚ => + (convolveFunctionMeasure_lipschitz_in_x gradW L hL (ρ s) (h_int s)).dist_le_mul x₁ xβ‚‚) + (fun x => (hf_cont x).continuousOn) + have hg2 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => ((charX p.1 p.2, p.1) : PhysSpace d Γ— ℝ)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := hcharX.prodMk continuousOn_fst + have hg2maps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((charX p.1 p.2, p.1) : PhysSpace d Γ— ℝ)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := + fun p hp => ⟨Set.mem_univ _, hp.1⟩ + have hconv_along : ContinuousOn + (fun p : ℝ Γ— PhaseSpace d => convolveFunctionMeasure gradW (ρ p.1) (charX p.1 p.2)) + (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := hconv_joint.comp hg2 hg2maps + have heq : (fun p : ℝ Γ— PhaseSpace d => + vlasovVectorField gradW ρ p.1 (charX p.1 p.2, charV p.1 p.2)) + = fun p => ((charV p.1 p.2), + -(convolveFunctionMeasure gradW (ρ p.1) (charX p.1 p.2))) := by + funext p; rfl + rw [heq] + exact hcomp1.prodMk hconv_along.neg + +omit [NeZero d] in +/-- **Step 3 (iii) β€” the forward flow `(s,z) ↦ Ξ¦_s z` is jointly `CΒΉ`** on `U := Ioo 0 T Γ—Λ’ univ`: +FrΓ©chet-differentiable at every point with a jointly-continuous total derivative `DΞ¦`. Built by +composing the open-set gating theorem (`hasFDerivAt_of_continuous_partials_open`) β€” fed the +`s`-partial `b_s(Ξ¦_s z)` (flow ODE, jointly continuous by item (ii)) and the `z`-partial `M_s z` +(the fundamental matrix, via D1c, jointly continuous by item (i)). Per L14 the matrix is rebuilt +concretely (`fundamentalMatrix (A z) s`), NOT routed through `#3`'s existential. + +The field `bfun` and matrix `Mfun` are made opaque locals (`clear_value`, the D1c lesson) so the +gating unification stays syntactic and never unfolds the `vlasovVectorField`/`vlasovFieldJacobian` +integrals β€” the per-point derivative facts are established in terms of them *before* clearing. +`A` is kept transparent through the D1c call (whose coefficient is +`vlasovFieldJacobian`) and cleared +only afterwards (before the projection-reduction defeqs). No `maxHeartbeats` bump needed. -/ +theorem charFlow_hasFDerivAt_joint + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT : 0 < T) + (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) + (hcontIcc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : + βˆƒ DΞ¦ : ℝ Γ— PhaseSpace d β†’ (ℝ Γ— PhaseSpace d β†’L[ℝ] PhaseSpace d), + (βˆ€ p ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)), + HasFDerivAt (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) (DΞ¦ p) p) ∧ + ContinuousOn DΞ¦ (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := by + set A : PhaseSpace d β†’ ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := + fun z s => vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z)) with hA_def + have hAcont : βˆ€ z, ContinuousOn (A z) (Set.Icc 0 T) := fun z => + vlasovVariationalCoeff_continuousOn gradW ρ charX charV T z (hcontIcc z) hρD_cont + have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := fun z => + Prod.ext_iff.mpr ⟨(hflow.1 z (Set.mem_univ z)).1, (hflow.1 z (Set.mem_univ z)).2⟩ + have h_deriv : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivWithinAt (fun s => (charX s z, charV s z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s := fun z s hs => + (HasDerivAt.prodMk (hflow.2.1 s hs z (Set.mem_univ z)) + (hflow.2.2 s hs z (Set.mem_univ z))).hasDerivWithinAt + have hflowjoint_sz : ContinuousOn (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) + (Set.Icc 0 T Γ—Λ’ Set.univ) := + charFlow_continuousOn_joint gradW L hL ρ h_int charX charV T hT.le h_init hcontIcc h_deriv + -- field as an opaque local + set bfun : ℝ Γ— PhaseSpace d β†’ PhaseSpace d := + fun q => vlasovVectorField gradW ρ q.1 (charX q.1 q.2, charV q.1 q.2) with hbfun_def + have hb_cont : ContinuousOn bfun (Set.Icc 0 T Γ—Λ’ Set.univ) := + vlasovField_along_flow_continuousOn gradW L hL ρ h_int hf_cont charX charV T hflowjoint_sz + -- `A` jointly continuous + bounded β‡’ `M` jointly continuous (item (i)) + have hflowjoint_zs : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => (charX p.2 p.1, charV p.2 p.1)) + (Set.univ Γ—Λ’ Set.Icc 0 T) := by + have hswap : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => ((p.2, p.1) : ℝ Γ— PhaseSpace d)) + (Set.univ Γ—Λ’ Set.Icc 0 T) := (continuous_snd.prodMk continuous_fst).continuousOn + have hmaps : Set.MapsTo (fun p : PhaseSpace d Γ— ℝ => ((p.2, p.1) : ℝ Γ— PhaseSpace d)) + (Set.univ Γ—Λ’ Set.Icc 0 T) (Set.Icc 0 T Γ—Λ’ Set.univ) := fun p hp => ⟨hp.2, Set.mem_univ _⟩ + exact hflowjoint_sz.comp hswap hmaps + have hg : ContinuousOn + (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) + (Set.univ Γ—Λ’ Set.Icc 0 T) := continuousOn_snd.prodMk hflowjoint_zs + have hmapsg : Set.MapsTo + (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) + (Set.univ Γ—Λ’ Set.Icc 0 T) (Set.Icc 0 T Γ—Λ’ Set.univ) := fun p hp => ⟨hp.2, Set.mem_univ _⟩ + have hA_contOn : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => A p.1 p.2) (Set.univ Γ—Λ’ Set.Icc 0 T) := + (vlasovFieldJacobian_continuousOn gradW ρ T hρD_cont).comp hg hmapsg + have hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ ((max 1 L : NNReal) : ℝ) := by + intro z s _ + have heq : A z s = fderiv ℝ (vlasovVectorField gradW ρ s) (charX s z, charV s z) := by + simp only [hA_def] + exact (vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s + (charX s z, charV s z)).fderiv.symm + rw [heq] + exact norm_fderiv_le_of_lipschitz ℝ (vlasovVectorField_lipschitzWith gradW L hL ρ h_int s) + have hM_zs : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => fundamentalMatrix (A p.1) p.2) + (Set.univ Γ—Λ’ Set.Icc 0 T) := + fundamentalMatrix_continuous_param_joint A T hT.le ((max 1 L : NNReal) : ℝ) (by positivity) + hA_contOn hA_bound + have hU_open : IsOpen (Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := + isOpen_Ioo.prod isOpen_univ + have hU_sub : Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)) βŠ† Set.Icc 0 T Γ—Λ’ Set.univ := + Set.prod_mono Set.Ioo_subset_Icc_self (subset_refl _) + -- matrix as a local (kept transparent for the D1c call, which needs `A`'s coefficient) + set Mfun : ℝ Γ— PhaseSpace d β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := + fun p => fundamentalMatrix (A p.2) p.1 with hMfun_def + -- z-partial at base via D1c β€” needs `A` TRANSPARENT (its coefficient is `vlasovFieldJacobian`). + have hDz_all : βˆ€ sβ‚€ ∈ Set.Ioo (0 : ℝ) T, βˆ€ zβ‚€ : PhaseSpace d, + HasFDerivAt (fun z => (charX sβ‚€ z, charV sβ‚€ z)) (Mfun (sβ‚€, zβ‚€)) zβ‚€ := by + intro sβ‚€ hsβ‚€ zβ‚€ + obtain ⟨h0, hMcont, hMderiv⟩ := fundamentalMatrix_spec (A zβ‚€) T hT.le (hAcont zβ‚€) + exact charFlow_hasFDerivAt_of_fundamentalMatrix gradW hgradW_C1 L hL ρ charX charV T hT hflow + h_int hρD_cont zβ‚€ hcontIcc (fundamentalMatrix (A zβ‚€)) h0 hMcont hMderiv sβ‚€ hsβ‚€ + have hDs_all : βˆ€ p ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)), + HasDerivAt (fun s => ((charX s p.2, charV s p.2) : PhaseSpace d)) (bfun p) p.1 := by + intro p hp' + exact HasDerivAt.prodMk (hflow.2.1 p.1 hp'.1 p.2 (Set.mem_univ _)) + (hflow.2.2 p.1 hp'.1 p.2 (Set.mem_univ _)) + -- NOW make `A`/field/matrix opaque so the projection-reduction defeqs below never unfold the + -- heavy `vlasovFieldJacobian`/`vlasovVectorField` integrals (D1c lesson). + clear_value A bfun Mfun + have hM_sz : ContinuousOn Mfun (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := by + rw [hMfun_def] + have hswap : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) + (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := (continuous_snd.prodMk continuous_fst).continuousOn + have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) + (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) (Set.univ Γ—Λ’ Set.Icc 0 T) := + fun p hp => ⟨Set.mem_univ _, Set.Ioo_subset_Icc_self hp.1⟩ + exact hM_zs.comp hswap hmaps + refine ⟨fun p => (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).smulRight (bfun p) + + (Mfun p).comp (ContinuousLinearMap.snd ℝ ℝ (PhaseSpace d)), ?_, ?_⟩ + Β· rintro ⟨sβ‚€, zβ‚€βŸ© hp + obtain ⟨hsβ‚€, _⟩ := hp + exact hasFDerivAt_of_continuous_partials_open + (f := fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) (Ds := bfun) + hU_open ⟨hsβ‚€, Set.mem_univ _⟩ hDs_all (hb_cont.mono hU_sub) (hDz_all sβ‚€ hsβ‚€ zβ‚€) + Β· have hT1 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => + (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).smulRight (bfun p)) + (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := by + have hc : Continuous (fun v : PhaseSpace d => + (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).smulRight v) := + (ContinuousLinearMap.smulRightL ℝ (ℝ Γ— PhaseSpace d) (PhaseSpace d) + (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d))).continuous + exact hc.comp_continuousOn (hb_cont.mono hU_sub) + have hT2 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => + (Mfun p).comp (ContinuousLinearMap.snd ℝ ℝ (PhaseSpace d))) + (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := hM_sz.clm_comp continuousOn_const + exact hT1.add hT2 + +omit [NeZero d] in +/-- **Step 3 (iv-A) β€” the forward flow `(s,z) ↦ Ξ¦_s z` is `ContDiffAt ℝ 1`** at each point of the +open window (the chart-IFT input for item (iv)). Lifts item (iii)'s `HasFDerivAt`-everywhere + +`ContinuousOn`-derivative to `ContDiffAt` via `contDiffAt_succ_iff_hasFDerivAt`. -/ +lemma charFlow_contDiffAt_joint + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT : 0 < T) + (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) + (hcontIcc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : + βˆ€ p ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)), + ContDiffAt ℝ 1 (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) p := by + obtain ⟨DΞ¦, hFDeriv, hDΞ¦_cont⟩ := + charFlow_hasFDerivAt_joint gradW hgradW_C1 L hL ρ charX charV T hT + hflow h_int hf_cont hρD_cont hcontIcc + have hU_open : IsOpen (Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := + isOpen_Ioo.prod isOpen_univ + intro p hp + have hmain : ContDiffAt ℝ ((0:β„•) + 1) + (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) p := by + rw [contDiffAt_succ_iff_hasFDerivAt] + refine ⟨DΞ¦, ⟨Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ, hU_open.mem_nhds hp, fun y hy => hFDeriv y hy⟩, ?_⟩ + exact contDiffAt_zero.mpr ⟨Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ, hU_open.mem_nhds hp, hDΞ¦_cont⟩ + simpa using hmain + +open Filter Topology in +omit [NeZero d] in +/-- **Step 3 (iv) β€” the per-slice inverse `Ξ¨_s := Ξ¦_s⁻¹` is jointly `CΒΉ`** on `Ioo 0 T Γ—Λ’ univ`, +the keystone of the two-time flow `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹`. + +**PROVEN (axiom-clean)** via the space-time chart inverse-function theorem β€” see the proof plan +below, realized exactly as scouted: `charFlow_contDiffAt_joint` (iv-A) for the chart `ContDiffAt`, +the block-triangular `≃L` (invertibility from Step 2's `e zβ‚€` via `HasFDerivAt.unique` + +`ofBijective`), `ContDiffAt.to_localInverse`, and the global patch via `localInverse_unique` (the +global per-slice inverse is a local left inverse of the chart, by injectivity on the window). + +Per slice `s ∈ Ioo 0 T`, Step 2 (`exists_charFlow_inverse_On`) already gives the inverse `Ξ¨_s` and +its invertible derivative family `e` (`= M_s z`, `#3`/D1c); here we upgrade to JOINT `(s,w)` +regularity via the space-time chart. + +**Proof plan (atoms scouted + verified, 2026-06-16):** +1. **Forward chart `Ξ : (s,z) ↦ (s, Ξ¦_s z)` is `ContDiffAt ℝ 1` at each + `(sβ‚€,zβ‚€) ∈ Ioo 0 T Γ—Λ’ univ`.** + `Ξ¦ := (charXΒ·, charVΒ·)` is jointly `CΒΉ` (`charFlow_hasFDerivAt_joint`, item (iii) β€” `βˆƒ DΞ¦`, + `HasFDerivAt`-everywhere + `ContinuousOn DΞ¦`); lift to `ContDiffAt ℝ 1 Ξ¦` via + `contDiffAt_succ_iff_hasFDerivAt` (`Mathlib/.../ContDiff/Defs.lean:994`, `n := 0`: feed `DΞ¦`, the + open nbhd `U ∈ 𝓝`, `HasFDerivAt`-on-`U`, and `ContDiffAt 0 DΞ¦` from `contDiffAt_zero` + + `ContinuousOn DΞ¦ U`). `Ξ = (fst, Ξ¦)` so `ContDiffAt ℝ 1 Ξ` via `ContDiffAt.prod` with + `contDiffAt_fst`. +2. **`DΞ(sβ‚€,zβ‚€)` is an invertible `≃L`.** Block-lower-triangular `(h,k) ↦ (h, hβ€’b + MΒ·k)` with + `b := b_{sβ‚€}(Ξ¦_{sβ‚€}zβ‚€)`, `M := M_{sβ‚€}zβ‚€` invertible (Step 2's `eβ‚€ zβ‚€`). Build the `ℝ×E ≃L ℝ×E` + via `ContinuousLinearEquiv.ofBijective` (inject: `(h,k)↦0 β‡’ h=0`, then `M k=0 β‡’ k=0`; finite-dim + `LinearMap.injective_iff_surjective`). `HasStrictFDerivAt Ξ (this ≃L) (sβ‚€,zβ‚€)` via + `ContDiffAt.hasStrictFDerivAt'`. +3. **Local `CΒΉ` inverse + patch.** `ContDiffAt.to_localInverse` + (`Mathlib/.../InverseFunctionTheorem/ContDiff.lean:66`) β‡’ `Ξ.localInverse` is `ContDiffAt ℝ 1` at + `Ξ(sβ‚€,zβ‚€) = (sβ‚€, Ξ¦_{sβ‚€}zβ‚€)`. The global `(s,w)↦(s, Ξ¨_s w)` agrees with + `Ξ.localInverse` on a nbhd + (both left-inverses; `Ξ` injective on `Ioo 0 T Γ—Λ’ univ` since `s` is preserved + each `Ξ¦_s` + injective per Step 2) β‡’ `ContDiffAt.congr` β‡’ `(s,w)↦(s,Ξ¨_s w)` is `ContDiffAt ℝ 1` at each point + β‡’ `ContDiffOn ℝ 1` (projecting off the `s` component, `ContDiffAt.snd`). +4. **Bijectivity** is the per-slice `LeftInverse`/`RightInverse` from `exists_charFlow_inverse_On`, + packaged into the `s`-indexed `Ξ¨`. +The two-time flow `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¨_s` is then jointly `CΒΉ` by composing with `Ξ¦_t` (`CΒΉ` in its +argument, `#3`), and the dual core's transport identity differentiates it. -/ +theorem charFlow_inverse_contDiffOn_joint + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (T : ℝ) (hT : 0 < T) + (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) + (hcontIcc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : + βˆƒ Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d, + (βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + Function.LeftInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) ∧ + (βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + Function.RightInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) ∧ + ContDiffOn ℝ 1 (fun p : ℝ Γ— PhaseSpace d => Ξ¨ p.1 p.2) (Set.Ioo 0 T Γ—Λ’ Set.univ) := by + classical + obtain ⟨DΞ¦, hFDeriv, -⟩ := charFlow_hasFDerivAt_joint gradW hgradW_C1 L hL ρ charX charV T hT + hflow h_int hf_cont hρD_cont hcontIcc + have hΞ¦_cda := charFlow_contDiffAt_joint gradW hgradW_C1 L hL ρ charX charV T hT + hflow h_int hf_cont hρD_cont hcontIcc + have hstep2 := exists_charFlow_inverse_On gradW hgradW_C1 L hL ρ charX charV T hT + hflow h_int hρD_cont hcontIcc + have hbij : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + Function.Bijective (fun z => ((charX s z, charV s z) : PhaseSpace d)) := by + intro s hs + obtain ⟨Ψ', e, _, hL', hR', _, _⟩ := hstep2 s hs + exact ⟨hL'.injective, hR'.surjective⟩ + set Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d := + fun s => Function.invFun (fun z => (charX s z, charV s z)) with hΞ¨_def + have hLeft : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + Function.LeftInverse (Ξ¨ s) (fun z => (charX s z, charV s z)) := + fun s hs => Function.leftInverse_invFun (hbij s hs).1 + have hRight : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + Function.RightInverse (Ξ¨ s) (fun z => (charX s z, charV s z)) := + fun s hs => Function.rightInverse_invFun (hbij s hs).2 + refine ⟨Ψ, hLeft, hRight, ?_⟩ + set Ξ : ℝ Γ— PhaseSpace d β†’ ℝ Γ— PhaseSpace d := + fun x => (x.1, (charX x.1 x.2, charV x.1 x.2)) with hΞ_def + intro pt hpt + obtain ⟨hsβ‚€, -⟩ := hpt + obtain ⟨Ψ', e, he_deriv, -, -, -, -⟩ := hstep2 pt.1 hsβ‚€ + set zβ‚€ : PhaseSpace d := Ξ¨ pt.1 pt.2 with hzβ‚€_def + have hΞ¦zβ‚€ : (charX pt.1 zβ‚€, charV pt.1 zβ‚€) = pt.2 := hRight pt.1 hsβ‚€ pt.2 + have hΞ_cda : ContDiffAt ℝ 1 Ξ (pt.1, zβ‚€) := + contDiffAt_fst.prodMk (hΞ¦_cda (pt.1, zβ‚€) ⟨hsβ‚€, Set.mem_univ _⟩) + set DΞ : (ℝ Γ— PhaseSpace d) β†’L[ℝ] (ℝ Γ— PhaseSpace d) := + (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).prod (DΞ¦ (pt.1, zβ‚€)) with hDΞ_def + have hΞ_hd : HasFDerivAt Ξ DΞ (pt.1, zβ‚€) := + (hasFDerivAt_fst).prodMk (hFDeriv (pt.1, zβ‚€) ⟨hsβ‚€, Set.mem_univ _⟩) + have hincl : HasFDerivAt (fun z : PhaseSpace d => ((pt.1, z) : ℝ Γ— PhaseSpace d)) + ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d))) zβ‚€ := + (hasFDerivAt_const (pt.1 : ℝ) zβ‚€).prodMk (hasFDerivAt_id zβ‚€) + have hslice : HasFDerivAt (fun z => (charX pt.1 z, charV pt.1 z)) + ((DΞ¦ (pt.1, zβ‚€)).comp + ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d)))) zβ‚€ := + (hFDeriv (pt.1, zβ‚€) ⟨hsβ‚€, Set.mem_univ _⟩).comp zβ‚€ hincl + have hcomp_eq : (DΞ¦ (pt.1, zβ‚€)).comp + ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d))) + = (e zβ‚€ : PhaseSpace d β†’L[ℝ] PhaseSpace d) := + hslice.unique (he_deriv zβ‚€) + have hslice_app : βˆ€ k : PhaseSpace d, + DΞ¦ (pt.1, zβ‚€) ((0 : ℝ), k) = (e zβ‚€ : PhaseSpace d β†’L[ℝ] PhaseSpace d) k := by + intro k + have h1 : ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d))) k + = ((0 : ℝ), k) := by simp + rw [← h1, ← ContinuousLinearMap.comp_apply, hcomp_eq] + have hker : LinearMap.ker (DΞ : (ℝ Γ— PhaseSpace d) β†’β‚—[ℝ] (ℝ Γ— PhaseSpace d)) = βŠ₯ := by + refine LinearMap.ker_eq_bot'.mpr (fun x hx => ?_) + have hxapp : (x.1, DΞ¦ (pt.1, zβ‚€) x) = ((0 : ℝ), (0 : PhaseSpace d)) := by + have : DΞ x = ((0 : ℝ), (0 : PhaseSpace d)) := hx + simpa [hDΞ_def, ContinuousLinearMap.prod_apply] using this + have hx1 : x.1 = 0 := (Prod.ext_iff.mp hxapp).1 + have hx2 : DΞ¦ (pt.1, zβ‚€) x = 0 := (Prod.ext_iff.mp hxapp).2 + have hxz : x = ((0 : ℝ), x.2) := Prod.ext hx1 rfl + have hez : (e zβ‚€ : PhaseSpace d β†’L[ℝ] PhaseSpace d) x.2 = 0 := by + rw [← hslice_app x.2, ← hxz]; exact hx2 + have : x.2 = 0 := by + have hinj := (e zβ‚€).injective + have : (e zβ‚€) x.2 = (e zβ‚€) 0 := by rw [map_zero]; exact_mod_cast hez + exact hinj this + exact Prod.ext hx1 this + have hrange : LinearMap.range (DΞ : (ℝ Γ— PhaseSpace d) β†’β‚—[ℝ] (ℝ Γ— PhaseSpace d)) = ⊀ := + LinearMap.range_eq_top.mpr + (LinearMap.injective_iff_surjective.mp (LinearMap.ker_eq_bot.mp hker)) + set eΞ : (ℝ Γ— PhaseSpace d) ≃L[ℝ] (ℝ Γ— PhaseSpace d) := + ContinuousLinearEquiv.ofBijective DΞ hker hrange with heΞ_def + have hΞ_hd' : HasFDerivAt Ξ (eΞ : (ℝ Γ— PhaseSpace d) β†’L[ℝ] (ℝ Γ— PhaseSpace d)) (pt.1, zβ‚€) := + hΞ_hd + have hlocinv : ContDiffAt ℝ 1 (hΞ_cda.localInverse hΞ_hd' one_ne_zero) (Ξ (pt.1, zβ‚€)) := + hΞ_cda.to_localInverse hΞ_hd' one_ne_zero + have hstrict := hΞ_cda.hasStrictFDerivAt' hΞ_hd' (one_ne_zero) + have hloc : βˆ€αΆ  x in 𝓝 ((pt.1, zβ‚€) : ℝ Γ— PhaseSpace d), + ((fun y : ℝ Γ— PhaseSpace d => ((y.1, Ξ¨ y.1 y.2) : ℝ Γ— PhaseSpace d)) (Ξ x)) = x := by + have hIoo : βˆ€αΆ  x in 𝓝 ((pt.1, zβ‚€) : ℝ Γ— PhaseSpace d), x.1 ∈ Set.Ioo (0 : ℝ) T := + continuous_fst.continuousAt.eventually_mem (isOpen_Ioo.mem_nhds hsβ‚€) + filter_upwards [hIoo] with x hx + have hL2 : Ξ¨ x.1 (charX x.1 x.2, charV x.1 x.2) = x.2 := hLeft x.1 hx x.2 + simp only [hΞ_def] + rw [hL2] + have huniq : βˆ€αΆ  y in 𝓝 (Ξ (pt.1, zβ‚€)), + ((y.1, Ξ¨ y.1 y.2) : ℝ Γ— PhaseSpace d) = (hΞ_cda.localInverse hΞ_hd' one_ne_zero) y := + hstrict.localInverse_unique hloc + have hΞeq : Ξ (pt.1, zβ‚€) = (pt.1, pt.2) := by rw [hΞ_def]; exact Prod.ext rfl hΞ¦zβ‚€ + have hG_cda : ContDiffAt ℝ 1 + (fun y : ℝ Γ— PhaseSpace d => ((y.1, Ξ¨ y.1 y.2) : ℝ Γ— PhaseSpace d)) (pt.1, pt.2) := by + rw [← hΞeq] + exact hlocinv.congr_of_eventuallyEq huniq + have hpt_eq : pt = (pt.1, pt.2) := rfl + rw [hpt_eq] + exact (hG_cda.snd).contDiffWithinAt + +/-! ### Step 4 β€” the transported test function and the transport identity + +The dual core's `s ↦ ∫ ψ_s d(f s)` argument rests on the backward-transported test +`ψ_s := Ο† ∘ Ξ¦_{sβ†’t}` where `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹` is the two-time flow (Step 3 gave it jointly +`CΒΉ`). Two deliverables, both taking the *outputs* of Step 3 (the inverse `Ξ¨` + the `CΒΉ` terminal +map `Ξ¦_t`) as hypotheses rather than re-deriving them from the flow-construction data: -/ + +omit [NeZero d] in +/-- **Step 4 (4a) β€” the two-time flow `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹` is jointly `CΒΉ`** on +`Ioo 0 T Γ—Λ’ univ`. + +The two-time flow `(s,w) ↦ (charX t (Ξ¨_s w), charV t (Ξ¨_s w))` is the composition of the terminal +map `Ξ¦_t = (charX t Β·, charV t Β·)` (`CΒΉ` in its argument β€” `hΞ¦t_C1`, from Step 2 / item (iii) at the +fixed time `t`) with the jointly-`CΒΉ` inverse family `(s,w) ↦ Ξ¨_s w` (`hΞ¨_C1`, item (iv)). Proof: +`ContDiff.comp_contDiffOn`. -/ +theorem twoTimeFlow_contDiffOn_joint + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T t : ℝ) + (Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d) + (hΞ¨_C1 : ContDiffOn ℝ 1 (fun p : ℝ Γ— PhaseSpace d => Ξ¨ p.1 p.2) + (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ)) + (hΞ¦t_C1 : ContDiff ℝ 1 (fun z : PhaseSpace d => (charX t z, charV t z))) : + ContDiffOn ℝ 1 + (fun p : ℝ Γ— PhaseSpace d => ((charX t (Ξ¨ p.1 p.2), charV t (Ξ¨ p.1 p.2)) : PhaseSpace d)) + (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := + hΞ¦t_C1.comp_contDiffOn hΞ¨_C1 + +omit [NeZero d] in +/-- **Step 4 (4b) β€” the transport identity `βˆ‚_s ψ_s + Dψ_s Β· b_s = 0`.** + +For the backward-transported test `ψ_s(w) := Ο†(Ξ¦_t(Ξ¨_s w)) = Ο†(Ξ¦_{sβ†’t} w)`, the partial +`s`-derivative cancels the spatial directional derivative along the field: +`βˆ‚_s ψ_s(w) = -(Dψ_s(w))(b_s(w))`, where `b_s = vlasovVectorField gradW ρ s` and +`Dψ_s(w) = fderiv ℝ (ψ s) w`. This is the dual of `vlasov_traj_chain_rule` (the pushforward +direction) and the engine that makes `s ↦ ∫ ψ_s d(f s)` constant in Step 6. + +Proof: +* `ψ` is jointly `CΒΉ` on `Ioo 0 T Γ—Λ’ univ` (4a + `Ο†` smooth), so `HasFDerivAt (uncurry ψ) Dψ (s,w)` + at the interior point `(s,w)`, with `Dψ` the joint FrΓ©chet derivative. +* Constancy curve: set `zβ‚€ := Ξ¨_s w`, so `w = Ξ¦_s zβ‚€` (`hΞ¨_right`). The composite + `s' ↦ ψ_{s'}(Ξ¦_{s'} zβ‚€) = Ο†(Ξ¦_t(Ξ¨_{s'}(Ξ¦_{s'} zβ‚€))) = Ο†(Ξ¦_t zβ‚€)` is **constant** in `s'` + (`hΞ¨_left`: `Ξ¨_{s'} ∘ Ξ¦_{s'} = id`), hence has zero `s'`-derivative. +* The curve `c(s') := (s', Ξ¦_{s'} zβ‚€)` has `HasDerivAt c (1, b_s w) s` (`hflow_ode` + `id`), with + `c(s) = (s, w)`. Chain rule: `0 = Dψ(s,w)(1, b_s w) = Dψ(s,w)(1,0) + Dψ(s,w)(0, b_s w)`. +* `Dψ(s,w)(1,0) = βˆ‚_s ψ_s(w)` (compose `uncurry ψ` with `s' ↦ (s', w)`) and + `Dψ(s,w)(0,k) = (fderiv ℝ (ψ s) w) k` (compose with `w' ↦ (s, w')`). Surjectivity (`hΞ¨_right`) + covers every `w`. Rearrange to the claimed `HasDerivAt`. -/ +theorem transportedTest_transport_identity + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T t : ℝ) + (Ο† : PhaseSpace d β†’ ℝ) (hΟ† : ContDiff ℝ (⊀ : β„•βˆž) Ο†) + (Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d) + (hΞ¨_left : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + Function.LeftInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) + (hΞ¨_right : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + Function.RightInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) + (hΞ¨_C1 : ContDiffOn ℝ 1 (fun p : ℝ Γ— PhaseSpace d => Ξ¨ p.1 p.2) + (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ)) + (hΞ¦t_C1 : ContDiff ℝ 1 (fun z : PhaseSpace d => (charX t z, charV t z))) + (hflow_ode : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, + HasDerivAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) s) + (s : ℝ) (hs : s ∈ Set.Ioo (0 : ℝ) T) (w : PhaseSpace d) : + HasDerivAt (fun s' => Ο† (charX t (Ξ¨ s' w), charV t (Ξ¨ s' w))) + (-(fderiv ℝ (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) w + (vlasovVectorField gradW ρ s w))) s := by + classical + -- uncurried two-time flow and transported test + set G2 : ℝ Γ— PhaseSpace d β†’ PhaseSpace d := + fun p => (charX t (Ξ¨ p.1 p.2), charV t (Ξ¨ p.1 p.2)) with hG2_def + set g : ℝ Γ— PhaseSpace d β†’ ℝ := fun p => Ο† (G2 p) with hg_def + have hopen : IsOpen (Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := + isOpen_Ioo.prod isOpen_univ + have hmem : ((s, w) : ℝ Γ— PhaseSpace d) ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)) := + ⟨hs, Set.mem_univ _⟩ + -- right-inverse identity: Ξ¦_s (Ξ¨_s w) = w + have hw : (charX s (Ξ¨ s w), charV s (Ξ¨ s w)) = w := hΞ¨_right s hs w + -- g is jointly CΒΉ, hence HasFDerivAt at the interior point (s,w) + have hG2_cd : ContDiffOn ℝ 1 G2 (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := + twoTimeFlow_contDiffOn_joint charX charV T t Ξ¨ hΞ¨_C1 hΞ¦t_C1 + have hG2_diff : DifferentiableAt ℝ G2 (s, w) := + hG2_cd.differentiableOn_one.differentiableAt (hopen.mem_nhds hmem) + have hΟ†_diff : DifferentiableAt ℝ Ο† (G2 (s, w)) := hΟ†.differentiable (by simp) _ + have hg_fderiv : HasFDerivAt g (fderiv ℝ g (s, w)) (s, w) := + (hΟ†_diff.comp (s, w) hG2_diff).hasFDerivAt + set G := fderiv ℝ g (s, w) with hG_def + -- (A) spatial slice w' ↦ g (s, w') : fderiv = G ∘ inr + have hslice_fderiv : HasFDerivAt (fun w' : PhaseSpace d => g (s, w')) + (G.comp (ContinuousLinearMap.inr ℝ ℝ (PhaseSpace d))) w := by + have := hg_fderiv.comp w (hasFDerivAt_prodMk_right s w) + simpa only [Function.comp_def] using this + -- (B) βˆ‚_s slice s' ↦ g (s', w) : HasDerivAt with value G (1, 0) + have hscurve : HasDerivAt (fun s' => ((s', w) : ℝ Γ— PhaseSpace d)) + ((1 : ℝ), (0 : PhaseSpace d)) s := + (hasDerivAt_id s).prodMk (hasDerivAt_const s w) + have hs_slice : HasDerivAt (fun s' => g (s', w)) (G ((1 : ℝ), (0 : PhaseSpace d))) s := by + have := hg_fderiv.comp_hasDerivAt s hscurve + simpa only [Function.comp_def] using this + -- (C) constancy curve c(s') = (s', Ξ¦_{s'} (Ξ¨_s w)); chain rule gives G(1, b) + have hccurve : HasDerivAt + (fun s' => ((s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w))) : ℝ Γ— PhaseSpace d)) + ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) s := + (hasDerivAt_id s).prodMk (hflow_ode (Ξ¨ s w) s hs) + have hcs : ((s, (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) : ℝ Γ— PhaseSpace d) = (s, w) := by rw [hw] + have hgc : HasDerivAt (fun s' => g (s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w)))) + (G ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w)))) s := by + have hF := hg_fderiv + rw [← hcs] at hF + have := hF.comp_hasDerivAt s hccurve + simpa only [Function.comp_def] using this + -- (D) the composite is eventually constant near s, so its derivative is 0 + have hconst : (fun s' => g (s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w)))) =αΆ [nhds s] + (fun _ => Ο† (charX t (Ξ¨ s w), charV t (Ξ¨ s w))) := by + filter_upwards [isOpen_Ioo.mem_nhds hs] with s' hs' + simp only [hg_def, hG2_def] + rw [hΞ¨_left s' hs' (Ξ¨ s w)] + have hgc0 : HasDerivAt (fun s' => g (s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w)))) 0 s := + (hasDerivAt_const s (Ο† (charX t (Ξ¨ s w), charV t (Ξ¨ s w)))).congr_of_eventuallyEq hconst + -- (E) uniqueness: G (1, b) = 0 + have hGzero : G ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) = 0 := + hgc.unique hgc0 + -- (F) split G(1,b) = G(1,0) + G(0,b); identify G(0,b) with the target fderiv applied to b + have hsplit : ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) + = ((1 : ℝ), (0 : PhaseSpace d)) + + ((0 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) := by + ext <;> simp + have hb_eq : vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w)) + = vlasovVectorField gradW ρ s w := by rw [hw] + have hG0b : G ((0 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) + = (fderiv ℝ (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) w) + (vlasovVectorField gradW ρ s w) := by + have hfd : fderiv ℝ (fun w' : PhaseSpace d => g (s, w')) w + = G.comp (ContinuousLinearMap.inr ℝ ℝ (PhaseSpace d)) := hslice_fderiv.fderiv + have hfun : (fun w' : PhaseSpace d => g (s, w')) + = (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) := rfl + rw [hfun] at hfd + rw [hfd, ContinuousLinearMap.comp_apply, ContinuousLinearMap.inr_apply, hb_eq] + -- (G) G(1,0) = -(target fderiv)(b) + have hval : G ((1 : ℝ), (0 : PhaseSpace d)) + = -(fderiv ℝ (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) w) + (vlasovVectorField gradW ρ s w) := by + have hsum : G ((1 : ℝ), (0 : PhaseSpace d)) + + G ((0 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) = 0 := by + rw [← map_add, ← hsplit]; exact hGzero + rw [hG0b] at hsum + linarith [hsum] + -- (H) conclude + have hgoalfun : (fun s' => Ο† (charX t (Ξ¨ s' w), charV t (Ξ¨ s' w))) + = (fun s' => g (s', w)) := rfl + rw [hgoalfun, ← hval] + exact hs_slice + + +end Vlasov diff --git a/LeanPool/Vlasov/OT/FrozenField.lean b/LeanPool/Vlasov/OT/FrozenField.lean new file mode 100644 index 0000000000..188b698ca6 --- /dev/null +++ b/LeanPool/Vlasov/OT/FrozenField.lean @@ -0,0 +1,594 @@ +/- +Copyright (c) 2026 Joseph K. Miller. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph K. Miller +-/ +module + + +public import Mathlib.Analysis.Calculus.BumpFunction.FiniteDimension +public import LeanPool.Vlasov.OT.CharacteristicFlow +public import Mathlib.Analysis.Calculus.BumpFunction.Normed +import Mathlib.Algebra.Order.Ring.Star +import Mathlib.Analysis.Calculus.Deriv.MeanValue +import Mathlib.Analysis.Calculus.Deriv.Prod +import Mathlib.Analysis.Calculus.BumpFunction.Convolution +import Mathlib.MeasureTheory.Integral.RieszMarkovKakutani.Real + +/-! +# Frozen-field weak solutions and convolution derivatives + +The linear weak equation, frozen-flow existence, and differentiation of the convolution +field support the weak-to-Lagrangian argument without its transported-test machinery. +-/ + +@[expose] public section + +namespace Vlasov + +open MeasureTheory + +variable {d : β„•} [NeZero d] + +/-! ## Linear (external-field) weak Vlasov solutions + +The self-consistent weak predicate `IsVlasovSolutionOn` drives the convolution field by the +solution's *own* spatial marginal. For the superposition argument we need the **linear** +version, where the field is driven by an *external* (frozen) measure curve `ρ` β€” both the given +weak solution `f` (with `ρ := spatialMarginal ∘ f`) and the pushforward `g` along the +frozen-field flow solve the *same* `IsLinearVlasovSolutionOn gradW ρ Β· T`, and uniqueness for it +(the crux, C3) forces `f = g`. -/ + +/-- Linear weak Vlasov evolution on `Ioo 0 T` for a test function `Ο†`, with the convolution field +driven by an **external** measure curve `ρ` (frozen), not the solution's own spatial marginal. +The self-consistent `WeakEvolutionEqOn gradW ΞΌ Ο† … (fun _ => 0) T` is the special case +`ρ = spatialMarginal ∘ ΞΌ` (modulo the `+ 0` remainder term). -/ +def LinearWeakEvolutionEqOn + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) + (Ο† : PhaseSpace d β†’ ℝ) + (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) + (T : ℝ) : Prop := + βˆ€ t ∈ Set.Ioo (0 : ℝ) T, + HasDerivAt (fun s => ∫ z, Ο† z βˆ‚ΞΌ s) + (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - + @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ t) z.1) + (gradVΟ† z)) + βˆ‚ΞΌ t) t + +/-- A measure curve `ΞΌ` solves the **linear** Vlasov equation on `[0,T]` driven by the external +field `ρ`: the distributional identity `LinearWeakEvolutionEqOn` holds for every `C_c^∞` test +function. Mirror of `IsVlasovSolutionOn` with the field externalized. -/ +def IsLinearVlasovSolutionOn + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) : Prop := + βˆ€ (Ο† : PhaseSpace d β†’ ℝ), + ContDiff ℝ (⊀ : β„•βˆž) Ο† β†’ HasCompactSupport Ο† β†’ + βˆ€ (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d), + (βˆ€ z, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) β†’ + (βˆ€ z, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) β†’ + LinearWeakEvolutionEqOn gradW ρ ΞΌ Ο† gradXΟ† gradVΟ† T + +omit [NeZero d] in +/-- A self-consistent weak solution is a linear solution driven by its **own** spatial marginal. +The two differ only by `WeakEvolutionEqOn`'s `+ (fun _ => 0) t = + 0` remainder. -/ +lemma IsVlasovSolutionOn.toLinearSelf + {gradW : PhysSpace d β†’ PhysSpace d} {f : ℝ β†’ Measure (PhaseSpace d)} {T : ℝ} + (h : IsVlasovSolutionOn gradW f T) : + IsLinearVlasovSolutionOn gradW (fun t => spatialMarginal (f t)) f T := by + intro Ο† hΟ† hΟ†c gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht + simpa using h Ο† hΟ† hΟ†c gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht + +omit [NeZero d] in +/-- **C1 #1 β€” pushforward solves the frozen linear weak equation.** + +For a characteristic flow `(charX, charV)` solving the ODE with an **external** field `ρ` on +`Ioo 0 T`, the pushforward `g := (charX t, charV t)_# fβ‚€` solves the linear Vlasov equation +driven by that same `ρ`. Proof: the generic SC.1–SC.3 machinery (change of variables + +chain rule + differentiation-under-the-integral, all parametric in `ρ`) recomposed at this `ρ`, +with SC.4's push-back inlined as `integral_map` (SC.4's packaged form hard-codes the +self-consistent marginal). This is `vlasovSolutionViaPushforward_isVlasovSolutionOn` with `ρ` +left free β€” the `_hself` self-consistency hypothesis is unused. -/ +theorem vlasov_frozenField_pushforward_isLinearVlasovSolutionOn + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_fm : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (hflow_on : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) + (h_cont_Icc : βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) + (h_deriv_Ico : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, + HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s) + (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) + (hM_ρ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(ρ s) ≀ M_ρ) + (h_y_int : βˆ€ s ∈ Set.Icc (0 : ℝ) T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ s)) + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (h_flow_meas : βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) + (hgradW_cont : Continuous gradW) + (hconv_cont : βˆ€ s, Continuous (fun x => convolveFunctionMeasure gradW (ρ s) x)) : + IsLinearVlasovSolutionOn gradW ρ (vlasovSolutionViaPushforward charX charV fβ‚€) T := by + intro Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht + have hΟ†_cont : Continuous Ο† := hΟ†_smooth.continuous + have hΟ†_aesm_general : βˆ€ ΞΌ : Measure (PhaseSpace d), AEStronglyMeasurable Ο† ΞΌ := + fun ΞΌ => hΟ†_cont.aestronglyMeasurable + -- SC.1: ∫ Ο† d(pushforward s) = ∫ (Ο† ∘ flow_s) dfβ‚€. + have h_compose : βˆ€ s, ∫ z, Ο† z βˆ‚(vlasovSolutionViaPushforward charX charV fβ‚€ s) = + ∫ z, Ο† (charX s z, charV s z) βˆ‚fβ‚€ := fun s => + vlasov_pushforward_integral_eq_compose charX charV fβ‚€ s (h_flow_meas s) Ο† (hΟ†_aesm_general _) + -- SC.2 `_at`: pointwise chain rule at every z, at this t. + have h_pointwise : βˆ€ z, HasDerivAt (fun s => Ο† (charX s z, charV s z)) + (@inner ℝ (PhysSpace d) _ (charV t z) (gradXΟ† (charX t z, charV t z)) + - @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ t) (charX t z)) + (gradVΟ† (charX t z, charV t z))) t := by + intro z + have hX_at := hflow_on.2.1 t ht z (Set.mem_univ z) + have hV_at := hflow_on.2.2 t ht z (Set.mem_univ z) + exact vlasov_traj_chain_rule_at gradW ρ charX charV Ο† hΟ†_smooth + gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t z hX_at hV_at + -- SC.3: differentiation under the integral via the DiffUnderIntegralData bundle. + have h_diff_data : DiffUnderIntegralData gradW ρ charX charV fβ‚€ Ο† gradXΟ† gradVΟ† t := by + obtain ⟨nhd, bound, hnhd, h_lipsch, h_bound_int⟩ := + vlasov_trajectory_lipschitz_bound_on gradW L hL ρ charX charV fβ‚€ + hfβ‚€_fm Ο† hΟ†_smooth hΟ†_compact hT hflow_on h_init h_cont_Icc h_deriv_Ico + hgradW_cont hconv_cont t ht M_ρ hM_ρ_nn hM_ρ h_y_int h_int + refine ⟨nhd, bound, hnhd, ?_, ?_, ?_, h_lipsch, h_bound_int⟩ + Β· exact vlasov_compose_flow_aestronglymeas charX charV fβ‚€ Ο† hΟ†_cont h_flow_meas t + Β· exact vlasov_compose_flow_integrable_at charX charV fβ‚€ Ο† hΟ†_cont hΟ†_compact t (h_flow_meas t) + Β· exact vlasov_pointwise_deriv_aestronglymeas gradW ρ charX charV fβ‚€ + Ο† hΟ†_smooth gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† hconv_cont t (h_flow_meas t) + have h_under_integral := + vlasov_pushforward_hasDerivAt_under_integral gradW ρ charX charV fβ‚€ + Ο† gradXΟ† gradVΟ† t h_pointwise h_diff_data + -- SC.4 (inlined; the packaged form hard-codes the self-consistent marginal): AE-strong-meas + -- of the dot-product integrand, then push back through `integral_map`. + have h_integrand_aesm : AEStronglyMeasurable + (fun y : PhaseSpace d => + @inner ℝ (PhysSpace d) _ y.2 (gradXΟ† y) + - @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (ρ t) y.1) (gradVΟ† y)) + (vlasovSolutionViaPushforward charX charV fβ‚€ t) := by + apply Continuous.aestronglyMeasurable + apply Continuous.sub + Β· apply Continuous.inner continuous_snd + have hfderiv_X : βˆ€ z : PhaseSpace d, + fderiv ℝ (fun x => Ο† (x, z.2)) z.1 = + (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := + fun z => by + have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := + (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt + have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := + hasFDerivAt_prodMk_left z.1 z.2 + exact (h1.comp z.1 h2).fderiv + have heqX : gradXΟ† = fun z => gradient (fun x => Ο† (x, z.2)) z.1 := funext hgradXΟ† + simp_rw [heqX, gradient, hfderiv_X] + exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp + ((ContinuousLinearMap.isBoundedLinearMap_comp_right + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))).continuous.comp + (hΟ†_smooth.continuous_fderiv (by simp))) + Β· apply Continuous.inner + Β· exact (hconv_cont t).comp continuous_fst + Β· have hfderiv_V : βˆ€ z : PhaseSpace d, + fderiv ℝ (fun v => Ο† (z.1, v)) z.2 = + (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := + fun z => by + have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := + (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt + have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := + hasFDerivAt_prodMk_right z.1 z.2 + exact (h1.comp z.2 h2).fderiv + have heqV : gradVΟ† = fun z => gradient (fun v => Ο† (z.1, v)) z.2 := funext hgradVΟ† + simp_rw [heqV, gradient, hfderiv_V] + exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp + ((ContinuousLinearMap.isBoundedLinearMap_comp_right + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))).continuous.comp + (hΟ†_smooth.continuous_fderiv (by simp))) + -- Assemble: rewrite LHS via SC.1; push the derivative integral back through `integral_map`. + have hLHS : (fun s => ∫ z, Ο† z βˆ‚(vlasovSolutionViaPushforward charX charV fβ‚€ s)) = + (fun s => ∫ z, Ο† (charX s z, charV s z) βˆ‚fβ‚€) := funext h_compose + have h_map_eq : + ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) + - @inner ℝ (PhysSpace d) _ (convolveFunctionMeasure gradW (ρ t) z.1) (gradVΟ† z)) + βˆ‚(vlasovSolutionViaPushforward charX charV fβ‚€ t) + = ∫ z, (@inner ℝ (PhysSpace d) _ (charV t z) (gradXΟ† (charX t z, charV t z)) + - @inner ℝ (PhysSpace d) _ (convolveFunctionMeasure gradW (ρ t) (charX t z)) + (gradVΟ† (charX t z, charV t z))) + βˆ‚fβ‚€ := by + unfold vlasovSolutionViaPushforward at h_integrand_aesm ⊒ + exact integral_map (h_flow_meas t) h_integrand_aesm + rw [hLHS, h_map_eq] + exact h_under_integral + +omit [NeZero d] in +/-- **C1 #2 β€” characteristic flow for a frozen field from window data (L11 clamp).** + +Build the characteristic flow for the *given* external curve `ρ` on `Ioo 0 T` (with boundary +regularity), from probability/moment/integrability/continuity data on the window `[0,T]` only. +`exists_vlasov_characteristicFlow_global_smallT` demands *universal*-in-`t` instances; we clamp +`t ↦ ρ (max 0 (min t T))` into the window (L11), apply the universal producer to the clamped +curve, and transfer on `[0,T]` where the clamp is the identity. -/ +theorem exists_frozenField_charFlow_On + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (T : ℝ) (hT : 0 < T) (hTL_PL : LocalSmallnessPLBuffer L T) + (hρ_prob : βˆ€ t ∈ Set.Icc (0 : ℝ) T, IsProbabilityMeasure (ρ t)) + (h_int : βˆ€ t ∈ Set.Icc (0 : ℝ) T, βˆ€ (x : PhysSpace d), + Integrable (fun y => gradW (x - y)) (ρ t)) + (hρ_cont : βˆ€ x : PhysSpace d, + ContinuousOn (fun t => convolveFunctionMeasure gradW (ρ t) x) (Set.Icc (0 : ℝ) T)) + (h_y_int : βˆ€ t ∈ Set.Icc (0 : ℝ) T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) + (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) + (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ M_ρ) : + βˆƒ charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d, + IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ ∧ + (βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) ∧ + (βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) ∧ + (βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, + HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) + (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s) := by + classical + -- L11 clamp: `clampT t ∈ [0,T]` for every `t`, and `clampT t = t` on `[0,T]`. + set clampT : ℝ β†’ ℝ := fun t => max 0 (min t T) with hclampT_def + have hclampT_mem : βˆ€ t, clampT t ∈ Set.Icc (0 : ℝ) T := by + intro t + simp only [hclampT_def, Set.mem_Icc] + exact ⟨le_max_left _ _, max_le hT.le (min_le_right _ _)⟩ + have hclampT_id : βˆ€ t ∈ Set.Icc (0 : ℝ) T, clampT t = t := by + intro t ht + simp only [hclampT_def, min_eq_left ht.2, max_eq_right ht.1] + have hclampT_cont : Continuous clampT := by + simp only [hclampT_def] + exact continuous_const.max (continuous_id.min continuous_const) + -- Clamped curve `ρ' := ρ ∘ clampT`, which satisfies the universal hypotheses. + set ρ' : ℝ β†’ Measure (PhysSpace d) := fun t => ρ (clampT t) with hρ'_def + have hρ'_prob : βˆ€ t, IsProbabilityMeasure (ρ' t) := + fun t => hρ_prob (clampT t) (hclampT_mem t) + have h_int' : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ' t) := + fun t x => h_int (clampT t) (hclampT_mem t) x + have h_y_int' : βˆ€ t, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ' t) := + fun t => h_y_int (clampT t) (hclampT_mem t) + have hM_ρ' : βˆ€ t, ∫ y, β€–yβ€– βˆ‚(ρ' t) ≀ M_ρ := fun t => hM_ρ (clampT t) (hclampT_mem t) + have hρ'_cont : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ' t) x) := + fun x => (hρ_cont x).comp_continuous hclampT_cont (fun t => hclampT_mem t) + -- Apply the universal producer to `ρ'`. + obtain ⟨charX, charV, hflow', h_bdry'⟩ := + exists_vlasov_characteristicFlow_global_smallT W gradW hgradW L hL ρ' + h_int' hρ'_cont h_y_int' M_ρ hM_ρ_nn hM_ρ' T hT.le hTL_PL + -- On `Ioo`/`Icc 0 T`, `clampT = id` so `ρ' = ρ`: transfer the flow back to `ρ`. + refine ⟨charX, charV, ⟨hflow'.1, hflow'.2.1, ?_⟩, ?_, ?_, ?_⟩ + Β· -- velocity ODE for `ρ` on `Ioo 0 T` + intro t ht z hz + have h := hflow'.2.2 t ht z hz + have hρeq : ρ' t = ρ t := by + simp only [hρ'_def, hclampT_id t (Set.Ioo_subset_Icc_self ht)] + rwa [hρeq] at h + Β· -- initial condition + intro z + have h := hflow'.1 z (Set.mem_univ z) + exact Prod.ext h.1 h.2 + Β· -- `ContinuousOn` on `Icc 0 T` from the producer's boundary derivatives + intro z t ht + obtain ⟨hX, hV⟩ := h_bdry' z t ht + exact (hX.prodMk hV).continuousWithinAt + Β· -- `h_deriv_Ico` (Ici-joint) from the producer's `Icc`-component derivatives + intro z s hs + have hsIcc : s ∈ Set.Icc (0 : ℝ) T := Set.Ico_subset_Icc_self hs + obtain ⟨hX, hV⟩ := h_bdry' z s hsIcc + have hρeq : ρ' s = ρ s := by simp only [hρ'_def, hclampT_id s hsIcc] + have hpair : HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) + (charV s z, -(convolveFunctionMeasure gradW (ρ' s) (charX s z))) + (Set.Icc 0 T) s := hX.prodMk hV + rw [hρeq] at hpair + -- convert the set `Icc 0 T` to `Ici s` (local subset near `s`, since `s < T`) + have hmem : Set.Iic ((s + T) / 2) ∈ nhds s := Iic_mem_nhds (by linarith [hs.2]) + have hsub : Set.Ici s ∩ Set.Iic ((s + T) / 2) βŠ† Set.Icc 0 T := by + rintro u ⟨hu1, hu2⟩ + exact ⟨le_trans hs.1 hu1, le_trans hu2 (by linarith [hs.2])⟩ + exact (hasDerivWithinAt_inter hmem).mp (hpair.mono hsub) + +/-! ## Final-step layer (crux-independent): constancy + measure extensionality -/ + +/-- **C2 #7 β€” constancy from a vanishing derivative.** + +If a real function is continuous on `[0,T]` and has zero derivative throughout the open +interval, its endpoint values agree. This is the dual argument's payoff step: `s ↦ ∫ ψ_s dΞΌ_s` +is constant, so its value at `T` (= `∫ Ο† dΞΌ_T`) equals its value at `0` (= `∫ ψ_0 dΞΌ_0`). Mean +value theorem (`exists_hasDerivAt_eq_slope`). -/ +lemma transportedIntegral_const_On {h : ℝ β†’ ℝ} {T : ℝ} (hT : 0 < T) + (hcont : ContinuousOn h (Set.Icc 0 T)) + (hderiv : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt h 0 s) : + h 0 = h T := by + obtain ⟨c, _hc, hc'⟩ := + exists_hasDerivAt_eq_slope h (fun _ => 0) hT hcont (fun s hs => hderiv s hs) + have hc0 : (0 : ℝ) = (h T - h 0) / (T - 0) := hc' + rcases div_eq_zero_iff.mp hc0.symm with h1 | h2 + Β· exact (sub_eq_zero.mp h1).symm + Β· exact absurd h2 (ne_of_gt (by linarith : (0 : ℝ) < T - 0)) + +omit [NeZero d] in +/-- **C2 #9 β€” `C_c^∞` test functions determine a finite measure.** + +If `∫ Ο† dΞΌ = ∫ Ο† dΞ½` for every smooth compactly-supported `Ο†`, then `ΞΌ = Ξ½` (finite measures on +phase space). The dual argument yields equality of integrals against the `IsVlasovSolution` test +class `C_c^∞`; this closes the bridge's final step `f T = g T`. Route: extend `C_c^∞ β†’` +bounded-continuous (smooth approximation), then the in-house bounded-continuous extensionality +`ext_of_forall_integral_eq_of_IsFiniteMeasure` (cf. `Wasserstein.lean`). -/ +lemma measure_eq_of_forall_Cc_integral_eq {ΞΌ Ξ½ : Measure (PhaseSpace d)} + [IsFiniteMeasure ΞΌ] [IsFiniteMeasure Ξ½] + (h : βˆ€ Ο† : PhaseSpace d β†’ ℝ, ContDiff ℝ (⊀ : β„•βˆž) Ο† β†’ HasCompactSupport Ο† β†’ + ∫ z, Ο† z βˆ‚ΞΌ = ∫ z, Ο† z βˆ‚Ξ½) : + ΞΌ = Ξ½ := by + -- Haar instance on the ambient volume via the product reduction. + have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by + rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from + Measure.volume_eq_prod _ _] + infer_instance + have hvolReg : (volume : Measure (PhaseSpace d)).Regular := + Measure.Regular.of_sigmaCompactSpace_of_isLocallyFiniteMeasure _ + have hΞΌreg : ΞΌ.Regular := inferInstance + have hΞ½reg : Ξ½.Regular := inferInstance + -- Reduce `ΞΌ = Ξ½` to equality of integrals against continuous compactly-supported `g`. + refine MeasureTheory.Measure.ext_of_integral_eq_on_compactlySupported (fun g => ?_) + set gf : PhaseSpace d β†’ ℝ := ⇑g with hgf + have hg_cont : Continuous gf := map_continuous g + have hg_cs : HasCompactSupport gf := CompactlySupportedContinuousMap.hasCompactSupport g + -- Uniform sup bound on `g`. + obtain ⟨C, hC⟩ := hg_cont.bounded_above_of_compact_support hg_cs + have hCnn : 0 ≀ C := le_trans (norm_nonneg _) (hC 0) + -- A mollifier family `Ο† n` with outer radius `2/(n+2) β†’ 0`. + set Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d) := + fun n => ⟨1 / (n + 2), 2 / (n + 2), by positivity, by + rw [div_lt_div_iff_of_pos_right (by positivity)]; norm_num⟩ with hΟ† + have hrout : βˆ€ n, (Ο† n).rOut = 2 / (n + 2) := fun n => rfl + have hrout_tendsto : Filter.Tendsto (fun n => (Ο† n).rOut) Filter.atTop (nhds 0) := by + simp only [hrout] + apply Filter.Tendsto.div_atTop (tendsto_const_nhds) + exact Filter.tendsto_atTop_add_const_right _ 2 tendsto_natCast_atTop_atTop + -- The mollified functions. + set gn : β„• β†’ PhaseSpace d β†’ ℝ := + fun n => convolution ((Ο† n).normed volume) gf (ContinuousLinearMap.lsmul ℝ ℝ) volume with hgn + -- Each `gn n` is `C^∞` with compact support, hence covered by the hypothesis `h`. + have hgn_smooth : βˆ€ n, ContDiff ℝ (⊀ : β„•βˆž) (gn n) := fun n => + ((Ο† n).hasCompactSupport_normed).contDiff_convolution_left _ + (Ο† n).contDiff_normed (hg_cont.locallyIntegrable) + have hgn_cs : βˆ€ n, HasCompactSupport (gn n) := fun n => + HasCompactSupport.convolution _ (Ο† n).hasCompactSupport_normed hg_cs + have hgn_eq : βˆ€ n, ∫ z, gn n z βˆ‚ΞΌ = ∫ z, gn n z βˆ‚Ξ½ := fun n => + h (gn n) (hgn_smooth n) (hgn_cs n) + -- Pointwise convergence `gn n β†’ gf` (continuous `g`, shrinking bumps). + have hgn_lim : βˆ€ x, Filter.Tendsto (fun n => gn n x) Filter.atTop (nhds (gf x)) := fun x => + ContDiffBump.convolution_tendsto_right_of_continuous hrout_tendsto hg_cont x + -- Uniform bound `β€–gn n xβ€– ≀ C` (averaging keeps the sup bound). + have hgn_bound : βˆ€ n, βˆ€ x, β€–gn n xβ€– ≀ C := by + intro n x + rw [hgn] + simp only + rw [convolution_lsmul] + calc β€–βˆ« t, (Ο† n).normed volume t β€’ gf (x - t) βˆ‚volumeβ€– + ≀ ∫ t, β€–(Ο† n).normed volume t β€’ gf (x - t)β€– βˆ‚volume := norm_integral_le_integral_norm _ + _ ≀ ∫ t, (Ο† n).normed volume t * C βˆ‚volume := by + apply integral_mono_of_nonneg + Β· exact Filter.Eventually.of_forall (fun t => norm_nonneg _) + Β· exact ((Ο† n).integrable_normed).mul_const C + Β· refine Filter.Eventually.of_forall (fun t => ?_) + simp only + rw [norm_smul, Real.norm_eq_abs, abs_of_nonneg ((Ο† n).nonneg_normed t)] + exact mul_le_mul_of_nonneg_left (hC _) ((Ο† n).nonneg_normed t) + _ = C := by rw [integral_mul_const, (Ο† n).integral_normed, one_mul] + -- DCT: `∫ gn n dΞΌ β†’ ∫ gf dΞΌ` and likewise for `Ξ½`. + have hconv_ΞΌ : Filter.Tendsto (fun n => ∫ z, gn n z βˆ‚ΞΌ) Filter.atTop (nhds (∫ z, gf z βˆ‚ΞΌ)) := by + apply tendsto_integral_of_dominated_convergence (fun _ => C) + Β· exact fun n => (hgn_smooth n).continuous.aestronglyMeasurable + Β· exact integrable_const C + Β· exact fun n => Filter.Eventually.of_forall (fun x => hgn_bound n x) + Β· exact Filter.Eventually.of_forall hgn_lim + have hconv_Ξ½ : Filter.Tendsto (fun n => ∫ z, gn n z βˆ‚Ξ½) Filter.atTop (nhds (∫ z, gf z βˆ‚Ξ½)) := by + apply tendsto_integral_of_dominated_convergence (fun _ => C) + Β· exact fun n => (hgn_smooth n).continuous.aestronglyMeasurable + Β· exact integrable_const C + Β· exact fun n => Filter.Eventually.of_forall (fun x => hgn_bound n x) + Β· exact Filter.Eventually.of_forall hgn_lim + -- The two limits coincide because the prelimit sequences are equal. + have hΞΌΞ½ : Filter.Tendsto (fun n => ∫ z, gn n z βˆ‚ΞΌ) Filter.atTop (nhds (∫ z, gf z βˆ‚Ξ½)) := by + simpa only [hgn_eq] using hconv_Ξ½ + exact tendsto_nhds_unique hconv_ΞΌ hΞΌΞ½ + +omit [NeZero d] in +/-- Convenience extractor: under `[AssW2 W]`, a gradient field `gradW= βˆ‡W` is `CΒΉ`. + +`AssW2.gradContDiff` gives `ContDiff ℝ 1 (fun x => fderiv ℝ W x)`; composing with the (smooth, +linear) Riesz isometry `gradient W x = (toDual ℝ _).symm (fderiv ℝ W x)` and rewriting by `hgradW` +yields `ContDiff ℝ 1 gradW`. -/ +lemma assW2_contDiff_gradW (W : PhysSpace d β†’ ℝ) [AssW2 W] + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW : βˆ€ x, gradW x = gradient W x) : + ContDiff ℝ 1 gradW := by + have heq : gradW = + fun x => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm (fderiv ℝ W x) := by + funext x; rw [hgradW]; rfl + rw [heq] + have hriesz : ContDiff ℝ 1 fun u => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm u := + (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.toContinuousLinearEquiv.contDiff + exact hriesz.comp β€ΉAssW2 Wβ€Ί.gradContDiff + +/-! ## Crux layer (C3): the variational equation and the dual-transport assembly + +The two interfaces below were the load-bearing pieces of the bridge β€” both now proven and +axiom-clean. `#3` was the genuine research gap (CΒΉ dependence of an ODE flow on its initial point +β€” absent from Mathlib), closed via route (b) (difference-quotient + Gronwall); `#8` is the +bridge-specific dual-transported-test-function assembly that consumes it. `#10` (the public +theorem) composes the reuse layer (`exists_frozenField_charFlow_On`, #2) with `#8`. + +The dual-argument *internals* `#4`/`#5`/`#6` (test-class enlargement `C_c^∞ β†’ CΒΉ_c`, the +transported test function `ψ_s = Ο† ∘ Ξ¦_{sβ†’t}` and its transport identity, and the zero-derivative +of `s ↦ ∫ ψ_s dΞΌ_s`) are realized against the two-time-flow representation `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹` +and proven below (`weakEvolution_test_C1c_On`, `transportedTest_transport_identity`, +`transportedIntegral_hasDerivAt_zero`). -/ + +omit [NeZero d] in +/-- **C3 F1 β€” the convolution force field is `CΒΉ` in space (FrΓ©chet derivative under the +integral).** For `gradW ∈ CΒΉ` (and `L`-Lipschitz, a probability measure `ρ` with the kernel +integrable), `x ↦ ∫ y, gradW (x βˆ’ y) βˆ‚Ο` is FrΓ©chet-differentiable with derivative +`∫ y, fderiv ℝ gradW (xβ‚€ βˆ’ y) βˆ‚Ο`. This is the field-regularity foundation of the variational +equation (#3): it makes `D_z (vlasovVectorField …)` exist and continuous, so the variational ODE +`M' = (D_z b)Β·M` has continuous coefficients. + +Differentiation under the integral sign (`hasFDerivAt_integral_of_dominated_loc_of_lip`): the +per-fibre map `x ↦ gradW (x βˆ’ y)` is `L`-Lipschitz (a uniform, integrable bound against a +probability measure) and differentiable, so the parametric integral differentiates with derivative +the integral of the fibrewise derivatives. -/ +theorem convolveFunctionMeasure_hasFDerivAt + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] + (h_int : βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) ρ) + (xβ‚€ : PhysSpace d) : + HasFDerivAt (fun x => convolveFunctionMeasure gradW ρ x) + (∫ y, fderiv ℝ gradW (xβ‚€ - y) βˆ‚Ο) xβ‚€ := by + have hdiff : Differentiable ℝ gradW := hgradW_C1.differentiable one_ne_zero + have hfderiv_cont : Continuous (fun z => fderiv ℝ gradW z) := + hgradW_C1.continuous_fderiv one_ne_zero + have key := hasFDerivAt_integral_of_dominated_loc_of_lip + (ΞΌ := ρ) (s := (Set.univ : Set (PhysSpace d))) (xβ‚€ := xβ‚€) + (F := fun x y => gradW (x - y)) + (F' := fun y => fderiv ℝ gradW (xβ‚€ - y)) + (bound := fun _ => (L : ℝ)) + (Filter.univ_mem) + (Filter.Eventually.of_forall fun x => + (hL.continuous.comp (continuous_const.sub continuous_id)).aestronglyMeasurable) + (h_int xβ‚€) + ((hfderiv_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable) + (Filter.Eventually.of_forall fun a => ?_) + (integrable_const _) + (Filter.Eventually.of_forall fun a => ?_) + Β· have h2 := key.2 + simpa only [convolveFunctionMeasure] using h2 + Β· -- h_lip: `fun x => gradW (x - a)` is `L`-Lipschitz, hence `LipschitzOnWith (nnabs L)` on univ + have hLip : LipschitzWith L (fun x : PhysSpace d => gradW (x - a)) := by + refine LipschitzWith.of_dist_le_mul (fun x y => ?_) + have hd : dist (x - a) (y - a) = dist x y := by + rw [dist_eq_norm, dist_eq_norm]; congr 1; abel + calc dist (gradW (x - a)) (gradW (y - a)) + ≀ (L : ℝ) * dist (x - a) (y - a) := hL.dist_le_mul _ _ + _ = (L : ℝ) * dist x y := by rw [hd] + rw [Real.nnabs_coe L] + exact hLip.lipschitzOnWith + Β· -- h_diff: `HasFDerivAt (fun x => gradW (x - a)) (fderiv ℝ gradW (xβ‚€ - a)) xβ‚€` + have h1 : HasFDerivAt gradW (fderiv ℝ gradW (xβ‚€ - a)) (xβ‚€ - a) := + (hdiff (xβ‚€ - a)).hasFDerivAt + have h2 : HasFDerivAt (fun x : PhysSpace d => x - a) + (ContinuousLinearMap.id ℝ (PhysSpace d)) xβ‚€ := + (hasFDerivAt_id xβ‚€).sub_const a + have hc := h1.comp xβ‚€ h2 + simpa [Function.comp_def] using hc + +omit [NeZero d] in +/-- **C3 F2 β€” the Vlasov field is `CΒΉ` in the phase-space variable, with the block Jacobian.** +At fixed time `t`, `vlasovVectorField gradW ρ t = fun (x,v) ↦ (v, βˆ’conv(x))` is +FrΓ©chet-differentiable in `z = (x,v)` with derivative the block continuous-linear map +`Ξ΄ ↦ (Ξ΄.2, βˆ’(D_x conv)(Ξ΄.1))`, where `D_x conv = ∫ y, fderiv ℝ gradW (z.1 βˆ’ y) βˆ‚(ρ t)` (F1). +This is the coefficient `A(t) := D_z b(t, Ξ¦_t z)` of the variational ODE `M' = A(t)Β·M`. -/ +theorem vlasovVectorField_hasFDerivAt_in_z + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] + (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) + (t : ℝ) (z : PhaseSpace d) : + HasFDerivAt (vlasovVectorField gradW ρ t) + ((ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod + (-((∫ y, fderiv ℝ gradW (z.1 - y) βˆ‚(ρ t)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) z := by + have hconv : HasFDerivAt (fun x => convolveFunctionMeasure gradW (ρ t) x) + (∫ y, fderiv ℝ gradW (z.1 - y) βˆ‚(ρ t)) z.1 := + convolveFunctionMeasure_hasFDerivAt gradW hgradW_C1 L hL (ρ t) (h_int t) z.1 + have hfst : HasFDerivAt (fun w : PhaseSpace d => w.1) + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)) z := + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)).hasFDerivAt + have h1 : HasFDerivAt (fun w : PhaseSpace d => w.2) + (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) z := + (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).hasFDerivAt + have h2 : HasFDerivAt (fun w : PhaseSpace d => convolveFunctionMeasure gradW (ρ t) w.1) + ((∫ y, fderiv ℝ gradW (z.1 - y) βˆ‚(ρ t)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))) z := + hconv.comp z hfst + have hprod := h1.prodMk h2.neg + exact hprod + +omit [NeZero d] in +/-- **C3 F1c β€” the convolution derivative is continuous in space.** `x ↦ ∫ y, fderiv ℝ gradW +(x βˆ’ y) βˆ‚Ο` (the FrΓ©chet derivative of the convolution field, F1) is continuous, by dominated +convergence: the integrand is continuous in `x` and bounded by `β€–fderiv gradWβ€– ≀ L` (a constant, +integrable against the probability measure `ρ`). Continuity of the variational coefficient +`A(t)` in its spatial argument β€” half of the `t`-continuity of `A` (the other half is the +measure-curve regularity `t ↦ ρ t`, supplied at the V1c ODE-existence step). -/ +theorem convolveFunctionMeasure_fderiv_continuous + (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] : + Continuous (fun x => ∫ y, fderiv ℝ gradW (x - y) βˆ‚Ο) := by + have hfderiv_cont : Continuous (fun z => fderiv ℝ gradW z) := + hgradW_C1.continuous_fderiv one_ne_zero + refine continuous_of_dominated + (F := fun x y => fderiv ℝ gradW (x - y)) (bound := fun _ => (L : ℝ)) ?_ ?_ ?_ ?_ + Β· intro x + exact (hfderiv_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable + Β· intro x + exact Filter.Eventually.of_forall (fun y => norm_fderiv_le_of_lipschitz (π•œ := ℝ) hL) + Β· exact integrable_const _ + Β· exact Filter.Eventually.of_forall (fun y => + hfderiv_cont.comp (continuous_id.sub continuous_const)) + +omit [NeZero d] in +/-- **C3 A-cont β€” the variational coefficient is continuous in time.** +Compose the convolution-derivative continuity with the flow, then express the block map as a +sum of continuous compositions. This supplies the coefficient regularity for +`exists_fundamentalMatrix`. -/ +lemma vlasovVariationalCoeff_continuousOn + (gradW : PhysSpace d β†’ PhysSpace d) + (ρ : ℝ β†’ Measure (PhysSpace d)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) (z : PhaseSpace d) + (hcontIcc : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) + (hρD_cont : ContinuousOn + (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) + (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) : + ContinuousOn (fun s => (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod + (-((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) (Set.Icc 0 T) := by + have hX : ContinuousOn (fun s => charX s z) (Set.Icc (0 : ℝ) T) := + continuous_fst.comp_continuousOn hcontIcc + have hpair : ContinuousOn (fun s => ((s, charX s z) : ℝ Γ— PhysSpace d)) (Set.Icc (0 : ℝ) T) := + continuousOn_id.prodMk hX + have hmaps : Set.MapsTo (fun s => ((s, charX s z) : ℝ Γ— PhysSpace d)) + (Set.Icc (0 : ℝ) T) (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d))) := + fun s hs => ⟨hs, Set.mem_univ _⟩ + have hD : ContinuousOn (fun s => ∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)) (Set.Icc 0 T) := + hρD_cont.comp hpair hmaps + have hDcomp : ContinuousOn (fun s => -((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) (Set.Icc 0 T) := + (hD.clm_comp continuousOn_const).neg + have heq : (fun s => (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod + (-((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) + = (fun s => (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)).comp + (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) + + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)).comp + (-((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp + (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) := by + funext s; ext x <;> simp + rw [heq] + exact continuousOn_const.add (continuousOn_const.clm_comp hDcomp) + +end Vlasov diff --git a/LeanPool/Vlasov/OT/LocalWellPosedness.lean b/LeanPool/Vlasov/OT/LocalWellPosedness.lean new file mode 100644 index 0000000000..408d8afb72 --- /dev/null +++ b/LeanPool/Vlasov/OT/LocalWellPosedness.lean @@ -0,0 +1,1471 @@ +/- +Copyright (c) 2026 Joseph K. Miller. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph K. Miller +-/ +module + +public import LeanPool.Vlasov.OT.CharacteristicFlow +import Mathlib.Algebra.Order.Ring.Star + +/-! +# Local well-posedness for the Vlasov equation + +The Picard fixed point supplies the local characteristic flow, its moment bound, +and the local Lagrangian solution. Continuation and stability use these results +without retaining their elaboration in the same compilation unit. +-/ + +@[expose] public section + +namespace Vlasov + +open MeasureTheory ENNReal + +/-! ## Β§9 Theorem (Existence and uniqueness for Vlasov) (tex: thm:vlasov-wp) -/ +-- The proof composes directly with the characteristic-flow infrastructure +-- developed in `LeanPool/Vlasov/OT/CharacteristicFlow.lean`: `exists_vlasov_characteristicFlow`, +-- `flow_distance_growth_bound`, and +-- `vlasovSolutionViaPushforward_isLagrangianVlasovSolution`. The +-- `HasFiniteFirstMoment` predicate remains in `Basic.lean`. + +/-- **Project-internal: AEMeasurability of the Vlasov characteristic flow's +joint map** `z ↦ (charX s z, charV s z)` on the window `Icc 0 T`. + +The window-restricted statement (`Icc 0 T`) is exactly what is needed: the +Vlasov flow satisfies `HasDerivAt` only on `Ioo 0 T` (off-window it is +uncontrolled `Classical.choose` data), and the sole consumer applies this +only at `clampToIcc T s ∈ Icc 0 T`. On the window the joint flow's +measurability follows from `charFlow_measurable_via_gronwall` (genuine +`Measurable`, via the boundary bundle through +`characteristicFlow_boundary_regularity`). + +**In-project consumer**: `vlasovWellPosedness_local_picard_fixedPointFlow`'s +AEMeasurable conjunct, applied at clamp times `clampToIcc T s ∈ Icc 0 T`. -/ +private lemma picardCharFlow_aemeasurable + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ t, IsProbabilityMeasure (ρ t)] + (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + {T : ℝ} (hT : 0 ≀ T) + (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) + (hbdry : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (ρ t) (charX t z))) (Set.Icc 0 T) t) + (ΞΌ : Measure (PhaseSpace d)) : + βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) ΞΌ := by + intro s hs + obtain ⟨h_init, h_cont, h_deriv⟩ := + characteristicFlow_boundary_regularity gradW ρ charX charV T hT hflow hbdry + exact (charFlow_measurable_via_gronwall gradW L hL ρ h_int charX charV T hT + h_init h_cont h_deriv s hs).aemeasurable + +/-- **Contraction-input helper**: from a flow's exposed facts (`IsCharacteristicFlowOn` +on `Ioo` + the boundary bundle on `Icc` β€” the `Phi_step_envelope` output shape) +against a curve `Ξ½`, derive the six per-`z` regularity facts that +`Phi_supW1_contraction` consumes. Chains `characteristicFlow_boundary_regularity` +(β†’ init/cont/deriv, the last three EXACT), `charFlow_measurable_via_gronwall` +(β†’ AEMeasurable), and `flow_distance_growth_bound_on` (β†’ growth bound, integrated +to the two integrability facts). -/ +private lemma envelopeStep_contractionInputs {d : β„•} [NeZero d] + (gradW : PhysSpace d β†’ PhysSpace d) (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (h_fβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 ≀ T) {m : ℝ β†’ ℝ} + (Ξ½ : VlasovMeasureCurve d T m) + (Mbar : ℝ) (hMbar_nn : 0 ≀ Mbar) + (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(Ξ½.extend t) ≀ Mbar) + (cX cV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hflow : IsCharacteristicFlowOn gradW Ξ½.extend cX cV (Set.Ioo 0 T) Set.univ) + (hbdry : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => cX s z) (cV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => cV s z) + (-(convolveFunctionMeasure gradW (Ξ½.extend t) (cX t z))) (Set.Icc 0 T) t) + (h_int_ext : βˆ€ t (x : PhysSpace d), + Integrable (fun y => gradW (x - y)) (Ξ½.extend t)) : + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, AEMeasurable (fun z : PhaseSpace d => cX t z) fβ‚€) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, Integrable (fun z : PhaseSpace d => β€–cX t zβ€–) fβ‚€) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => cX t z) fβ‚€)) ∧ + (βˆ€ z : PhaseSpace d, (cX 0 z, cV 0 z) = z) ∧ + (βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (cX s z, cV s z)) (Set.Icc (0 : ℝ) T)) ∧ + (βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, + HasDerivWithinAt (fun s' => (cX s' z, cV s' z)) + (vlasovVectorField gradW (Ξ½.extend) s (cX s z, cV s z)) + (Set.Ici s) s) := by + have : βˆ€ t, IsProbabilityMeasure (Ξ½.extend t) := VlasovMeasureCurve.extend_isProb Ξ½ + obtain ⟨h_init, h_cont, h_deriv⟩ := + characteristicFlow_boundary_regularity gradW Ξ½.extend cX cV T hT hflow hbdry + have h_meas : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => cX t z) fβ‚€ := by + have h_meas_Icc := charFlow_measurable_via_gronwall gradW L hL Ξ½.extend h_int_ext + cX cV T hT h_init h_cont h_deriv + exact fun t ht => (measurable_fst.comp (h_meas_Icc t ht)).aemeasurable + obtain ⟨C_T, hC_T_nn, h_growth⟩ := + flow_distance_growth_bound_on gradW L hL Ξ½.extend cX cV T hT + h_init h_cont h_deriv Mbar hMbar_nn hM_ρ + (fun t _ => VlasovMeasureCurve.extend_yIntegrable hT Ξ½ t) h_int_ext + have h_int_charX : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun z : PhaseSpace d => β€–cX t zβ€–) fβ‚€ := by + intro t ht + have h_dom_int : Integrable (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) fβ‚€ := by + have h1 : Integrable (fun z : PhaseSpace d => C_T * β€–zβ€–) fβ‚€ := h_fβ‚€_int.const_mul C_T + have h2 : Integrable (fun _ : PhaseSpace d => C_T) fβ‚€ := integrable_const _ + have h_eq : (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) = fun z => C_T * β€–zβ€– + C_T := by + funext z; ring + rw [h_eq]; exact h1.add h2 + refine h_dom_int.mono' (h_meas t ht).norm.aestronglyMeasurable ?_ + refine Filter.Eventually.of_forall fun z => ?_ + rw [Real.norm_of_nonneg (norm_nonneg _)] + exact le_trans (norm_fst_le (cX t z, cV t z)) (h_growth t ht z) + have h_yint_Phi : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => cX t z) fβ‚€) := by + intro t ht + rw [integrable_map_measure continuous_norm.aestronglyMeasurable (h_meas t ht)] + exact h_int_charX t ht + exact ⟨h_meas, h_int_charX, h_yint_Phi, h_init, h_cont, h_deriv⟩ + +/-- Lipschitz growth of the force plus a first moment of the measure make the +shifted force integrable. The workhorse integrability fact behind every +`convolveFunctionMeasure` estimate. -/ +lemma integrable_gradW_shift + {d : β„•} + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (ΞΌ : Measure (PhysSpace d)) [MeasureTheory.IsFiniteMeasure ΞΌ] + (h_yint : Integrable (fun y : PhysSpace d => β€–yβ€–) ΞΌ) + (xp : PhysSpace d) : + Integrable (fun y => gradW (xp - y)) ΞΌ := by + have h_aesm : AEStronglyMeasurable (fun y : PhysSpace d => gradW (xp - y)) ΞΌ := + (hL.continuous.comp (continuous_const.sub continuous_id)).aestronglyMeasurable + have h_dom : βˆ€ y : PhysSpace d, β€–gradW (xp - y)β€– ≀ + β€–gradW 0β€– + (L : ℝ) * β€–xpβ€– + (L : ℝ) * β€–yβ€– := by + intro y + have hd := hL.dist_le_mul (xp - y) 0 + simp only [dist_eq_norm, sub_zero] at hd + have h_tri : β€–gradW (xp - y)β€– ≀ β€–gradW 0β€– + β€–gradW (xp - y) - gradW 0β€– := by + have := norm_add_le (gradW (xp - y) - gradW 0) (gradW 0) + simp only [sub_add_cancel] at this; linarith + have h_sub_le : β€–xp - yβ€– ≀ β€–xpβ€– + β€–yβ€– := norm_sub_le xp y + have h_mul := mul_le_mul_of_nonneg_left h_sub_le L.coe_nonneg + linarith + have h_dom_int : Integrable + (fun y : PhysSpace d => β€–gradW 0β€– + (L : ℝ) * β€–xpβ€– + (L : ℝ) * β€–yβ€–) ΞΌ := by + have h_eq : (fun y : PhysSpace d => β€–gradW 0β€– + (L : ℝ) * β€–xpβ€– + (L : ℝ) * β€–yβ€–) = + fun y => (β€–gradW 0β€– + (L : ℝ) * β€–xpβ€–) + (L : ℝ) * β€–yβ€– := by funext y; ring + rw [h_eq]; exact (integrable_const _).add (h_yint.const_mul _) + exact h_dom_int.mono' h_aesm (Filter.Eventually.of_forall fun y => h_dom y) + +/-- `LocalSmallnessContraction L T` IS the GrΓΆnwall contraction factor +`gronwallBound 0 (max 1 L) L T < 1`, after unfolding both definitions. -/ +lemma LocalSmallnessContraction.gronwallBound_lt_one + {L : NNReal} {T : ℝ} (hTL_con : LocalSmallnessContraction L T) : + gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T < 1 := by + have hK_pos : (0 : ℝ) < ((max 1 L : NNReal) : ℝ) := by + have : (1 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := by + rw [NNReal.coe_max, NNReal.coe_one]; exact le_max_left _ _ + linarith + have hK_ne : ((max 1 L : NNReal) : ℝ) β‰  0 := ne_of_gt hK_pos + rw [gronwallBound_of_K_ne_0 hK_ne] + simp only [zero_mul, zero_add] + have h_eq : (L : ℝ) / ((max 1 L : NNReal) : ℝ) * + (Real.exp (((max 1 L : NNReal) : ℝ) * T) - 1) = + (L : ℝ) * (Real.exp ((max 1 (L : ℝ)) * T) - 1) / (max 1 (L : ℝ)) := by + rw [NNReal.coe_max, NNReal.coe_one] + ring + rw [h_eq] + exact hTL_con + +/-- The Picard sequence of the local fixed-point construction, with its exposed +per-step flows and the geometric contraction bound. Extracted from +`vlasovWellPosedness_local_picard_fixedPointFlow`; the parameters `q` (the +contraction factor) and `Dβ‚€` (the initial `W₁`-input bound) are threaded with +their defining equations so the parent's `let`-definitions supply `rfl`. -/ +private lemma vlasovWellPosedness_local_picard_sequence + {d : β„•} [NeZero d] + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (hTL_PL : LocalSmallnessPLBuffer L T) + (m : ℝ β†’ ℝ) (hm_mono : MonotoneOn m (Set.Icc 0 T)) + (hm_nn : βˆ€ t ∈ Set.Icc (0 : ℝ) T, 0 ≀ m t) + (hm_inv : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + gronwallBound (∫ z, β€–zβ€– βˆ‚fβ‚€) (1 + (L : ℝ)) (β€–gradW 0β€– + (L : ℝ) * m t) t ≀ m t) + (hMbar_nn : 0 ≀ m T) (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) + (hΞΌβ‚€_prob : IsProbabilityMeasure (spatialMarginal fβ‚€)) + (hΞΌβ‚€_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal fβ‚€)) + (hΞΌβ‚€_le_m : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal fβ‚€) ≀ m t) + (q : ℝ) (hq_nn : 0 ≀ q) + (hq_def : q = gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T) + (Dβ‚€ : ℝ) (hDβ‚€_nn : 0 ≀ Dβ‚€) (hDβ‚€_def : Dβ‚€ = 2 * (m T)) : + βˆƒ (x : β„• β†’ VlasovMeasureCurve d T m) + (charXs charVs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d), + (βˆ€ k, supW1On (Set.Icc 0 T) (x k).ρ (x (k + 1)).ρ ≀ + ENNReal.ofReal (q ^ k * Dβ‚€)) ∧ + (βˆ€ k, + IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) + (Set.Ioo 0 T) Set.univ ∧ + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charVs k s z) + (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) + (Set.Icc 0 T) t) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (x (k + 1)).ρ t + = Measure.map (fun z : PhaseSpace d => charXs k t z) fβ‚€)) := by + have h_int_ext_gen : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) (t : ℝ) (xp : PhysSpace d), + Integrable (fun y => gradW (xp - y)) (Ξ½.extend t) := fun Ξ½ t xp => + integrable_gradW_shift gradW L hL (Ξ½.extend t) + (VlasovMeasureCurve.extend_yIntegrable hT.le Ξ½ t) xp + have step : βˆ€ (Ξ½ : VlasovMeasureCurve d T m), + βˆƒ (Οƒ : VlasovMeasureCurve d T m) (cX cV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, Οƒ.ρ t = Measure.map (fun z => cX t z) fβ‚€) ∧ + IsCharacteristicFlowOn gradW Ξ½.extend cX cV (Set.Ioo 0 T) Set.univ ∧ + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => cX s z) (cV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => cV s z) + (-(convolveFunctionMeasure gradW (Ξ½.extend t) (cX t z))) (Set.Icc 0 T) t) := by + intro Ξ½ + obtain ⟨cX, cV, hflow, hbdry, Οƒ, hΟƒβŸ© := + Phi_step_envelope W gradW hgradW L hL fβ‚€ hfβ‚€_int hT.le m hm_mono hm_nn hm_inv hTL_PL + Ξ½ (h_int_ext_gen Ξ½) + exact βŸ¨Οƒ, cX, cV, hΟƒ, hflow, hbdry⟩ + have hΞΌβ‚€_prob_inst : IsProbabilityMeasure (spatialMarginal fβ‚€) := hΞΌβ‚€_prob + let base : VlasovMeasureCurve d T m := constantCurve (spatialMarginal fβ‚€) hΞΌβ‚€_int hΞΌβ‚€_le_m + let x : β„• β†’ VlasovMeasureCurve d T m := + fun n => Nat.rec base (fun _ Ξ½ => Classical.choose (step Ξ½)) n + let charXs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d := + fun k => Classical.choose (Classical.choose_spec (step (x k))) + let charVs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d := + fun k => Classical.choose (Classical.choose_spec (Classical.choose_spec (step (x k)))) + have hx_succ : βˆ€ k, x (k + 1) = Classical.choose (step (x k)) := fun _ => rfl + have hspec : βˆ€ k, + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (Classical.choose (step (x k))).ρ t = Measure.map (fun z => charXs k t z) fβ‚€) ∧ + IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) + (Set.Ioo 0 T) Set.univ ∧ + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charVs k s z) + (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) + (Set.Icc 0 T) t) := + fun k => Classical.choose_spec + (Classical.choose_spec (Classical.choose_spec (step (x k)))) + have h_flow : βˆ€ k, + IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) + (Set.Ioo 0 T) Set.univ ∧ + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charVs k s z) + (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) + (Set.Icc 0 T) t) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (x (k + 1)).ρ t = Measure.map (fun z : PhaseSpace d => charXs k t z) fβ‚€) := by + intro k + obtain ⟨hpush, hcf, hbd⟩ := hspec k + refine ⟨hcf, hbd, fun t ht => ?_⟩ + rw [hx_succ k]; exact hpush t ht + have hCI : βˆ€ k, + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, AEMeasurable (fun z : PhaseSpace d => charXs k t z) fβ‚€) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, Integrable (fun z : PhaseSpace d => β€–charXs k t zβ€–) fβ‚€) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => charXs k t z) fβ‚€)) ∧ + (βˆ€ z : PhaseSpace d, (charXs k 0 z, charVs k 0 z) = z) ∧ + (βˆ€ z : PhaseSpace d, + ContinuousOn (fun s => (charXs k s z, charVs k s z)) (Set.Icc (0 : ℝ) T)) ∧ + (βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, + HasDerivWithinAt (fun s' => (charXs k s' z, charVs k s' z)) + (vlasovVectorField gradW ((x k).extend) s (charXs k s z, charVs k s z)) + (Set.Ici s) s) := + fun k => envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le (x k) (m T) hMbar_nn + (fun t _ => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le (x k) t) + (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t))) + (charXs k) (charVs k) (h_flow k).1 (h_flow k).2.1 (h_int_ext_gen (x k)) + have hK_ne : ((max 1 L : NNReal) : ℝ) β‰  0 := by + have h1 : (1:ℝ) ≀ ((max 1 L : NNReal):ℝ) := by + rw [NNReal.coe_max, NNReal.coe_one]; exact le_max_left _ _ + linarith + have hq_scale : βˆ€ D : ℝ, + gronwallBound 0 ((max 1 L : NNReal):ℝ) ((L:ℝ)*D) T = D * q := by + intro D + rw [hq_def, gronwallBound_of_K_ne_0 hK_ne, gronwallBound_of_K_ne_0 hK_ne]; ring + have hPext : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) (t : ℝ), + IsProbabilityMeasure (Ξ½.extend t) := + fun Ξ½ => VlasovMeasureCurve.extend_isProb Ξ½ + have h_contract : βˆ€ k, supW1On (Set.Icc 0 T) (x k).ρ (x (k + 1)).ρ ≀ + ENNReal.ofReal (q ^ k * Dβ‚€) := by + intro k + induction k with + | zero => + simp only [pow_zero, one_mul] + rw [hDβ‚€_def] + exact supW1On_le_two_moment_of_VlasovMeasureCurve (m T) hMbar_mono (x 0) (x 1) + | succ k ih => + set D : ℝ := q ^ k * Dβ‚€ with hD_def + have hD_nn : 0 ≀ D := mul_nonneg (pow_nonneg hq_nn k) hDβ‚€_nn + have he : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) s, s ∈ Set.Icc (0 : ℝ) T β†’ Ξ½.extend s = Ξ½.ρ s := by + intro Ξ½ s hs + unfold VlasovMeasureCurve.extend clampToIcc; congr 1 + rw [min_eq_left hs.2, max_eq_right hs.1] + have h_W1_fin : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + wasserstein1 ((x k).extend s) ((x (k+1)).extend s) β‰  ⊀ := by + intro s hs + rw [he (x k) s hs, he (x (k+1)) s hs] + have := (x k).isProb s; have := (x (k+1)).isProb s + exact wasserstein1_ne_top_of_finite_moment _ _ + ((x k).yIntegrable s hs) ((x (k+1)).yIntegrable s hs) + have h_W1_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + (wasserstein1 ((x k).extend s) ((x (k+1)).extend s)).toReal ≀ D := by + intro s hs + rw [he (x k) s hs, he (x (k+1)) s hs] + have h_le : wasserstein1 ((x k).ρ s) ((x (k+1)).ρ s) + ≀ ENNReal.ofReal D := + le_trans (wasserstein1_le_supW1On _ _ _ s hs) ih + have h_ne : wasserstein1 ((x k).ρ s) ((x (k+1)).ρ s) β‰  ⊀ := by + have := (x k).isProb s; have := (x (k+1)).isProb s + exact wasserstein1_ne_top_of_finite_moment _ _ + ((x k).yIntegrable s hs) ((x (k+1)).yIntegrable s hs) + calc (wasserstein1 ((x k).ρ s) ((x (k+1)).ρ s)).toReal + ≀ (ENNReal.ofReal D).toReal := ENNReal.toReal_mono ENNReal.ofReal_ne_top h_le + _ = D := ENNReal.toReal_ofReal hD_nn + have h_contr := @Phi_supW1_contraction d gradW L hL ((x k).extend) ((x (k+1)).extend) + (hPext (x k)) (hPext (x (k+1))) + (h_int_ext_gen (x k)) (h_int_ext_gen (x (k+1))) T hT.le D hD_nn h_W1_fin h_W1_bound + (charXs k) (charVs k) (charXs (k+1)) (charVs (k+1)) fβ‚€ _ + (hCI k).1 (hCI (k+1)).1 (hCI k).2.1 (hCI (k+1)).2.1 + (hCI k).2.2.1 (hCI (k+1)).2.2.1 (hCI k).2.2.2.1 (hCI (k+1)).2.2.2.1 + (hCI k).2.2.2.2.1 (hCI (k+1)).2.2.2.2.1 (hCI k).2.2.2.2.2 (hCI (k+1)).2.2.2.2.2 + rw [hq_scale D] at h_contr + have h_supW1_eq : supW1On (Set.Icc 0 T) (x (k+1)).ρ (x (k+1+1)).ρ + = supW1On (Set.Icc 0 T) + (fun t => Measure.map (fun z => charXs k t z) fβ‚€) + (fun t => Measure.map (fun z => charXs (k+1) t z) fβ‚€) := by + unfold supW1On + exact iSup_congr fun t => iSup_congr fun ht => by + rw [(h_flow k).2.2 t ht, (h_flow (k+1)).2.2 t ht] + have hDq : D * q = q ^ (k + 1) * Dβ‚€ := by rw [hD_def, pow_succ]; ring + rw [hDq] at h_contr + have h_ne_top : supW1On (Set.Icc 0 T) + (fun t => Measure.map (fun z => charXs k t z) fβ‚€) + (fun t => Measure.map (fun z => charXs (k+1) t z) fβ‚€) β‰  ⊀ := by + rw [← h_supW1_eq] + exact supW1On_ne_top_of_VlasovMeasureCurve (m T) hMbar_mono (x (k+1)) (x (k+1+1)) + have h_pow_nn : 0 ≀ q ^ (k + 1) * Dβ‚€ := mul_nonneg (pow_nonneg hq_nn _) hDβ‚€_nn + rw [h_supW1_eq] + rw [← ENNReal.toReal_le_toReal h_ne_top ENNReal.ofReal_ne_top, + ENNReal.toReal_ofReal h_pow_nn] + exact h_contr + exact ⟨x, charXs, charVs, h_contract, h_flow⟩ + +/-- Pointwise contraction of the Picard step between an iterate and the limit +curve: the pushforwards under the two flows are `DΒ·q`-close whenever the curves +are uniformly `D`-close in `W₁`. Wraps `Phi_pointwise_contraction` + +`gronwallBound` monotonicity for a single curve pair. -/ +private lemma picardLimit_flow_pointwise_contraction + {d : β„•} [NeZero d] + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (m : ℝ β†’ ℝ) (hMbar_nn : 0 ≀ m T) + (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) + (Ξ½ ρl : VlasovMeasureCurve d T m) + (cX cV charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hflow_Ξ½ : IsCharacteristicFlowOn gradW Ξ½.extend cX cV (Set.Ioo 0 T) Set.univ) + (hbdry_Ξ½ : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => cX s z) (cV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => cV s z) + (-(convolveFunctionMeasure gradW (Ξ½.extend t) (cX t z))) (Set.Icc 0 T) t) + (hflow_l : IsCharacteristicFlowOn gradW ρl.extend charX charV (Set.Ioo 0 T) Set.univ) + (hbdry_l : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (ρl.extend t) (charX t z))) (Set.Icc 0 T) t) + (D : ℝ) (hD_nn : 0 ≀ D) + (h_W1_fin : βˆ€ s ∈ Set.Icc (0 : ℝ) T, wasserstein1 (Ξ½.extend s) (ρl.extend s) β‰  ⊀) + (h_W1_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + (wasserstein1 (Ξ½.extend s) (ρl.extend s)).toReal ≀ D) + (q : ℝ) (hq_def : q = gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (wasserstein1 (Measure.map (fun z => cX t z) fβ‚€) + (Measure.map (fun z => charX t z) fβ‚€)).toReal ≀ D * q := by + have hK_ge1 : (1 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := by + rw [NNReal.coe_max, NNReal.coe_one]; exact le_max_left _ _ + have hK_ne : ((max 1 L : NNReal) : ℝ) β‰  0 := ne_of_gt (by linarith) + have hK_pos : (0 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := by linarith + have hMm : βˆ€ (ΞΌ : VlasovMeasureCurve d T m), βˆ€ t ∈ Set.Icc (0 : ℝ) T, + ∫ y, β€–yβ€– βˆ‚(ΞΌ.extend t) ≀ m T := + fun ΞΌ t _ => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le ΞΌ t) + (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t)) + have h_int_Ξ½ : βˆ€ t (xp : PhysSpace d), + Integrable (fun y => gradW (xp - y)) (Ξ½.extend t) := fun t xp => + integrable_gradW_shift gradW L hL (Ξ½.extend t) + (VlasovMeasureCurve.extend_yIntegrable hT.le Ξ½ t) xp + have h_int_l : βˆ€ t (xp : PhysSpace d), + Integrable (fun y => gradW (xp - y)) (ρl.extend t) := fun t xp => + integrable_gradW_shift gradW L hL (ρl.extend t) + (VlasovMeasureCurve.extend_yIntegrable hT.le ρl t) xp + have hCI_Ξ½ := envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le Ξ½ + (m T) hMbar_nn (hMm Ξ½) cX cV hflow_Ξ½ hbdry_Ξ½ h_int_Ξ½ + have hCI_l := envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le ρl + (m T) hMbar_nn (hMm ρl) charX charV hflow_l hbdry_l h_int_l + have hq_scale : gronwallBound 0 ((max 1 L : NNReal) : ℝ) ((L:ℝ) * D) T = D * q := by + rw [hq_def, gronwallBound_of_K_ne_0 hK_ne, gronwallBound_of_K_ne_0 hK_ne]; ring + intro t ht + have hpt := @Phi_pointwise_contraction d gradW L hL (Ξ½.extend) (ρl.extend) + (VlasovMeasureCurve.extend_isProb Ξ½) (VlasovMeasureCurve.extend_isProb ρl) + h_int_Ξ½ h_int_l T hT.le D hD_nn h_W1_fin h_W1_bound + cX cV charX charV fβ‚€ _ + hCI_Ξ½.1 hCI_l.1 hCI_Ξ½.2.1 hCI_l.2.1 + hCI_Ξ½.2.2.2.1 hCI_l.2.2.2.1 hCI_Ξ½.2.2.2.2.1 hCI_l.2.2.2.2.1 + hCI_Ξ½.2.2.2.2.2 hCI_l.2.2.2.2.2 t ht + have h_mono : gronwallBound 0 ((max 1 L : NNReal) : ℝ) ((L:ℝ) * D) t + ≀ gronwallBound 0 ((max 1 L : NNReal) : ℝ) ((L:ℝ) * D) T := + gronwallBound_mono (le_refl 0) (mul_nonneg L.coe_nonneg hD_nn) hK_pos ht.2 + rw [hq_scale] at h_mono + exact le_trans hpt h_mono + +/-- The Picard fixed-point equation at the limit: if the iterates converge to the +limit curve in `W₁` and each step's pushforward is `Dβ‚™Β·q`-close to the limit +flow's pushforward with `Dβ‚™Β·q β†’ 0`, the limit curve equals the limit flow's +pushforward. Triangle through the iterates + the `W₁` separation lemma. -/ +private lemma picardLimit_fixed_point_eq + {d : β„•} [NeZero d] + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + {T : ℝ} + (m : ℝ β†’ ℝ) (x : β„• β†’ VlasovMeasureCurve d T m) (ρl : VlasovMeasureCurve d T m) + (charXs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (charX : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_push : βˆ€ n, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (x (n + 1)).ρ t = Measure.map (fun z : PhaseSpace d => charXs n t z) fβ‚€) + (h_tendsto : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Filter.Tendsto (fun n => wasserstein1 ((x n).ρ t) (ρl.ρ t)) Filter.atTop (nhds 0)) + (h_aem_n : βˆ€ n, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => charXs n t z) fβ‚€) + (h_aem_lim : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => charX t z) fβ‚€) + (h_mom_n : βˆ€ n, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => charXs n t z) fβ‚€)) + (h_mom_lim : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => charX t z) fβ‚€)) + (Dn : β„• β†’ ℝ) (q : ℝ) + (hDnq_tendsto : Filter.Tendsto (fun n => Dn n * q) Filter.atTop (nhds 0)) + (h_term2 : βˆ€ n t, t ∈ Set.Icc (0 : ℝ) T β†’ + (wasserstein1 (Measure.map (fun z => charXs n t z) fβ‚€) + (Measure.map (fun z => charX t z) fβ‚€)).toReal ≀ Dn n * q) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, ρl.ρ t = Measure.map (fun z => charX t z) fβ‚€ := by + intro t ht + have hP1 : IsProbabilityMeasure (ρl.ρ t) := ρl.isProb t + have hP2 : IsProbabilityMeasure (Measure.map (fun z => charX t z) fβ‚€) := + (Measure.isProbabilityMeasure_map_iff (h_aem_lim t ht)).mpr inferInstance + refine (wasserstein1_eq_zero_iff_measure_eq (ρl.ρ t) + (Measure.map (fun z => charX t z) fβ‚€)).mp ?_ + have h_le_seq : βˆ€ n, wasserstein1 (ρl.ρ t) (Measure.map (fun z => charX t z) fβ‚€) + ≀ wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) + ENNReal.ofReal (Dn n * q) := by + intro n + have h_mid : (x (n+1)).ρ t = Measure.map (fun z => charXs n t z) fβ‚€ := h_push n t ht + calc wasserstein1 (ρl.ρ t) (Measure.map (fun z => charX t z) fβ‚€) + ≀ wasserstein1 (ρl.ρ t) ((x (n+1)).ρ t) + + wasserstein1 ((x (n+1)).ρ t) (Measure.map (fun z => charX t z) fβ‚€) := + wasserstein1_triangle _ _ _ + _ = wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) + + wasserstein1 ((x (n+1)).ρ t) (Measure.map (fun z => charX t z) fβ‚€) := by + rw [wasserstein1_comm (ρl.ρ t) ((x (n+1)).ρ t)] + _ ≀ wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) + ENNReal.ofReal (Dn n * q) := by + gcongr + rw [h_mid] + have h_fin : wasserstein1 (Measure.map (fun z => charXs n t z) fβ‚€) + (Measure.map (fun z => charX t z) fβ‚€) β‰  ⊀ := by + have : IsProbabilityMeasure (Measure.map (fun z => charXs n t z) fβ‚€) := + (Measure.isProbabilityMeasure_map_iff (h_aem_n n t ht)).mpr inferInstance + exact wasserstein1_ne_top_of_finite_moment _ _ + (h_mom_n n t ht) (h_mom_lim t ht) + rw [← ENNReal.ofReal_toReal h_fin] + exact ENNReal.ofReal_le_ofReal (h_term2 n t ht) + have hA : Filter.Tendsto (fun n => wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t)) + Filter.atTop (nhds 0) := + (h_tendsto t ht).comp (Filter.tendsto_add_atTop_nat 1) + have hB : Filter.Tendsto (fun n => ENNReal.ofReal (Dn n * q)) Filter.atTop (nhds 0) := by + have := (ENNReal.continuous_ofReal.tendsto 0).comp hDnq_tendsto + simpa [Function.comp_def] using this + have h_seq : Filter.Tendsto + (fun n => wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) + ENNReal.ofReal (Dn n * q)) + Filter.atTop (nhds 0) := by + have := hA.add hB + simpa using this + exact le_antisymm (ge_of_tendsto' h_seq h_le_seq) (zero_le) + +/-- Bundle the self-consistent Picard-limit flow, CLAMPED to the window, into the +seven-conjunct conclusion of `vlasovWellPosedness_local_picard_fixedPointFlow`. +The raw flow is controlled only on `[0, T]`; clamping (`clampToIcc`) makes every +universal-in-`s` conjunct reduce to the window, where the clamp is the identity. -/ +private lemma picardFlow_clamp_bundle + {d : β„•} [NeZero d] + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) + {T : ℝ} (hT : 0 < T) + (m : ℝ β†’ ℝ) (hMbar_nn : 0 ≀ m T) + (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) + (ρ_lim : VlasovMeasureCurve d T m) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hflow_on_ρlim : IsCharacteristicFlowOn gradW ρ_lim.extend charX charV + (Set.Ioo 0 T) Set.univ) + (h_boundary_ρlim : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (ρ_lim.extend t) (charX t z))) (Set.Icc 0 T) t) + (h_int_ρ_lim : βˆ€ t (x_pt : PhysSpace d), + Integrable (fun y => gradW (x_pt - y)) (ρ_lim.extend t)) + (h_self_consist : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + ρ_lim.extend t = + spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) : + βˆƒ (charX' charV' : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (M_ρ : ℝ), 0 ≀ M_ρ ∧ + IsCharacteristicFlowOn gradW + (fun t => spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ t)) + charX' charV' (Set.Ioo 0 T) Set.univ ∧ + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX' s z) (charV' t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV' s z) + (-(convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ t)) + (charX' t z))) + (Set.Icc 0 T) t) ∧ + (βˆ€ s ∈ Set.Icc (0 : ℝ) T, + ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s)) ≀ M_ρ) ∧ + (βˆ€ s ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) + (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s))) ∧ + (βˆ€ s, Continuous (fun x => + convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s)) x)) ∧ + (βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX' s z, charV' s z)) fβ‚€) ∧ + (βˆ€ s (x : PhysSpace d), + Integrable (fun y => gradW (x - y)) + (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s))) := by + have hclamp_id : βˆ€ s ∈ Set.Icc (0 : ℝ) T, clampToIcc T s = s := fun s hs => by + unfold clampToIcc; rw [min_eq_left hs.2, max_eq_right hs.1] + have hclamp0 : clampToIcc T 0 = 0 := hclamp_id 0 ⟨le_refl 0, hT.le⟩ + have h_rho_clamp : βˆ€ s : ℝ, + spatialMarginal (vlasovSolutionViaPushforward + (fun s' z => charX (clampToIcc T s') z) + (fun s' z => charV (clampToIcc T s') z) fβ‚€ s) = + ρ_lim.extend (clampToIcc T s) := by + intro s + have h1 : spatialMarginal (vlasovSolutionViaPushforward + (fun s' z => charX (clampToIcc T s') z) + (fun s' z => charV (clampToIcc T s') z) fβ‚€ s) = + spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ (clampToIcc T s)) := + rfl + rw [h1, ← h_self_consist (clampToIcc T s) (clampToIcc_mem hT.le s)] + refine ⟨fun s z => charX (clampToIcc T s) z, fun s z => charV (clampToIcc T s) z, + m T, hMbar_nn, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + Β· refine ⟨fun z _hz => ?_, fun t ht z _hz => ?_, fun t ht z _hz => ?_⟩ + Β· change charX (clampToIcc T 0) z = z.1 ∧ charV (clampToIcc T 0) z = z.2 + rw [hclamp0]; exact hflow_on_ρlim.1 z (Set.mem_univ z) + Β· have hEv : (fun s => charX (clampToIcc T s) z) =αΆ [nhds t] + (fun s => charX s z) := by + filter_upwards [Ioo_mem_nhds ht.1 ht.2] with s hs + rw [hclamp_id s (Set.Ioo_subset_Icc_self hs)] + change HasDerivAt (fun s => charX (clampToIcc T s) z) (charV (clampToIcc T t) z) t + rw [hclamp_id t (Set.Ioo_subset_Icc_self ht)] + exact (hflow_on_ρlim.2.1 t ht z (Set.mem_univ z)).congr_of_eventuallyEq hEv + Β· have hEv : (fun s => charV (clampToIcc T s) z) =αΆ [nhds t] + (fun s => charV s z) := by + filter_upwards [Ioo_mem_nhds ht.1 ht.2] with s hs + rw [hclamp_id s (Set.Ioo_subset_Icc_self hs)] + change HasDerivAt (fun s => charV (clampToIcc T s) z) + (-(convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward + (fun s' z' => charX (clampToIcc T s') z') + (fun s' z' => charV (clampToIcc T s') z') fβ‚€ t)) + (charX (clampToIcc T t) z))) t + rw [h_rho_clamp t, hclamp_id t (Set.Ioo_subset_Icc_self ht)] + exact (hflow_on_ρlim.2.2 t ht z (Set.mem_univ z)).congr_of_eventuallyEq hEv + Β· intro z t ht + have hEqOn : Set.EqOn (fun s => charX (clampToIcc T s) z) (fun s => charX s z) + (Set.Icc 0 T) := fun s hs => by + change charX (clampToIcc T s) z = charX s z; rw [hclamp_id s hs] + have hEqOnV : Set.EqOn (fun s => charV (clampToIcc T s) z) (fun s => charV s z) + (Set.Icc 0 T) := fun s hs => by + change charV (clampToIcc T s) z = charV s z; rw [hclamp_id s hs] + obtain ⟨h1, h2⟩ := h_boundary_ρlim z t ht + refine ⟨?_, ?_⟩ + Β· change HasDerivWithinAt (fun s => charX (clampToIcc T s) z) + (charV (clampToIcc T t) z) (Set.Icc 0 T) t + rw [hclamp_id t ht] + exact h1.congr hEqOn (hEqOn ht) + Β· change HasDerivWithinAt (fun s => charV (clampToIcc T s) z) + (-(convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward + (fun s' z' => charX (clampToIcc T s') z') + (fun s' z' => charV (clampToIcc T s') z') fβ‚€ t)) + (charX (clampToIcc T t) z))) (Set.Icc 0 T) t + rw [h_rho_clamp t, hclamp_id t ht] + exact h2.congr hEqOnV (hEqOnV ht) + Β· intro s hs + rw [h_rho_clamp s, hclamp_id s hs] + exact le_trans (VlasovMeasureCurve.extend_hasMoment hT.le ρ_lim s) + (hMbar_mono (clampToIcc T s) (clampToIcc_mem hT.le s)) + Β· intro s hs + rw [h_rho_clamp s, hclamp_id s hs] + exact VlasovMeasureCurve.extend_yIntegrable hT.le ρ_lim s + Β· intro s + rw [h_rho_clamp s] + have : IsProbabilityMeasure (ρ_lim.extend (clampToIcc T s)) := + VlasovMeasureCurve.extend_isProb ρ_lim (clampToIcc T s) + exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL + (ρ_lim.extend (clampToIcc T s)) (h_int_ρ_lim (clampToIcc T s))).continuous + Β· intro s + exact picardCharFlow_aemeasurable gradW L hL ρ_lim.extend h_int_ρ_lim charX charV hT.le + hflow_on_ρlim h_boundary_ρlim fβ‚€ (clampToIcc T s) (clampToIcc_mem hT.le s) + Β· intro s x + rw [h_rho_clamp s] + exact h_int_ρ_lim (clampToIcc T s) x + +/-- **Sub-helper for `_picard_fixedPointFlow`** β€” the Picard fixed-point +self-consistency equation. For `t ∈ Icc 0 T`, + +`ρ_lim.extend t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)`, + +proved by the triangle through the iterates `x n`: the marginal-vs-limit leg +tends to `0` by `h_tendsto`, the flow-pushforward leg is `≀ Dn n Β· q` by the +pointwise contraction `picardLimit_flow_pointwise_contraction` (with +`Dn n := (supW1On (Icc 0 T) (x n).ρ ρ_lim.ρ).toReal β†’ 0` from the +supW1On-Cauchy structure), and `picardLimit_fixed_point_eq` closes. The +contraction ratio `q` is threaded by its defining equation `hq_def` +(let-bound parent supplies `rfl`). -/ +private lemma picardLimit_self_consistency + {d : β„•} [NeZero d] + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (m : ℝ β†’ ℝ) (hMbar_nn : 0 ≀ m T) + (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) + (q : ℝ) (hq_nn : 0 ≀ q) (hq_lt : q < 1) + (hq_def : q = gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T) + (Dβ‚€ : ℝ) (hDβ‚€_nn : 0 ≀ Dβ‚€) + (x : β„• β†’ VlasovMeasureCurve d T m) + (charXs charVs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (h_contract : βˆ€ k, supW1On (Set.Icc 0 T) (x k).ρ (x (k + 1)).ρ ≀ + ENNReal.ofReal (q ^ k * Dβ‚€)) + (h_flow : βˆ€ k, + IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) + (Set.Ioo 0 T) Set.univ ∧ + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charVs k s z) + (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) + (Set.Icc 0 T) t) ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, + (x (k + 1)).ρ t = Measure.map (fun z : PhaseSpace d => charXs k t z) fβ‚€)) + (ρ_lim : VlasovMeasureCurve d T m) + (h_tendsto : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Filter.Tendsto (fun n => wasserstein1 ((x n).ρ t) (ρ_lim.ρ t)) + Filter.atTop (nhds 0)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (hflow_on_ρlim : IsCharacteristicFlowOn gradW ρ_lim.extend charX charV + (Set.Ioo 0 T) Set.univ) + (h_boundary_ρlim : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (ρ_lim.extend t) (charX t z))) + (Set.Icc 0 T) t) + (h_int_ρ_lim : βˆ€ t (x_pt : PhysSpace d), + Integrable (fun y => gradW (x_pt - y)) (ρ_lim.extend t)) : + βˆ€ t ∈ Set.Icc (0 : ℝ) T, + ρ_lim.extend t = + spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) := by + have he : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) s, s ∈ Set.Icc (0 : ℝ) T β†’ + Ξ½.extend s = Ξ½.ρ s := by + intro Ξ½ s hs + unfold VlasovMeasureCurve.extend clampToIcc; congr 1 + rw [min_eq_left hs.2, max_eq_right hs.1] + have hMm : βˆ€ (Ξ½ : VlasovMeasureCurve d T m), βˆ€ t ∈ Set.Icc (0 : ℝ) T, + ∫ y, β€–yβ€– βˆ‚(Ξ½.extend t) ≀ m T := + fun Ξ½ t _ => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le Ξ½ t) + (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t)) + have h_int_ext_gen : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) (t : ℝ) (xp : PhysSpace d), + Integrable (fun y => gradW (xp - y)) (Ξ½.extend t) := fun Ξ½ t xp => + integrable_gradW_shift gradW L hL (Ξ½.extend t) + (VlasovMeasureCurve.extend_yIntegrable hT.le Ξ½ t) xp + have hCI := fun k => envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le (x k) + (m T) hMbar_nn (hMm (x k)) (charXs k) (charVs k) + (h_flow k).1 (h_flow k).2.1 (h_int_ext_gen (x k)) + have hCI_lim := envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le ρ_lim + (m T) hMbar_nn (hMm ρ_lim) charX charV hflow_on_ρlim h_boundary_ρlim h_int_ρ_lim + have h_marg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s) + = Measure.map (fun z => charX s z) fβ‚€ := by + intro s hs + have h_pair_meas := charFlow_measurable_via_gronwall gradW L hL ρ_lim.extend h_int_ρ_lim + charX charV T hT.le hCI_lim.2.2.2.1 hCI_lim.2.2.2.2.1 hCI_lim.2.2.2.2.2 s hs + unfold spatialMarginal vlasovSolutionViaPushforward + rw [Measure.map_map measurable_fst h_pair_meas] + rfl + have h_cauchy := picard_iterate_isCauchy_of_contraction + (Set.Icc (0 : ℝ) T) (fun n => (x n).ρ) q hq_nn hq_lt Dβ‚€ hDβ‚€_nn h_contract + have h_uniform := picard_iterate_limit_uniform_tendsto + (Set.Icc (0 : ℝ) T) (fun n => (x n).ρ) ρ_lim.ρ h_cauchy h_tendsto + have h_sup_ne_top : βˆ€ n, supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ β‰  ⊀ := + fun n => supW1On_ne_top_of_VlasovMeasureCurve (m T) hMbar_mono (x n) ρ_lim + have h_sup_tendsto : Filter.Tendsto + (fun n => supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ) Filter.atTop (nhds 0) := by + rw [ENNReal.tendsto_atTop_zero] + intro Ξ΅ hΞ΅ + obtain ⟨N, hN⟩ := h_uniform Ξ΅ hΞ΅ + refine ⟨N, fun n hn => ?_⟩ + unfold supW1On + exact iSup_le fun s => iSup_le fun hs => hN n hn s hs + set Dn : β„• β†’ ℝ := fun n => (supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ).toReal with hDn_def + have hDn_nn : βˆ€ n, 0 ≀ Dn n := fun n => ENNReal.toReal_nonneg + have hDn_tendsto : Filter.Tendsto Dn Filter.atTop (nhds 0) := by + have h := (ENNReal.tendsto_toReal (show (0:ENNReal) β‰  ⊀ by simp)).comp h_sup_tendsto + rw [ENNReal.toReal_zero] at h + exact h + have h_W1_fin_curve : βˆ€ n, βˆ€ s ∈ Set.Icc (0 : ℝ) T, + wasserstein1 ((x n).extend s) (ρ_lim.extend s) β‰  ⊀ := by + intro n s hs + rw [he (x n) s hs, he ρ_lim s hs] + have := (x n).isProb s; have := ρ_lim.isProb s + exact wasserstein1_ne_top_of_finite_moment _ _ + ((x n).yIntegrable s hs) (ρ_lim.yIntegrable s hs) + have h_W1_bound_curve : βˆ€ n, βˆ€ s ∈ Set.Icc (0 : ℝ) T, + (wasserstein1 ((x n).extend s) (ρ_lim.extend s)).toReal ≀ Dn n := by + intro n s hs + rw [he (x n) s hs, he ρ_lim s hs] + exact ENNReal.toReal_mono (h_sup_ne_top n) + (wasserstein1_le_supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ s hs) + have h_term2 : βˆ€ n t, t ∈ Set.Icc (0 : ℝ) T β†’ + (wasserstein1 (Measure.map (fun z => charXs n t z) fβ‚€) + (Measure.map (fun z => charX t z) fβ‚€)).toReal ≀ Dn n * q := + fun n t ht => picardLimit_flow_pointwise_contraction gradW L hL fβ‚€ hfβ‚€_int hT + m hMbar_nn hMbar_mono (x n) ρ_lim (charXs n) (charVs n) charX charV + (h_flow n).1 (h_flow n).2.1 hflow_on_ρlim h_boundary_ρlim + (Dn n) (hDn_nn n) (h_W1_fin_curve n) (h_W1_bound_curve n) q hq_def t ht + intro t ht + rw [he ρ_lim t ht, h_marg t ht] + exact picardLimit_fixed_point_eq fβ‚€ m x ρ_lim charXs charX + (fun n t' ht' => (h_flow n).2.2 t' ht') h_tendsto + (fun n t' ht' => (hCI n).1 t' ht') (fun t' ht' => hCI_lim.1 t' ht') + (fun n t' ht' => (hCI n).2.2.1 t' ht') (fun t' ht' => hCI_lim.2.2.1 t' ht') + Dn q (by simpa using hDn_tendsto.mul_const q) h_term2 t ht + +/-- **Sub-helper for `vlasovWellPosedness_local`** β€” the Picard fixed-point +self-consistent flow. + +Given `fβ‚€ : Measure (PhaseSpace d)` with finite first moment, produces a +characteristic flow `(charX, charV)` whose **own pushforward's spatial +marginal** is the reference measure the flow is built against β€” i.e., the +Picard fixed point at the spatial-marginal-curve level: + + `ρ_t := spatialMarginal (Measure.map (z ↦ (charX t z, charV t z)) fβ‚€)` + `charX, charV solve the Vlasov ODE against this ρ`. + +The body carries the substantive Picard analysis: + +* M-fixed-point: pick a moment bound `M β‰₯ A/(1 - B)` where + `A = gronwallBound 1 (1+L) β€–gradW 0β€– T Β· (M_fβ‚€ + 1)` and + `B = L Β· (exp((1+L)Β·T) - 1)/(1+L) Β· (M_fβ‚€ + 1)`. Requires `B < 1`, + which is the genuine convergence criterion for the moment iteration + (stronger than the contraction predicate `LocalSmallnessContraction + L T` alone for large `M_fβ‚€` β€” the contraction predicate gates the q + factor; the M-fixed-point additionally requires the moment iteration + to converge). +* Picard sequence `x_n : β„• β†’ VlasovMeasureCurve d T M` starting from + `x_0 := constantCurve (spatialMarginal fβ‚€)` and `x_{n+1} := Phi_step(x_n)`. +* Contraction via `Phi_supW1_contraction`: `supW1On (Φρ) (Φσ) ≀ q Β· D` + with `q < 1`. Apply `picard_iterate_isCauchy_of_contraction` + + `picard_iterate_exists_limit` to get the W₁-limit + `ρ_lim : VlasovMeasureCurve d T M`. +* Self-consistency `Ξ¦(ρ_lim) = ρ_lim`: triangle through `x_n`. +* Apply `exists_vlasov_characteristicFlow_global_smallT` to `ρ_lim.extend` + to get the flow. + +**Metric-dependence note**. The convergence rests on two independent +predicates: +* `LocalSmallnessContraction L T := L Β· (exp((max 1 L)Β·T) - 1) / (max 1 L) < 1` + β€” exponential in T, from `Phi_supW1_contraction`'s W₁-based shape. +* `LocalSmallnessPLBuffer L T := L Β· TΒ² < 1` β€” quadratic, from + per-ball Picard-LindelΓΆf's ball geometry. + +These are genuinely independent (neither universally implies the other), so +each predicate matches its own sub-argument. + +Under the Wbar refactor (Dobrushin 1979, Β§5), both constraints become +linear-in-T and align: `LocalSmallnessContraction` reduces to +`Cβ‚‚(L)Β·T < 1`, and the single algebraic constraint then suffices and is +satisfiable for any `L > 0` by taking `T < 1/Cβ‚‚(L)`. + +**Output bundle** (designed to feed +`vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn` directly): + +* Flow `(charX, charV)` against the *spatial marginal of the pushforward* + β€” the load-bearing self-consistency conjunct. +* Boundary regularity. +* Uniform moment bound `M_ρ` on the spatial marginal trajectory. -/ +theorem vlasovWellPosedness_local_picard_fixedPointFlow + {d : β„•} [NeZero d] + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (hTL_PL : LocalSmallnessPLBuffer L T) + (hTL_con : LocalSmallnessContraction L T) + (hB : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T) - 1) < 1) : + βˆƒ (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (M_ρ : ℝ), 0 ≀ M_ρ ∧ + -- Self-consistent characteristic flow: against the spatial marginal + -- of its own phase-space pushforward. + IsCharacteristicFlowOn gradW + (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + charX charV (Set.Ioo 0 T) Set.univ ∧ + -- Boundary regularity: HasDerivWithinAt on `Icc 0 T` for every z and + -- t ∈ Icc 0 T. + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + (charX t z))) + (Set.Icc 0 T) t) ∧ + -- Uniform first-moment bound on the spatial-marginal trajectory. + (βˆ€ s ∈ Set.Icc (0 : ℝ) T, + ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) ≀ M_ρ) ∧ + -- First-moment integrability on the spatial-marginal trajectory. + (βˆ€ s ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) ∧ + -- Continuity of the convolution force in `x` (uniformly in `s`). + (βˆ€ s, Continuous (fun x => + convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) x)) ∧ + -- **AEMeasurable witness**, projected from the Picard fixed-point + -- construction's continuity-in-z β€” supplies the `h_aemeas` conjunct + -- in downstream `_finalAssembly_*`. + (βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) ∧ + -- **Universal-in-s convolution integrability**. For `s ∈ Icc 0 T` + -- follows from `h_y_int_ρ` + Lipschitz of `gradW`; the extension to + -- all `s` uses constant-extension (clamp) past T inside the Picard + -- construction. Supplies the `h_int_conv` conjunct in downstream + -- `_finalAssembly_*`. + (βˆ€ s (x : PhysSpace d), + Integrable (fun y => gradW (x - y)) + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) := by + -- ============================================================ + -- Step 1: Spatial marginal setup. + -- ΞΌβ‚€ := spatialMarginal fβ‚€ = Measure.map Prod.fst fβ‚€. + -- IsProbabilityMeasure ΞΌβ‚€ via Measure.isProbabilityMeasure_map. + -- Integrable β€–Β·β€– ΞΌβ‚€ from hfβ‚€_int via integral_map on Prod.fst. + -- ============================================================ + have hΞΌβ‚€_prob : IsProbabilityMeasure (spatialMarginal fβ‚€) := + (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + have hΞΌβ‚€_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal fβ‚€) := by + unfold spatialMarginal + rw [integrable_map_measure + (Continuous.aestronglyMeasurable continuous_norm) measurable_fst.aemeasurable] + -- Need: Integrable (β€–Β·β€– ∘ Prod.fst) fβ‚€ = Integrable (fun z => β€–z.1β€–) fβ‚€. + -- This follows from hfβ‚€_int (Integrable β€–Β·β€– fβ‚€) and β€–z.1β€– ≀ β€–zβ€–. + refine hfβ‚€_int.mono' ?_ (Filter.Eventually.of_forall fun z => ?_) + Β· exact (measurable_fst.norm.aestronglyMeasurable) + Β· simp only [Function.comp_def, Real.norm_of_nonneg (norm_nonneg _)] + exact (norm_fst_le z) + -- **F1 (phase-space anchor)**: `M_fβ‚€` is the *phase-space* first moment + -- `∫zβ€–zβ€–βˆ‚fβ‚€`, NOT the spatial marginal β€” matching `phi_moment_envelope_le`'s + -- (A.2) `integral_map` initial value, so the envelope dominates both the + -- pushforward moments (A.2) and the spatial base case (`βˆ«β€–xβ€–βˆ‚ΞΌβ‚€ ≀ M_fβ‚€`). + let M_fβ‚€ : ℝ := ∫ z : PhaseSpace d, β€–zβ€– βˆ‚fβ‚€ + have hM_fβ‚€_nn : 0 ≀ M_fβ‚€ := integral_nonneg (fun z => norm_nonneg z) + -- ============================================================ + -- Step 2: time-dependent moment envelope `m` (option 2, dissolving the + -- constant-`M` fixed-point). `gronwall_envelope_exists` (Piece A.3) under + -- `hB := B(T) < 1` yields a monotone `m` that is `Ξ¦`-invariant at the moment + -- level, so `Ξ¦ : space(m) β†’ space(m)` and the Picard sequence stays in one + -- fixed curve space. + -- ============================================================ + obtain ⟨m, hm_mono, hm_ge, hm_inv⟩ := + gronwall_envelope_exists M_fβ‚€ β€–gradW 0β€– hM_fβ‚€_nn (norm_nonneg _) L T hT.le hB + have hm_nn : βˆ€ t ∈ Set.Icc (0 : ℝ) T, 0 ≀ m t := + fun t ht => le_trans hM_fβ‚€_nn (hm_ge t ht) + have hMbar_nn : 0 ≀ m T := hm_nn T ⟨hT.le, le_refl T⟩ + have hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T := + fun t ht => hm_mono ht ⟨hT.le, le_refl T⟩ ht.2 + -- ============================================================ + -- Step 3: Convolution integrability for constantCurve. + -- For the base case x 0 = constantCurve ΞΌβ‚€, need h_int_ext: + -- βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) ((constantCurve ΞΌβ‚€).extend t). + -- This reduces to: Integrable (fun y => gradW (x - y)) ΞΌβ‚€, which follows + -- from hΞΌβ‚€_int + Lipschitz bound on gradW. + -- Integrability of gradW against ΞΌβ‚€. + -- ============================================================ + have h_int_gradW_ΞΌβ‚€ : βˆ€ (x_pt : PhysSpace d), + Integrable (fun y => gradW (x_pt - y)) (spatialMarginal fβ‚€) := + fun x_pt => integrable_gradW_shift gradW L hL (spatialMarginal fβ‚€) hΞΌβ‚€_int x_pt + -- ============================================================ + -- Step 4: Picard sequence + contraction bound. + -- The sequence x : β„• β†’ VlasovMeasureCurve d T M is built by Phi_step + + -- induction; the contraction estimate uses Phi_supW1_contraction applied + -- to consecutive iterates. + -- ============================================================ + -- `q` is the M-INDEPENDENT genuine contraction ratio (not 2MΒ·q_true). + -- `Phi_supW1_contraction` outputs `q Β· D` per step, so `q^k Β· Dβ‚€ = + -- q^k Β· (2M)` is the iterated contraction bound; the contraction factor + -- `q = gronwallBound 0 (max 1 L) L T = (L/(max 1 L)) Β· (exp((max 1 L)Β·T) - 1)` + -- is separated from the W₁-input bound `Dβ‚€ = 2M`. `hq_lt` closes by direct + -- citation of `hTL_con` (LocalSmallnessContraction) after one unfold. + let q : ℝ := gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T + have hq_nn : 0 ≀ q := by + have hK_nn : (0 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := NNReal.coe_nonneg _ + have hΞ΅_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg + have := gronwallBound_mono (Ξ΄ := (0 : ℝ)) (K := ((max 1 L : NNReal) : ℝ)) + (Ξ΅ := (L : ℝ)) (le_refl 0) hΞ΅_nn hK_nn hT.le + rw [gronwallBound_x0] at this; exact this + -- Direct citation: `LocalSmallnessContraction L T` IS `q < 1` after + -- unfolding both definitions. No local derivation; the named-lemma + -- pattern from the soundness-fix mechanism. + have hq_lt : q < 1 := hTL_con.gronwallBound_lt_one + -- Dβ‚€: initial supW1On bound = supW1On (x 0).ρ (x 1).ρ ≀ 2 * M. + let Dβ‚€ : ℝ := 2 * (m T) + have hDβ‚€_nn : 0 ≀ Dβ‚€ := by linarith [hMbar_nn] + -- Picard sequence + contraction, in the fixed envelope space `m`. The + -- recursion uses `Phi_step_envelope` per step + `Phi_supW1_contraction` + -- for the geometric bound. + -- **Enriched existential**: the Picard sequence exposes, per + -- step `k`, the flow `(charXs k, charVs k)` against `(x k).extend` β€” exactly + -- `Phi_step_envelope`'s output shape β€” plus the pushforward identity + -- `(x(k+1)).ρ t = map (charXs k t) fβ‚€`. Exposing the flows lets the + -- self-consistency proof (Step 8) feed them directly to `Phi_supW1_contraction`, + -- dissolving the (un-banked) ODE-uniqueness that re-deriving them would need. + have hΞΌβ‚€_int_fst : Integrable (fun z : PhaseSpace d => β€–z.1β€–) fβ‚€ := + hfβ‚€_int.mono' measurable_fst.norm.aestronglyMeasurable + (Filter.Eventually.of_forall fun z => by + rw [Real.norm_of_nonneg (norm_nonneg _)]; exact norm_fst_le z) + have hΞΌβ‚€_le_m : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + ∫ y, β€–yβ€– βˆ‚(spatialMarginal fβ‚€) ≀ m t := by + intro t ht + have h_eq : ∫ y, β€–yβ€– βˆ‚(spatialMarginal fβ‚€) = ∫ z, β€–z.1β€– βˆ‚fβ‚€ := by + unfold spatialMarginal + rw [integral_map measurable_fst.aemeasurable continuous_norm.aestronglyMeasurable] + have h_le : ∫ z, β€–z.1β€– βˆ‚fβ‚€ ≀ M_fβ‚€ := + integral_mono hΞΌβ‚€_int_fst hfβ‚€_int (fun z => norm_fst_le z) + rw [h_eq]; exact le_trans h_le (hm_ge t ht) + obtain ⟨x, charXs, charVs, h_contract, h_flow⟩ := + vlasovWellPosedness_local_picard_sequence W gradW hgradW L hL fβ‚€ hfβ‚€_int hT hTL_PL + m hm_mono hm_nn hm_inv hMbar_nn hMbar_mono hΞΌβ‚€_prob hΞΌβ‚€_int hΞΌβ‚€_le_m + q hq_nn rfl Dβ‚€ hDβ‚€_nn rfl + -- ============================================================ + -- Step 5: Extract limit ρ_lim via picard_iterate_exists_limit. + -- ============================================================ + obtain ⟨ρ_lim, h_tendsto⟩ := + picard_iterate_exists_limit x q hq_nn hq_lt Dβ‚€ hDβ‚€_nn h_contract + -- ============================================================ + -- Step 6: Convolution integrability for ρ_lim.extend. + -- Needed by exists_vlasov_characteristicFlow_global_smallT. + -- Integrability of gradW against ρ_lim.extend t. + -- ============================================================ + have h_int_ρ_lim : βˆ€ t (x_pt : PhysSpace d), + Integrable (fun y => gradW (x_pt - y)) (ρ_lim.extend t) := fun t x_pt => + integrable_gradW_shift gradW L hL (ρ_lim.extend t) + (VlasovMeasureCurve.extend_yIntegrable hT.le ρ_lim t) x_pt + -- Convolution continuity for ρ_lim.extend, universal in t. + -- Deduced from ρ_lim.extend_convCont + h_int_ρ_lim restricted to Icc 0 T. + have h_conv_cont_ρ_lim : βˆ€ x : PhysSpace d, + Continuous (fun t => convolveFunctionMeasure gradW (ρ_lim.extend t) x) := by + intro x_pt + have h_int_Icc : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y => gradW (x_pt - y)) (ρ_lim.ρ t) := by + intro t ht + have h_eq : ρ_lim.extend t = ρ_lim.ρ t := by + unfold VlasovMeasureCurve.extend clampToIcc + congr 1 + rw [min_eq_left ht.2, max_eq_right ht.1] + rw [← h_eq]; exact h_int_ρ_lim t x_pt + exact VlasovMeasureCurve.extend_convCont gradW L hL hT.le ρ_lim x_pt h_int_Icc + -- ============================================================ + -- Step 7: Flow construction via exists_vlasov_characteristicFlow_global_smallT. + -- Build (charX, charV) against ρ_lim.extend. + -- ============================================================ + obtain ⟨charX, charV, hflow_on_ρlim, h_boundary_ρlim⟩ := + exists_vlasov_characteristicFlow_global_smallT W gradW hgradW L hL + ρ_lim.extend h_int_ρ_lim h_conv_cont_ρ_lim + (fun t => VlasovMeasureCurve.extend_yIntegrable hT.le ρ_lim t) + (m T) hMbar_nn + (fun t => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le ρ_lim t) + (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t))) + T hT.le hTL_PL + -- ============================================================ + -- Step 8: Self-consistency. For t ∈ Icc 0 T, + -- ρ_lim.ρ t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t). + -- This is the Picard fixed-point equation: Phi charX fβ‚€ t = ρ_lim.ρ t, + -- proved by triangle through x n using contraction + tendsto. + -- ============================================================ + -- ============================================================ + -- Self-consistency on Icc 0 T. + -- For t ∈ Icc 0 T: + -- ρ_lim.extend t = ρ_lim.ρ t (by clampToIcc identity on Icc) + -- ρ_lim.ρ t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) + -- The second equality is the Picard fixed-point equation, proved by triangle + -- through x n using contraction + tendsto. + -- ============================================================ + have h_self_consist : βˆ€ t ∈ Set.Icc (0 : ℝ) T, + ρ_lim.extend t = + spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) := + -- Step 8 extracted as `picardLimit_self_consistency`; the let-bound `q`'s + -- defining equation is supplied by `rfl`. + picardLimit_self_consistency gradW L hL fβ‚€ hfβ‚€_int hT m hMbar_nn hMbar_mono + q hq_nn hq_lt rfl Dβ‚€ hDβ‚€_nn x charXs charVs h_contract h_flow + ρ_lim h_tendsto charX charV hflow_on_ρlim h_boundary_ρlim h_int_ρ_lim + -- ============================================================ + -- Step 9: Bundle with a CLAMPED flow `cX s := charX (clampToIcc T s)`. + -- + -- The raw flow from `exists_vlasov_characteristicFlow_global_smallT` is + -- controlled only on `[0, T]`; off-window it is uncontrolled + -- `Classical.choose` data with no growth bound. The conclusion's + -- universal-in-`s` conjuncts (convolution integrability + continuity-in-x + -- for ALL `s`) therefore cannot hold for the raw flow. We return instead + -- the clamped flow, whose pushforward at any `s` equals the on-window + -- pushforward at `clampToIcc T s ∈ [0, T]` β€” hence globally controlled. + -- On `[0, T]` the clamp is the identity (`clampToIcc T s = s`), so every + -- window conjunct (flow ODE on Ioo, boundary on Icc, moment, integrability) + -- transfers from the raw flow via `clampToIcc`-congruence. + -- ============================================================ + exact picardFlow_clamp_bundle gradW L hL fβ‚€ hT m hMbar_nn hMbar_mono ρ_lim + charX charV hflow_on_ρlim h_boundary_ρlim h_int_ρ_lim h_self_consist + +/-- **Sub-helper for `vlasovWellPosedness_local`** β€” moment-bound transport. + +Given the Picard fixed-point flow's bundle (from +`_picard_fixedPointFlow`), produces `HasFiniteFirstMoment (f t)` for +`t ∈ Icc 0 T`, where `f := vlasovSolutionViaPushforward charX charV fβ‚€`. + +**Proof strategy**: + +1. Boundary transport: extract `h_init / h_cont_Icc / h_deriv_Ico` from + `hflow_on + h_boundary` via `characteristicFlow_boundary_regularity`. +2. `flow_distance_growth_bound_on` applied to `(charX, charV)` produces + the growth constant `C_T` with `β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1)`. +3. Probability of `f t = Measure.map (z ↦ (charX t z, charV t z)) fβ‚€` from + the AEMeasurable witness. +4. Integrable `β€–Β·β€–` on `f t`: via `integrable_map_measure` + growth bound + + `Integrable β€–Β·β€– fβ‚€`. + +Factored out to keep `vlasovWellPosedness_local`'s body a clean glue. -/ +theorem vlasovWellPosedness_local_moment + {d : β„•} + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (_hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (_hTL_PL : LocalSmallnessPLBuffer L T) + (_hTL_con : LocalSmallnessContraction L T) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) + (hflow_on : IsCharacteristicFlowOn gradW + (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + charX charV (Set.Ioo 0 T) Set.univ) + (h_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + (charX t z))) + (Set.Icc 0 T) t) + (hM_ρ_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) ≀ M_ρ) + (h_y_int_ρ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) + (_hconv_cont : βˆ€ s, Continuous (fun x => + convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) x)) + -- Passed from `_picard_fixedPointFlow`'s enriched output: the + -- AEMeasurable witness + universal-in-s convolution integrability. + (h_aemeas : βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) + (h_int_conv : βˆ€ s (x : PhysSpace d), + Integrable (fun y => gradW (x - y)) + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) + (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : + HasFiniteFirstMoment (vlasovSolutionViaPushforward charX charV fβ‚€ t) := by + -- IsProbabilityMeasure for the spatial marginal (needed for the flow typeclass). + -- spatialMarginal ΞΌ = Measure.map Prod.fst ΞΌ, so IsProbabilityMeasure_map needs + -- AEMeasurable Prod.fst (Measure.map ... fβ‚€). Since Prod.fst is measurable, + -- it is AEMeasurable wrt any measure. + have hρ_prob : βˆ€ s, IsProbabilityMeasure + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) := by + intro s + unfold spatialMarginal vlasovSolutionViaPushforward + -- Need IsProbabilityMeasure (Measure.map Prod.fst (Measure.map (fun z => ...) fβ‚€)) + -- Use Measure.map_map to compose, then isProbabilityMeasure_map_iff on the composition. + have h_aemeas_pair : AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€ := + h_aemeas s + have h_prob_inner : IsProbabilityMeasure + (Measure.map (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) := + (Measure.isProbabilityMeasure_map_iff h_aemeas_pair).mpr inferInstance + exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + -- Step 1: Extract h_init, h_cont_Icc, h_deriv_Ico via boundary transport. + obtain ⟨h_init, h_cont_Icc, h_deriv_Ico⟩ := + characteristicFlow_boundary_regularity gradW + (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + charX charV T hT.le hflow_on h_boundary + -- Step 2: Growth bound from flow_distance_growth_bound_on. + obtain ⟨C_T, hC_T_nn, h_growth⟩ := + flow_distance_growth_bound_on gradW L hL + (fun s => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) + charX charV T hT.le + h_init h_cont_Icc h_deriv_Ico + M_ρ hM_ρ_nn hM_ρ_bound h_y_int_ρ h_int_conv + -- Step 3: Conclude HasFiniteFirstMoment. + unfold HasFiniteFirstMoment vlasovSolutionViaPushforward + refine ⟨(Measure.isProbabilityMeasure_map_iff (h_aemeas t)).mpr inferInstance, ?_⟩ + -- Integrable β€–Β·β€– wrt Measure.map (fun z => (charX t z, charV t z)) fβ‚€. + rw [integrable_map_measure + (Continuous.aestronglyMeasurable continuous_norm) (h_aemeas t)] + -- Now need: Integrable (fun z : PhaseSpace d => β€–(charX t z, charV t z)β€–) fβ‚€. + have h_dom_int : Integrable (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) fβ‚€ := by + have h1 : Integrable (fun z : PhaseSpace d => C_T * β€–zβ€–) fβ‚€ := + hfβ‚€_int.const_mul C_T + have h2 : Integrable (fun _ : PhaseSpace d => C_T) fβ‚€ := integrable_const _ + have h_eq : (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) = + fun z => C_T * β€–zβ€– + C_T := by funext z; ring + rw [h_eq]; exact h1.add h2 + -- The goal after rw is: Integrable (β€–Β·β€– ∘ fun z => (charX t z, charV t z)) fβ‚€ + -- = Integrable (fun z => β€–(charX t z, charV t z)β€–) fβ‚€. + -- Dominator: C_T * (β€–zβ€– + 1); AE bound from h_growth. + have h_norm_aesm : AEStronglyMeasurable + (fun z : PhaseSpace d => β€–(charX t z, charV t z)β€–) fβ‚€ := + (h_aemeas t).norm.aestronglyMeasurable + refine h_dom_int.mono' ?_ (Filter.Eventually.of_forall fun z => ?_) + Β· -- AEStronglyMeasurable of β€–Β·β€– ∘ (charX t, charV t). + -- After integrable_map_measure rewrite, goal is for the composition form. + convert h_norm_aesm using 1 + rfl + Β· -- Pointwise bound: β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1). + -- The norm in the goal is β€–(β€–Β·β€– ∘ ...)(z)β€– = β€–β€–(charX t z, charV t z)β€–β€–. + simp only [Function.comp_def, Real.norm_of_nonneg (norm_nonneg _)] + exact h_growth t ht z + +/-- **Sub-helper for `vlasovWellPosedness_local`** β€” IsLagrangianVlasovSolutionOn +threading. + +Given the Picard fixed-point flow's bundle (from +`_picard_fixedPointFlow`), produces the +`IsLagrangianVlasovSolutionOn gradW f T` conjunct via the 20-hypothesis +threading through +`vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. + +**Proof strategy**: + +1. Boundary transport: extract `h_init / h_cont_Icc / h_deriv_Ico`. +2. Universal-in-`s` convolution integrability (handling `s` outside + `[0, T]` via the clamp-extension argument). +3. AEMeasurable witness. +4. `IsCharacteristicFlowSelfConsistent`: `βˆ€ t, ρ_lim t = Ξ¦ charX fβ‚€ t`, + which expands by definition since `ρ_lim = spatialMarginal ∘ f` and + `f = vlasovSolutionViaPushforward charX charV fβ‚€`; spatial marginal + of pushforward = pushforward under `Prod.fst ∘ ...` = `Ξ¦ charX fβ‚€`. + The composition is the `Measure.map_map`-with-AEMeasurable bridge. +5. Continuity of `gradW`: `hL.continuous`. +6. Probability instance of `spatialMarginal ∘ f`: derived from + AEMeasurable + IsProbabilityMeasure fβ‚€. +7. Final invocation: `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn` + with the full hypothesis bundle. + +Factored out to keep `vlasovWellPosedness_local`'s body a clean glue. -/ +theorem vlasovWellPosedness_local_isLagrangian + {d : β„•} + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (_hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] + (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) + {T : ℝ} (hT : 0 < T) + (_hTL_PL : LocalSmallnessPLBuffer L T) + (_hTL_con : LocalSmallnessContraction L T) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) + (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) + (hflow_on : IsCharacteristicFlowOn gradW + (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + charX charV (Set.Ioo 0 T) Set.univ) + (h_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + (charX t z))) + (Set.Icc 0 T) t) + (hM_ρ_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) ≀ M_ρ) + (h_y_int_ρ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, + Integrable (fun y : PhysSpace d => β€–yβ€–) + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) + (hconv_cont : βˆ€ s, Continuous (fun x => + convolveFunctionMeasure gradW + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) x)) + -- Passed from `_picard_fixedPointFlow`'s enriched output: the + -- AEMeasurable witness + universal-in-s convolution integrability. + (h_aemeas : βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) + (h_int_conv : βˆ€ s (x : PhysSpace d), + Integrable (fun y => gradW (x - y)) + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) : + IsLagrangianVlasovSolutionOn gradW + (vlasovSolutionViaPushforward charX charV fβ‚€) T := by + -- IsProbabilityMeasure for the spatial marginal (needed for the target typeclass). + have hρ_prob : βˆ€ s, IsProbabilityMeasure + (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) := by + intro s + unfold spatialMarginal vlasovSolutionViaPushforward + have h_aemeas_pair : AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€ := + h_aemeas s + have _h_prob_inner : IsProbabilityMeasure + (Measure.map (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) := + (Measure.isProbabilityMeasure_map_iff h_aemeas_pair).mpr inferInstance + exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + -- Step 1: Extract h_init, h_cont_Icc, h_deriv_Ico via boundary transport. + obtain ⟨h_init, h_cont_Icc, h_deriv_Ico⟩ := + characteristicFlow_boundary_regularity gradW + (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) + charX charV T hT.le hflow_on h_boundary + -- Step 2: IsCharacteristicFlowSelfConsistent + -- ρ t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) + -- = Measure.map Prod.fst (Measure.map (fun z => (charX t z, charV t z)) fβ‚€) + -- = Measure.map (Prod.fst ∘ fun z => (charX t z, charV t z)) fβ‚€ + -- [by map_map_of_aemeasurable] + -- = Measure.map (charX t) fβ‚€ + have hself : IsCharacteristicFlowSelfConsistent charX fβ‚€ + (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) := by + intro t + simp only [] + unfold spatialMarginal vlasovSolutionViaPushforward + -- Goal: Measure.map Prod.fst (Measure.map (fun z => (charX t z, charV t z)) fβ‚€) + -- = Measure.map (fun z => charX t z) fβ‚€ + have h_comp : Measure.map Prod.fst + (Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) fβ‚€) = + Measure.map (Prod.fst ∘ fun z : PhaseSpace d => (charX t z, charV t z)) fβ‚€ := by + apply AEMeasurable.map_map_of_aemeasurable + Β· exact measurable_fst.aemeasurable + Β· exact h_aemeas t + rw [h_comp]; congr 1 + -- Step 3: Apply the main threading theorem. + exact vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn + gradW L hL charX charV fβ‚€ hfβ‚€_int hT + hflow_on h_init h_cont_Icc h_deriv_Ico + M_ρ hM_ρ_nn hM_ρ_bound h_y_int_ρ h_int_conv + hself h_aemeas hL.continuous hconv_cont + +/-- **Local existence of a Vlasov solution on `[0, T]`.** + +Under the joint constraint `LocalSmallnessPLBuffer L T` (`L Β· TΒ² < 1`) + +`LocalSmallnessContraction L T`, produces a local-time Vlasov solution +`f : ℝ β†’ Measure (PhaseSpace d)` on `[0, T]` satisfying initial +condition + local finite first moment + `IsLagrangianVlasovSolutionOn`. + +The forward-iteration continuation extends from local `T` to arbitrary +`T_target` via **fixed-`T_0`** iteration: the contraction time `T_0` +depends only on `L` (not on the moment bound `M_n` propagating through +iterations), because `Phi_supW1_contraction`'s `q` is +`gronwallBound 0 (max 1 L) (L Β· D) T` β€” independent of `M_n`. So the +continuation iterates `[0, T_0], [T_0, 2 T_0], …` with constant step `T_0`, +reaching any `T_target` in `⌈T_target / T_0βŒ‰` windows; gluing then bridges +from `IsLagrangianVlasovSolutionOn` (local) to `IsLagrangianVlasovSolution` +(global). + +**Proof strategy**: + +1. Initial spatial marginal: `ΞΌβ‚€ := spatialMarginal fβ‚€`. By + `HasFiniteFirstMoment fβ‚€`, `ΞΌβ‚€` is a probability measure with + `Integrable β€–Β·β€–`. Let `M_fβ‚€ := ∫ β€–zβ€– βˆ‚fβ‚€` (finite by + `hfβ‚€.2.integral_norm_le`). + +2. Picard sequence on spatial marginals: + - `ρ_0 := constantCurve ΞΌβ‚€`. + - `ρ_{n+1}` obtained via `Phi_step` applied to `ρ_n`'s flow. + + Each `ρ_n` lives in `VlasovMeasureCurve d T M` for an appropriate + `M` chosen so that the growth bound from + `flow_distance_growth_bound_on` stays within `M` across iterations + (the M-preservation constraint). + +3. Contraction estimate via `Phi_supW1_contraction`: + `supW1On (ρ_n.ρ) (ρ_{n+1}.ρ) ≀ ENNReal.ofReal (q^n * Dβ‚€)` + for `q := gronwallBound 0 (max 1 L) (L Β· D) T < 1` (since `T` is + small enough per the joint constraint). + +4. Apply `picard_iterate_isCauchy_of_contraction` to get the ENNReal-form + Cauchy condition on the `supW1On` pseudodistance. + +5. Apply `picard_iterate_exists_limit` to extract the + limit `ρ_lim : VlasovMeasureCurve d T M` plus pointwise W₁-tendsto. + +6. Self-consistency `Ξ¦(ρ_lim) = ρ_lim`: triangle through `ρ_n` using + the uniform-tendsto helper, contraction, and pointwise tendsto. + +7. Apply `exists_vlasov_characteristicFlow_global_smallT` + to `ρ_lim.extend` to get the characteristic flow `(charX, charV)` + against the self-consistent limit. + +8. Define `f := vlasovSolutionViaPushforward charX charV fβ‚€`. Verify: + - `f 0 = fβ‚€` (from `IsCharacteristicFlowOn`'s initial-condition + clause + `Measure.map_id`). + - `HasFiniteFirstMoment (f t)` on `[0, T]` (from + `flow_distance_growth_bound_on` applied to `(charX, charV)` + + `hfβ‚€.2`). + - `IsLagrangianVlasovSolutionOn gradW f T` via + `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. + +The body invokes `vlasovWellPosedness_local_picard_fixedPointFlow` for the +Picard fixed-point flow, then `vlasovWellPosedness_local_finalAssembly_*` +for the moment and Lagrangian conjuncts, deriving `f 0 = fβ‚€` inline. -/ +theorem vlasovWellPosedness_local + {d : β„•} [NeZero d] + (W : PhysSpace d β†’ ℝ) + (gradW : PhysSpace d β†’ PhysSpace d) + (hgradW : βˆ€ x, gradW x = gradient W x) + (L : NNReal) (hL : LipschitzWith L gradW) + (fβ‚€ : Measure (PhaseSpace d)) + (hfβ‚€ : HasFiniteFirstMoment fβ‚€) + {T : ℝ} (hT : 0 < T) + (hTL_PL : LocalSmallnessPLBuffer L T) + (hTL_con : LocalSmallnessContraction L T) + (hB : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T) - 1) < 1) : + βˆƒ (f : ℝ β†’ Measure (PhaseSpace d)) + (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), + f 0 = fβ‚€ ∧ + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) ∧ + -- FLAT (window-constant) uniform first-moment bound on the spatial marginal. + (βˆƒ M : ℝ, 0 ≀ M ∧ + βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M) ∧ + IsLagrangianVlasovSolutionOn gradW f T ∧ + -- Explicit flow bundle: pushforward, AEMeasurable, and boundary derivatives. + -- These use the SAME charX charV as the outer βˆƒ (not the hidden witnesses + -- inside IsLagrangianVlasovSolutionOn), enabling downstream consumers to + -- use them without witness-identity issues. + (βˆ€ t ∈ Set.Icc (0 : ℝ) T, + f t = Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) (f 0)) ∧ + (βˆ€ s ∈ Set.Icc (0 : ℝ) T, + AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) (f 0)) ∧ + (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, + HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ + HasDerivWithinAt (fun s => charV s z) + (-(convolveFunctionMeasure gradW (spatialMarginal (f t)) (charX t z))) + (Set.Icc 0 T) t) ∧ + -- Initial condition for the outer charX charV (same witnesses as boundary bundle above). + (βˆ€ z : PhaseSpace d, charX 0 z = z.1 ∧ charV 0 z = z.2) := by + -- The body is decomposed into two sub-helpers plus an inline glue: + -- * `vlasovWellPosedness_local_picard_fixedPointFlow` carries the Picard + -- mathematics β€” spatial-marginal setup, the Picard sequence via + -- `Phi_step`, the contraction estimate via `Phi_supW1_contraction`, + -- the limit via `picard_iterate_exists_limit`, + -- self-consistency `Ξ¦(ρ_lim) = ρ_lim`, and the flow construction via + -- `exists_vlasov_characteristicFlow_global_smallT`. + -- * `vlasovWellPosedness_local_finalAssembly_*` thread the moment and + -- `IsLagrangianVlasovSolutionOn` conjuncts through + -- `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. + -- * This body invokes both, derives `f 0 = fβ‚€` inline, and assembles. + obtain ⟨hfβ‚€_prob, hfβ‚€_int⟩ := hfβ‚€ + have : IsProbabilityMeasure fβ‚€ := hfβ‚€_prob + -- Sub-helper invocation: produces the self-consistent flow + regularity + -- + AEMeasurable witness + universal-in-s convolution integrability. + obtain ⟨charX, charV, _M_ρ, _hM_ρ_nn, _hflow_on, _h_boundary, + _hM_ρ_bound, _h_y_int_ρ, _hconv_cont, _h_aemeas, _h_int_conv⟩ := + vlasovWellPosedness_local_picard_fixedPointFlow W gradW hgradW L hL + fβ‚€ hfβ‚€_int hT hTL_PL hTL_con hB + -- Bundle the f-shape result. + refine ⟨vlasovSolutionViaPushforward charX charV fβ‚€, charX, charV, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ + Β· -- (a) f 0 = fβ‚€. The flow's initial-condition clause gives + -- (charX 0 z, charV 0 z) = z for every z, so the pushforward at t = 0 + -- is `Measure.map id fβ‚€ = fβ‚€`. Proved inline via the sub-helper's + -- initial-condition projection at t = 0. + have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := by + intro z + have := (_hflow_on.1 z (Set.mem_univ z)) + exact Prod.ext this.1 this.2 + change vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€ + unfold vlasovSolutionViaPushforward + have h_at_0 : (fun z : PhaseSpace d => (charX 0 z, charV 0 z)) = id := by + funext z; exact h_init z + rw [h_at_0, Measure.map_id] + Β· -- (b) HasFiniteFirstMoment (f t) on Icc 0 T. Deferred to the + -- _finalAssembly sub-helper (since it requires C_T from + -- flow_distance_growth_bound_on, plus the integral_map + + -- pushforward-moment-bound chain β€” exactly the threading work that + -- the _finalAssembly sub-helper handles). + intro t ht + exact vlasovWellPosedness_local_moment W gradW hgradW L hL + fβ‚€ hfβ‚€_int hT hTL_PL hTL_con charX charV + _M_ρ _hM_ρ_nn _hflow_on _h_boundary _hM_ρ_bound _h_y_int_ρ _hconv_cont + _h_aemeas _h_int_conv + t ht + Β· -- (bβ€²) FLAT uniform first-moment bound on the spatial marginal. + -- The picard fixed-point flow already exposes exactly this bound + -- (`_hM_ρ_bound`) for `M_ρ := _M_ρ` against + -- `spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ Β·)`, + -- which is `spatialMarginal (f Β·)` by definition of `f` here. + exact ⟨_M_ρ, _hM_ρ_nn, _hM_ρ_bound⟩ + Β· -- (c) IsLagrangianVlasovSolutionOn gradW f T. Handled by the + -- _finalAssembly sub-helper: it derives the AEMeasurable witness, the + -- IsCharacteristicFlowSelfConsistent discharge, the universal-in-s + -- convolution integrability (extension of `_hconv_cont`'s implications), + -- and threads all the hypotheses through + -- `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. + exact vlasovWellPosedness_local_isLagrangian W gradW hgradW L hL + fβ‚€ hfβ‚€_int hT hTL_PL hTL_con charX charV + _M_ρ _hM_ρ_nn _hflow_on _h_boundary _hM_ρ_bound _h_y_int_ρ _hconv_cont + _h_aemeas _h_int_conv + Β· -- (d) Explicit pushforward equation for the outer charX charV. + -- vlasovSolutionViaPushforward charX charV fβ‚€ t = Measure.map (charX t, charV t) fβ‚€ + -- by DEFINITION. And f 0 = fβ‚€ (from goal (a), which used the initial condition). + -- So f t = Measure.map (charX t, charV t) (f 0) by congruence on f 0 = fβ‚€. + have h_f0_eq : vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€ := by + have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := + fun z => Prod.ext (_hflow_on.1 z (Set.mem_univ z)).1 (_hflow_on.1 z (Set.mem_univ z)).2 + simp [vlasovSolutionViaPushforward, + show (fun z : PhaseSpace d => (charX 0 z, charV 0 z)) = id from funext h_init] + intro t _ + show vlasovSolutionViaPushforward charX charV fβ‚€ t = + Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) + (vlasovSolutionViaPushforward charX charV fβ‚€ 0) + rw [h_f0_eq] + -- After rw, goal is: vlasovSolutionViaPushforward charX charV fβ‚€ t = Measure.map ... fβ‚€ + -- This is rfl by definition of vlasovSolutionViaPushforward. + rfl + Β· -- (e) Explicit AEMeasurable for the outer charX charV. + -- AEMeasurable (fun z => (charX s z, charV s z)) fβ‚€ comes from _h_aemeas. + -- The expected type uses (f 0) = vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€. + have h_f0_eq : vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€ := by + have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := + fun z => Prod.ext (_hflow_on.1 z (Set.mem_univ z)).1 (_hflow_on.1 z (Set.mem_univ z)).2 + simp [vlasovSolutionViaPushforward, + show (fun z : PhaseSpace d => (charX 0 z, charV 0 z)) = id from funext h_init] + intro s _ + rw [h_f0_eq] + exact _h_aemeas s + Β· -- (f) Boundary regularity bundle: HasDerivWithinAt on Icc 0 T for all z, t. + -- Directly from `_h_boundary` (the picard fixed-point flow's boundary output). + -- The measure in the velocity derivative uses spatialMarginal (f t) where + -- f = vlasovSolutionViaPushforward charX charV fβ‚€, which is the same as + -- what _h_boundary was built against. + exact _h_boundary + Β· -- (g) Initial condition for the outer charX charV witnesses. + -- From _hflow_on.1 (IsCharacteristicFlowOn's first conjunct). + intro z + exact _hflow_on.1 z (Set.mem_univ z) + +end Vlasov diff --git a/LeanPool/Vlasov/OT/TestApproximation.lean b/LeanPool/Vlasov/OT/TestApproximation.lean new file mode 100644 index 0000000000..532e7a4969 --- /dev/null +++ b/LeanPool/Vlasov/OT/TestApproximation.lean @@ -0,0 +1,715 @@ +/- +Copyright (c) 2026 Joseph K. Miller. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joseph K. Miller +-/ +module + +public import LeanPool.Vlasov.OT.CharacteristicFlow +public import Mathlib.Analysis.Calculus.BumpFunction.FiniteDimension +public import Mathlib.Analysis.Calculus.BumpFunction.Normed +import Mathlib.Algebra.Order.Ring.Star +import Mathlib.Analysis.Calculus.BumpFunction.Convolution + +/-! +# Compactly supported test approximation for weak Vlasov solutions + +Mollification converges together with its first derivative. These estimates extend +the weak equation to compactly supported CΒΉ tests, independently of flow inversion. +-/ + +@[expose] public section + +namespace Vlasov + +open MeasureTheory + +variable {d : β„•} [NeZero d] + +open Filter Topology Metric in +open scoped Convolution in +omit [NeZero d] in +/-- Helper 1 β€” uniform mollification of a continuous, compactly-supported function. +The mollified family `ρ_n ⋆ g` converges to `g` **uniformly** (not just pointwise), the +load-bearing analytic input the `CΒΉ_c` test-class enlargement (#4) needs. Proof: uniform +continuity of `g` (compact support) gives a single `Ξ΄`; once `rOut_n < Ξ΄`, the pointwise bump +estimate `dist_normed_convolution_le` fires at *every* base point simultaneously. -/ +theorem mollifier_tendstoUniformly {E : Type*} + [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] + (g : PhaseSpace d β†’ E) (hg_cont : Continuous g) (hg_cs : HasCompactSupport g) + (Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d)) + (hΟ† : Tendsto (fun n => (Ο† n).rOut) atTop (𝓝 0)) : + TendstoUniformly + (fun n x => ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g) x) g atTop := by + have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by + rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from + Measure.volume_eq_prod _ _] + infer_instance + have hg_uc : UniformContinuous g := hg_cs.uniformContinuous_of_continuous hg_cont + rw [Metric.uniformContinuous_iff] at hg_uc + rw [Metric.tendstoUniformly_iff] + intro Ξ΅ hΞ΅ + obtain ⟨δ, hΞ΄, hΞ΄_prop⟩ := hg_uc (Ξ΅ / 2) (by positivity) + have hev : βˆ€αΆ  n in atTop, (Ο† n).rOut < Ξ΄ := hΟ†.eventually (Iio_mem_nhds hΞ΄) + filter_upwards [hev] with n hn + intro xβ‚€ + rw [dist_comm] + have hball : βˆ€ x ∈ ball xβ‚€ (Ο† n).rOut, dist (g x) (g xβ‚€) ≀ Ξ΅ / 2 := by + intro x hx + exact le_of_lt (hΞ΄_prop (lt_trans (mem_ball.mp hx) hn)) + have hbump := ContDiffBump.dist_normed_convolution_le (ΞΌ := volume) (Ο† := Ο† n) (g := g) + hg_cont.aestronglyMeasurable hball + exact lt_of_le_of_lt hbump (half_lt_self hΞ΅) + +open Filter Topology Metric in +open scoped Convolution in +omit [NeZero d] in +/-- Helper 2 β€” the mollified FrΓ©chet derivative converges uniformly. +`fderiv (ρ_n ⋆ Ο‡) = ρ_n ⋆ (fderiv Ο‡)` (convolution commutes onto the `CΒΉ` factor via +`HasCompactSupport.hasFDerivAt_convolution_right`, with `precompR` reconciled to `lsmul` on the +operator codomain), and the right-hand side converges uniformly to `fderiv Ο‡` by Helper 1 applied +to the continuous, compactly-supported `fderiv Ο‡`. -/ +theorem mollifiedFDeriv_tendstoUniformly + (Ο‡ : PhaseSpace d β†’ ℝ) (hΟ‡_C1 : ContDiff ℝ 1 Ο‡) (hΟ‡c : HasCompactSupport Ο‡) + (Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d)) + (hΟ† : Tendsto (fun n => (Ο† n).rOut) atTop (𝓝 0)) : + TendstoUniformly + (fun n z => fderiv ℝ ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡) z) + (fderiv ℝ Ο‡) atTop := by + have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by + rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from + Measure.volume_eq_prod _ _] + infer_instance + have hdf_cont : Continuous (fderiv ℝ Ο‡) := hΟ‡_C1.continuous_fderiv one_ne_zero + have hdf_cs : HasCompactSupport (fderiv ℝ Ο‡) := hΟ‡c.fderiv ℝ + -- the `precompR` bilinear map coincides with `lsmul` on the operator codomain + have hbridge : (ContinuousLinearMap.lsmul ℝ ℝ).precompR (PhaseSpace d) + = (ContinuousLinearMap.lsmul ℝ ℝ : + ℝ β†’L[ℝ] (PhaseSpace d β†’L[ℝ] ℝ) β†’L[ℝ] (PhaseSpace d β†’L[ℝ] ℝ)) := by + refine ContinuousLinearMap.ext fun u => ?_ + refine ContinuousLinearMap.ext fun v => ?_ + refine ContinuousLinearMap.ext fun x => ?_ + simp [ContinuousLinearMap.precompR_apply, ContinuousLinearMap.lsmul_apply] + have hfd : βˆ€ n, (fun z => fderiv ℝ + ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡) z) + = (fun z => ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fderiv ℝ Ο‡) z) := by + intro n + funext z + rw [(hΟ‡c.hasFDerivAt_convolution_right (L := ContinuousLinearMap.lsmul ℝ ℝ) + ((Ο† n).continuous_normed.locallyIntegrable) hΟ‡_C1 z).fderiv, hbridge] + have hgoal_eq : + (fun n z => fderiv ℝ ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡) z) + = (fun n z => + ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fderiv ℝ Ο‡) z) := by + funext n; exact hfd n + rw [hgoal_eq] + exact mollifier_tendstoUniformly (fderiv ℝ Ο‡) hdf_cont hdf_cs Ο† hΟ† + +-- ── Helpers for `weakEvolution_test_C1c_On`, extracted from its proof body (the +-- mathematical content is unchanged; each piece is generic in the test function). ── + +omit [NeZero d] in +/-- Norm bound for the dual-composed difference of two FrΓ©chet derivatives. -/ +lemma toDualSymm_comp_sub_norm_le (ψ Ο• : PhaseSpace d β†’ ℝ) + (z : PhaseSpace d) (e : PhysSpace d β†’L[ℝ] PhaseSpace d) : + β€–(InnerProductSpace.toDual ℝ (PhysSpace d)).symm ((fderiv ℝ ψ z).comp e) + - (InnerProductSpace.toDual ℝ (PhysSpace d)).symm ((fderiv ℝ Ο• z).comp e)β€– + ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * β€–eβ€– := by + rw [← map_sub, LinearIsometryEquiv.norm_map, ← ContinuousLinearMap.sub_comp] + exact ContinuousLinearMap.opNorm_comp_le _ _ + +omit [NeZero d] in +/-- Chain rule: the FrΓ©chet derivative of an `x`-slice is the composition with `inl`. -/ +lemma fderiv_slice_fst (ψ : PhaseSpace d β†’ ℝ) (hψ : Differentiable ℝ ψ) (z : PhaseSpace d) : + fderiv ℝ (fun x => ψ (x, z.2)) z.1 + = (fderiv ℝ ψ z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := by + have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) + (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := + hasFDerivAt_prodMk_left z.1 z.2 + exact ((hψ z).hasFDerivAt.comp z.1 h2).fderiv + +omit [NeZero d] in +/-- Chain rule: the FrΓ©chet derivative of a `v`-slice is the composition with `inr`. -/ +lemma fderiv_slice_snd (ψ : PhaseSpace d β†’ ℝ) (hψ : Differentiable ℝ ψ) (z : PhaseSpace d) : + fderiv ℝ (fun v => ψ (z.1, v)) z.2 + = (fderiv ℝ ψ z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := by + have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := + hasFDerivAt_prodMk_right z.1 z.2 + exact ((hψ z).hasFDerivAt.comp z.2 h2).fderiv + +omit [NeZero d] in +/-- Continuity of the first-slot partial-gradient field of a `CΒΉ` test function. -/ +lemma continuous_gradientSlice_fst (ψ : PhaseSpace d β†’ ℝ) (g : PhaseSpace d β†’ PhysSpace d) + (hψ : Differentiable ℝ ψ) (hψ' : Continuous (fderiv ℝ ψ)) + (hg : βˆ€ z, g z = gradient (fun x => ψ (x, z.2)) z.1) : Continuous g := by + have heq : g = fun z => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm + ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))) := by + funext z; rw [hg z]; simp only [gradient]; rw [fderiv_slice_fst ψ hψ z] + rw [heq] + exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp + (hψ'.clm_comp continuous_const) + +omit [NeZero d] in +/-- Continuity of the second-slot partial-gradient field of a `CΒΉ` test function. -/ +lemma continuous_gradientSlice_snd (ψ : PhaseSpace d β†’ ℝ) (g : PhaseSpace d β†’ PhysSpace d) + (hψ : Differentiable ℝ ψ) (hψ' : Continuous (fderiv ℝ ψ)) + (hg : βˆ€ z, g z = gradient (fun v => ψ (z.1, v)) z.2) : Continuous g := by + have heq : g = fun z => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm + ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))) := by + funext z; rw [hg z]; simp only [gradient]; rw [fderiv_slice_snd ψ hψ z] + rw [heq] + exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp + (hψ'.clm_comp continuous_const) + +omit [NeZero d] in +/-- Compact support of the first-slot partial-gradient field. -/ +lemma hasCompactSupport_gradientSlice_fst (ψ : PhaseSpace d β†’ ℝ) + (g : PhaseSpace d β†’ PhysSpace d) (hψ : Differentiable ℝ ψ) (hψcs : HasCompactSupport ψ) + (hg : βˆ€ z, g z = gradient (fun x => ψ (x, z.2)) z.1) : HasCompactSupport g := by + apply HasCompactSupport.intro hψcs + intro z hz + have hf0 : fderiv ℝ ψ z = 0 := fderiv_of_notMem_tsupport ℝ hz + rw [hg z]; simp only [gradient]; rw [fderiv_slice_fst ψ hψ z, hf0]; simp + +omit [NeZero d] in +/-- Compact support of the second-slot partial-gradient field. -/ +lemma hasCompactSupport_gradientSlice_snd (ψ : PhaseSpace d β†’ ℝ) + (g : PhaseSpace d β†’ PhysSpace d) (hψ : Differentiable ℝ ψ) (hψcs : HasCompactSupport ψ) + (hg : βˆ€ z, g z = gradient (fun v => ψ (z.1, v)) z.2) : HasCompactSupport g := by + apply HasCompactSupport.intro hψcs + intro z hz + have hf0 : fderiv ℝ ψ z = 0 := fderiv_of_notMem_tsupport ℝ hz + rw [hg z]; simp only [gradient]; rw [fderiv_slice_snd ψ hψ z, hf0]; simp + +omit [NeZero d] in +/-- First-slot partial gradients of two tests differ by at most the full +FrΓ©chet-derivative difference. -/ +lemma gradientSlice_fst_sub_norm_le (ψ Ο• : PhaseSpace d β†’ ℝ) + (hψ : Differentiable ℝ ψ) (hΟ• : Differentiable ℝ Ο•) + (gψ gΟ• : PhaseSpace d β†’ PhysSpace d) + (hgψ : βˆ€ z, gψ z = gradient (fun x => ψ (x, z.2)) z.1) + (hgΟ• : βˆ€ z, gΟ• z = gradient (fun x => Ο• (x, z.2)) z.1) (z : PhaseSpace d) : + β€–gψ z - gΟ• zβ€– ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := by + have e1 : gψ z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm + ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))) := by + rw [hgψ z]; simp only [gradient]; rw [fderiv_slice_fst ψ hψ z] + have e2 : gΟ• z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm + ((fderiv ℝ Ο• z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))) := by + rw [hgΟ• z]; simp only [gradient]; rw [fderiv_slice_fst Ο• hΟ• z] + rw [e1, e2] + refine le_trans (toDualSymm_comp_sub_norm_le ψ Ο• z _) ?_ + calc β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * β€–ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)β€– + ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * 1 := by + gcongr; exact ContinuousLinearMap.norm_inl_le_one ℝ (PhysSpace d) (PhysSpace d) + _ = β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := mul_one _ + +omit [NeZero d] in +/-- Second-slot partial gradients of two tests differ by at most the full +FrΓ©chet-derivative difference. -/ +lemma gradientSlice_snd_sub_norm_le (ψ Ο• : PhaseSpace d β†’ ℝ) + (hψ : Differentiable ℝ ψ) (hΟ• : Differentiable ℝ Ο•) + (gψ gΟ• : PhaseSpace d β†’ PhysSpace d) + (hgψ : βˆ€ z, gψ z = gradient (fun v => ψ (z.1, v)) z.2) + (hgΟ• : βˆ€ z, gΟ• z = gradient (fun v => Ο• (z.1, v)) z.2) (z : PhaseSpace d) : + β€–gψ z - gΟ• zβ€– ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := by + have e1 : gψ z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm + ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))) := by + rw [hgψ z]; simp only [gradient]; rw [fderiv_slice_snd ψ hψ z] + have e2 : gΟ• z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm + ((fderiv ℝ Ο• z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))) := by + rw [hgΟ• z]; simp only [gradient]; rw [fderiv_slice_snd Ο• hΟ• z] + rw [e1, e2] + refine le_trans (toDualSymm_comp_sub_norm_le ψ Ο• z _) ?_ + calc β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * β€–ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)β€– + ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * 1 := by + gcongr; exact ContinuousLinearMap.norm_inr_le_one ℝ (PhysSpace d) (PhysSpace d) + _ = β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := mul_one _ + +omit [NeZero d] in +/-- Integrability of the weak-evolution integrand against a probability measure: +continuous with compact support (both gradient slots), continuous field. -/ +lemma inner_integrand_integrable + (ΞΌ : Measure (PhaseSpace d)) [IsProbabilityMeasure ΞΌ] + (fld : PhysSpace d β†’ PhysSpace d) (hfld : Continuous fld) + (gX gV : PhaseSpace d β†’ PhysSpace d) + (hgXc : Continuous gX) (hgVc : Continuous gV) + (hgXcs : HasCompactSupport gX) (hgVcs : HasCompactSupport gV) : + Integrable (fun z => @inner ℝ (PhysSpace d) _ z.2 (gX z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) ΞΌ := by + have hcont : Continuous (fun z => @inner ℝ (PhysSpace d) _ z.2 (gX z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) := + (continuous_snd.inner hgXc).sub ((hfld.comp continuous_fst).inner hgVc) + have hcs : HasCompactSupport (fun z => @inner ℝ (PhysSpace d) _ z.2 (gX z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) := by + apply HasCompactSupport.intro (IsCompact.union hgXcs hgVcs) + intro z hz + simp only [Set.mem_union, not_or] at hz + rw [image_eq_zero_of_notMem_tsupport hz.1, image_eq_zero_of_notMem_tsupport hz.2] + simp + exact hcont.integrable_of_hasCompactSupport hcs + +omit [NeZero d] in +/-- Pointwise bound on the difference of two weak-evolution integrands: on the +common support `K` it is `(R_K + B) * Ξ΄` (norm bound `R_K` on `K`, field bound `B` +on `K`, gradient-slot distance `Ξ΄`); off `K` both integrands agree. -/ +lemma inner_integrand_sub_norm_le + (K : Set (PhaseSpace d)) (R_K : ℝ) (hR_K_nn : 0 ≀ R_K) (hR_K : βˆ€ z ∈ K, β€–zβ€– ≀ R_K) + (fld : PhysSpace d β†’ PhysSpace d) (B : ℝ) (hB_nn : 0 ≀ B) + (hfld_K : βˆ€ z ∈ K, β€–fld (Prod.fst z)β€– ≀ B) + (gX gV gX' gV' : PhaseSpace d β†’ PhysSpace d) (Ξ΄ : ℝ) (hΞ΄_nn : 0 ≀ Ξ΄) + (hXd : βˆ€ z, β€–gX' z - gX zβ€– ≀ Ξ΄) (hVd : βˆ€ z, β€–gV' z - gV zβ€– ≀ Ξ΄) + (hXoff : βˆ€ z βˆ‰ K, gX' z = gX z) (hVoff : βˆ€ z βˆ‰ K, gV' z = gV z) + (z : PhaseSpace d) : + β€–(@inner ℝ (PhysSpace d) _ z.2 (gX z) - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) + - (@inner ℝ (PhysSpace d) _ z.2 (gX' z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV' z))β€– + ≀ (R_K + B) * Ξ΄ := by + by_cases hzK : z ∈ K + Β· have hrw : (@inner ℝ (PhysSpace d) _ z.2 (gX z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) + - (@inner ℝ (PhysSpace d) _ z.2 (gX' z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV' z)) + = @inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z) := by + rw [inner_sub_right, inner_sub_right]; ring + rw [Real.norm_eq_abs, hrw] + have hb1 : |@inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z)| ≀ R_K * Ξ΄ := by + refine le_trans (abs_real_inner_le_norm _ _) ?_ + have hz2 : β€–z.2β€– ≀ R_K := le_trans (norm_snd_le z) (hR_K z hzK) + rw [norm_sub_rev (gX z)] + exact mul_le_mul hz2 (hXd z) (norm_nonneg _) hR_K_nn + have hb2 : |@inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z)| ≀ B * Ξ΄ := by + refine le_trans (abs_real_inner_le_norm _ _) ?_ + rw [norm_sub_rev (gV z)] + exact mul_le_mul (hfld_K z hzK) (hVd z) (norm_nonneg _) hB_nn + calc |@inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z) + - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z)| + ≀ |@inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z)| + + |@inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z)| := abs_sub _ _ + _ ≀ R_K * Ξ΄ + B * Ξ΄ := by linarith + _ = (R_K + B) * Ξ΄ := by ring + Β· rw [hXoff z hzK, hVoff z hzK] + simp only [sub_self, norm_zero] + positivity + +omit [NeZero d] in +/-- On the window, the frozen convolution field over the spatial marginal is +integrable (in force form), linearly bounded, and continuous β€” packaged for +consumers that quantify over the window. -/ +lemma convolveField_window_setup + (gradW : PhysSpace d β†’ PhysSpace d) + (L : NNReal) (hL : LipschitzWith L gradW) + (f : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) + (hf_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) + (M_ρ : ℝ) + (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M_ρ) + (Ξ΅β‚€ : ℝ) (hΞ΅β‚€_def : Ξ΅β‚€ = β€–gradW 0β€– + (L : ℝ) * M_ρ) : + βˆ€ Οƒ ∈ Set.Icc (0 : ℝ) T, + (Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (f Οƒ))) + ∧ (βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) (spatialMarginal (f Οƒ))) + ∧ (βˆ€ x : PhysSpace d, + β€–convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) xβ€– ≀ Ξ΅β‚€ + (L:ℝ) * β€–xβ€–) + ∧ Continuous (fun x => convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) x) := by + intro Οƒ hΟƒ + have : IsProbabilityMeasure (f Οƒ) := (hf_mom Οƒ hΟƒ).1 + have hprob_m : IsProbabilityMeasure (spatialMarginal (f Οƒ)) := + (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance + -- β€–Β·β€– integrable wrt the spatial marginal (from the finite first moment of f Οƒ) + have h_y_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (f Οƒ)) := by + unfold spatialMarginal + rw [integrable_map_measure (continuous_norm.measurable).aestronglyMeasurable + measurable_fst.aemeasurable] + refine Integrable.mono' (hf_mom Οƒ hΟƒ).2 + ((continuous_norm.comp continuous_fst).aestronglyMeasurable) + (Filter.Eventually.of_forall fun z => ?_) + change |β€–z.1β€–| ≀ β€–zβ€– + rw [abs_of_nonneg (norm_nonneg _)]; exact norm_fst_le z + -- force-integrability (Lipschitz growth + finite moment) + have h_int : βˆ€ x : PhysSpace d, + Integrable (fun y => gradW (x - y)) (spatialMarginal (f Οƒ)) := by + intro x + have h_aesm : AEStronglyMeasurable (fun y : PhysSpace d => gradW (x - y)) + (spatialMarginal (f Οƒ)) := + (hL.continuous.comp (continuous_const.sub continuous_id)).aestronglyMeasurable + have h_dom : βˆ€ y : PhysSpace d, + β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L:ℝ) * β€–xβ€– + (L:ℝ) * β€–yβ€– := by + intro y + have hd := hL.dist_le_mul (x - y) 0 + simp only [dist_eq_norm, sub_zero] at hd + have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by + have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) + simp only [sub_add_cancel] at this; linarith + have h_sub_le : β€–x - yβ€– ≀ β€–xβ€– + β€–yβ€– := norm_sub_le x y + have h_mul := mul_le_mul_of_nonneg_left h_sub_le L.coe_nonneg + linarith + have h_dom_int : Integrable + (fun y : PhysSpace d => β€–gradW 0β€– + (L:ℝ) * β€–xβ€– + (L:ℝ) * β€–yβ€–) + (spatialMarginal (f Οƒ)) := by + have h_eq : (fun y : PhysSpace d => β€–gradW 0β€– + (L:ℝ) * β€–xβ€– + (L:ℝ) * β€–yβ€–) + = fun y => (β€–gradW 0β€– + (L:ℝ) * β€–xβ€–) + (L:ℝ) * β€–yβ€– := by funext y; ring + rw [h_eq]; exact (integrable_const _).add (h_y_int.const_mul _) + exact Integrable.mono' h_dom_int h_aesm (Filter.Eventually.of_forall h_dom) + -- field bound (CharFlow idiom) + have hbound : βˆ€ x : PhysSpace d, + β€–convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) xβ€– ≀ Ξ΅β‚€ + (L:ℝ) * β€–xβ€– := by + intro x + rw [hΞ΅β‚€_def] + exact norm_convolveFunctionMeasure_le_affine gradW L hL (spatialMarginal (f Οƒ)) + h_int h_y_int M_ρ (hM_ρ Οƒ hΟƒ) x + -- field continuity from the Lipschitz-in-x lemma + have hcont : Continuous (fun x => convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) x) := + (convolveFunctionMeasure_lipschitz_in_x gradW L hL (spatialMarginal (f Οƒ)) h_int).continuous + exact ⟨h_y_int, h_int, hbound, hcont⟩ + +omit [NeZero d] in +open Filter Topology Metric in +/-- Uniform convergence of integrands implies convergence of the integrals against +a probability measure (every term integrable). -/ +lemma integral_tendsto_of_tendstoUniformly + (ΞΌ : Measure (PhaseSpace d)) [IsProbabilityMeasure ΞΌ] + (g : β„• β†’ PhaseSpace d β†’ ℝ) (gβ‚€ : PhaseSpace d β†’ ℝ) + (hUnif : TendstoUniformly g gβ‚€ atTop) + (hgβ‚€_int : Integrable gβ‚€ ΞΌ) (hg_int : βˆ€ n, Integrable (g n) ΞΌ) : + Tendsto (fun n => ∫ z, g n z βˆ‚ΞΌ) atTop (𝓝 (∫ z, gβ‚€ z βˆ‚ΞΌ)) := by + rw [Metric.tendsto_atTop] + intro Ξ΅ hΞ΅ + obtain ⟨N, hN⟩ := eventually_atTop.mp + (Metric.tendstoUniformly_iff.mp hUnif (Ξ΅/2) (by positivity)) + refine ⟨N, fun n hn => ?_⟩ + rw [Real.dist_eq] + have hpt : βˆ€ z, |g n z - gβ‚€ z| ≀ Ξ΅/2 := by + intro z + have h := hN n hn z + rw [Real.dist_eq, abs_sub_comm] at h + exact le_of_lt h + calc |∫ z, g n z βˆ‚ΞΌ - ∫ z, gβ‚€ z βˆ‚ΞΌ| + = |∫ z, (g n z - gβ‚€ z) βˆ‚ΞΌ| := by rw [integral_sub (hg_int n) hgβ‚€_int] + _ ≀ ∫ z, |g n z - gβ‚€ z| βˆ‚ΞΌ := abs_integral_le_integral_abs + _ ≀ ∫ _z, (Ξ΅/2) βˆ‚ΞΌ := + integral_mono_of_nonneg (Eventually.of_forall fun z => abs_nonneg _) + (integrable_const _) (Eventually.of_forall hpt) + _ = Ξ΅/2 := by simp + _ < Ξ΅ := half_lt_self hΞ΅ + +-- #4 (Step 5 interface): the weak evolution equation extended to CΒΉ_c test functions. +open Filter Topology Metric in +open scoped Convolution Pointwise in +omit [NeZero d] in +theorem weakEvolution_test_C1c_On + (gradW : PhysSpace d β†’ PhysSpace d) + (f : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) + (hf_weak : IsVlasovSolutionOn gradW f T) + (hf_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) + -- B2 enrichment (mollification proof): the velocity-term needs a uniform-in-Οƒ bound on the + -- frozen field `β€–βˆ‡Wβˆ—Ο_Οƒβ€–` over the fixed compact support of the test, supplied by the + -- Lipschitz growth of `gradW` (`hL`) and the uniform first-moment bound `hM_ρ`. + (L : NNReal) (hL : LipschitzWith L gradW) + (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) + (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M_ρ) + (Ο‡ : PhaseSpace d β†’ ℝ) (hΟ‡_C1 : ContDiff ℝ 1 Ο‡) (hΟ‡c : HasCompactSupport Ο‡) + (gradXΟ‡ gradVΟ‡ : PhaseSpace d β†’ PhysSpace d) + (hgradXΟ‡ : βˆ€ z, gradXΟ‡ z = gradient (fun x => Ο‡ (x, z.2)) z.1) + (hgradVΟ‡ : βˆ€ z, gradVΟ‡ z = gradient (fun v => Ο‡ (z.1, v)) z.2) + (s : ℝ) (hs : s ∈ Set.Ioo (0 : ℝ) T) : + HasDerivAt (fun Οƒ => ∫ z, Ο‡ z βˆ‚(f Οƒ)) + (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) + - @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f s)) z.1) + (gradVΟ‡ z)) βˆ‚(f s)) s := by + classical + have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by + rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from + Measure.volume_eq_prod _ _] + infer_instance + have hvolReg : (volume : Measure (PhaseSpace d)).Regular := + Measure.Regular.of_sigmaCompactSpace_of_isLocallyFiniteMeasure _ + -- mollifier family (shrinking bumps); copy of #9's + set Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d) := + fun n => ⟨1 / (n + 2), 2 / (n + 2), by positivity, by + rw [div_lt_div_iff_of_pos_right (by positivity)]; norm_num⟩ with hΟ†_def + have hrout : βˆ€ n, (Ο† n).rOut = 2 / (n + 2) := fun n => rfl + have hrout_tendsto : Tendsto (fun n => (Ο† n).rOut) atTop (𝓝 0) := by + simp only [hrout] + apply Filter.Tendsto.div_atTop (tendsto_const_nhds) + exact Filter.tendsto_atTop_add_const_right _ 2 tendsto_natCast_atTop_atTop + -- mollified test functions + set Ο‡n : β„• β†’ PhaseSpace d β†’ ℝ := + fun n => (Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡ with hΟ‡n_def + have hΟ‡n_smooth : βˆ€ n, ContDiff ℝ (⊀ : β„•βˆž) (Ο‡n n) := fun n => + ((Ο† n).hasCompactSupport_normed).contDiff_convolution_left _ + (Ο† n).contDiff_normed hΟ‡_C1.continuous.locallyIntegrable + have hΟ‡n_cs : βˆ€ n, HasCompactSupport (Ο‡n n) := fun n => + HasCompactSupport.convolution _ (Ο† n).hasCompactSupport_normed hΟ‡c + -- genuine partial gradients of Ο‡_n + set gXn : β„• β†’ PhaseSpace d β†’ PhysSpace d := + fun n z => gradient (fun x => Ο‡n n (x, z.2)) z.1 with hgXn_def + set gVn : β„• β†’ PhaseSpace d β†’ PhysSpace d := + fun n z => gradient (fun v => Ο‡n n (z.1, v)) z.2 with hgVn_def + -- D_n: the C^∞ weak-evolution derivative, from hf_weak applied to Ο‡_n + have hDn : βˆ€ n, βˆ€ Οƒ ∈ Set.Ioo (0 : ℝ) T, HasDerivAt (fun Οƒ' => ∫ z, Ο‡n n z βˆ‚(f Οƒ')) + (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) + - @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) z.1) + (gVn n z)) βˆ‚(f Οƒ)) Οƒ := by + intro n Οƒ hΟƒ + have h := hf_weak (Ο‡n n) (hΟ‡n_smooth n) (hΟ‡n_cs n) (gXn n) (gVn n) + (fun z => rfl) (fun z => rfl) Οƒ hΟƒ + simpa using h + -- pointwise convergence (0th order): ∫ Ο‡_n d(f Οƒ) β†’ ∫ Ο‡ d(f Οƒ) + have hfg : βˆ€ Οƒ ∈ Set.Ioo (0 : ℝ) T, Tendsto (fun n => ∫ z, Ο‡n n z βˆ‚(f Οƒ)) atTop + (𝓝 (∫ z, Ο‡ z βˆ‚(f Οƒ))) := by + intro Οƒ hΟƒ + have : IsProbabilityMeasure (f Οƒ) := (hf_mom Οƒ (Set.Ioo_subset_Icc_self hΟƒ)).1 + exact integral_tendsto_of_tendstoUniformly (f Οƒ) Ο‡n Ο‡ + (mollifier_tendstoUniformly Ο‡ hΟ‡_C1.continuous hΟ‡c Ο† hrout_tendsto) + (hΟ‡_C1.continuous.integrable_of_hasCompactSupport hΟ‡c) + (fun n => (hΟ‡n_smooth n).continuous.integrable_of_hasCompactSupport (hΟ‡n_cs n)) + -- uniform-in-Οƒ convergence of the derivatives (the term bound) + -- Helper 2: uniform fderiv convergence + have hH2 := mollifiedFDeriv_tendstoUniformly Ο‡ hΟ‡_C1 hΟ‡c Ο† hrout_tendsto + -- fixed compact K containing all supports + set K : Set (PhaseSpace d) := tsupport Ο‡ + Metric.closedBall (0 : PhaseSpace d) 1 with hK_def + have hK_compact : IsCompact K := IsCompact.add hΟ‡c (isCompact_closedBall 0 1) + obtain ⟨R0, hR0⟩ := (hK_compact.image continuous_norm).bddAbove + set R_K := max R0 0 with hRK_def + have hR_K_nn : (0 : ℝ) ≀ R_K := le_max_right _ _ + have hR_K : βˆ€ z ∈ K, β€–zβ€– ≀ R_K := fun z hz => le_trans (hR0 ⟨z, hz, rfl⟩) (le_max_left _ _) + -- tsupport Ο‡ βŠ† K, and fderiv Ο‡ vanishes off K + have htsuppΟ‡_K : tsupport Ο‡ βŠ† K := by + intro z hz + rw [hK_def] + exact (add_zero z) β–Έ Set.add_mem_add hz (by simp : (0:PhaseSpace d) ∈ Metric.closedBall 0 1) + have hsuppΟ‡ : βˆ€ z βˆ‰ K, fderiv ℝ Ο‡ z = 0 := by + intro z hz + exact fderiv_of_notMem_tsupport ℝ (fun h => hz (htsuppΟ‡_K h)) + -- tsupport (Ο‡n n) βŠ† K, and fderiv (Ο‡n n) vanishes off K + have htsuppΟ‡n_K : βˆ€ n, tsupport (Ο‡n n) βŠ† K := by + intro n + have h1 : Function.support (Ο‡n n) + βŠ† Function.support ((Ο† n).normed volume) + Function.support Ο‡ := + support_convolution_subset _ + have h2 : Function.support ((Ο† n).normed volume) βŠ† Metric.closedBall 0 1 := by + rw [(Ο† n).support_normed_eq] + refine Metric.ball_subset_closedBall.trans (Metric.closedBall_subset_closedBall ?_) + rw [hrout n]; rw [div_le_one (by positivity)]; norm_num + have h4 : Function.support (Ο‡n n) βŠ† K := by + refine h1.trans ?_ + rw [hK_def, add_comm (tsupport Ο‡)] + exact Set.add_subset_add h2 (subset_tsupport Ο‡) + exact (closure_minimal h4 hK_compact.isClosed) + have hsuppΟ‡n : βˆ€ n, βˆ€ z βˆ‰ K, fderiv ℝ (Ο‡n n) z = 0 := by + intro n z hz + exact fderiv_of_notMem_tsupport ℝ (fun h => hz (htsuppΟ‡n_K n h)) + -- partial-gradient projection bounds (X and V), off Helper 2's fderiv difference + -- field: integrability, bound, continuity β€” all on the window + set Ξ΅β‚€ : ℝ := β€–gradW 0β€– + (L : ℝ) * M_ρ with hΞ΅β‚€_def + have hΞ΅β‚€_nn : 0 ≀ Ξ΅β‚€ := by positivity + have hfield_setup := convolveField_window_setup gradW L hL f T hf_mom M_ρ hM_ρ Ξ΅β‚€ hΞ΅β‚€_def + -- THE ESTIMATE + -- continuity of the four partial gradients (off the uniform fderiv) + have htop : ((⊀ : β„•βˆž) : WithTop β„•βˆž) β‰  0 := by simp + have hΟ‡diff : Differentiable ℝ Ο‡ := hΟ‡_C1.differentiable one_ne_zero + have hΟ‡'cont : Continuous (fderiv ℝ Ο‡) := hΟ‡_C1.continuous_fderiv one_ne_zero + have hgXΟ‡c : Continuous gradXΟ‡ := + continuous_gradientSlice_fst Ο‡ gradXΟ‡ hΟ‡diff hΟ‡'cont hgradXΟ‡ + have hgVΟ‡c : Continuous gradVΟ‡ := + continuous_gradientSlice_snd Ο‡ gradVΟ‡ hΟ‡diff hΟ‡'cont hgradVΟ‡ + have hgXnc : βˆ€ n, Continuous (gXn n) := fun n => continuous_gradientSlice_fst (Ο‡n n) (gXn n) + ((hΟ‡n_smooth n).differentiable htop) ((hΟ‡n_smooth n).continuous_fderiv htop) + (fun z => by rw [hgXn_def]) + have hgVnc : βˆ€ n, Continuous (gVn n) := fun n => continuous_gradientSlice_snd (Ο‡n n) (gVn n) + ((hΟ‡n_smooth n).differentiable htop) ((hΟ‡n_smooth n).continuous_fderiv htop) + (fun z => by rw [hgVn_def]) + -- compact support of the four partial gradients (vanish off the test's support) + have hgXΟ‡cs : HasCompactSupport gradXΟ‡ := + hasCompactSupport_gradientSlice_fst Ο‡ gradXΟ‡ hΟ‡diff hΟ‡c hgradXΟ‡ + have hgVΟ‡cs : HasCompactSupport gradVΟ‡ := + hasCompactSupport_gradientSlice_snd Ο‡ gradVΟ‡ hΟ‡diff hΟ‡c hgradVΟ‡ + have hgXncs : βˆ€ n, HasCompactSupport (gXn n) := fun n => + hasCompactSupport_gradientSlice_fst (Ο‡n n) (gXn n) + ((hΟ‡n_smooth n).differentiable htop) (hΟ‡n_cs n) (fun z => by rw [hgXn_def]) + have hgVncs : βˆ€ n, HasCompactSupport (gVn n) := fun n => + hasCompactSupport_gradientSlice_snd (Ο‡n n) (gVn n) + ((hΟ‡n_smooth n).differentiable htop) (hΟ‡n_cs n) (fun z => by rw [hgVn_def]) + -- THE ESTIMATE + have hf'unif : TendstoUniformlyOn + (fun n Οƒ => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) + - @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) z.1) (gVn n z)) βˆ‚(f Οƒ)) + (fun Οƒ => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) + - @inner ℝ (PhysSpace d) _ + (convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) z.1) (gradVΟ‡ z)) βˆ‚(f Οƒ)) + atTop (Set.Ioo 0 T) := by + rw [Metric.tendstoUniformlyOn_iff] + intro Ξ΅ hΞ΅ + set C : ℝ := R_K + (Ξ΅β‚€ + (L:ℝ) * R_K) with hC_def + have hC_nn : (0 : ℝ) ≀ C := by rw [hC_def]; positivity + rw [Metric.tendstoUniformly_iff] at hH2 + filter_upwards [hH2 (Ξ΅/(C+1)) (by positivity)] with n hn + intro Οƒ hΟƒ + have hΟƒ' : Οƒ ∈ Set.Icc (0 : ℝ) T := Set.Ioo_subset_Icc_self hΟƒ + have : IsProbabilityMeasure (f Οƒ) := (hf_mom Οƒ hΟƒ').1 + obtain ⟨_, _, hbnd, hfc⟩ := hfield_setup Οƒ hΟƒ' + -- L15: make the field opaque so defeq never unfolds its Bochner integral + set fldΟƒ : PhysSpace d β†’ PhysSpace d := convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) + with hfldΟƒ_def + clear_value fldΟƒ + -- projection bounds for this n + have hXp : βˆ€ z, β€–gXn n z - gradXΟ‡ zβ€– ≀ β€–fderiv ℝ (Ο‡n n) z - fderiv ℝ Ο‡ zβ€– := + fun z => gradientSlice_fst_sub_norm_le (Ο‡n n) Ο‡ + ((hΟ‡n_smooth n).differentiable htop) hΟ‡diff (gXn n) gradXΟ‡ + (fun z => by rw [hgXn_def]) hgradXΟ‡ z + have hVp : βˆ€ z, β€–gVn n z - gradVΟ‡ zβ€– ≀ β€–fderiv ℝ (Ο‡n n) z - fderiv ℝ Ο‡ zβ€– := + fun z => gradientSlice_snd_sub_norm_le (Ο‡n n) Ο‡ + ((hΟ‡n_smooth n).differentiable htop) hΟ‡diff (gVn n) gradVΟ‡ + (fun z => by rw [hgVn_def]) hgradVΟ‡ z + -- uniform fderiv bound at this n (uses Ο‡n = the convolution defeq, before clearing) + have hfd_le : βˆ€ z, β€–fderiv ℝ (Ο‡n n) z - fderiv ℝ Ο‡ zβ€– ≀ Ξ΅/(C+1) := by + intro z + have h := hn z + rw [dist_eq_norm, norm_sub_rev] at h + exact le_of_lt h + -- L15: with the projection + fderiv bounds proven, make the heavy convolution defs opaque so + -- the integrand-difference manipulations never unfold their Bochner integrals + clear_value gXn gVn Ο‡n + -- off K both gradient pairs agree (fderivs vanish there) + have hXoff : βˆ€ z βˆ‰ K, gXn n z = gradXΟ‡ z := by + intro z hzK + have hfd0 : fderiv ℝ (Ο‡n n) z = 0 := hsuppΟ‡n n z hzK + have hfd0' : fderiv ℝ Ο‡ z = 0 := hsuppΟ‡ z hzK + have := hXp z; rw [hfd0, hfd0', sub_self, norm_zero] at this + exact sub_eq_zero.mp (norm_le_zero_iff.mp this) + have hVoff : βˆ€ z βˆ‰ K, gVn n z = gradVΟ‡ z := by + intro z hzK + have hfd0 : fderiv ℝ (Ο‡n n) z = 0 := hsuppΟ‡n n z hzK + have hfd0' : fderiv ℝ Ο‡ z = 0 := hsuppΟ‡ z hzK + have := hVp z; rw [hfd0, hfd0', sub_self, norm_zero] at this + exact sub_eq_zero.mp (norm_le_zero_iff.mp this) + -- field bound on K + have hfld_K : βˆ€ z ∈ K, β€–fldΟƒ (Prod.fst z)β€– ≀ Ξ΅β‚€ + (L:ℝ) * R_K := by + intro z hzK + refine le_trans (hbnd z.1) ?_ + have : β€–z.1β€– ≀ R_K := le_trans (norm_fst_le z) (hR_K z hzK) + gcongr + -- pointwise bound on the integrand difference + have hpt : βˆ€ z, β€–(@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) + - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) + (gradVΟ‡ z)) + - (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) + - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) + (gVn n z))β€– ≀ C * (Ξ΅/(C+1)) := by + intro z + have h := inner_integrand_sub_norm_le K R_K hR_K_nn hR_K fldΟƒ + (Ξ΅β‚€ + (L:ℝ) * R_K) (by positivity) hfld_K + gradXΟ‡ gradVΟ‡ (gXn n) (gVn n) (Ξ΅/(C+1)) (by positivity) + (fun z => le_trans (hXp z) (hfd_le z)) (fun z => le_trans (hVp z) (hfd_le z)) + hXoff hVoff z + refine le_trans h (le_of_eq ?_) + rw [hC_def] + -- integrability of both integrands (continuous + compact support in K) + have hGd_int := inner_integrand_integrable (f Οƒ) fldΟƒ hfc gradXΟ‡ gradVΟ‡ + hgXΟ‡c hgVΟ‡c hgXΟ‡cs hgVΟ‡cs + have hGnd_int := inner_integrand_integrable (f Οƒ) fldΟƒ hfc (gXn n) (gVn n) + (hgXnc n) (hgVnc n) (hgXncs n) (hgVncs n) + -- assemble + rw [Real.dist_eq, ← integral_sub hGd_int hGnd_int] + calc |∫ z, ((@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) + - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) + (gradVΟ‡ z)) + - (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) + - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) + (gVn n z))) βˆ‚(f Οƒ)| + ≀ ∫ z, C * (Ξ΅/(C+1)) βˆ‚(f Οƒ) := by + refine le_trans (abs_integral_le_integral_abs) ?_ + refine integral_mono_of_nonneg (Filter.Eventually.of_forall fun z => abs_nonneg _) + (integrable_const _) (Filter.Eventually.of_forall fun z => ?_) + have := hpt z; rwa [Real.norm_eq_abs] at this + _ = C * (Ξ΅/(C+1)) := by simp + _ < Ξ΅ := by + have h1 : (0 : ℝ) < C + 1 := by positivity + rw [← mul_div_assoc, div_lt_iffβ‚€ h1] + nlinarith [hΞ΅, hC_nn] + -- assemble via the uniform-limit-of-derivatives theorem + exact hasDerivAt_of_tendstoUniformlyOn isOpen_Ioo hf'unif (Eventually.of_forall hDn) hfg hs + +-- NC (consumption form): integral of a jointly-continuous, uniformly-compactly-supported +-- family against the weak-solution measure curve is continuous in time. +omit [NeZero d] in +theorem vlasovSolutionOn_integral_continuousOn + (f : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) + (hf_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) + (hf_narrow : βˆ€ (g : PhaseSpace d β†’ ℝ), Continuous g β†’ HasCompactSupport g β†’ + ContinuousOn (fun s => ∫ z, g z βˆ‚(f s)) (Set.Icc 0 T)) + (G : ℝ β†’ PhaseSpace d β†’ ℝ) + (hG_cont : Continuous (fun p : ℝ Γ— PhaseSpace d => G p.1 p.2)) + (K : Set (PhaseSpace d)) (hK : IsCompact K) + (hG_supp : βˆ€ s, βˆ€ z βˆ‰ K, G s z = 0) : + ContinuousOn (fun s => ∫ z, G s z βˆ‚(f s)) (Set.Icc (0 : ℝ) T) := by + -- Each slice G a is continuous, supported in K, hence integrable wrt the probability f b. + have hGs_cont : βˆ€ a : ℝ, Continuous (fun z => G a z) := fun a => + hG_cont.comp (Continuous.prodMk_right a) + have hGs_cs : βˆ€ a : ℝ, HasCompactSupport (fun z => G a z) := by + intro a + have hsub : tsupport (fun z => G a z) βŠ† K := + closure_minimal (fun z hz => by by_contra hzK; exact hz (hG_supp a z hzK)) hK.isClosed + exact IsCompact.of_isClosed_subset hK (isClosed_tsupport _) hsub + have hGint : βˆ€ (a b : ℝ), b ∈ Set.Icc (0 : ℝ) T β†’ Integrable (fun z => G a z) (f b) := by + intro a b hb + have := (hf_mom b hb).1 + exact (hGs_cont a).integrable_of_hasCompactSupport (hGs_cs a) + -- Uniform continuity of the uncurried G on the compact Icc 0 T Γ—Λ’ K. + have hC : IsCompact (Set.Icc (0 : ℝ) T Γ—Λ’ K) := isCompact_Icc.prod hK + have hG_uc : UniformContinuousOn (fun p : ℝ Γ— PhaseSpace d => G p.1 p.2) + (Set.Icc (0 : ℝ) T Γ—Λ’ K) := + hC.uniformContinuousOn_of_continuous hG_cont.continuousOn + rw [Metric.uniformContinuousOn_iff] at hG_uc + -- Main Ρ–δ. + rw [Metric.continuousOn_iff] + intro sβ‚€ hsβ‚€ Ξ΅ hΞ΅ + obtain βŸ¨Ξ΄β‚, hδ₁, hδ₁_prop⟩ := hG_uc (Ξ΅/2) (by positivity) + -- term2: narrow continuity of f tested against the frozen g := G sβ‚€. + have hterm2 : ContinuousWithinAt (fun s => ∫ z, G sβ‚€ z βˆ‚(f s)) (Set.Icc 0 T) sβ‚€ := + (hf_narrow (fun z => G sβ‚€ z) (hGs_cont sβ‚€) (hGs_cs sβ‚€)) sβ‚€ hsβ‚€ + rw [Metric.continuousWithinAt_iff] at hterm2 + obtain βŸ¨Ξ΄β‚‚, hΞ΄β‚‚, hΞ΄β‚‚_prop⟩ := hterm2 (Ξ΅/2) (by positivity) + refine ⟨min δ₁ Ξ΄β‚‚, lt_min hδ₁ hΞ΄β‚‚, fun s hs hsd => ?_⟩ + have hp_s : IsProbabilityMeasure (f s) := (hf_mom s hs).1 + have hsd1 : dist s sβ‚€ < δ₁ := lt_of_lt_of_le hsd (min_le_left _ _) + have hsd2 : dist s sβ‚€ < Ξ΄β‚‚ := lt_of_lt_of_le hsd (min_le_right _ _) + -- pointwise: |G s z - G sβ‚€ z| ≀ Ξ΅/2 (uniform continuity on K; both zero off K) + have hpoint : βˆ€ z, |G s z - G sβ‚€ z| ≀ Ξ΅/2 := by + intro z + by_cases hzK : z ∈ K + Β· have hp : ((s, z) : ℝ Γ— PhaseSpace d) ∈ Set.Icc (0 : ℝ) T Γ—Λ’ K := ⟨hs, hzK⟩ + have hq : ((sβ‚€, z) : ℝ Γ— PhaseSpace d) ∈ Set.Icc (0 : ℝ) T Γ—Λ’ K := ⟨hsβ‚€, hzK⟩ + have hdpq : dist ((s, z) : ℝ Γ— PhaseSpace d) (sβ‚€, z) < δ₁ := by + rw [Prod.dist_eq] + exact max_lt hsd1 (by rw [dist_self]; exact hδ₁) + have hlt := hδ₁_prop _ hp _ hq hdpq + rw [Real.dist_eq] at hlt + exact le_of_lt hlt + Β· rw [hG_supp s z hzK, hG_supp sβ‚€ z hzK, sub_zero, abs_zero]; positivity + -- split the s-integral + have key : ∫ z, G s z βˆ‚(f s) - ∫ z, G sβ‚€ z βˆ‚(f s) + = ∫ z, (G s z - G sβ‚€ z) βˆ‚(f s) := + (integral_sub (hGint s s hs) (hGint sβ‚€ s hs)).symm + have hfirst : dist (∫ z, G s z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f s)) ≀ Ξ΅/2 := by + rw [Real.dist_eq, key] + calc |∫ z, (G s z - G sβ‚€ z) βˆ‚(f s)| + ≀ ∫ z, |G s z - G sβ‚€ z| βˆ‚(f s) := by + have h := norm_integral_le_integral_norm (ΞΌ := f s) (fun z => G s z - G sβ‚€ z) + simpa only [Real.norm_eq_abs] using h + _ ≀ ∫ _z, (Ξ΅/2) βˆ‚(f s) := + integral_mono (((hGint s s hs).sub (hGint sβ‚€ s hs)).abs) + (integrable_const _) hpoint + _ = Ξ΅/2 := by simp + have hsecond : dist (∫ z, G sβ‚€ z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f sβ‚€)) < Ξ΅/2 := + hΞ΄β‚‚_prop hs hsd2 + calc dist (∫ z, G s z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f sβ‚€)) + ≀ dist (∫ z, G s z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f s)) + + dist (∫ z, G sβ‚€ z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f sβ‚€)) := dist_triangle _ _ _ + _ < Ξ΅/2 + Ξ΅/2 := add_lt_add_of_le_of_lt hfirst hsecond + _ = Ξ΅ := by ring + +end Vlasov diff --git a/LeanPool/Vlasov/OT/WeakToLagrangian.lean b/LeanPool/Vlasov/OT/WeakToLagrangian.lean index 128916837e..a3fa6cb1a5 100644 --- a/LeanPool/Vlasov/OT/WeakToLagrangian.lean +++ b/LeanPool/Vlasov/OT/WeakToLagrangian.lean @@ -6,14 +6,12 @@ Authors: Joseph K. Miller module -public import Mathlib.Analysis.Calculus.BumpFunction.FiniteDimension -public import LeanPool.Vlasov.OT.CharacteristicFlow -public import Mathlib.Analysis.Calculus.BumpFunction.Normed -import Mathlib.Algebra.Order.Ring.Star -import Mathlib.Analysis.Calculus.BumpFunction.Convolution -import Mathlib.Analysis.Calculus.InverseFunctionTheorem.ContDiff -import Mathlib.Analysis.SpecialFunctions.Integrals.Basic -import Mathlib.MeasureTheory.Integral.RieszMarkovKakutani.Real +public import LeanPool.Vlasov.OT.FlowDifferentiability +import all LeanPool.Vlasov.OT.FlowDifferentiability +public import LeanPool.Vlasov.OT.TestApproximation +import all LeanPool.Vlasov.OT.TestApproximation +import all LeanPool.Vlasov.OT.FrozenField +import all LeanPool.Vlasov.ForMathlib.VariationalEquation /-! # Weak ⟹ Lagrangian: every weak Vlasov solution is transported by its characteristic flow @@ -91,3466 +89,6 @@ open MeasureTheory variable {d : β„•} [NeZero d] -/-! ## Linear (external-field) weak Vlasov solutions - -The self-consistent weak predicate `IsVlasovSolutionOn` drives the convolution field by the -solution's *own* spatial marginal. For the superposition argument we need the **linear** -version, where the field is driven by an *external* (frozen) measure curve `ρ` β€” both the given -weak solution `f` (with `ρ := spatialMarginal ∘ f`) and the pushforward `g` along the -frozen-field flow solve the *same* `IsLinearVlasovSolutionOn gradW ρ Β· T`, and uniqueness for it -(the crux, C3) forces `f = g`. -/ - -/-- Linear weak Vlasov evolution on `Ioo 0 T` for a test function `Ο†`, with the convolution field -driven by an **external** measure curve `ρ` (frozen), not the solution's own spatial marginal. -The self-consistent `WeakEvolutionEqOn gradW ΞΌ Ο† … (fun _ => 0) T` is the special case -`ρ = spatialMarginal ∘ ΞΌ` (modulo the `+ 0` remainder term). -/ -def LinearWeakEvolutionEqOn - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) - (Ο† : PhaseSpace d β†’ ℝ) - (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (T : ℝ) : Prop := - βˆ€ t ∈ Set.Ioo (0 : ℝ) T, - HasDerivAt (fun s => ∫ z, Ο† z βˆ‚ΞΌ s) - (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ t) z.1) - (gradVΟ† z)) - βˆ‚ΞΌ t) t - -/-- A measure curve `ΞΌ` solves the **linear** Vlasov equation on `[0,T]` driven by the external -field `ρ`: the distributional identity `LinearWeakEvolutionEqOn` holds for every `C_c^∞` test -function. Mirror of `IsVlasovSolutionOn` with the field externalized. -/ -def IsLinearVlasovSolutionOn - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) : Prop := - βˆ€ (Ο† : PhaseSpace d β†’ ℝ), - ContDiff ℝ (⊀ : β„•βˆž) Ο† β†’ HasCompactSupport Ο† β†’ - βˆ€ (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d), - (βˆ€ z, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) β†’ - (βˆ€ z, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) β†’ - LinearWeakEvolutionEqOn gradW ρ ΞΌ Ο† gradXΟ† gradVΟ† T - -omit [NeZero d] in -/-- A self-consistent weak solution is a linear solution driven by its **own** spatial marginal. -The two differ only by `WeakEvolutionEqOn`'s `+ (fun _ => 0) t = + 0` remainder. -/ -lemma IsVlasovSolutionOn.toLinearSelf - {gradW : PhysSpace d β†’ PhysSpace d} {f : ℝ β†’ Measure (PhaseSpace d)} {T : ℝ} - (h : IsVlasovSolutionOn gradW f T) : - IsLinearVlasovSolutionOn gradW (fun t => spatialMarginal (f t)) f T := by - intro Ο† hΟ† hΟ†c gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht - simpa using h Ο† hΟ† hΟ†c gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht - -omit [NeZero d] in -/-- **C1 #1 β€” pushforward solves the frozen linear weak equation.** - -For a characteristic flow `(charX, charV)` solving the ODE with an **external** field `ρ` on -`Ioo 0 T`, the pushforward `g := (charX t, charV t)_# fβ‚€` solves the linear Vlasov equation -driven by that same `ρ`. Proof: the generic SC.1–SC.3 machinery (change of variables + -chain rule + differentiation-under-the-integral, all parametric in `ρ`) recomposed at this `ρ`, -with SC.4's push-back inlined as `integral_map` (SC.4's packaged form hard-codes the -self-consistent marginal). This is `vlasovSolutionViaPushforward_isVlasovSolutionOn` with `ρ` -left free β€” the `_hself` self-consistency hypothesis is unused. -/ -theorem vlasov_frozenField_pushforward_isLinearVlasovSolutionOn - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_fm : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (hflow_on : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) - (h_cont_Icc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) - (h_deriv_Ico : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, - HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s) - (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) - (hM_ρ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(ρ s) ≀ M_ρ) - (h_y_int : βˆ€ s ∈ Set.Icc (0 : ℝ) T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ s)) - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (h_flow_meas : βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) - (hgradW_cont : Continuous gradW) - (hconv_cont : βˆ€ s, Continuous (fun x => convolveFunctionMeasure gradW (ρ s) x)) : - IsLinearVlasovSolutionOn gradW ρ (vlasovSolutionViaPushforward charX charV fβ‚€) T := by - intro Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht - have hΟ†_cont : Continuous Ο† := hΟ†_smooth.continuous - have hΟ†_aesm_general : βˆ€ ΞΌ : Measure (PhaseSpace d), AEStronglyMeasurable Ο† ΞΌ := - fun ΞΌ => hΟ†_cont.aestronglyMeasurable - -- SC.1: ∫ Ο† d(pushforward s) = ∫ (Ο† ∘ flow_s) dfβ‚€. - have h_compose : βˆ€ s, ∫ z, Ο† z βˆ‚(vlasovSolutionViaPushforward charX charV fβ‚€ s) = - ∫ z, Ο† (charX s z, charV s z) βˆ‚fβ‚€ := fun s => - vlasov_pushforward_integral_eq_compose charX charV fβ‚€ s (h_flow_meas s) Ο† (hΟ†_aesm_general _) - -- SC.2 `_at`: pointwise chain rule at every z, at this t. - have h_pointwise : βˆ€ z, HasDerivAt (fun s => Ο† (charX s z, charV s z)) - (@inner ℝ (PhysSpace d) _ (charV t z) (gradXΟ† (charX t z, charV t z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ t) (charX t z)) - (gradVΟ† (charX t z, charV t z))) t := by - intro z - have hX_at := hflow_on.2.1 t ht z (Set.mem_univ z) - have hV_at := hflow_on.2.2 t ht z (Set.mem_univ z) - exact vlasov_traj_chain_rule_at gradW ρ charX charV Ο† hΟ†_smooth - gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t z hX_at hV_at - -- SC.3: differentiation under the integral via the DiffUnderIntegralData bundle. - have h_diff_data : DiffUnderIntegralData gradW ρ charX charV fβ‚€ Ο† gradXΟ† gradVΟ† t := by - obtain ⟨nhd, bound, hnhd, h_lipsch, h_bound_int⟩ := - vlasov_trajectory_lipschitz_bound_on gradW L hL ρ charX charV fβ‚€ - hfβ‚€_fm Ο† hΟ†_smooth hΟ†_compact hT hflow_on h_init h_cont_Icc h_deriv_Ico - hgradW_cont hconv_cont t ht M_ρ hM_ρ_nn hM_ρ h_y_int h_int - refine ⟨nhd, bound, hnhd, ?_, ?_, ?_, h_lipsch, h_bound_int⟩ - Β· exact vlasov_compose_flow_aestronglymeas charX charV fβ‚€ Ο† hΟ†_cont h_flow_meas t - Β· exact vlasov_compose_flow_integrable_at charX charV fβ‚€ Ο† hΟ†_cont hΟ†_compact t (h_flow_meas t) - Β· exact vlasov_pointwise_deriv_aestronglymeas gradW ρ charX charV fβ‚€ - Ο† hΟ†_smooth gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† hconv_cont t (h_flow_meas t) - have h_under_integral := - vlasov_pushforward_hasDerivAt_under_integral gradW ρ charX charV fβ‚€ - Ο† gradXΟ† gradVΟ† t h_pointwise h_diff_data - -- SC.4 (inlined; the packaged form hard-codes the self-consistent marginal): AE-strong-meas - -- of the dot-product integrand, then push back through `integral_map`. - have h_integrand_aesm : AEStronglyMeasurable - (fun y : PhaseSpace d => - @inner ℝ (PhysSpace d) _ y.2 (gradXΟ† y) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ t) y.1) (gradVΟ† y)) - (vlasovSolutionViaPushforward charX charV fβ‚€ t) := by - apply Continuous.aestronglyMeasurable - apply Continuous.sub - Β· apply Continuous.inner continuous_snd - have hfderiv_X : βˆ€ z : PhaseSpace d, - fderiv ℝ (fun x => Ο† (x, z.2)) z.1 = - (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := - fun z => by - have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := - (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt - have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := - hasFDerivAt_prodMk_left z.1 z.2 - exact (h1.comp z.1 h2).fderiv - have heqX : gradXΟ† = fun z => gradient (fun x => Ο† (x, z.2)) z.1 := funext hgradXΟ† - simp_rw [heqX, gradient, hfderiv_X] - exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp - ((ContinuousLinearMap.isBoundedLinearMap_comp_right - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))).continuous.comp - (hΟ†_smooth.continuous_fderiv (by simp))) - Β· apply Continuous.inner - Β· exact (hconv_cont t).comp continuous_fst - Β· have hfderiv_V : βˆ€ z : PhaseSpace d, - fderiv ℝ (fun v => Ο† (z.1, v)) z.2 = - (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := - fun z => by - have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := - (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt - have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) - (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := - hasFDerivAt_prodMk_right z.1 z.2 - exact (h1.comp z.2 h2).fderiv - have heqV : gradVΟ† = fun z => gradient (fun v => Ο† (z.1, v)) z.2 := funext hgradVΟ† - simp_rw [heqV, gradient, hfderiv_V] - exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp - ((ContinuousLinearMap.isBoundedLinearMap_comp_right - (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))).continuous.comp - (hΟ†_smooth.continuous_fderiv (by simp))) - -- Assemble: rewrite LHS via SC.1; push the derivative integral back through `integral_map`. - have hLHS : (fun s => ∫ z, Ο† z βˆ‚(vlasovSolutionViaPushforward charX charV fβ‚€ s)) = - (fun s => ∫ z, Ο† (charX s z, charV s z) βˆ‚fβ‚€) := funext h_compose - have h_map_eq : - ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ (convolveFunctionMeasure gradW (ρ t) z.1) (gradVΟ† z)) - βˆ‚(vlasovSolutionViaPushforward charX charV fβ‚€ t) - = ∫ z, (@inner ℝ (PhysSpace d) _ (charV t z) (gradXΟ† (charX t z, charV t z)) - - @inner ℝ (PhysSpace d) _ (convolveFunctionMeasure gradW (ρ t) (charX t z)) - (gradVΟ† (charX t z, charV t z))) - βˆ‚fβ‚€ := by - unfold vlasovSolutionViaPushforward at h_integrand_aesm ⊒ - exact integral_map (h_flow_meas t) h_integrand_aesm - rw [hLHS, h_map_eq] - exact h_under_integral - -omit [NeZero d] in -/-- **C1 #2 β€” characteristic flow for a frozen field from window data (L11 clamp).** - -Build the characteristic flow for the *given* external curve `ρ` on `Ioo 0 T` (with boundary -regularity), from probability/moment/integrability/continuity data on the window `[0,T]` only. -`exists_vlasov_characteristicFlow_global_smallT` demands *universal*-in-`t` instances; we clamp -`t ↦ ρ (max 0 (min t T))` into the window (L11), apply the universal producer to the clamped -curve, and transfer on `[0,T]` where the clamp is the identity. -/ -theorem exists_frozenField_charFlow_On - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (T : ℝ) (hT : 0 < T) (hTL_PL : LocalSmallnessPLBuffer L T) - (hρ_prob : βˆ€ t ∈ Set.Icc (0 : ℝ) T, IsProbabilityMeasure (ρ t)) - (h_int : βˆ€ t ∈ Set.Icc (0 : ℝ) T, βˆ€ (x : PhysSpace d), - Integrable (fun y => gradW (x - y)) (ρ t)) - (hρ_cont : βˆ€ x : PhysSpace d, - ContinuousOn (fun t => convolveFunctionMeasure gradW (ρ t) x) (Set.Icc (0 : ℝ) T)) - (h_y_int : βˆ€ t ∈ Set.Icc (0 : ℝ) T, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ t)) - (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) - (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(ρ t) ≀ M_ρ) : - βˆƒ charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d, - IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ ∧ - (βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) ∧ - (βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) ∧ - (βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, - HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s) := by - classical - -- L11 clamp: `clampT t ∈ [0,T]` for every `t`, and `clampT t = t` on `[0,T]`. - set clampT : ℝ β†’ ℝ := fun t => max 0 (min t T) with hclampT_def - have hclampT_mem : βˆ€ t, clampT t ∈ Set.Icc (0 : ℝ) T := by - intro t - simp only [hclampT_def, Set.mem_Icc] - exact ⟨le_max_left _ _, max_le hT.le (min_le_right _ _)⟩ - have hclampT_id : βˆ€ t ∈ Set.Icc (0 : ℝ) T, clampT t = t := by - intro t ht - simp only [hclampT_def, min_eq_left ht.2, max_eq_right ht.1] - have hclampT_cont : Continuous clampT := by - simp only [hclampT_def] - exact continuous_const.max (continuous_id.min continuous_const) - -- Clamped curve `ρ' := ρ ∘ clampT`, which satisfies the universal hypotheses. - set ρ' : ℝ β†’ Measure (PhysSpace d) := fun t => ρ (clampT t) with hρ'_def - have hρ'_prob : βˆ€ t, IsProbabilityMeasure (ρ' t) := - fun t => hρ_prob (clampT t) (hclampT_mem t) - have h_int' : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ' t) := - fun t x => h_int (clampT t) (hclampT_mem t) x - have h_y_int' : βˆ€ t, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ' t) := - fun t => h_y_int (clampT t) (hclampT_mem t) - have hM_ρ' : βˆ€ t, ∫ y, β€–yβ€– βˆ‚(ρ' t) ≀ M_ρ := fun t => hM_ρ (clampT t) (hclampT_mem t) - have hρ'_cont : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ' t) x) := - fun x => (hρ_cont x).comp_continuous hclampT_cont (fun t => hclampT_mem t) - -- Apply the universal producer to `ρ'`. - obtain ⟨charX, charV, hflow', h_bdry'⟩ := - exists_vlasov_characteristicFlow_global_smallT W gradW hgradW L hL ρ' - h_int' hρ'_cont h_y_int' M_ρ hM_ρ_nn hM_ρ' T hT.le hTL_PL - -- On `Ioo`/`Icc 0 T`, `clampT = id` so `ρ' = ρ`: transfer the flow back to `ρ`. - refine ⟨charX, charV, ⟨hflow'.1, hflow'.2.1, ?_⟩, ?_, ?_, ?_⟩ - Β· -- velocity ODE for `ρ` on `Ioo 0 T` - intro t ht z hz - have h := hflow'.2.2 t ht z hz - have hρeq : ρ' t = ρ t := by - simp only [hρ'_def, hclampT_id t (Set.Ioo_subset_Icc_self ht)] - rwa [hρeq] at h - Β· -- initial condition - intro z - have h := hflow'.1 z (Set.mem_univ z) - exact Prod.ext h.1 h.2 - Β· -- `ContinuousOn` on `Icc 0 T` from the producer's boundary derivatives - intro z t ht - obtain ⟨hX, hV⟩ := h_bdry' z t ht - exact (hX.prodMk hV).continuousWithinAt - Β· -- `h_deriv_Ico` (Ici-joint) from the producer's `Icc`-component derivatives - intro z s hs - have hsIcc : s ∈ Set.Icc (0 : ℝ) T := Set.Ico_subset_Icc_self hs - obtain ⟨hX, hV⟩ := h_bdry' z s hsIcc - have hρeq : ρ' s = ρ s := by simp only [hρ'_def, hclampT_id s hsIcc] - have hpair : HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) - (charV s z, -(convolveFunctionMeasure gradW (ρ' s) (charX s z))) - (Set.Icc 0 T) s := hX.prodMk hV - rw [hρeq] at hpair - -- convert the set `Icc 0 T` to `Ici s` (local subset near `s`, since `s < T`) - have hmem : Set.Iic ((s + T) / 2) ∈ nhds s := Iic_mem_nhds (by linarith [hs.2]) - have hsub : Set.Ici s ∩ Set.Iic ((s + T) / 2) βŠ† Set.Icc 0 T := by - rintro u ⟨hu1, hu2⟩ - exact ⟨le_trans hs.1 hu1, le_trans hu2 (by linarith [hs.2])⟩ - exact (hasDerivWithinAt_inter hmem).mp (hpair.mono hsub) - -/-! ## Final-step layer (crux-independent): constancy + measure extensionality -/ - -/-- **C2 #7 β€” constancy from a vanishing derivative.** - -If a real function is continuous on `[0,T]` and has zero derivative throughout the open -interval, its endpoint values agree. This is the dual argument's payoff step: `s ↦ ∫ ψ_s dΞΌ_s` -is constant, so its value at `T` (= `∫ Ο† dΞΌ_T`) equals its value at `0` (= `∫ ψ_0 dΞΌ_0`). Mean -value theorem (`exists_hasDerivAt_eq_slope`). -/ -lemma transportedIntegral_const_On {h : ℝ β†’ ℝ} {T : ℝ} (hT : 0 < T) - (hcont : ContinuousOn h (Set.Icc 0 T)) - (hderiv : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt h 0 s) : - h 0 = h T := by - obtain ⟨c, _hc, hc'⟩ := - exists_hasDerivAt_eq_slope h (fun _ => 0) hT hcont (fun s hs => hderiv s hs) - have hc0 : (0 : ℝ) = (h T - h 0) / (T - 0) := hc' - rcases div_eq_zero_iff.mp hc0.symm with h1 | h2 - Β· exact (sub_eq_zero.mp h1).symm - Β· exact absurd h2 (ne_of_gt (by linarith : (0 : ℝ) < T - 0)) - -omit [NeZero d] in -/-- **C2 #9 β€” `C_c^∞` test functions determine a finite measure.** - -If `∫ Ο† dΞΌ = ∫ Ο† dΞ½` for every smooth compactly-supported `Ο†`, then `ΞΌ = Ξ½` (finite measures on -phase space). The dual argument yields equality of integrals against the `IsVlasovSolution` test -class `C_c^∞`; this closes the bridge's final step `f T = g T`. Route: extend `C_c^∞ β†’` -bounded-continuous (smooth approximation), then the in-house bounded-continuous extensionality -`ext_of_forall_integral_eq_of_IsFiniteMeasure` (cf. `Wasserstein.lean`). -/ -lemma measure_eq_of_forall_Cc_integral_eq {ΞΌ Ξ½ : Measure (PhaseSpace d)} - [IsFiniteMeasure ΞΌ] [IsFiniteMeasure Ξ½] - (h : βˆ€ Ο† : PhaseSpace d β†’ ℝ, ContDiff ℝ (⊀ : β„•βˆž) Ο† β†’ HasCompactSupport Ο† β†’ - ∫ z, Ο† z βˆ‚ΞΌ = ∫ z, Ο† z βˆ‚Ξ½) : - ΞΌ = Ξ½ := by - -- Haar instance on the ambient volume via the product reduction. - have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by - rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from - Measure.volume_eq_prod _ _] - infer_instance - have hvolReg : (volume : Measure (PhaseSpace d)).Regular := - Measure.Regular.of_sigmaCompactSpace_of_isLocallyFiniteMeasure _ - have hΞΌreg : ΞΌ.Regular := inferInstance - have hΞ½reg : Ξ½.Regular := inferInstance - -- Reduce `ΞΌ = Ξ½` to equality of integrals against continuous compactly-supported `g`. - refine MeasureTheory.Measure.ext_of_integral_eq_on_compactlySupported (fun g => ?_) - set gf : PhaseSpace d β†’ ℝ := ⇑g with hgf - have hg_cont : Continuous gf := map_continuous g - have hg_cs : HasCompactSupport gf := CompactlySupportedContinuousMap.hasCompactSupport g - -- Uniform sup bound on `g`. - obtain ⟨C, hC⟩ := hg_cont.bounded_above_of_compact_support hg_cs - have hCnn : 0 ≀ C := le_trans (norm_nonneg _) (hC 0) - -- A mollifier family `Ο† n` with outer radius `2/(n+2) β†’ 0`. - set Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d) := - fun n => ⟨1 / (n + 2), 2 / (n + 2), by positivity, by - rw [div_lt_div_iff_of_pos_right (by positivity)]; norm_num⟩ with hΟ† - have hrout : βˆ€ n, (Ο† n).rOut = 2 / (n + 2) := fun n => rfl - have hrout_tendsto : Filter.Tendsto (fun n => (Ο† n).rOut) Filter.atTop (nhds 0) := by - simp only [hrout] - apply Filter.Tendsto.div_atTop (tendsto_const_nhds) - exact Filter.tendsto_atTop_add_const_right _ 2 tendsto_natCast_atTop_atTop - -- The mollified functions. - set gn : β„• β†’ PhaseSpace d β†’ ℝ := - fun n => convolution ((Ο† n).normed volume) gf (ContinuousLinearMap.lsmul ℝ ℝ) volume with hgn - -- Each `gn n` is `C^∞` with compact support, hence covered by the hypothesis `h`. - have hgn_smooth : βˆ€ n, ContDiff ℝ (⊀ : β„•βˆž) (gn n) := fun n => - ((Ο† n).hasCompactSupport_normed).contDiff_convolution_left _ - (Ο† n).contDiff_normed (hg_cont.locallyIntegrable) - have hgn_cs : βˆ€ n, HasCompactSupport (gn n) := fun n => - HasCompactSupport.convolution _ (Ο† n).hasCompactSupport_normed hg_cs - have hgn_eq : βˆ€ n, ∫ z, gn n z βˆ‚ΞΌ = ∫ z, gn n z βˆ‚Ξ½ := fun n => - h (gn n) (hgn_smooth n) (hgn_cs n) - -- Pointwise convergence `gn n β†’ gf` (continuous `g`, shrinking bumps). - have hgn_lim : βˆ€ x, Filter.Tendsto (fun n => gn n x) Filter.atTop (nhds (gf x)) := fun x => - ContDiffBump.convolution_tendsto_right_of_continuous hrout_tendsto hg_cont x - -- Uniform bound `β€–gn n xβ€– ≀ C` (averaging keeps the sup bound). - have hgn_bound : βˆ€ n, βˆ€ x, β€–gn n xβ€– ≀ C := by - intro n x - rw [hgn] - simp only - rw [convolution_lsmul] - calc β€–βˆ« t, (Ο† n).normed volume t β€’ gf (x - t) βˆ‚volumeβ€– - ≀ ∫ t, β€–(Ο† n).normed volume t β€’ gf (x - t)β€– βˆ‚volume := norm_integral_le_integral_norm _ - _ ≀ ∫ t, (Ο† n).normed volume t * C βˆ‚volume := by - apply integral_mono_of_nonneg - Β· exact Filter.Eventually.of_forall (fun t => norm_nonneg _) - Β· exact ((Ο† n).integrable_normed).mul_const C - Β· refine Filter.Eventually.of_forall (fun t => ?_) - simp only - rw [norm_smul, Real.norm_eq_abs, abs_of_nonneg ((Ο† n).nonneg_normed t)] - exact mul_le_mul_of_nonneg_left (hC _) ((Ο† n).nonneg_normed t) - _ = C := by rw [integral_mul_const, (Ο† n).integral_normed, one_mul] - -- DCT: `∫ gn n dΞΌ β†’ ∫ gf dΞΌ` and likewise for `Ξ½`. - have hconv_ΞΌ : Filter.Tendsto (fun n => ∫ z, gn n z βˆ‚ΞΌ) Filter.atTop (nhds (∫ z, gf z βˆ‚ΞΌ)) := by - apply tendsto_integral_of_dominated_convergence (fun _ => C) - Β· exact fun n => (hgn_smooth n).continuous.aestronglyMeasurable - Β· exact integrable_const C - Β· exact fun n => Filter.Eventually.of_forall (fun x => hgn_bound n x) - Β· exact Filter.Eventually.of_forall hgn_lim - have hconv_Ξ½ : Filter.Tendsto (fun n => ∫ z, gn n z βˆ‚Ξ½) Filter.atTop (nhds (∫ z, gf z βˆ‚Ξ½)) := by - apply tendsto_integral_of_dominated_convergence (fun _ => C) - Β· exact fun n => (hgn_smooth n).continuous.aestronglyMeasurable - Β· exact integrable_const C - Β· exact fun n => Filter.Eventually.of_forall (fun x => hgn_bound n x) - Β· exact Filter.Eventually.of_forall hgn_lim - -- The two limits coincide because the prelimit sequences are equal. - have hΞΌΞ½ : Filter.Tendsto (fun n => ∫ z, gn n z βˆ‚ΞΌ) Filter.atTop (nhds (∫ z, gf z βˆ‚Ξ½)) := by - simpa only [hgn_eq] using hconv_Ξ½ - exact tendsto_nhds_unique hconv_ΞΌ hΞΌΞ½ - -omit [NeZero d] in -/-- Convenience extractor: under `[AssW2 W]`, a gradient field `gradW= βˆ‡W` is `CΒΉ`. - -`AssW2.gradContDiff` gives `ContDiff ℝ 1 (fun x => fderiv ℝ W x)`; composing with the (smooth, -linear) Riesz isometry `gradient W x = (toDual ℝ _).symm (fderiv ℝ W x)` and rewriting by `hgradW` -yields `ContDiff ℝ 1 gradW`. -/ -lemma assW2_contDiff_gradW (W : PhysSpace d β†’ ℝ) [AssW2 W] - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW : βˆ€ x, gradW x = gradient W x) : - ContDiff ℝ 1 gradW := by - have heq : gradW = - fun x => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm (fderiv ℝ W x) := by - funext x; rw [hgradW]; rfl - rw [heq] - have hriesz : ContDiff ℝ 1 fun u => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm u := - (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.toContinuousLinearEquiv.contDiff - exact hriesz.comp β€ΉAssW2 Wβ€Ί.gradContDiff - -/-! ## Crux layer (C3): the variational equation and the dual-transport assembly - -The two interfaces below were the load-bearing pieces of the bridge β€” both now proven and -axiom-clean. `#3` was the genuine research gap (CΒΉ dependence of an ODE flow on its initial point -β€” absent from Mathlib), closed via route (b) (difference-quotient + Gronwall); `#8` is the -bridge-specific dual-transported-test-function assembly that consumes it. `#10` (the public -theorem) composes the reuse layer (`exists_frozenField_charFlow_On`, #2) with `#8`. - -The dual-argument *internals* `#4`/`#5`/`#6` (test-class enlargement `C_c^∞ β†’ CΒΉ_c`, the -transported test function `ψ_s = Ο† ∘ Ξ¦_{sβ†’t}` and its transport identity, and the zero-derivative -of `s ↦ ∫ ψ_s dΞΌ_s`) are realized against the two-time-flow representation `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹` -and proven below (`weakEvolution_test_C1c_On`, `transportedTest_transport_identity`, -`transportedIntegral_hasDerivAt_zero`). -/ - -omit [NeZero d] in -/-- **C3 F1 β€” the convolution force field is `CΒΉ` in space (FrΓ©chet derivative under the -integral).** For `gradW ∈ CΒΉ` (and `L`-Lipschitz, a probability measure `ρ` with the kernel -integrable), `x ↦ ∫ y, gradW (x βˆ’ y) βˆ‚Ο` is FrΓ©chet-differentiable with derivative -`∫ y, fderiv ℝ gradW (xβ‚€ βˆ’ y) βˆ‚Ο`. This is the field-regularity foundation of the variational -equation (#3): it makes `D_z (vlasovVectorField …)` exist and continuous, so the variational ODE -`M' = (D_z b)Β·M` has continuous coefficients. - -Differentiation under the integral sign (`hasFDerivAt_integral_of_dominated_loc_of_lip`): the -per-fibre map `x ↦ gradW (x βˆ’ y)` is `L`-Lipschitz (a uniform, integrable bound against a -probability measure) and differentiable, so the parametric integral differentiates with derivative -the integral of the fibrewise derivatives. -/ -theorem convolveFunctionMeasure_hasFDerivAt - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] - (h_int : βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) ρ) - (xβ‚€ : PhysSpace d) : - HasFDerivAt (fun x => convolveFunctionMeasure gradW ρ x) - (∫ y, fderiv ℝ gradW (xβ‚€ - y) βˆ‚Ο) xβ‚€ := by - have hdiff : Differentiable ℝ gradW := hgradW_C1.differentiable one_ne_zero - have hfderiv_cont : Continuous (fun z => fderiv ℝ gradW z) := - hgradW_C1.continuous_fderiv one_ne_zero - have key := hasFDerivAt_integral_of_dominated_loc_of_lip - (ΞΌ := ρ) (s := (Set.univ : Set (PhysSpace d))) (xβ‚€ := xβ‚€) - (F := fun x y => gradW (x - y)) - (F' := fun y => fderiv ℝ gradW (xβ‚€ - y)) - (bound := fun _ => (L : ℝ)) - (Filter.univ_mem) - (Filter.Eventually.of_forall fun x => - (hL.continuous.comp (continuous_const.sub continuous_id)).aestronglyMeasurable) - (h_int xβ‚€) - ((hfderiv_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable) - (Filter.Eventually.of_forall fun a => ?_) - (integrable_const _) - (Filter.Eventually.of_forall fun a => ?_) - Β· have h2 := key.2 - simpa only [convolveFunctionMeasure] using h2 - Β· -- h_lip: `fun x => gradW (x - a)` is `L`-Lipschitz, hence `LipschitzOnWith (nnabs L)` on univ - have hLip : LipschitzWith L (fun x : PhysSpace d => gradW (x - a)) := by - refine LipschitzWith.of_dist_le_mul (fun x y => ?_) - have hd : dist (x - a) (y - a) = dist x y := by - rw [dist_eq_norm, dist_eq_norm]; congr 1; abel - calc dist (gradW (x - a)) (gradW (y - a)) - ≀ (L : ℝ) * dist (x - a) (y - a) := hL.dist_le_mul _ _ - _ = (L : ℝ) * dist x y := by rw [hd] - rw [Real.nnabs_coe L] - exact hLip.lipschitzOnWith - Β· -- h_diff: `HasFDerivAt (fun x => gradW (x - a)) (fderiv ℝ gradW (xβ‚€ - a)) xβ‚€` - have h1 : HasFDerivAt gradW (fderiv ℝ gradW (xβ‚€ - a)) (xβ‚€ - a) := - (hdiff (xβ‚€ - a)).hasFDerivAt - have h2 : HasFDerivAt (fun x : PhysSpace d => x - a) - (ContinuousLinearMap.id ℝ (PhysSpace d)) xβ‚€ := - (hasFDerivAt_id xβ‚€).sub_const a - have hc := h1.comp xβ‚€ h2 - simpa [Function.comp_def] using hc - -omit [NeZero d] in -/-- **C3 F2 β€” the Vlasov field is `CΒΉ` in the phase-space variable, with the block Jacobian.** -At fixed time `t`, `vlasovVectorField gradW ρ t = fun (x,v) ↦ (v, βˆ’conv(x))` is -FrΓ©chet-differentiable in `z = (x,v)` with derivative the block continuous-linear map -`Ξ΄ ↦ (Ξ΄.2, βˆ’(D_x conv)(Ξ΄.1))`, where `D_x conv = ∫ y, fderiv ℝ gradW (z.1 βˆ’ y) βˆ‚(ρ t)` (F1). -This is the coefficient `A(t) := D_z b(t, Ξ¦_t z)` of the variational ODE `M' = A(t)Β·M`. -/ -theorem vlasovVectorField_hasFDerivAt_in_z - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (t : ℝ) (z : PhaseSpace d) : - HasFDerivAt (vlasovVectorField gradW ρ t) - ((ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod - (-((∫ y, fderiv ℝ gradW (z.1 - y) βˆ‚(ρ t)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) z := by - have hconv : HasFDerivAt (fun x => convolveFunctionMeasure gradW (ρ t) x) - (∫ y, fderiv ℝ gradW (z.1 - y) βˆ‚(ρ t)) z.1 := - convolveFunctionMeasure_hasFDerivAt gradW hgradW_C1 L hL (ρ t) (h_int t) z.1 - have hfst : HasFDerivAt (fun w : PhaseSpace d => w.1) - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)) z := - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)).hasFDerivAt - have h1 : HasFDerivAt (fun w : PhaseSpace d => w.2) - (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) z := - (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).hasFDerivAt - have h2 : HasFDerivAt (fun w : PhaseSpace d => convolveFunctionMeasure gradW (ρ t) w.1) - ((∫ y, fderiv ℝ gradW (z.1 - y) βˆ‚(ρ t)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))) z := - hconv.comp z hfst - have hprod := h1.prodMk h2.neg - exact hprod - -omit [NeZero d] in -/-- **C3 F1c β€” the convolution derivative is continuous in space.** `x ↦ ∫ y, fderiv ℝ gradW -(x βˆ’ y) βˆ‚Ο` (the FrΓ©chet derivative of the convolution field, F1) is continuous, by dominated -convergence: the integrand is continuous in `x` and bounded by `β€–fderiv gradWβ€– ≀ L` (a constant, -integrable against the probability measure `ρ`). Continuity of the variational coefficient -`A(t)` in its spatial argument β€” half of the `t`-continuity of `A` (the other half is the -measure-curve regularity `t ↦ ρ t`, supplied at the V1c ODE-existence step). -/ -theorem convolveFunctionMeasure_fderiv_continuous - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] : - Continuous (fun x => ∫ y, fderiv ℝ gradW (x - y) βˆ‚Ο) := by - have hfderiv_cont : Continuous (fun z => fderiv ℝ gradW z) := - hgradW_C1.continuous_fderiv one_ne_zero - refine continuous_of_dominated - (F := fun x y => fderiv ℝ gradW (x - y)) (bound := fun _ => (L : ℝ)) ?_ ?_ ?_ ?_ - Β· intro x - exact (hfderiv_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable - Β· intro x - exact Filter.Eventually.of_forall (fun y => norm_fderiv_le_of_lipschitz (π•œ := ℝ) hL) - Β· exact integrable_const _ - Β· exact Filter.Eventually.of_forall (fun y => - hfderiv_cont.comp (continuous_id.sub continuous_const)) - -/-- Picard iterates for the linear IVP `x' = π’œ(t)x`, `x(0)=xβ‚€` (the V1c engine): -`Iβ‚€ ≑ xβ‚€`, `I_{n+1}(t) = βˆ«β‚€α΅— π’œ(s)(Iβ‚™(s)) ds`. -/ -noncomputable def picardIter {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) : β„• β†’ ℝ β†’ E - | 0, _ => xβ‚€ - | (n + 1), t => ∫ s in (0 : ℝ)..t, π’œ s (picardIter π’œ xβ‚€ n s) - -@[simp] lemma picardIter_zero {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (t : ℝ) : picardIter π’œ xβ‚€ 0 t = xβ‚€ := rfl - -lemma picardIter_succ {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (n : β„•) (t : ℝ) : - picardIter π’œ xβ‚€ (n + 1) t = ∫ s in (0 : ℝ)..t, π’œ s (picardIter π’œ xβ‚€ n s) := rfl - -/-- **C3 V1c-engine β€” the Picard iterates are continuous and satisfy the geometric -`(Kt)ⁿ/n!`-bound on `[0,T]`.** Proved by simultaneous induction (continuity feeds -integrability, which feeds the next bound). This `Ξ£ (KT)ⁿ/n! = e^{KT}`-summable bound is the -convergence driver for the V1c fixed point. -/ -lemma picardIter_continuousOn_and_bound {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) - (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hcontπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) - (hboundπ’œ : βˆ€ t ∈ Set.Icc 0 T, β€–π’œ tβ€– ≀ K) : - βˆ€ n, ContinuousOn (picardIter π’œ xβ‚€ n) (Set.Icc 0 T) ∧ - βˆ€ t ∈ Set.Icc 0 T, β€–picardIter π’œ xβ‚€ n tβ€– ≀ (K * t) ^ n / n.factorial * β€–xβ‚€β€– := by - intro n - induction n with - | zero => - refine ⟨continuousOn_const, fun t ht => ?_⟩ - simp - | succ n ih => - obtain ⟨ih_cont, ih_bd⟩ := ih - have hg_cont : ContinuousOn (fun s => π’œ s (picardIter π’œ xβ‚€ n s)) (Set.Icc 0 T) := - hcontπ’œ.clm_apply ih_cont - have hg_int : IntegrableOn (fun s => π’œ s (picardIter π’œ xβ‚€ n s)) (Set.Icc 0 T) := - hg_cont.integrableOn_Icc - refine ⟨?_, ?_⟩ - Β· have hcp := intervalIntegral.continuousOn_primitive_interval (a := 0) (b := T) (ΞΌ := volume) - (f := fun s => π’œ s (picardIter π’œ xβ‚€ n s)) (by rw [Set.uIcc_of_le hT]; exact hg_int) - rw [Set.uIcc_of_le hT] at hcp - exact hcp - Β· intro t ht - have ht0 : (0 : ℝ) ≀ t := ht.1 - have htT : t ≀ T := ht.2 - have h_ptwise : βˆ€ s ∈ Set.Icc (0 : ℝ) t, - β€–π’œ s (picardIter π’œ xβ‚€ n s)β€– ≀ K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– := by - intro s hs - have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨hs.1, le_trans hs.2 htT⟩ - calc β€–π’œ s (picardIter π’œ xβ‚€ n s)β€– - ≀ β€–π’œ sβ€– * β€–picardIter π’œ xβ‚€ n sβ€– := (π’œ s).le_opNorm _ - _ ≀ K * ((K * s) ^ n / n.factorial * β€–xβ‚€β€–) := - mul_le_mul (hboundπ’œ s hsT) (ih_bd s hsT) (norm_nonneg _) hK - _ = K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– := by ring - have hRHS_int : IntervalIntegrable - (fun s => K * (K * s) ^ n / n.factorial * β€–xβ‚€β€–) volume 0 t := - (Continuous.intervalIntegrable (by fun_prop) 0 t) - have hLHS_int : IntervalIntegrable - (fun s => β€–π’œ s (picardIter π’œ xβ‚€ n s)β€–) volume 0 t := by - apply ContinuousOn.intervalIntegrable - rw [Set.uIcc_of_le ht0] - exact (hg_cont.mono (Set.Icc_subset_Icc_right htT)).norm - calc β€–picardIter π’œ xβ‚€ (n + 1) tβ€– - = β€–βˆ« s in (0 : ℝ)..t, π’œ s (picardIter π’œ xβ‚€ n s)β€– := by rw [picardIter_succ] - _ ≀ ∫ s in (0 : ℝ)..t, β€–π’œ s (picardIter π’œ xβ‚€ n s)β€– := - intervalIntegral.norm_integral_le_integral_norm ht0 - _ ≀ ∫ s in (0 : ℝ)..t, K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– := - intervalIntegral.integral_mono_on ht0 hLHS_int hRHS_int h_ptwise - _ = (K * t) ^ (n + 1) / (n + 1).factorial * β€–xβ‚€β€– := by - have hpow : βˆ€ s : ℝ, K * (K * s) ^ n / n.factorial * β€–xβ‚€β€– - = (K ^ (n + 1) * β€–xβ‚€β€– / n.factorial) * s ^ n := by - intro s; rw [mul_pow]; ring - simp_rw [hpow] - rw [intervalIntegral.integral_const_mul, integral_pow] - rw [Nat.factorial_succ] - push_cast - rw [mul_pow] - field_simp - ring - -/-- **C3 V1c-conv β€” the Dyson sum `M := βˆ‘β‚™ Iβ‚™` is continuous on `[0,T]`.** Weierstrass M-test: -the terms are dominated by the summable majorant `(KT)ⁿ/n!Β·β€–xβ‚€β€–`, so the series converges -uniformly; the uniform limit of the continuous partial sums is continuous. (`M` is the candidate -solution: `M = xβ‚€ + βˆ«β‚€α΅— π’œ(s)(M s) ds`, proved next.) -/ -lemma picardSum_continuousOn {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hcontπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (hboundπ’œ : βˆ€ t ∈ Set.Icc 0 T, β€–π’œ tβ€– ≀ K) : - ContinuousOn (fun t => βˆ‘' n, picardIter π’œ xβ‚€ n t) (Set.Icc 0 T) := by - have hcb := picardIter_continuousOn_and_bound π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ - have hbd : βˆ€ (n : β„•) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - β€–picardIter π’œ xβ‚€ n tβ€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := by - intro n t ht - refine le_trans ((hcb n).2 t ht) ?_ - have hKt : 0 ≀ K * t := mul_nonneg hK ht.1 - have hle : K * t ≀ K * T := mul_le_mul_of_nonneg_left ht.2 hK - gcongr - have hsum : Summable (fun n => (K * T) ^ n / n.factorial * β€–xβ‚€β€–) := - (Real.summable_pow_div_factorial (K * T)).mul_right β€–xβ‚€β€– - have hunif : TendstoUniformlyOn - (fun (u : Finset β„•) (t : ℝ) => βˆ‘ n ∈ u, picardIter π’œ xβ‚€ n t) - (fun t => βˆ‘' n, picardIter π’œ xβ‚€ n t) Filter.atTop (Set.Icc 0 T) := - tendstoUniformlyOn_tsum hsum hbd - refine hunif.continuousOn ?_ - exact (Filter.Eventually.of_forall - (fun u => continuousOn_finsetSum u (fun n _ => (hcb n).1))).frequently - -/-- **C3 V2-core β€” the Dyson sum is continuous in a PARAMETER (the V2 ingredient).** If the -coefficient family `π’œ : Z β†’ ℝ β†’ (E β†’L E)` is jointly continuous in `(z, s)` (globally) and -uniformly `K`-bounded on `[0,T]` (with `xβ‚€` constant in `z`), then `z ↦ βˆ‘β‚™ Iβ‚™(z)(t)` is continuous -for each fixed `t ∈ [0,T]`. This is the parameter analogue of `picardSum_continuousOn`: each -iterate `z ↦ Iβ‚™(z)(t)` is continuous (joint `(z,s)`-continuity, by induction through the parametric -primitive `continuous_parametric_primitive_of_continuous`), and the M-test majorant `(KT)ⁿ/n!Β·β€–xβ‚€β€–` -is **`z`-independent**, so the uniform-in-`z` limit of continuous maps is continuous. This is what -makes the variational fundamental matrix `z ↦ M z t` continuous (V2) β€” the property the abstract -`exists_fundamentalMatrix` + `choose` cannot supply (the `choose`'d witness is an arbitrary -fiberwise section; see lesson L14). -/ -lemma picardSum_continuous_param - {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hπ’œ_cont : Continuous (fun p : Z Γ— ℝ => π’œ p.1 p.2)) - (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) - (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : - Continuous (fun z => βˆ‘' n, picardIter (π’œ z) xβ‚€ n t) := by - -- (1) joint continuity of each Picard iterate on `Z Γ— ℝ`. - have hiter_cont : βˆ€ n, Continuous (fun p : Z Γ— ℝ => picardIter (π’œ p.1) xβ‚€ n p.2) := by - intro n - induction n with - | zero => - simp only [picardIter_zero] - exact continuous_const - | succ n ih => - have hg : Continuous (Function.uncurry fun z v => π’œ z v (picardIter (π’œ z) xβ‚€ n v)) := - hπ’œ_cont.clm_apply ih - have hpp := intervalIntegral.continuous_parametric_primitive_of_continuous - (ΞΌ := volume) (aβ‚€ := (0 : ℝ)) hg - simp only [picardIter_succ] - exact hpp - -- (2) per-`z` slice continuity + the `z`-independent M-test bound. - have hπ’œcont_z : βˆ€ z, ContinuousOn (π’œ z) (Set.Icc (0 : ℝ) T) := fun z => - (hπ’œ_cont.comp (continuous_const.prodMk continuous_id)).continuousOn - have hbd : βˆ€ (n : β„•) (z : Z), z ∈ (Set.univ : Set Z) β†’ - β€–picardIter (π’œ z) xβ‚€ n tβ€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := by - intro n z _ - have hb := (picardIter_continuousOn_and_bound (π’œ z) xβ‚€ T hT K hK (hπ’œcont_z z) - (hπ’œ_bound z) n).2 t ht - refine le_trans hb ?_ - have hKt : (0 : ℝ) ≀ K * t := mul_nonneg hK ht.1 - have hle : K * t ≀ K * T := mul_le_mul_of_nonneg_left ht.2 hK - gcongr - have hsum : Summable (fun n => (K * T) ^ n / n.factorial * β€–xβ‚€β€–) := - (Real.summable_pow_div_factorial (K * T)).mul_right β€–xβ‚€β€– - have hsummands_cont : βˆ€ n, Continuous (fun z => picardIter (π’œ z) xβ‚€ n t) := fun n => - (hiter_cont n).comp (continuous_id.prodMk continuous_const) - have hunif : TendstoUniformlyOn - (fun (u : Finset β„•) (z : Z) => βˆ‘ n ∈ u, picardIter (π’œ z) xβ‚€ n t) - (fun z => βˆ‘' n, picardIter (π’œ z) xβ‚€ n t) Filter.atTop (Set.univ : Set Z) := - tendstoUniformlyOn_tsum hsum hbd - rw [← continuousOn_univ] - refine hunif.continuousOn ?_ - exact (Filter.Eventually.of_forall - (fun u => continuousOn_finsetSum u (fun n _ => (hsummands_cont n).continuousOn))).frequently - -/-- Window version of `picardSum_continuous_param`: only joint continuity ON `[0,T]` is needed. -The coefficient is clamped into `[0,T]` (`projIcc`, L11) so the global parametric-primitive lemma -applies, then transferred back by agreement of the iterates on `[0,T]` (they only integrate over -`[0,t] βŠ† [0,T]`). This is the form the variational coefficient `A(s,z) = D_z b(s, Ξ¦_s z)` needs β€” -it is jointly continuous only on the window `[0,T]` (the flow `Ξ¦_s z` is). -/ -lemma picardSum_continuous_param_Icc - {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hπ’œ_contOn : ContinuousOn (fun p : Z Γ— ℝ => π’œ p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) - (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) - (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : - Continuous (fun z => βˆ‘' n, picardIter (π’œ z) xβ‚€ n t) := by - set cl : ℝ β†’ ℝ := fun s => ↑(Set.projIcc 0 T hT s) with hcl - have hcl_cont : Continuous cl := continuous_subtype_val.comp continuous_projIcc - have hcl_mem : βˆ€ s, cl s ∈ Set.Icc (0 : ℝ) T := fun s => (Set.projIcc 0 T hT s).2 - have hcl_eq : βˆ€ s ∈ Set.Icc (0 : ℝ) T, cl s = s := by - intro s hs; change (↑(Set.projIcc 0 T hT s) : ℝ) = s; rw [Set.projIcc_of_mem hT hs] - set π’œc : Z β†’ ℝ β†’ (E β†’L[ℝ] E) := fun z s => π’œ z (cl s) with hπ’œc - have hπ’œc_cont : Continuous (fun p : Z Γ— ℝ => π’œc p.1 p.2) := by - have hmap : Continuous (fun p : Z Γ— ℝ => ((p.1, cl p.2) : Z Γ— ℝ)) := - continuous_fst.prodMk (hcl_cont.comp continuous_snd) - have hmem : βˆ€ p : Z Γ— ℝ, ((p.1, cl p.2) : Z Γ— ℝ) ∈ Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T := - fun p => ⟨Set.mem_univ _, hcl_mem p.2⟩ - exact hπ’œ_contOn.comp_continuous hmap hmem - have hπ’œc_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œc z sβ€– ≀ K := - fun z s _ => hπ’œ_bound z (cl s) (hcl_mem s) - have hagree : βˆ€ (n : β„•) (z : Z), βˆ€ s ∈ Set.Icc (0 : ℝ) T, - picardIter (π’œc z) xβ‚€ n s = picardIter (π’œ z) xβ‚€ n s := by - intro n - induction n with - | zero => intro z s _; simp - | succ n ih => - intro z s hs - simp only [picardIter_succ] - refine intervalIntegral.integral_congr (fun u hu => ?_) - have huIcc : u ∈ Set.Icc (0 : ℝ) T := by - rw [Set.uIcc_of_le hs.1] at hu; exact ⟨hu.1, le_trans hu.2 hs.2⟩ - have e1 : π’œc z u = π’œ z u := by simp only [hπ’œc, hcl_eq u huIcc] - rw [e1, ih z u huIcc] - have key := picardSum_continuous_param π’œc xβ‚€ T hT K hK hπ’œc_cont hπ’œc_bound t ht - have heq : (fun z => βˆ‘' n, picardIter (π’œc z) xβ‚€ n t) - = (fun z => βˆ‘' n, picardIter (π’œ z) xβ‚€ n t) := by - funext z; congr 1; funext n; exact hagree n z t ht - rwa [heq] at key - -/-- **C3 V1c-rec β€” finite Picard recurrence.** The `(N+1)`-th partial Dyson sum equals -`xβ‚€ + βˆ«β‚€α΅— π’œ(s)(Sβ‚™(s)) ds`, where `Sβ‚™ = βˆ‘_{n π’œ s (picardIter π’œ xβ‚€ n s)) volume 0 t := by - intro n - apply ContinuousOn.intervalIntegrable - rw [Set.uIcc_of_le ht.1] - exact (hcontπ’œ.clm_apply (hcb n).1).mono (Set.Icc_subset_Icc_right ht.2) - rw [Finset.sum_range_succ', picardIter_zero] - simp only [picardIter_succ] - rw [add_comm] - congr 1 - rw [← intervalIntegral.integral_finsetSum (fun i _ => hint i)] - refine intervalIntegral.integral_congr (fun s _ => ?_) - exact (map_sum (π’œ s) (fun i => picardIter π’œ xβ‚€ i s) (Finset.range N)).symm - -/-- **C3 V1c-inteq β€” the Dyson sum solves the integral equation.** -`M(t) = xβ‚€ + βˆ«β‚€α΅— π’œ(s)(M s) ds` on `[0,T]`, where `M = βˆ‘'β‚™ Iβ‚™`. Pass `N β†’ ∞` in the finite -recurrence: LHS β†’ `M t` (partial sums of the summable series); RHS via DCT (the terms -`π’œ(s)(S_N s) β†’ π’œ(s)(M s)` pointwise, dominated by the constant `KΒ·βˆ‘'β‚™ (KT)ⁿ/n!Β·β€–xβ‚€β€–`). -/ -lemma picardSum_solves_integralEq - {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hcontπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (hboundπ’œ : βˆ€ t ∈ Set.Icc 0 T, β€–π’œ tβ€– ≀ K) - (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : - (βˆ‘' n, picardIter π’œ xβ‚€ n t) - = xβ‚€ + ∫ s in (0 : ℝ)..t, π’œ s (βˆ‘' n, picardIter π’œ xβ‚€ n s) := by - have hcb := picardIter_continuousOn_and_bound π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ - have ht0 : (0 : ℝ) ≀ t := ht.1 - have htT : t ≀ T := ht.2 - have hmaj : βˆ€ n, βˆ€ s ∈ Set.Icc (0 : ℝ) T, - β€–picardIter π’œ xβ‚€ n sβ€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := by - intro n s hs - refine le_trans ((hcb n).2 s hs) ?_ - have hKs : 0 ≀ K * s := mul_nonneg hK hs.1 - have hle : K * s ≀ K * T := mul_le_mul_of_nonneg_left hs.2 hK - gcongr - have hmaj_summable : Summable (fun n => (K * T) ^ n / n.factorial * β€–xβ‚€β€–) := - (Real.summable_pow_div_factorial (K * T)).mul_right β€–xβ‚€β€– - have hsummable : βˆ€ s ∈ Set.Icc (0 : ℝ) T, Summable (fun n => picardIter π’œ xβ‚€ n s) := by - intro s hs - exact (hmaj_summable.of_nonneg_of_le (fun n => norm_nonneg _) (fun n => hmaj n s hs)).of_norm - set C : ℝ := βˆ‘' n, (K * T) ^ n / n.factorial * β€–xβ‚€β€– with hC - have hSbound : βˆ€ N, βˆ€ s ∈ Set.Icc (0 : ℝ) T, - β€–βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n sβ€– ≀ C := by - intro N s hs - refine le_trans (norm_sum_le _ _) ?_ - refine le_trans (Finset.sum_le_sum (fun n _ => hmaj n s hs)) ?_ - exact hmaj_summable.sum_le_tsum _ (fun n _ => by positivity) - set M : ℝ β†’ E := fun u => βˆ‘' n, picardIter π’œ xβ‚€ n u with hM - have hLHS : Filter.Tendsto (fun N => βˆ‘ n ∈ Finset.range (N + 1), picardIter π’œ xβ‚€ n t) - Filter.atTop (nhds (M t)) := - ((hsummable t ht).hasSum.tendsto_sum_nat).comp (Filter.tendsto_add_atTop_nat 1) - have hRHS_int : Filter.Tendsto - (fun N => ∫ s in Set.Ioc (0 : ℝ) t, π’œ s (βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n s)) - Filter.atTop (nhds (∫ s in Set.Ioc (0 : ℝ) t, π’œ s (M s))) := by - apply MeasureTheory.tendsto_integral_of_dominated_convergence (bound := fun _ => K * C) - Β· intro N - apply ContinuousOn.aestronglyMeasurable _ measurableSet_Ioc - exact (hcontπ’œ.clm_apply (continuousOn_finsetSum _ (fun n _ => (hcb n).1))).mono - (Set.Ioc_subset_Icc_self.trans (Set.Icc_subset_Icc_right htT)) - Β· exact integrableOn_const (hs := measure_Ioc_lt_top.ne) - Β· intro N - refine MeasureTheory.ae_restrict_of_forall_mem measurableSet_Ioc (fun s hs => ?_) - have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨le_of_lt hs.1, le_trans hs.2 htT⟩ - calc β€–π’œ s (βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n s)β€– - ≀ β€–π’œ sβ€– * β€–βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n sβ€– := (π’œ s).le_opNorm _ - _ ≀ K * C := mul_le_mul (hboundπ’œ s hsT) (hSbound N s hsT) (norm_nonneg _) hK - Β· refine MeasureTheory.ae_restrict_of_forall_mem measurableSet_Ioc (fun s hs => ?_) - have hsT : s ∈ Set.Icc (0 : ℝ) T := ⟨le_of_lt hs.1, le_trans hs.2 htT⟩ - exact ((π’œ s).continuous.tendsto (M s)).comp ((hsummable s hsT).hasSum.tendsto_sum_nat) - rw [intervalIntegral.integral_of_le ht0] - have hrec' : βˆ€ N, βˆ‘ n ∈ Finset.range (N + 1), picardIter π’œ xβ‚€ n t - = xβ‚€ + ∫ s in Set.Ioc (0 : ℝ) t, π’œ s (βˆ‘ n ∈ Finset.range N, picardIter π’œ xβ‚€ n s) := by - intro N - rw [picardSum_finset_recurrence π’œ xβ‚€ T hT K hK hcontπ’œ hboundπ’œ N t ht, - intervalIntegral.integral_of_le ht0] - exact tendsto_nhds_unique hLHS ((hRHS_int.const_add xβ‚€).congr (fun N => (hrec' N).symm)) - -/-- **C3 V1c β€” existence for a linear ODE with continuous coefficients on a compact interval** -(the fundamental solution of the variational equation; a Mathlib gap). - -For a continuous family of bounded linear maps `π’œ : ℝ β†’ (E β†’L[ℝ] E)` on a Banach space `E`, the -linear IVP `x' = π’œ(t) x`, `x(0) = xβ‚€` has a solution on `[0,T]`. Generic and reusable -(promotable to `Mathlib/Analysis/ODE/`); instantiated for the variational equation with -`E := PhaseSpace d β†’L[ℝ] PhaseSpace d`, `π’œ(t) := (Β·).comp-by A(t)` (left composition), `xβ‚€ := id` -to produce the fundamental matrix `M(t)`, where `A(t) = vlasovVectorField_hasFDerivAt_in_z`'s -block CLM evaluated along the flow. - -**Why not Mathlib's `IsPicardLindelof`**: that needs a *globally bounded* field -(`norm_le : β€–f t xβ€– ≀ L`); the linear field `x ↦ π’œ(t) x` is unbounded, and confining to a ball -makes the Picard window-condition `KΒ·e^{KT}Β·T ≀ e^{KT}βˆ’1` fail for a single window (β‡’ tiling). - -**Proof plan (integral-operator contraction, no tiling)**: on the Banach space -`C([0,T]; E)` the Picard operator `𝒯[M](t) := xβ‚€ + ∫_0^t π’œ(s) (M s) ds` is `KΒ·T`-Lipschitz -(`K := sup_{[0,T]} β€–π’œβ€–`, finite by continuity on the compact `[0,T]`), and its `n`-th iterate is -`(KΒ·T)^n/n!`-Lipschitz (induction on the Bochner-integral bound), which is `< 1` for large `n`; -so `𝒯` has a unique fixed point by the iterated-contraction Banach theorem -(`ContractingWith` + `exists_fixedPoint`, `Mathlib/Topology/MetricSpace/Contracting.lean`). -Differentiating the fixed-point integral equation (FTC, `HasDerivWithinAt` of `t ↦ ∫_0^t …`) -recovers `x' = π’œ(t) x`; `x(0) = xβ‚€` from the lower integral limit. -/ -theorem exists_linearODE_solution_Icc - {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (π’œ : ℝ β†’ (E β†’L[ℝ] E)) (T : ℝ) (hT : 0 ≀ T) - (hπ’œ : ContinuousOn π’œ (Set.Icc 0 T)) (xβ‚€ : E) : - βˆƒ M : ℝ β†’ E, M 0 = xβ‚€ ∧ ContinuousOn M (Set.Icc 0 T) ∧ - βˆ€ t ∈ Set.Icc 0 T, HasDerivWithinAt M (π’œ t (M t)) (Set.Icc 0 T) t := by - obtain ⟨K, hbK⟩ := isCompact_Icc.exists_bound_of_continuousOn hπ’œ - have hK'0 : 0 ≀ max K 0 := le_max_right _ _ - have hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, β€–π’œ tβ€– ≀ max K 0 := - fun t ht => le_trans (hbK t ht) (le_max_left _ _) - set M : ℝ β†’ E := fun u => βˆ‘' n, picardIter π’œ xβ‚€ n u with hM - have hMcont : ContinuousOn M (Set.Icc 0 T) := - picardSum_continuousOn π’œ xβ‚€ T hT (max K 0) hK'0 hπ’œ hbound - have hMeq : βˆ€ t ∈ Set.Icc (0 : ℝ) T, M t = xβ‚€ + ∫ s in (0 : ℝ)..t, π’œ s (M s) := - fun t ht => picardSum_solves_integralEq π’œ xβ‚€ T hT (max K 0) hK'0 hπ’œ hbound t ht - have hg_cont : ContinuousOn (fun s => π’œ s (M s)) (Set.Icc 0 T) := hπ’œ.clm_apply hMcont - refine ⟨M, ?_, hMcont, fun t ht => ?_⟩ - Β· rw [hMeq 0 ⟨le_refl 0, hT⟩, intervalIntegral.integral_same, add_zero] - Β· have : Fact (t ∈ Set.Icc (0 : ℝ) T) := ⟨ht⟩ - have hg_int : IntervalIntegrable (fun s => π’œ s (M s)) volume 0 t := by - apply ContinuousOn.intervalIntegrable - rw [Set.uIcc_of_le ht.1] - exact hg_cont.mono (Set.Icc_subset_Icc_right ht.2) - have hg_meas : StronglyMeasurableAtFilter (fun s => π’œ s (M s)) (nhdsWithin t (Set.Icc 0 T)) := - ⟨Set.Icc 0 T, self_mem_nhdsWithin, hg_cont.aestronglyMeasurable measurableSet_Icc⟩ - have hFTC : HasDerivWithinAt (fun u => ∫ s in (0 : ℝ)..u, π’œ s (M s)) (π’œ t (M t)) - (Set.Icc 0 T) t := - intervalIntegral.integral_hasDerivWithinAt_right hg_int hg_meas (hg_cont t ht) - exact (hFTC.const_add xβ‚€).congr (fun y hy => hMeq y hy) (hMeq t ht) - -/-- **C3 V1cβ†’matrix β€” the fundamental matrix of a linear ODE.** Specialising -`exists_linearODE_solution_Icc` to the operator space `E := F β†’L[ℝ] F` with `π’œ(s) := A(s) ∘ (Β·)` -(left composition) and `xβ‚€ := id` gives the fundamental solution `M' = A(t)∘M`, `M(0) = id`. -This `M(t)` is the candidate `Dflow t z` of the variational equation (#3), once `A` is the Vlasov -field Jacobian `A(s) = D_z b(s, Ξ¦_s z)` along the flow (F2). -/ -lemma exists_fundamentalMatrix - {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] - (A : ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (hA : ContinuousOn A (Set.Icc 0 T)) : - βˆƒ M : ℝ β†’ (F β†’L[ℝ] F), M 0 = ContinuousLinearMap.id ℝ F ∧ ContinuousOn M (Set.Icc 0 T) ∧ - βˆ€ t ∈ Set.Icc 0 T, HasDerivWithinAt M ((A t).comp (M t)) (Set.Icc 0 T) t := by - obtain ⟨M, hM0, hMcont, hMderiv⟩ := exists_linearODE_solution_Icc - (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) T hT - ((ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA) - (ContinuousLinearMap.id ℝ F) - refine ⟨M, hM0, hMcont, fun t ht => ?_⟩ - simpa [ContinuousLinearMap.compL_apply] using hMderiv t ht - -omit [NeZero d] in -/-- **C3 A-cont β€” the variational coefficient `A(s,z) = D_z b(s, Ξ¦_s z)` is continuous in `s`.** -`A(s,z)` is the F2 block CLM `(snd).prod(βˆ’(∫ fderiv gradW (charX s z βˆ’ y) βˆ‚Ο_s) ∘ fst)`; its only -`s`-varying part is the convolution-derivative integral, continuous via `hρD_cont` composed with -the flow. The block CLM is reassembled with `inl∘snd + inr∘(Β·)` (Mathlib has no `clm_prod` -continuity combinator). This `ContinuousOn` is the coefficient input to `exists_fundamentalMatrix` -that produces the fundamental matrix `M_t(z) = Dflow t z` for `#3`. -/ -lemma vlasovVariationalCoeff_continuousOn - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) (z : PhaseSpace d) - (hcontIcc : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) : - ContinuousOn (fun s => (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod - (-((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) (Set.Icc 0 T) := by - have hX : ContinuousOn (fun s => charX s z) (Set.Icc (0 : ℝ) T) := - continuous_fst.comp_continuousOn hcontIcc - have hpair : ContinuousOn (fun s => ((s, charX s z) : ℝ Γ— PhysSpace d)) (Set.Icc (0 : ℝ) T) := - continuousOn_id.prodMk hX - have hmaps : Set.MapsTo (fun s => ((s, charX s z) : ℝ Γ— PhysSpace d)) - (Set.Icc (0 : ℝ) T) (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d))) := - fun s hs => ⟨hs, Set.mem_univ _⟩ - have hD : ContinuousOn (fun s => ∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)) (Set.Icc 0 T) := - hρD_cont.comp hpair hmaps - have hDcomp : ContinuousOn (fun s => -((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) (Set.Icc 0 T) := - (hD.clm_comp continuousOn_const).neg - have heq : (fun s => (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod - (-((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) - = (fun s => (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)).comp - (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) - + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)).comp - (-((∫ y, fderiv ℝ gradW (charX s z - y) βˆ‚(ρ s)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d))))) := by - funext s; ext x <;> simp - rw [heq] - exact continuousOn_const.add (continuousOn_const.clm_comp hDcomp) - -/-- **C3 D1 (Jacobian).** The phase-space Jacobian `A(s, p) = D_w b(s, p)` of the frozen Vlasov -field at the base point `p`: the block continuous-linear map `Ξ΄ ↦ (Ξ΄.2, βˆ’(D_x conv ρ_s)(p.1)Β·Ξ΄.1)`, -where `D_x conv ρ_s (p.1) = ∫ y, fderiv ℝ gradW (p.1 βˆ’ y) βˆ‚Ο_s` (F1). This is the coefficient of -the linear variational ODE `M' = A(s, Ξ¦_s z)Β·M`; `vlasovVectorField_hasFDerivAt_in_z` (F2) says it -is the FrΓ©chet derivative of `vlasovVectorField gradW ρ s` at `p.2`. -/ -noncomputable def vlasovFieldJacobian (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) (p : ℝ Γ— PhaseSpace d) : PhaseSpace d β†’L[ℝ] PhaseSpace d := - (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)).prod - (-((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) - -omit [NeZero d] in -/-- **C3 D1a β€” the uniform-over-compact first-order Taylor remainder of the Vlasov field.** - -For a fixed initial point `z`, the first-order remainder of the frozen field `b(s,Β·)` at the moving -base point `Ξ¦_s z := (charX s z, charV s z)`, -`R(s,w) = b(s,w) βˆ’ b(s,Ξ¦_s z) βˆ’ A(s,Ξ¦_s z)Β·(w βˆ’ Ξ¦_s z)`, is `o(β€–w βˆ’ Ξ¦_s zβ€–)` **uniformly in -`s ∈ [0,T]`**: for every `Ξ· > 0` there is a single `Ξ΄ > 0` (independent of `s`) with -`β€–R(s,w)β€– ≀ Ξ·Β·β€–w βˆ’ Ξ¦_s zβ€–` whenever `β€–w βˆ’ Ξ¦_s zβ€– ≀ Ξ΄`. - -This uniformity is the load-bearing analytic core of D1 (the variational-equation difference -quotient): it is what lets GrΓΆnwall bound `Ξ¦_t(z+h) βˆ’ Ξ¦_t(z) βˆ’ M_t(z)Β·h` by `o(β€–hβ€–)` *uniformly -along the trajectory*. Proof: the flow image `{Ξ¦_s z : s ∈ [0,T]}` is compact (continuous image of -`[0,T]`), `A = D_w b` is jointly `(s,w)`-continuous (from `hρD_cont`), so `A` is **uniformly** -continuous on the compact tube `Ξ“ = {(s, Ξ¦_s z + e) : s ∈ [0,T], β€–eβ€– ≀ 1}` (Heine–Cantor); the -mean-value inequality on `closedBall (Ξ¦_s z) Ξ΄` then converts the modulus into the remainder -bound. -/ -lemma vlasovField_taylorRemainder_uniform - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) (z : PhaseSpace d) - (hcontIcc : ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) : - βˆ€ Ξ· : ℝ, 0 < Ξ· β†’ βˆƒ Ξ΄ : ℝ, 0 < Ξ΄ ∧ βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ w : PhaseSpace d, - β€–w - (charX s z, charV s z)β€– ≀ Ξ΄ β†’ - β€–vlasovVectorField gradW ρ s w - vlasovVectorField gradW ρ s (charX s z, charV s z) - - (vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z))) (w - (charX s z, charV s z))β€– - ≀ Ξ· * β€–w - (charX s z, charV s z)β€– := by - set Ξ¦ : ℝ β†’ PhaseSpace d := fun s => (charX s z, charV s z) with hΞ¦ - -- F2: the field is differentiable in the phase variable with derivative `vlasovFieldJacobian`. - have hF2 : βˆ€ s (w : PhaseSpace d), - HasFDerivAt (vlasovVectorField gradW ρ s) (vlasovFieldJacobian gradW ρ (s, w)) w := - fun s w => vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s w - -- Joint continuity of the Jacobian on `Icc 0 T Γ—Λ’ Set.univ` (from `hρD_cont`). - have hg_cont : Continuous (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) := - continuous_fst.prodMk (continuous_fst.comp continuous_snd) - have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d))) := - fun p hp => ⟨hp.1, Set.mem_univ _⟩ - have hD2 : ContinuousOn - (fun p : ℝ Γ— PhaseSpace d => ∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ Set.univ) := - hρD_cont.comp hg_cont.continuousOn hmaps - have hDcomp : ContinuousOn - (fun p : ℝ Γ— PhaseSpace d => -((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) (Set.Icc 0 T Γ—Λ’ Set.univ) := - (hD2.clm_comp continuousOn_const).neg - have heq : (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) = fun p => - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)).comp - (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) - + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)).comp - (-((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) := by - funext p; ext x <;> simp [vlasovFieldJacobian] - have hAj_cont : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) - (Set.Icc 0 T Γ—Λ’ Set.univ) := by - rw [heq]; exact continuousOn_const.add (continuousOn_const.clm_comp hDcomp) - -- The compact tube `Ξ“ = {(s, Ξ¦ s + e) : s ∈ [0,T], β€–eβ€– ≀ 1}`. - set ball1 : Set (PhaseSpace d) := Metric.closedBall 0 1 with hball1 - have hmap : ContinuousOn (fun q : ℝ Γ— PhaseSpace d => ((q.1, Ξ¦ q.1 + q.2) : ℝ Γ— PhaseSpace d)) - (Set.Icc 0 T Γ—Λ’ ball1) := - continuousOn_fst.prodMk - ((hcontIcc.comp continuousOn_fst (fun q hq => hq.1)).add continuousOn_snd) - set Ξ“ : Set (ℝ Γ— PhaseSpace d) := - (fun q : ℝ Γ— PhaseSpace d => ((q.1, Ξ¦ q.1 + q.2) : ℝ Γ— PhaseSpace d)) '' (Set.Icc 0 T Γ—Λ’ ball1) - with hΞ“ - have hΞ“compact : IsCompact Ξ“ := - (isCompact_Icc.prod (isCompact_closedBall 0 1)).image_of_continuousOn hmap - have hΞ“sub : Ξ“ βŠ† Set.Icc 0 T Γ—Λ’ Set.univ := by - rintro _ ⟨q, hq, rfl⟩; exact ⟨hq.1, Set.mem_univ _⟩ - have hUC : UniformContinuousOn (fun p => vlasovFieldJacobian gradW ρ p) Ξ“ := - hΞ“compact.uniformContinuousOn_of_continuous (hAj_cont.mono hΞ“sub) - have hmemΞ“ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ e : PhaseSpace d, β€–eβ€– ≀ 1 β†’ - ((s, Ξ¦ s + e) : ℝ Γ— PhaseSpace d) ∈ Ξ“ := by - intro s hs e he - exact ⟨(s, e), ⟨hs, by simpa [hball1, Metric.mem_closedBall, dist_eq_norm] using he⟩, rfl⟩ - -- Extract the uniform-continuity modulus. - intro Ξ· hΞ· - obtain βŸ¨Ξ΄β‚€, hΞ΄β‚€, H⟩ := Metric.uniformContinuousOn_iff_le.mp hUC Ξ· hΞ· - refine ⟨min Ξ΄β‚€ 1, lt_min hΞ΄β‚€ one_pos, ?_⟩ - intro s hs w hw - -- Mean value on the convex ball `C = closedBall (Ξ¦ s) (min Ξ΄β‚€ 1)`. - set C : Set (PhaseSpace d) := Metric.closedBall (Ξ¦ s) (min Ξ΄β‚€ 1) with hC - have hΞ¦mem : Ξ¦ s ∈ C := Metric.mem_closedBall_self (le_min hΞ΄β‚€.le zero_le_one) - have hwmem : w ∈ C := by - rw [hC, Metric.mem_closedBall, dist_eq_norm]; exact hw - -- The fderiv bound on `C` from uniform continuity. - have hbound : βˆ€ w' ∈ C, - β€–vlasovFieldJacobian gradW ρ (s, w') - vlasovFieldJacobian gradW ρ (s, Ξ¦ s)β€– ≀ Ξ· := by - intro w' hw' - have hw'norm : β€–w' - Ξ¦ sβ€– ≀ min Ξ΄β‚€ 1 := by - rw [← dist_eq_norm]; rw [hC, Metric.mem_closedBall] at hw'; exact hw' - have hw'le1 : β€–w' - Ξ¦ sβ€– ≀ 1 := hw'norm.trans (min_le_right _ _) - have hmem1 : ((s, w') : ℝ Γ— PhaseSpace d) ∈ Ξ“ := by - have := hmemΞ“ s hs (w' - Ξ¦ s) hw'le1 - rwa [add_sub_cancel] at this - have hmem2 : ((s, Ξ¦ s) : ℝ Γ— PhaseSpace d) ∈ Ξ“ := by - have := hmemΞ“ s hs 0 (by simp) - rwa [add_zero] at this - have hdist : dist ((s, w') : ℝ Γ— PhaseSpace d) (s, Ξ¦ s) ≀ Ξ΄β‚€ := by - rw [Prod.dist_eq] - simp only [dist_self, max_le_iff] - refine ⟨hΞ΄β‚€.le, ?_⟩ - rw [dist_eq_norm]; exact hw'norm.trans (min_le_left _ _) - have := H _ hmem1 _ hmem2 hdist - rwa [dist_eq_norm] at this - -- Apply the mean value inequality to `g u = b(s,u) βˆ’ A(s,Ξ¦ s)Β·u`. - have hg : βˆ€ w' ∈ C, HasFDerivWithinAt - (fun u => vlasovVectorField gradW ρ s u - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) u) - (vlasovFieldJacobian gradW ρ (s, w') - vlasovFieldJacobian gradW ρ (s, Ξ¦ s)) C w' := by - intro w' _ - have h1 := hF2 s w' - have h2 : HasFDerivAt (fun u => vlasovFieldJacobian gradW ρ (s, Ξ¦ s) u) - (vlasovFieldJacobian gradW ρ (s, Ξ¦ s)) w' := - (vlasovFieldJacobian gradW ρ (s, Ξ¦ s)).hasFDerivAt - exact (h1.sub h2).hasFDerivWithinAt - have hmv := (convex_closedBall (Ξ¦ s) (min Ξ΄β‚€ 1)).norm_image_sub_le_of_norm_hasFDerivWithin_le - hg hbound hΞ¦mem hwmem - -- Rewrite `g w βˆ’ g (Ξ¦ s)` as the remainder. - have hReq : (vlasovVectorField gradW ρ s w - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) w) - - (vlasovVectorField gradW ρ s (Ξ¦ s) - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) (Ξ¦ s)) - = vlasovVectorField gradW ρ s w - vlasovVectorField gradW ρ s (Ξ¦ s) - - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) (w - Ξ¦ s) := by - rw [map_sub]; abel - simpa only [hReq] using hmv - -omit [NeZero d] in -/-- **C3 (shared) β€” joint continuity of the Jacobian** on `Icc 0 T Γ—Λ’univ` (used by V2's -`hA_contOn`). The block CLM `vlasovFieldJacobian` is reassembled `inl∘snd + inr∘(Β·)` and its -varying part is continuous via `hρD_cont`. -/ -lemma vlasovFieldJacobian_continuousOn - (gradW : PhysSpace d β†’ PhysSpace d) (ρ : ℝ β†’ Measure (PhysSpace d)) (T : ℝ) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) : - ContinuousOn (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := by - have hg_cont : Continuous (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) := - continuous_fst.prodMk (continuous_fst.comp continuous_snd) - have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.1, p.2.1) : ℝ Γ— PhysSpace d)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d))) := - fun p hp => ⟨hp.1, Set.mem_univ _⟩ - have hD2 : ContinuousOn - (fun p : ℝ Γ— PhaseSpace d => ∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ Set.univ) := - hρD_cont.comp hg_cont.continuousOn hmaps - have hDcomp : ContinuousOn - (fun p : ℝ Γ— PhaseSpace d => -((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) (Set.Icc 0 T Γ—Λ’ Set.univ) := - (hD2.clm_comp continuousOn_const).neg - have heq : (fun p : ℝ Γ— PhaseSpace d => vlasovFieldJacobian gradW ρ p) = fun p => - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)).comp - (ContinuousLinearMap.snd ℝ (PhysSpace d) (PhysSpace d)) - + (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)).comp - (-((∫ y, fderiv ℝ gradW (p.2.1 - y) βˆ‚(ρ p.1)).comp - (ContinuousLinearMap.fst ℝ (PhysSpace d) (PhysSpace d)))) := by - funext p; ext x <;> simp [vlasovFieldJacobian] - rw [heq]; exact continuousOn_const.add (continuousOn_const.clm_comp hDcomp) - -/-- **C3 (shared) β€” Lipschitz-in-parameter + ContinuousOn-in-time β‡’ jointly ContinuousOn.** -A generic upgrade: if `G z Β·` is `ContinuousOn (Icc 0 T)` for each `z` and `z ↦ G z s` is -`C`-Lipschitz uniformly over `s ∈ [0,T]`, then `(z,s) ↦ G z s` is jointly continuous on -`univ Γ—Λ’ Icc 0 T`. Used to derive flow joint continuity `(z,s) ↦ Ξ¦_s z` from -`charFlow_lipschitzInZ_via_gronwall_Ioo` (Lipschitz-in-`z`) + per-`z` continuity in `s`. -/ -lemma continuousOn_prod_of_lipschitz_continuousOn - {Z E : Type*} [PseudoMetricSpace Z] [PseudoMetricSpace E] - (G : Z β†’ ℝ β†’ E) (T C : ℝ) - (hlip : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z₁ zβ‚‚, dist (G z₁ s) (G zβ‚‚ s) ≀ C * dist z₁ zβ‚‚) - (hcont : βˆ€ z, ContinuousOn (fun s => G z s) (Set.Icc (0 : ℝ) T)) : - ContinuousOn (fun p : Z Γ— ℝ => G p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by - rw [Metric.continuousOn_iff] - rintro ⟨zβ‚€, sβ‚€βŸ© ⟨_, hsβ‚€βŸ© Ξ΅ hΞ΅ - obtain βŸ¨Ξ΄β‚, hδ₁, hcs⟩ := - (Metric.continuousWithinAt_iff).mp (hcont zβ‚€ sβ‚€ hsβ‚€) (Ξ΅/2) (by positivity) - have hC1 : (0 : ℝ) < |C| + 1 := by positivity - refine ⟨min δ₁ (Ξ΅ / (2 * (|C| + 1))), by positivity, ?_⟩ - rintro ⟨z, s⟩ ⟨_, hs⟩ hd - rw [Prod.dist_eq, max_lt_iff] at hd - obtain ⟨hdz, hds⟩ := hd - have hterm1 : dist (G z s) (G zβ‚€ s) < Ξ΅/2 := by - calc dist (G z s) (G zβ‚€ s) - ≀ C * dist z zβ‚€ := hlip s hs z zβ‚€ - _ ≀ (|C| + 1) * dist z zβ‚€ := - mul_le_mul_of_nonneg_right (by linarith [le_abs_self C]) dist_nonneg - _ < (|C| + 1) * (Ξ΅ / (2 * (|C| + 1))) := - mul_lt_mul_of_pos_left (lt_of_lt_of_le hdz (min_le_right _ _)) hC1 - _ = Ξ΅/2 := by field_simp - have hterm2 : dist (G zβ‚€ s) (G zβ‚€ sβ‚€) < Ξ΅/2 := - hcs hs (lt_of_lt_of_le hds (min_le_left _ _)) - calc dist (G z s) (G zβ‚€ sβ‚€) - ≀ dist (G z s) (G zβ‚€ s) + dist (G zβ‚€ s) (G zβ‚€ sβ‚€) := dist_triangle _ _ _ - _ < Ξ΅/2 + Ξ΅/2 := add_lt_add hterm1 hterm2 - _ = Ξ΅ := by ring - -/-- **C3 V2 β€” the explicit fundamental matrix** (Route A, lesson L14): the canonical Dyson-series -solution of `M' = A(t)Β·M`, `M 0 = id`, as a *function* (not a `choose`-d witness), so its -parameter-regularity is accessible. -/ -noncomputable def fundamentalMatrix {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F] - (A : ℝ β†’ (F β†’L[ℝ] F)) : ℝ β†’ (F β†’L[ℝ] F) := - fun t => βˆ‘' n, picardIter (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) - (ContinuousLinearMap.id ℝ F) n t - -/-- `fundamentalMatrix A` solves the fundamental-matrix IVP on `[0,T]` (the non-existential form of -`exists_fundamentalMatrix`; same proof through the picardSum lemmas). -/ -lemma fundamentalMatrix_spec {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] - (A : ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (hA : ContinuousOn A (Set.Icc 0 T)) : - fundamentalMatrix A 0 = ContinuousLinearMap.id ℝ F ∧ - ContinuousOn (fundamentalMatrix A) (Set.Icc 0 T) ∧ - βˆ€ t ∈ Set.Icc 0 T, HasDerivWithinAt (fundamentalMatrix A) - ((A t).comp (fundamentalMatrix A t)) (Set.Icc 0 T) t := by - have hπ’œcont : ContinuousOn (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) (Set.Icc 0 T) := - (ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA - obtain ⟨KA, hKA⟩ := - (isCompact_Icc (a := (0 : ℝ)) (b := T)).exists_bound_of_continuousOn hA - have hK'0 : (0 : ℝ) ≀ max KA 0 := le_max_right _ _ - have hbound : βˆ€ t ∈ Set.Icc (0 : ℝ) T, β€–ContinuousLinearMap.compL ℝ F F F (A t)β€– ≀ max KA 0 := by - intro t ht - have h1 : β€–ContinuousLinearMap.compL ℝ F F F (A t)β€– ≀ β€–A tβ€– := by - refine ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg _) (fun g => ?_) - rw [ContinuousLinearMap.compL_apply]; exact (A t).opNorm_comp_le g - exact le_trans (le_trans h1 (hKA t ht)) (le_max_left KA 0) - have hMcont : ContinuousOn (fundamentalMatrix A) (Set.Icc 0 T) := - picardSum_continuousOn (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) - (ContinuousLinearMap.id ℝ F) T hT (max KA 0) hK'0 hπ’œcont hbound - have hMeq : βˆ€ t ∈ Set.Icc (0 : ℝ) T, fundamentalMatrix A t = ContinuousLinearMap.id ℝ F - + ∫ s in (0 : ℝ)..t, ContinuousLinearMap.compL ℝ F F F (A s) (fundamentalMatrix A s) := - fun t ht => picardSum_solves_integralEq (fun s => ContinuousLinearMap.compL ℝ F F F (A s)) - (ContinuousLinearMap.id ℝ F) T hT (max KA 0) hK'0 hπ’œcont hbound t ht - have hg_cont : ContinuousOn - (fun s => ContinuousLinearMap.compL ℝ F F F (A s) (fundamentalMatrix A s)) (Set.Icc 0 T) := - hπ’œcont.clm_apply hMcont - refine ⟨?_, hMcont, fun t ht => ?_⟩ - Β· rw [hMeq 0 ⟨le_refl 0, hT⟩, intervalIntegral.integral_same, add_zero] - Β· have : Fact (t ∈ Set.Icc (0 : ℝ) T) := ⟨ht⟩ - have hg_int : IntervalIntegrable - (fun s => ContinuousLinearMap.compL ℝ F F F (A s) (fundamentalMatrix A s)) volume 0 t := by - apply ContinuousOn.intervalIntegrable - rw [Set.uIcc_of_le ht.1]; exact hg_cont.mono (Set.Icc_subset_Icc_right ht.2) - have hg_meas : StronglyMeasurableAtFilter - (fun s => ContinuousLinearMap.compL ℝ F F F (A s) (fundamentalMatrix A s)) - (nhdsWithin t (Set.Icc 0 T)) := - ⟨Set.Icc 0 T, self_mem_nhdsWithin, hg_cont.aestronglyMeasurable measurableSet_Icc⟩ - have hFTC : HasDerivWithinAt - (fun u => ∫ s in (0 : ℝ)..u, - ContinuousLinearMap.compL ℝ F F F (A s) (fundamentalMatrix A s)) - (ContinuousLinearMap.compL ℝ F F F (A t) (fundamentalMatrix A t)) (Set.Icc 0 T) t := - intervalIntegral.integral_hasDerivWithinAt_right hg_int hg_meas (hg_cont t ht) - have hHD := (hFTC.const_add (ContinuousLinearMap.id ℝ F)).congr - (fun y hy => hMeq y hy) (hMeq t ht) - rwa [ContinuousLinearMap.compL_apply] at hHD - -/-- **C3 V2 β€” the fundamental matrix is continuous in a PARAMETER** (closes V2 via Route A). -Specialises `picardSum_continuous_param_Icc` to `π’œ := compL∘A`, `xβ‚€ := id`; the `compL` factor is -`1`-bounded so the `K`-bound transfers from `A`. -/ -lemma fundamentalMatrix_continuous_param - {Z F : Type*} [TopologicalSpace Z] [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] - (A : Z β†’ ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hA_contOn : ContinuousOn (fun p : Z Γ— ℝ => A p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) - (hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ K) - (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : - Continuous (fun z => fundamentalMatrix (A z) t) := by - have hπ’œ_contOn : ContinuousOn - (fun p : Z Γ— ℝ => ContinuousLinearMap.compL ℝ F F F (A p.1 p.2)) - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := - (ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA_contOn - have hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, - β€–ContinuousLinearMap.compL ℝ F F F (A z s)β€– ≀ K := by - intro z s hs - refine le_trans ?_ (hA_bound z s hs) - refine ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg _) (fun g => ?_) - rw [ContinuousLinearMap.compL_apply] - exact (A z s).opNorm_comp_le g - exact picardSum_continuous_param_Icc (fun z s => ContinuousLinearMap.compL ℝ F F F (A z s)) - (ContinuousLinearMap.id ℝ F) T hT K hK hπ’œ_contOn hπ’œ_bound t ht - -/-- **Step 3 (i) β€” joint `(z,s)` continuity of the Dyson sum** (global-hypothesis form). -Mirror of `picardSum_continuous_param`, concluding JOINT `ContinuousOn` on `univ Γ—Λ’ Icc 0 T` -instead of per-`t` continuity in `z`. The proof reuses the same joint iterate continuity -(`hiter_cont` on `Z Γ— ℝ`) and the same `(z,s)`-independent M-test majorant `(KT)ⁿ/n!Β·β€–xβ‚€β€–`; only -the final `tendstoUniformlyOn` ranges over `univ Γ—Λ’ Icc 0 T`. Used to make the variational -fundamental matrix `(z,s) ↦ M z s` jointly continuous (the partial-derivative continuity the -two-time-flow joint `CΒΉ`-ness needs). -/ -lemma picardSum_continuous_param_joint - {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hπ’œ_cont : Continuous (fun p : Z Γ— ℝ => π’œ p.1 p.2)) - (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) : - ContinuousOn (fun p : Z Γ— ℝ => βˆ‘' n, picardIter (π’œ p.1) xβ‚€ n p.2) - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by - have hiter_cont : βˆ€ n, Continuous (fun p : Z Γ— ℝ => picardIter (π’œ p.1) xβ‚€ n p.2) := by - intro n - induction n with - | zero => - simp only [picardIter_zero] - exact continuous_const - | succ n ih => - have hg : Continuous (Function.uncurry fun z v => π’œ z v (picardIter (π’œ z) xβ‚€ n v)) := - hπ’œ_cont.clm_apply ih - have hpp := intervalIntegral.continuous_parametric_primitive_of_continuous - (ΞΌ := volume) (aβ‚€ := (0 : ℝ)) hg - simp only [picardIter_succ] - exact hpp - have hπ’œcont_z : βˆ€ z, ContinuousOn (π’œ z) (Set.Icc (0 : ℝ) T) := fun z => - (hπ’œ_cont.comp (continuous_const.prodMk continuous_id)).continuousOn - have hbd : βˆ€ (n : β„•) (p : Z Γ— ℝ), p ∈ Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T β†’ - β€–picardIter (π’œ p.1) xβ‚€ n p.2β€– ≀ (K * T) ^ n / n.factorial * β€–xβ‚€β€– := by - intro n p hp - have hps : p.2 ∈ Set.Icc (0 : ℝ) T := hp.2 - have hb := (picardIter_continuousOn_and_bound (π’œ p.1) xβ‚€ T hT K hK (hπ’œcont_z p.1) - (hπ’œ_bound p.1) n).2 p.2 hps - refine le_trans hb ?_ - have hKt : (0 : ℝ) ≀ K * p.2 := mul_nonneg hK hps.1 - have hle : K * p.2 ≀ K * T := mul_le_mul_of_nonneg_left hps.2 hK - gcongr - have hsum : Summable (fun n => (K * T) ^ n / n.factorial * β€–xβ‚€β€–) := - (Real.summable_pow_div_factorial (K * T)).mul_right β€–xβ‚€β€– - have hunif : TendstoUniformlyOn - (fun (u : Finset β„•) (p : Z Γ— ℝ) => βˆ‘ n ∈ u, picardIter (π’œ p.1) xβ‚€ n p.2) - (fun p => βˆ‘' n, picardIter (π’œ p.1) xβ‚€ n p.2) Filter.atTop - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := - tendstoUniformlyOn_tsum hsum hbd - refine hunif.continuousOn ?_ - exact (Filter.Eventually.of_forall - (fun u => continuousOn_finsetSum u (fun n _ => (hiter_cont n).continuousOn))).frequently - -/-- **Step 3 (i) β€” joint `(z,s)` continuity of the Dyson sum** (window / `ContinuousOn`-hypothesis -form). Mirror of `picardSum_continuous_param_Icc`: clamp `s` into `[0,T]` (`projIcc`, L11) so the -global form applies, then transfer back by iterate-agreement on `[0,T]`. -/ -lemma picardSum_continuous_param_Icc_joint - {Z E : Type*} [TopologicalSpace Z] [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (π’œ : Z β†’ ℝ β†’ (E β†’L[ℝ] E)) (xβ‚€ : E) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hπ’œ_contOn : ContinuousOn (fun p : Z Γ— ℝ => π’œ p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) - (hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œ z sβ€– ≀ K) : - ContinuousOn (fun p : Z Γ— ℝ => βˆ‘' n, picardIter (π’œ p.1) xβ‚€ n p.2) - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by - set cl : ℝ β†’ ℝ := fun s => ↑(Set.projIcc 0 T hT s) with hcl - have hcl_cont : Continuous cl := continuous_subtype_val.comp continuous_projIcc - have hcl_mem : βˆ€ s, cl s ∈ Set.Icc (0 : ℝ) T := fun s => (Set.projIcc 0 T hT s).2 - have hcl_eq : βˆ€ s ∈ Set.Icc (0 : ℝ) T, cl s = s := by - intro s hs; change (↑(Set.projIcc 0 T hT s) : ℝ) = s; rw [Set.projIcc_of_mem hT hs] - set π’œc : Z β†’ ℝ β†’ (E β†’L[ℝ] E) := fun z s => π’œ z (cl s) with hπ’œc - have hπ’œc_cont : Continuous (fun p : Z Γ— ℝ => π’œc p.1 p.2) := by - have hmap : Continuous (fun p : Z Γ— ℝ => ((p.1, cl p.2) : Z Γ— ℝ)) := - continuous_fst.prodMk (hcl_cont.comp continuous_snd) - have hmem : βˆ€ p : Z Γ— ℝ, ((p.1, cl p.2) : Z Γ— ℝ) ∈ Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T := - fun p => ⟨Set.mem_univ _, hcl_mem p.2⟩ - exact hπ’œ_contOn.comp_continuous hmap hmem - have hπ’œc_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–π’œc z sβ€– ≀ K := - fun z s _ => hπ’œ_bound z (cl s) (hcl_mem s) - have hagree : βˆ€ (n : β„•) (z : Z), βˆ€ s ∈ Set.Icc (0 : ℝ) T, - picardIter (π’œc z) xβ‚€ n s = picardIter (π’œ z) xβ‚€ n s := by - intro n - induction n with - | zero => intro z s _; simp - | succ n ih => - intro z s hs - simp only [picardIter_succ] - refine intervalIntegral.integral_congr (fun u hu => ?_) - have huIcc : u ∈ Set.Icc (0 : ℝ) T := by - rw [Set.uIcc_of_le hs.1] at hu; exact ⟨hu.1, le_trans hu.2 hs.2⟩ - have e1 : π’œc z u = π’œ z u := by simp only [hπ’œc, hcl_eq u huIcc] - rw [e1, ih z u huIcc] - have key := picardSum_continuous_param_joint π’œc xβ‚€ T hT K hK hπ’œc_cont hπ’œc_bound - refine key.congr ?_ - rintro ⟨z, s⟩ ⟨_, hs⟩ - simp only - congr 1; funext n; exact (hagree n z s hs).symm - -/-- **Step 3 (i) β€” the fundamental matrix is jointly `(z,s)`-continuous.** Joint companion of -`fundamentalMatrix_continuous_param`; specialises `picardSum_continuous_param_Icc_joint` to -`π’œ := compL∘A`, `xβ‚€ := id`. This is the partial-`z`-derivative continuity input to the joint -`CΒΉ`-ness of the forward flow `(s,z) ↦ Ξ¦_s z` (Step 3 (iii)). -/ -lemma fundamentalMatrix_continuous_param_joint - {Z F : Type*} [TopologicalSpace Z] [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] - (A : Z β†’ ℝ β†’ (F β†’L[ℝ] F)) (T : ℝ) (hT : 0 ≀ T) (K : ℝ) (hK : 0 ≀ K) - (hA_contOn : ContinuousOn (fun p : Z Γ— ℝ => A p.1 p.2) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T)) - (hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ K) : - ContinuousOn (fun p : Z Γ— ℝ => fundamentalMatrix (A p.1) p.2) - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by - have hπ’œ_contOn : ContinuousOn - (fun p : Z Γ— ℝ => ContinuousLinearMap.compL ℝ F F F (A p.1 p.2)) - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := - (ContinuousLinearMap.compL ℝ F F F).continuous.comp_continuousOn hA_contOn - have hπ’œ_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, - β€–ContinuousLinearMap.compL ℝ F F F (A z s)β€– ≀ K := by - intro z s hs - refine le_trans ?_ (hA_bound z s hs) - refine ContinuousLinearMap.opNorm_le_bound _ (norm_nonneg _) (fun g => ?_) - rw [ContinuousLinearMap.compL_apply] - exact (A z s).opNorm_comp_le g - exact picardSum_continuous_param_Icc_joint - (fun z s => ContinuousLinearMap.compL ℝ F F F (A z s)) - (ContinuousLinearMap.id ℝ F) T hT K hK hπ’œ_contOn hπ’œ_bound - -section CharFlowDeriv -open Filter Topology - -/-- Generic GrΓΆnwall difference-quotient bound (open-interval ODE + `sβ‚€β†’0⁺` limit). Two curves -`uh, mh` that approximately solve the same linear ODE `w' = vlinΒ·w` on `Ioo 0 T` from the same datum -(`uh 0 = mh 0`), with `mh` exact and `uh`'s defect uniformly `≀ Ξ΅f`, satisfy -`dist (uh t) (mh t) ≀ gronwallBound 0 K Ξ΅f t`. `vlin` is abstract (kept opaque to avoid unfolding -the heavy `vlasovFieldJacobian` integral in the GrΓΆnwall application). -/ -lemma gronwall_diffQuotient_bound - {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - (vlin : ℝ β†’ (E β†’L[ℝ] E)) (K : NNReal) (hvlin_lip : βˆ€ s, LipschitzWith K (vlin s)) - (uh mh Fuh : ℝ β†’ E) (Ξ΅f : ℝ) (T t : ℝ) (ht : t ∈ Set.Ioo (0 : ℝ) T) - (huh_cont : ContinuousOn uh (Set.Icc 0 T)) (hmh_cont : ContinuousOn mh (Set.Icc 0 T)) - (huh_deriv : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt uh (Fuh s) s) - (hmh_deriv : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt mh ((vlin s) (mh s)) s) - (hdefect : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, dist (Fuh s) (vlin s (uh s)) ≀ Ξ΅f) - (h0 : uh 0 = mh 0) : - dist (uh t) (mh t) ≀ gronwallBound 0 (K:ℝ) Ξ΅f t := by - have hbound_s0 : βˆ€ sβ‚€ ∈ Set.Ioo (0 : ℝ) t, - dist (uh t) (mh t) ≀ gronwallBound (dist (uh sβ‚€) (mh sβ‚€)) (K:ℝ) Ξ΅f (t - sβ‚€) := by - intro sβ‚€ hsβ‚€ - have hIco_sub : Set.Ico sβ‚€ t βŠ† Set.Ioo 0 T := fun s hs => - ⟨lt_of_lt_of_le hsβ‚€.1 hs.1, hs.2.trans ht.2⟩ - have hIcc_sub : Set.Icc sβ‚€ t βŠ† Set.Icc 0 T := fun s hs => - ⟨le_trans hsβ‚€.1.le hs.1, le_trans hs.2 ht.2.le⟩ - have key := dist_le_of_approx_trajectories_ODE (K := K) - (Ξ΅f := Ξ΅f) (Ξ΅g := 0) (Ξ΄ := dist (uh sβ‚€) (mh sβ‚€)) - hvlin_lip (huh_cont.mono hIcc_sub) - (fun s hs => (huh_deriv s (hIco_sub hs)).hasDerivWithinAt) - (fun s hs => hdefect s (hIco_sub hs)) - (hmh_cont.mono hIcc_sub) - (fun s hs => (hmh_deriv s (hIco_sub hs)).hasDerivWithinAt) - (fun s _ => le_of_eq (dist_self _)) (le_refl _) - have hkey := key t ⟨hsβ‚€.2.le, le_refl t⟩ - simpa only [add_zero] using hkey - have : (𝓝[Set.Ioo 0 t] (0 : ℝ)).NeBot := left_nhdsWithin_Ioo_neBot ht.1 - have hT0 : (0 : ℝ) ≀ T := le_trans ht.1.le ht.2.le - have hsub_Icc : Set.Ioo (0 : ℝ) t βŠ† Set.Icc 0 T := fun s hs => ⟨hs.1.le, le_trans hs.2.le ht.2.le⟩ - have htend_uh : Tendsto uh (𝓝[Set.Ioo 0 t] 0) (𝓝 (uh 0)) := - (huh_cont 0 ⟨le_refl 0, hT0⟩).tendsto.mono_left (nhdsWithin_mono 0 hsub_Icc) - have htend_mh : Tendsto mh (𝓝[Set.Ioo 0 t] 0) (𝓝 (mh 0)) := - (hmh_cont 0 ⟨le_refl 0, hT0⟩).tendsto.mono_left (nhdsWithin_mono 0 hsub_Icc) - have htend_Ξ΄ : Tendsto (fun sβ‚€ => dist (uh sβ‚€) (mh sβ‚€)) (𝓝[Set.Ioo 0 t] 0) (𝓝 0) := by - have := htend_uh.dist htend_mh - rwa [h0, dist_self] at this - have htend_x : Tendsto (fun sβ‚€ : ℝ => t - sβ‚€) (𝓝[Set.Ioo 0 t] 0) (𝓝 t) := by - have h0' : Tendsto (fun sβ‚€ : ℝ => t - sβ‚€) (𝓝 0) (𝓝 (t - 0)) := - (continuous_const.sub continuous_id).tendsto 0 - rw [sub_zero] at h0'; exact h0'.mono_left nhdsWithin_le_nhds - have hgb_cont : Continuous (fun p : ℝ Γ— ℝ => gronwallBound p.1 (K:ℝ) Ξ΅f p.2) := by - by_cases hK : (K:ℝ) = 0 - Β· simp only [hK, gronwallBound_K0]; fun_prop - Β· have heq : (fun p : ℝ Γ— ℝ => gronwallBound p.1 (K:ℝ) Ξ΅f p.2) - = fun p => p.1 * Real.exp ((K:ℝ) * p.2) + Ξ΅f / (K:ℝ) * (Real.exp ((K:ℝ) * p.2) - 1) := by - funext p; rw [gronwallBound_of_K_ne_0 hK] - rw [heq]; fun_prop - have htend_gb : Tendsto (fun sβ‚€ => gronwallBound (dist (uh sβ‚€) (mh sβ‚€)) (K:ℝ) Ξ΅f (t - sβ‚€)) - (𝓝[Set.Ioo 0 t] 0) (𝓝 (gronwallBound 0 (K:ℝ) Ξ΅f t)) := - (hgb_cont.tendsto (0, t)).comp (htend_Ξ΄.prodMk_nhds htend_x) - exact ge_of_tendsto htend_gb (eventually_nhdsWithin_of_forall (fun sβ‚€ hsβ‚€ => hbound_s0 sβ‚€ hsβ‚€)) - -omit [NeZero d] in -/-- **C3 D1 β€” the difference-quotient heart of the variational equation.** - -Given the fundamental matrix `Mz` of the linear variational ODE `M' = A(s, Ξ¦_s z)Β·M`, `M 0 = id` -(coefficient `A = vlasovFieldJacobian`), the time-`t` flow map `w ↦ (charX t w, charV t w)` is -FrΓ©chet-differentiable **at the fixed point `z`** with derivative exactly `Mz t`. - -This is the load-bearing difference-quotient estimate `Ξ¦_t(z+h) βˆ’ Ξ¦_t(z) βˆ’ Mz tΒ·h = o(β€–hβ€–)`. -The matrix is threaded as an explicit hypothesis (rather than `choose`-d) so the proof can use its -ODE/continuity data directly. - -**Proof plan (route b β€” GrΓΆnwall on the linearisation remainder).** Reduce via -`hasFDerivAt_iff_isLittleO_nhds_zero` + `Asymptotics.isLittleO_iff` to: `βˆ€ c>0, βˆ€αΆ  h, β€–Ξ¦_t(z+h) βˆ’ -Ξ¦_t(z) βˆ’ Mz tΒ·hβ€– ≀ cβ€–hβ€–`. For fixed small `h`, the two curves `u_h(s) := Ξ¦_s(z+h) βˆ’ Ξ¦_s(z)` -(approximate) and `m_h(s) := Mz sΒ·h` (exact) both solve `w' = A(s, Ξ¦_s z)Β·w` from the same datum -`h` (`Ξ¦_0 = id`, `Mz 0 = id`): -* `m_h` is exact β€” its defect is `0` (its derivative `(AΒ·Mz)(s)Β·h = A(s)Β·m_h(s)` by `hMzderiv` + - `HasDerivWithinAt.clm_apply`). -* `u_h`'s defect is the Taylor remainder `R(s, Ξ¦_s(z+h))`, bounded by `Ξ·Β·β€–u_h(s)β€–` (D1a, - `vlasovField_taylorRemainder_uniform`) once `β€–u_h(s)β€– ≀ Ξ΄(Ξ·)`, which holds with - `β€–u_h(s)β€– ≀ exp(K T)Β·β€–hβ€–` (flow Lipschitz-in-`z`, `charFlow_lipschitzInZ_via_gronwall_Ioo`) for - `β€–hβ€–` small. So `Ξ΅f = Ξ·Β·exp(K T)Β·β€–hβ€–`, uniform in `s`. -The frozen field's two-sided ODE holds only on `Ioo 0 T`, so apply -`dist_le_of_approx_trajectories_ODE` on `[sβ‚€, t]` (`sβ‚€ ∈ Ioo 0 t`) and take `sβ‚€ β†’ 0⁺` (the initial -defect `dist(u_h sβ‚€, m_h sβ‚€) β†’ 0` by continuity), giving `β€–u_h t βˆ’ m_h tβ€– ≀ gronwallBound 0 K Ξ΅f t = -Ξ΅fΒ·(exp(K t)βˆ’1)/K`. Since `Ξ·` is arbitrary this is `o(β€–hβ€–)`. `K := max 1 L` is the uniform field -Lipschitz constant; `β€–A(s,Β·)β€– ≀ K` via `norm_fderiv_le_of_lipschitz`. (`hcontIcc` is universal in -the initial point because the `sβ‚€β†’0⁺` limit needs continuity of `Ξ¦_Β·(z+h)`, M2.) -/ -theorem charFlow_hasFDerivAt_of_fundamentalMatrix - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT : 0 < T) - (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) - (z : PhaseSpace d) - (hcontIcc : βˆ€ z' : PhaseSpace d, - ContinuousOn (fun s => (charX s z', charV s z')) (Set.Icc (0 : ℝ) T)) - (Mz : ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d)) - (hMz0 : Mz 0 = ContinuousLinearMap.id ℝ (PhaseSpace d)) - (hMzcont : ContinuousOn Mz (Set.Icc 0 T)) - (hMzderiv : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt Mz - ((vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z))).comp (Mz s)) - (Set.Icc 0 T) s) : - βˆ€ t ∈ Set.Ioo (0 : ℝ) T, HasFDerivAt (fun w => (charX t w, charV t w)) (Mz t) z := by - intro t ht - set Kr : ℝ := ((max 1 L : NNReal) : ℝ) with hKr - have hKr1 : (1:ℝ) ≀ Kr := by rw [hKr]; exact_mod_cast le_max_left 1 L - have hKrpos : (0 : ℝ) < Kr := lt_of_lt_of_le one_pos hKr1 - set Ξ¦ : ℝ β†’ PhaseSpace d := fun s => (charX s z, charV s z) with hΞ¦ - have hF2 : βˆ€ s (w : PhaseSpace d), - HasFDerivAt (vlasovVectorField gradW ρ s) (vlasovFieldJacobian gradW ρ (s, w)) w := - fun s w => vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s w - have hVF_lip : βˆ€ s, LipschitzWith (max 1 L) (vlasovVectorField gradW ρ s) := fun s => - vlasovVectorField_lipschitzWith gradW L hL ρ h_int s - set vlin : ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := fun s => vlasovFieldJacobian gradW ρ (s, Ξ¦ s) - with hvlin - have hvlin_norm : βˆ€ s, β€–vlin sβ€– ≀ Kr := by - intro s - change β€–vlasovFieldJacobian gradW ρ (s, Ξ¦ s)β€– ≀ Kr - rw [← (hF2 s (Ξ¦ s)).fderiv] - exact norm_fderiv_le_of_lipschitz ℝ (hVF_lip s) - have hvlin_lip : βˆ€ s, LipschitzWith (max 1 L) (vlin s) := by - intro s - refine LipschitzWith.of_dist_le_mul (fun x y => ?_) - rw [dist_eq_norm, dist_eq_norm, ← map_sub] - calc β€–vlin s (x - y)β€– ≀ β€–vlin sβ€– * β€–x - yβ€– := (vlin s).le_opNorm _ - _ ≀ Kr * β€–x - yβ€– := by gcongr; exact hvlin_norm s - clear_value vlin - have h_init : βˆ€ z' : PhaseSpace d, (charX 0 z', charV 0 z') = z' := fun z' => - Prod.ext_iff.mpr ⟨(hflow.1 z' (Set.mem_univ z')).1, (hflow.1 z' (Set.mem_univ z')).2⟩ - have h_derivAt : βˆ€ z', βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivAt (fun s => (charX s z', charV s z')) - (vlasovVectorField gradW ρ s (charX s z', charV s z')) s := fun z' s hs => - HasDerivAt.prodMk (hflow.2.1 s hs z' (Set.mem_univ z')) (hflow.2.2 s hs z' (Set.mem_univ z')) - have hgron := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT.le - h_init hcontIcc (fun z' s hs => (h_derivAt z' s hs).hasDerivWithinAt) - rw [hasFDerivAt_iff_isLittleO_nhds_zero, Asymptotics.isLittleO_iff] - intro c hc - set Cexp : ℝ := Real.exp (Kr * T) with hCexp - have hCexp_pos : 0 < Cexp := Real.exp_pos _ - set Cgron : ℝ := (Real.exp (Kr * t) - 1) / Kr with hCgron - have hCgron_nonneg : 0 ≀ Cgron := by - rw [hCgron]; apply div_nonneg _ hKrpos.le - simp only [sub_nonneg]; exact Real.one_le_exp (mul_nonneg hKrpos.le ht.1.le) - set G : ℝ := Cexp * Cgron with hG - have hG_nonneg : 0 ≀ G := mul_nonneg hCexp_pos.le hCgron_nonneg - set Ξ· : ℝ := c / (G + 1) with hΞ· - have hΞ·_pos : 0 < Ξ· := by rw [hΞ·]; positivity - obtain ⟨δη, hδη_pos, hδη⟩ := vlasovField_taylorRemainder_uniform gradW hgradW_C1 L hL ρ h_int - charX charV T z (hcontIcc z) hρD_cont Ξ· hΞ·_pos - refine Metric.eventually_nhds_iff.mpr - ⟨δη / (Cexp + 1), div_pos hδη_pos (by linarith [hCexp_pos]), ?_⟩ - intro h hh - rw [dist_zero_right] at hh - have hCexph : Cexp * β€–hβ€– ≀ δη := by - have hle : β€–hβ€– * (Cexp + 1) ≀ δη := by rw [← le_div_iffβ‚€ (by linarith [hCexp_pos])]; exact hh.le - nlinarith [norm_nonneg h, hCexp_pos, hle] - set uh : ℝ β†’ PhaseSpace d := fun s => (charX s (z + h), charV s (z + h)) - (charX s z, charV s z) - with huh - set mh : ℝ β†’ PhaseSpace d := fun s => (Mz s) h with hmh - set Ξ΅f : ℝ := Ξ· * Cexp * β€–hβ€– with hΞ΅f - have huh_cont : ContinuousOn uh (Set.Icc 0 T) := (hcontIcc (z + h)).sub (hcontIcc z) - have hmh_cont : ContinuousOn mh (Set.Icc 0 T) := hMzcont.clm_apply continuousOn_const - have huh_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–uh sβ€– ≀ Cexp * β€–hβ€– := by - intro s hs - change β€–(charX s (z + h), charV s (z + h)) - (charX s z, charV s z)β€– ≀ Cexp * β€–hβ€– - rw [← dist_eq_norm] - calc dist ((charX s (z + h), charV s (z + h)) : PhaseSpace d) (charX s z, charV s z) - ≀ dist (z + h) z * Real.exp (Kr * (s - 0)) := hgron s hs (z + h) z - _ = β€–hβ€– * Real.exp (Kr * s) := by rw [dist_eq_norm, add_sub_cancel_left, sub_zero] - _ ≀ β€–hβ€– * Cexp := by - refine mul_le_mul_of_nonneg_left ?_ (norm_nonneg h) - rw [hCexp]; exact Real.exp_le_exp.mpr (mul_le_mul_of_nonneg_left hs.2 hKrpos.le) - _ = Cexp * β€–hβ€– := mul_comm _ _ - have huh_derivAt : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt uh - (vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) - - vlasovVectorField gradW ρ s (charX s z, charV s z)) s := fun s hs => - (h_derivAt (z + h) s hs).sub (h_derivAt z s hs) - have hmh_derivAt : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, HasDerivAt mh ((vlin s) (mh s)) s := by - intro s hs - have hMz_at : HasDerivAt Mz ((vlin s).comp (Mz s)) s := by - simp only [hvlin] - exact (hMzderiv s (Set.Ioo_subset_Icc_self hs)).hasDerivAt (Icc_mem_nhds hs.1 hs.2) - have hck := hMz_at.clm_apply (hasDerivAt_const s h) - simpa only [ContinuousLinearMap.comp_apply, map_zero, add_zero] using hck - have hdefect : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - dist (vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) - - vlasovVectorField gradW ρ s (charX s z, charV s z)) (vlin s (uh s)) ≀ Ξ΅f := by - intro s hs - have hsIcc : s ∈ Set.Icc (0 : ℝ) T := Set.Ioo_subset_Icc_self hs - have huhs_le : β€–uh sβ€– ≀ δη := le_trans (huh_bound s hsIcc) hCexph - have hR := hδη s hsIcc (charX s (z + h), charV s (z + h)) huhs_le - rw [dist_eq_norm]; simp only [hvlin] - calc β€–vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) - - vlasovVectorField gradW ρ s (charX s z, charV s z) - - vlasovFieldJacobian gradW ρ (s, Ξ¦ s) (uh s)β€– - ≀ Ξ· * β€–uh sβ€– := hR - _ ≀ Ξ· * (Cexp * β€–hβ€–) := mul_le_mul_of_nonneg_left (huh_bound s hsIcc) hΞ·_pos.le - _ = Ξ΅f := by rw [hΞ΅f]; ring - have huh0 : uh 0 = h := by - change (charX 0 (z + h), charV 0 (z + h)) - (charX 0 z, charV 0 z) = h - rw [h_init (z + h), h_init z, add_sub_cancel_left] - have hmh0 : mh 0 = h := by change (Mz 0) h = h; rw [hMz0]; rfl - have hlim : dist (uh t) (mh t) ≀ gronwallBound 0 Kr Ξ΅f t := by - have := gronwall_diffQuotient_bound vlin (max 1 L) hvlin_lip uh mh - (fun s => vlasovVectorField gradW ρ s (charX s (z + h), charV s (z + h)) - - vlasovVectorField gradW ρ s (charX s z, charV s z)) Ξ΅f T t ht - huh_cont hmh_cont huh_derivAt hmh_derivAt hdefect (huh0.trans hmh0.symm) - rwa [← hKr] at this - have hgb_val : gronwallBound 0 Kr Ξ΅f t = Ξ΅f * Cgron := by - rw [gronwallBound_of_K_ne_0 hKrpos.ne']; simp only [zero_mul, zero_add]; rw [hCgron]; ring - have hΞ·G : Ξ· * G ≀ c := by - rw [hΞ·]; rw [div_mul_eq_mul_div, div_le_iffβ‚€ (by linarith [hG_nonneg] : (0 : ℝ) < G + 1)] - nlinarith [hG_nonneg, hc.le] - change β€–(charX t (z + h), charV t (z + h)) - (charX t z, charV t z) - (Mz t) hβ€– ≀ c * β€–hβ€– - rw [show (charX t (z + h), charV t (z + h)) - (charX t z, charV t z) - (Mz t) h - = uh t - mh t from rfl, ← dist_eq_norm] - calc dist (uh t) (mh t) - ≀ gronwallBound 0 Kr Ξ΅f t := hlim - _ = Ξ΅f * Cgron := hgb_val - _ = Ξ· * G * β€–hβ€– := by rw [hΞ΅f, hG]; ring - _ ≀ c * β€–hβ€– := mul_le_mul_of_nonneg_right hΞ·G (norm_nonneg h) - -end CharFlowDeriv - -omit [NeZero d] in -/-- **C3 #3 β€” the variational equation (`HasFDerivAt` of the flow in its initial point).** - -For the frozen field `b(t,Β·) = vlasovVectorField gradW ρ t` with `gradW ∈ CΒΉ` (supplied by the -consumer via `assW2_contDiff_gradW`), the time-`t` characteristic map -`z ↦ (charX t z, charV t z)` is FrΓ©chet-differentiable in the initial point `z`, with a derivative -`Dflow t z` that is continuous in `z` (so the flow map is `CΒΉ` in `z`). The derivative solves the -linear matrix variational ODE `M' = (D_z b(t, Ξ¦_t z)) Β· M`, `M_0 = id`. - -**This was the load-bearing research gap** β€” Mathlib has no CΒΉ-dependence-of-an-ODE-flow-on-its- -initial-condition lemma β€” now proven (axiom-clean) via route (b) -(`charFlow_lipschitzInZ_via_gronwall_Ioo`, `CharacteristicFlow.lean`, is the Lipschitz-in-`z` -scaffold; Mathlib Gronwall + the vendored `IsPicardLindelof` confinement are the analytic inputs): -3.1 existence/uniqueness of the continuous matrix solution `M_t(z)` of the variational ODE -(`fundamentalMatrix`); 3.2 joint `(t,z)` continuity of `M` (`fundamentalMatrix_continuous_param`); -3.3 the difference-quotient estimate `Ξ¦_t(z+h) βˆ’ Ξ¦_t(z) βˆ’ M_t(z)Β·h = o(β€–hβ€–)` uniformly on compacts -(Gronwall on the linearization remainder, using `gradW ∈ CΒΉ`, -`charFlow_hasFDerivAt_of_fundamentalMatrix`); 3.4 assembled into `HasFDerivAt`. - -The `HasFDerivAt`/continuity *conclusion* is route-independent, so this interface is stable; the -universal-`t` probability instance + force-integrability `h_int` are the field-regularity inputs -the proof consumes (the window-only application clamps, L11, at the grind). - -**`hρD_cont` (joint continuity of the convolution-derivative field).** This is the regularity that -makes the variational coefficient `A(s,z) = D_z b(s, Ξ¦_s z)` continuous in `s` β€” its only non-flow -varying part is `D_x conv(ρ_s)(x) = ∫ fderiv gradW (x βˆ’ y) βˆ‚Ο_s`, evaluated at the *moving* point -`Ξ¦_s z`, so per-`x` continuity is not enough; joint `(s,x)`-continuity is needed. Note the -asymmetry with the *field*: `∫ gradW(xβˆ’y) dρ_s` gets joint continuity for free (per-`x` continuity -+ uniform Lipschitz-in-`x`, `convolveFunctionMeasure_lipschitz_in_x`), but the *derivative* field is -NOT uniformly Lipschitz in `x` (that needs `W ∈ CΒ³`; `AssW2` gives only `CΒ²`), so its joint -continuity must be supplied. - -**Option-B note (running β€” eventual extension).** `hρD_cont` is, in the complete theory, NOT a new -assumption: it is *derivable* from **narrow continuity of `s ↦ ρ_s`** (since `fderiv gradW` is -bounded continuous, `β€–Β·β€– ≀ L`), which is in turn derivable from `IsVlasovSolutionOn` + tightness -(the uniform moment bound) via the standard **"`C_c^∞`-continuity + tight ⟹ narrow-continuity"** -upgrade β€” a self-contained measure-theory lemma not yet in the codebase. We thread it as a -hypothesis (Option A) to unblock the variational-equation grind; folding it into a derived fact -(so the bridge assumes only the weak solution + moments) is the **Option-B extension**, tracked as -a follow-up. -/ -theorem charFlow_hasFDerivAt_in_initialPoint - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT : 0 < T) - (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) - (hcontIcc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : - βˆƒ Dflow : ℝ β†’ PhaseSpace d β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d), - (βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z : PhaseSpace d, - HasFDerivAt (fun w => (charX t w, charV t w)) (Dflow t z) z) ∧ - (βˆ€ t ∈ Set.Ioo (0 : ℝ) T, Continuous (Dflow t)) := by - -- **Reduction (Route A β€” explicit fundamental matrix, lesson L14).** `M z := fundamentalMatrix - -- (A z)` with `A z s := vlasovFieldJacobian gradW ρ (s, Ξ¦_s z)`; its ODE/continuity - -- data come from - -- `fundamentalMatrix_spec` (feeds D1), and `z ↦ M z t` continuity (V2) from - -- `fundamentalMatrix_continuous_param` β€” the parameter-regularity an existential - -- `choose` could not - -- supply. `Dflow t z := fundamentalMatrix (A z) t`. - set A : PhaseSpace d β†’ ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := - fun z s => vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z)) with hA_def - have hAcont : βˆ€ z : PhaseSpace d, ContinuousOn (A z) (Set.Icc 0 T) := fun z => - vlasovVariationalCoeff_continuousOn gradW ρ charX charV T z (hcontIcc z) hρD_cont - refine ⟨fun t z => fundamentalMatrix (A z) t, ?_, ?_⟩ - Β· -- **D1** β€” `charFlow_hasFDerivAt_of_fundamentalMatrix` fed by `fundamentalMatrix_spec`. - intro t ht z - obtain ⟨h0, hcont, hderiv⟩ := fundamentalMatrix_spec (A z) T hT.le (hAcont z) - exact charFlow_hasFDerivAt_of_fundamentalMatrix gradW hgradW_C1 L hL ρ charX charV T hT hflow - h_int hρD_cont z hcontIcc (fundamentalMatrix (A z)) h0 hcont hderiv t ht - Β· -- **V2** β€” `fundamentalMatrix_continuous_param`: flow joint continuity β‡’ `A` jointly continuous - -- β‡’ `z ↦ M z t` continuous. - intro t ht - -- Flow joint continuity `(z,s) ↦ Ξ¦_s z` on `univ Γ—Λ’ Icc 0 T` (GrΓΆnwall Lipschitz-in-`z` from - -- `hflow` + per-`z` continuity in `s`). - have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := fun z => - Prod.ext_iff.mpr ⟨(hflow.1 z (Set.mem_univ z)).1, (hflow.1 z (Set.mem_univ z)).2⟩ - have h_deriv : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt (fun s => (charX s z, charV s z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s := fun z s hs => - (HasDerivAt.prodMk (hflow.2.1 s hs z (Set.mem_univ z)) - (hflow.2.2 s hs z (Set.mem_univ z))).hasDerivWithinAt - have hgron := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT.le - h_init hcontIcc h_deriv - have hflowjoint : ContinuousOn - (fun p : PhaseSpace d Γ— ℝ => (charX p.2 p.1, charV p.2 p.1)) (Set.univ Γ—Λ’ Set.Icc 0 T) := by - refine continuousOn_prod_of_lipschitz_continuousOn (fun z s => (charX s z, charV s z)) T - (Real.exp (((max 1 L : NNReal) : ℝ) * T)) (fun s hs z₁ zβ‚‚ => ?_) hcontIcc - calc dist ((charX s z₁, charV s z₁) : PhaseSpace d) (charX s zβ‚‚, charV s zβ‚‚) - ≀ dist z₁ zβ‚‚ * Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) := hgron s hs z₁ zβ‚‚ - _ = Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) * dist z₁ zβ‚‚ := by ring - _ ≀ Real.exp (((max 1 L : NNReal) : ℝ) * T) * dist z₁ zβ‚‚ := by - refine mul_le_mul_of_nonneg_right (Real.exp_le_exp.mpr ?_) dist_nonneg - have hsT : s - 0 ≀ T := by simp only [sub_zero]; exact hs.2 - exact mul_le_mul_of_nonneg_left hsT (by positivity) - -- `A` jointly continuous (Jacobian along the flow) and uniformly bounded by `max 1 L`. - have hg : ContinuousOn - (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) - (Set.univ Γ—Λ’ Set.Icc 0 T) := continuousOn_snd.prodMk hflowjoint - have hmapsg : Set.MapsTo - (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) - (Set.univ Γ—Λ’ Set.Icc 0 T) (Set.Icc 0 T Γ—Λ’ Set.univ) := fun p hp => ⟨hp.2, Set.mem_univ _⟩ - have hA_contOn : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => A p.1 p.2) - (Set.univ Γ—Λ’ Set.Icc 0 T) := - (vlasovFieldJacobian_continuousOn gradW ρ T hρD_cont).comp hg hmapsg - have hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ ((max 1 L : NNReal) : ℝ) := by - intro z s _ - have heq : A z s = fderiv ℝ (vlasovVectorField gradW ρ s) (charX s z, charV s z) := by - simp only [hA_def] - exact (vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s - (charX s z, charV s z)).fderiv.symm - rw [heq] - exact norm_fderiv_le_of_lipschitz ℝ (vlasovVectorField_lipschitzWith gradW L hL ρ h_int s) - exact fundamentalMatrix_continuous_param A T hT.le ((max 1 L : NNReal) : ℝ) (by positivity) - hA_contOn hA_bound t (Set.Ioo_subset_Icc_self ht) - -open Filter Topology in -omit [NeZero d] in -/-- **Step 1 (dual core) β€” lower GrΓΆnwall / anti-Lipschitz bound on the characteristic flow.** -For `t ∈ (0,T)`, the flow `Ξ¦_t : z ↦ (charX t z, charV t z)` satisfies -`dist z₁ zβ‚‚ ≀ dist (Ξ¦_t z₁) (Ξ¦_t zβ‚‚) Β· exp(K t)` (K = max 1 L), i.e. `Ξ¦_t` is `AntilipschitzWith`. -This is the keystone of the two-time-flow inverse construction (Step 2): bi-Lipschitz makes `Ξ¦_t` -injective with closed range and `M_t = DΞ¦_t` invertible (no Liouville needed). - -Proof: time-reverse the two trajectories on each `[sβ‚€,t] βŠ† (0,T)` (so they solve -`w' = βˆ’b_{sβ‚€+tβˆ’r}(w)`, still K-Lipschitz) and apply the existing forward -`dist_le_of_trajectories_ODE`; take `sβ‚€β†’0⁺`. `h_deriv2` is the two-sided `HasDerivAt` on the open -interval, supplied by `IsCharacteristicFlowOn`. -/ -theorem charFlow_antilipschitzInZ_via_gronwall_Ioo - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) - [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) - (h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) - (h_cont_Icc : βˆ€ z, ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) - (h_deriv2 : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) s) : - βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z₁ zβ‚‚ : PhaseSpace d, - dist z₁ zβ‚‚ ≀ - dist ((charX t z₁, charV t z₁) : PhaseSpace d) (charX t zβ‚‚, charV t zβ‚‚) - * Real.exp (((max 1 L : NNReal) : ℝ) * (t - 0)) := by - intro t ht z₁ zβ‚‚ - set K : NNReal := max 1 L with hK_def - have h_vf_lip : βˆ€ s, LipschitzWith K (vlasovVectorField gradW ρ s) := fun s => - vlasovVectorField_lipschitzWith gradW L hL ρ h_int s - set F : ℝ β†’ PhaseSpace d := fun s => (charX s z₁, charV s z₁) with hF_def - set G : ℝ β†’ PhaseSpace d := fun s => (charX s zβ‚‚, charV s zβ‚‚) with hG_def - -- Per-`sβ‚€` antilipschitz bound on `[sβ‚€, t]`. - have h_perS0 : βˆ€ sβ‚€ ∈ Set.Ioo (0 : ℝ) t, - dist (F sβ‚€) (G sβ‚€) ≀ dist (F t) (G t) * Real.exp ((K : ℝ) * (t - sβ‚€)) := by - intro sβ‚€ hsβ‚€ - have hsub_Ioo : Set.Icc sβ‚€ t βŠ† Set.Ioo (0 : ℝ) T := fun r hr => - ⟨lt_of_lt_of_le hsβ‚€.1 hr.1, lt_of_le_of_lt hr.2 ht.2⟩ - have hsub_Icc : Set.Icc sβ‚€ t βŠ† Set.Icc (0 : ℝ) T := fun r hr => - ⟨le_of_lt (lt_of_lt_of_le hsβ‚€.1 hr.1), le_of_lt (lt_of_le_of_lt hr.2 ht.2)⟩ - have hrefl_mem : βˆ€ r ∈ Set.Icc sβ‚€ t, sβ‚€ + t - r ∈ Set.Icc sβ‚€ t := by - intro r hr; exact ⟨by linarith [hr.2], by linarith [hr.1]⟩ - have hrefl_cont : ContinuousOn (fun r : ℝ => sβ‚€ + t - r) (Set.Icc sβ‚€ t) := - (continuous_const.sub continuous_id).continuousOn - set vr : ℝ β†’ PhaseSpace d β†’ PhaseSpace d := - fun r w => -(vlasovVectorField gradW ρ (sβ‚€ + t - r) w) with hvr_def - have hvr_lip : βˆ€ r, LipschitzWith K (vr r) := fun r => (h_vf_lip (sβ‚€ + t - r)).neg - have hFr_cont : ContinuousOn (fun r => F (sβ‚€ + t - r)) (Set.Icc sβ‚€ t) := - (h_cont_Icc z₁).comp hrefl_cont (fun r hr => hsub_Icc (hrefl_mem r hr)) - have hGr_cont : ContinuousOn (fun r => G (sβ‚€ + t - r)) (Set.Icc sβ‚€ t) := - (h_cont_Icc zβ‚‚).comp hrefl_cont (fun r hr => hsub_Icc (hrefl_mem r hr)) - have hFr' : βˆ€ r ∈ Set.Ico sβ‚€ t, - HasDerivWithinAt (fun r => F (sβ‚€ + t - r)) (vr r (F (sβ‚€ + t - r))) (Set.Ici r) r := by - intro r hr - have hrIoo : sβ‚€ + t - r ∈ Set.Ioo (0 : ℝ) T := - hsub_Ioo ⟨by linarith [hr.2], by linarith [hr.1]⟩ - have hlin : HasDerivAt (fun r : ℝ => sβ‚€ + t - r) (-1) r := by - simpa using (hasDerivAt_id r).const_sub (sβ‚€ + t) - have key : HasDerivAt (fun r => F (sβ‚€ + t - r)) - ((-1 : ℝ) β€’ vlasovVectorField gradW ρ (sβ‚€ + t - r) (F (sβ‚€ + t - r))) r := - HasDerivAt.scomp_of_eq r (h_deriv2 z₁ (sβ‚€ + t - r) hrIoo) hlin rfl - simp only [neg_one_smul] at key - exact key.hasDerivWithinAt - have hGr' : βˆ€ r ∈ Set.Ico sβ‚€ t, - HasDerivWithinAt (fun r => G (sβ‚€ + t - r)) (vr r (G (sβ‚€ + t - r))) (Set.Ici r) r := by - intro r hr - have hrIoo : sβ‚€ + t - r ∈ Set.Ioo (0 : ℝ) T := - hsub_Ioo ⟨by linarith [hr.2], by linarith [hr.1]⟩ - have hlin : HasDerivAt (fun r : ℝ => sβ‚€ + t - r) (-1) r := by - simpa using (hasDerivAt_id r).const_sub (sβ‚€ + t) - have key : HasDerivAt (fun r => G (sβ‚€ + t - r)) - ((-1 : ℝ) β€’ vlasovVectorField gradW ρ (sβ‚€ + t - r) (G (sβ‚€ + t - r))) r := - HasDerivAt.scomp_of_eq r (h_deriv2 zβ‚‚ (sβ‚€ + t - r) hrIoo) hlin rfl - simp only [neg_one_smul] at key - exact key.hasDerivWithinAt - have hgron := dist_le_of_trajectories_ODE hvr_lip hFr_cont hFr' hGr_cont hGr' - (le_refl (dist (F (sβ‚€ + t - sβ‚€)) (G (sβ‚€ + t - sβ‚€)))) t ⟨hsβ‚€.2.le, le_refl t⟩ - simp only [show sβ‚€ + t - t = sβ‚€ from by ring, show sβ‚€ + t - sβ‚€ = t from by ring] at hgron - exact hgron - -- `sβ‚€ β†’ 0⁺` limit. - have hfilt : (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)).NeBot := left_nhdsWithin_Ioo_neBot ht.1 - have hIoo_sub_Icc : Set.Ioo (0 : ℝ) t βŠ† Set.Icc (0 : ℝ) T := fun s hs => - ⟨hs.1.le, le_of_lt (lt_trans hs.2 ht.2)⟩ - have h_tendsto_F : Tendsto F (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) (nhds z₁) := by - have hcw : ContinuousWithinAt F (Set.Icc (0 : ℝ) T) 0 := - (h_cont_Icc z₁) 0 ⟨le_refl 0, le_of_lt (lt_trans ht.1 ht.2)⟩ - have h0 : Tendsto F (nhdsWithin (0 : ℝ) (Set.Icc 0 T)) (nhds (F 0)) := hcw - rw [show F 0 = z₁ from h_init z₁] at h0 - exact h0.mono_left (nhdsWithin_mono 0 hIoo_sub_Icc) - have h_tendsto_G : Tendsto G (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) (nhds zβ‚‚) := by - have hcw : ContinuousWithinAt G (Set.Icc (0 : ℝ) T) 0 := - (h_cont_Icc zβ‚‚) 0 ⟨le_refl 0, le_of_lt (lt_trans ht.1 ht.2)⟩ - have h0 : Tendsto G (nhdsWithin (0 : ℝ) (Set.Icc 0 T)) (nhds (G 0)) := hcw - rw [show G 0 = zβ‚‚ from h_init zβ‚‚] at h0 - exact h0.mono_left (nhdsWithin_mono 0 hIoo_sub_Icc) - have h_tendsto_lhs : Tendsto (fun sβ‚€ => dist (F sβ‚€) (G sβ‚€)) - (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) (nhds (dist z₁ zβ‚‚)) := - h_tendsto_F.dist h_tendsto_G - have h_tendsto_rhs : Tendsto (fun sβ‚€ => dist (F t) (G t) * Real.exp ((K : ℝ) * (t - sβ‚€))) - (nhdsWithin (0 : ℝ) (Set.Ioo 0 t)) - (nhds (dist (F t) (G t) * Real.exp ((K : ℝ) * (t - 0)))) := by - have hcont : Continuous (fun sβ‚€ : ℝ => dist (F t) (G t) * Real.exp ((K : ℝ) * (t - sβ‚€))) := by - fun_prop - exact (hcont.tendsto 0).mono_left nhdsWithin_le_nhds - exact le_of_tendsto_of_tendsto h_tendsto_lhs h_tendsto_rhs - (eventually_nhdsWithin_of_forall h_perS0) - -section Step2Inverse -open Filter Topology - -/-- **Step 2a (dual core, generic) β€” antilipschitz map β‡’ antilipschitz derivative.** -If `f` is antilipschitz and FrΓ©chet-differentiable at `x`, its derivative `f'` is antilipschitz -(hence injective) with the same constant. `f' u` is the limit of slopes `nβ€’(f(x+n⁻¹‒u)βˆ’f x)`, each -of norm `β‰₯ β€–uβ€–/C` by antilipschitz; pass to the limit. (Mathlib lacks this producer.) -/ -theorem antilipschitzWith_fderiv_of_antilipschitz - {E F : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - [NormedAddCommGroup F] [NormedSpace ℝ F] - {f : E β†’ F} {f' : E β†’L[ℝ] F} {x : E} {C : NNReal} - (hf : AntilipschitzWith C f) (hf' : HasFDerivAt f f' x) : - AntilipschitzWith C f' := by - refine AntilipschitzWith.of_le_mul_dist (fun v w => ?_) - rw [dist_eq_norm, dist_eq_norm, ← map_sub] - set u := v - w with hu - have hc : Tendsto (fun n : β„• => β€–((n : ℝ))β€–) atTop atTop := by - simpa [Real.norm_natCast] using tendsto_natCast_atTop_atTop (R := ℝ) - have hlim := hf'.lim u hc - have hbd : βˆ€αΆ  n : β„• in atTop, - β€–uβ€– ≀ (C : ℝ) * β€–(n : ℝ) β€’ (f (x + ((n : ℝ))⁻¹ β€’ u) - f x)β€– := by - filter_upwards [eventually_gt_atTop 0] with n hn - have hn0 : (0 : ℝ) < (n : ℝ) := by exact_mod_cast hn - have hd := hf.le_mul_dist (x + ((n : ℝ))⁻¹ β€’ u) x - rw [dist_eq_norm, dist_eq_norm, add_sub_cancel_left, norm_smul, norm_inv, - Real.norm_natCast] at hd - rw [norm_smul, Real.norm_natCast] - calc β€–uβ€– = (n : ℝ) * ((n : ℝ)⁻¹ * β€–uβ€–) := by - rw [← mul_assoc, mul_inv_cancelβ‚€ (ne_of_gt hn0), one_mul] - _ ≀ (n : ℝ) * ((C : ℝ) * β€–f (x + ((n : ℝ))⁻¹ β€’ u) - f xβ€–) := - mul_le_mul_of_nonneg_left hd (le_of_lt hn0) - _ = (C : ℝ) * ((n : ℝ) * β€–f (x + ((n : ℝ))⁻¹ β€’ u) - f xβ€–) := by ring - have hlim2 : Tendsto (fun n : β„• => (C : ℝ) * β€–(n : ℝ) β€’ (f (x + ((n : ℝ))⁻¹ β€’ u) - f x)β€–) - atTop (𝓝 ((C : ℝ) * β€–f' uβ€–)) := hlim.norm.const_mul (C : ℝ) - exact ge_of_tendsto hlim2 hbd - -/-- **Step 2 (dual core, generic) β€” global `CΒΉ` inverse of an antilipschitz `CΒΉ` self-map.** -If `Ξ¦ : E β†’ E` (finite-dim) is `CΒΉ` (derivative `M z` at `z`), antilipschitz, and Lipschitz, then -each `M z` is invertible, `Ξ¦` is bijective, and the global inverse `Ξ¨` is Lipschitz with -`HasFDerivAt Ξ¨ (M (Ξ¨ w))⁻¹ w`. No Liouville/Hadamard: open range -(`isOpenMap_of_hasStrictFDerivAt_equiv`) + closed range (`AntilipschitzWith.isClosed_range`) β‡’ -clopen β‡’ surjective; inverse derivative from `HasStrictFDerivAt.to_local_left_inverse`. -/ -theorem exists_global_c1_inverse_of_antilipschitz - {E : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] [FiniteDimensional ℝ E] - {Ξ¦ : E β†’ E} {M : E β†’ (E β†’L[ℝ] E)} {Ca Cl : NNReal} - (hderiv : βˆ€ z, HasFDerivAt Ξ¦ (M z) z) - (hM_cont : Continuous M) - (hanti : AntilipschitzWith Ca Ξ¦) - (hlip : LipschitzWith Cl Ξ¦) : - βˆƒ (Ξ¨ : E β†’ E) (e : E β†’ E ≃L[ℝ] E), - (βˆ€ z, ((e z : E β†’L[ℝ] E)) = M z) ∧ - Function.LeftInverse Ξ¨ Ξ¦ ∧ Function.RightInverse Ξ¨ Ξ¦ ∧ - LipschitzWith Ca Ξ¨ ∧ - (βˆ€ w, HasFDerivAt Ξ¨ ((e (Ξ¨ w)).symm : E β†’L[ℝ] E) w) := by - classical - have hMz_anti : βˆ€ z, AntilipschitzWith Ca (M z) := fun z => - antilipschitzWith_fderiv_of_antilipschitz hanti (hderiv z) - have hker : βˆ€ z, LinearMap.ker (M z : E β†’β‚—[ℝ] E) = βŠ₯ := fun z => - LinearMap.ker_eq_bot.mpr (hMz_anti z).injective - have hsurj_lin : βˆ€ z, LinearMap.range (M z : E β†’β‚—[ℝ] E) = ⊀ := fun z => - LinearMap.range_eq_top.mpr (LinearMap.injective_iff_surjective.mp (hMz_anti z).injective) - set e : βˆ€ z, E ≃L[ℝ] E := fun z => - ContinuousLinearEquiv.ofBijective (M z) (hker z) (hsurj_lin z) with he_def - have he_coe : βˆ€ z, ((e z : E β†’L[ℝ] E)) = M z := fun _ => rfl - have hC1 : ContDiff ℝ 1 Ξ¦ := contDiff_one_iff_hasFDerivAt.mpr ⟨M, hM_cont, hderiv⟩ - have hstrict : βˆ€ z, HasStrictFDerivAt Ξ¦ ((e z : E β†’L[ℝ] E)) z := fun z => by - rw [he_coe z]; exact hC1.contDiffAt.hasStrictFDerivAt' (hderiv z) (by norm_num) - have hopen : IsOpenMap Ξ¦ := isOpenMap_of_hasStrictFDerivAt_equiv hstrict - have hrange_open : IsOpen (Set.range Ξ¦) := hopen.isOpen_range - have hrange_closed : IsClosed (Set.range Ξ¦) := hanti.isClosed_range hlip.uniformContinuous - have hrange_univ : Set.range Ξ¦ = Set.univ := - IsClopen.eq_univ ⟨hrange_closed, hrange_open⟩ ⟨Φ 0, Set.mem_range_self 0⟩ - have hsurj : Function.Surjective Ξ¦ := Set.range_eq_univ.mp hrange_univ - have hinj : Function.Injective Ξ¦ := hanti.injective - set Ξ¨ : E β†’ E := Function.invFun Ξ¦ with hΞ¨_def - have hLeft : Function.LeftInverse Ξ¨ Ξ¦ := Function.leftInverse_invFun hinj - have hRight : Function.RightInverse Ξ¨ Ξ¦ := Function.rightInverse_invFun hsurj - have hΞ¨_lip : LipschitzWith Ca Ξ¨ := by - refine LipschitzWith.of_dist_le_mul (fun w₁ wβ‚‚ => ?_) - have h := hanti.le_mul_dist (Ξ¨ w₁) (Ξ¨ wβ‚‚) - rwa [hRight w₁, hRight wβ‚‚] at h - have hΞ¨_deriv : βˆ€ w, HasFDerivAt Ξ¨ ((e (Ξ¨ w)).symm : E β†’L[ℝ] E) w := by - intro w - have hz : Ξ¦ (Ξ¨ w) = w := hRight w - have hev : βˆ€αΆ  x in 𝓝 (Ξ¨ w), Ξ¨ (Ξ¦ x) = x := Filter.Eventually.of_forall hLeft - have hsymm := (hstrict (Ξ¨ w)).to_local_left_inverse hev - rw [hz] at hsymm - exact hsymm.hasFDerivAt - exact ⟨Ψ, e, he_coe, hLeft, hRight, hΞ¨_lip, hΞ¨_deriv⟩ - -end Step2Inverse - -omit [NeZero d] in -/-- **Step 2 (dual core) β€” the characteristic flow `Ξ¦_t` is a `CΒΉ` diffeomorphism on `(0,T)`.** -Instantiates the generic global-inverse machinery at `Ξ¦_t := (charX t, charV t)`: its derivative -`e z` (= `#3`'s `Dflow t z`) is invertible, `Ξ¦_t` is bijective, and the inverse `Ξ¨` is continuous -with `HasFDerivAt Ξ¨ (e (Ξ¨ w))⁻¹ w`. `hanti` comes from Step 1 -(`charFlow_antilipschitzInZ_via_gronwall_Ioo`), `hlip` from the existing upper GrΓΆnwall bound -(`charFlow_lipschitzInZ_via_gronwall_Ioo`), the derivative family from `#3`. -/ -theorem exists_charFlow_inverse_On - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT : 0 < T) - (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) - (hcontIcc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : - βˆ€ t ∈ Set.Ioo (0 : ℝ) T, - βˆƒ (Ξ¨ : PhaseSpace d β†’ PhaseSpace d) - (e : PhaseSpace d β†’ (PhaseSpace d ≃L[ℝ] PhaseSpace d)), - (βˆ€ z, HasFDerivAt (fun w => (charX t w, charV t w)) - ((e z : PhaseSpace d β†’L[ℝ] PhaseSpace d)) z) ∧ - Function.LeftInverse Ξ¨ (fun z => (charX t z, charV t z)) ∧ - Function.RightInverse Ξ¨ (fun z => (charX t z, charV t z)) ∧ - Continuous Ξ¨ ∧ - (βˆ€ w, HasFDerivAt Ξ¨ ((e (Ξ¨ w)).symm : PhaseSpace d β†’L[ℝ] PhaseSpace d) w) := by - have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := fun z => - Prod.ext_iff.mpr (hflow.1 z (Set.mem_univ z)) - have h_deriv2 : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) s := fun z s hs => - HasDerivAt.prodMk (hflow.2.1 s hs z (Set.mem_univ z)) (hflow.2.2 s hs z (Set.mem_univ z)) - have h_deriv_Ioo : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s := fun z s hs => - (h_deriv2 z s hs).hasDerivWithinAt - obtain ⟨Dflow, hDeriv, hCont⟩ := charFlow_hasFDerivAt_in_initialPoint gradW hgradW_C1 L hL ρ - charX charV T hT hflow h_int hρD_cont hcontIcc - intro t ht - set K : ℝ := ((max 1 L : NNReal) : ℝ) with hK - have hCcoe : (((Real.exp (K * t)).toNNReal : NNReal) : ℝ) = Real.exp (K * t) := - Real.coe_toNNReal _ (le_of_lt (Real.exp_pos _)) - have hderiv : βˆ€ z, HasFDerivAt (fun z => (charX t z, charV t z)) (Dflow t z) z := fun z => - hDeriv t ht z - have hM_cont : Continuous (Dflow t) := hCont t ht - have hanti : AntilipschitzWith (Real.exp (K * t)).toNNReal - (fun z => (charX t z, charV t z)) := by - refine AntilipschitzWith.of_le_mul_dist (fun z₁ zβ‚‚ => ?_) - have h1 := charFlow_antilipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T - h_init hcontIcc h_deriv2 t ht z₁ zβ‚‚ - rw [sub_zero] at h1 - rw [hCcoe, mul_comm] - exact h1 - have hlip : LipschitzWith (Real.exp (K * t)).toNNReal - (fun z => (charX t z, charV t z)) := by - refine LipschitzWith.of_dist_le_mul (fun z₁ zβ‚‚ => ?_) - have h1 := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT.le - h_init hcontIcc h_deriv_Ioo t (Set.Ioo_subset_Icc_self ht) z₁ zβ‚‚ - rw [sub_zero] at h1 - rw [hCcoe, mul_comm] - exact h1 - obtain ⟨Ψ, e, he_coe, hLeft, hRight, hΞ¨lip, hΞ¨deriv⟩ := - exists_global_c1_inverse_of_antilipschitz hderiv hM_cont hanti hlip - refine ⟨Ψ, e, ?_, hLeft, hRight, hΞ¨lip.continuous, hΞ¨deriv⟩ - intro z; rw [he_coe z]; exact hderiv z - -section Step3Joint -open Filter Topology Asymptotics - -/-- **Step 3 gating lemma (generic) β€” joint `CΒΉ` from continuous partial derivatives** on a -`ℝ Γ— E` domain (Mathlib-absent). A partial `s`-derivative `Ds p` at every point (`Ds` continuous) -plus a partial `z`-derivative `Dzβ‚€` at the base point β‡’ `f` is FrΓ©chet-differentiable at `(sβ‚€,zβ‚€)` -with total derivative `(h,k) ↦ hβ€’Ds(sβ‚€,zβ‚€) + Dzβ‚€ k`. Proof: split the increment into an -`s`-part (FTC `βˆ«β‚€Κ° Ds(sβ‚€+u,zβ‚€+k)du β‰ˆ hβ€’Dsβ‚€` by continuity of `Ds`) and a `z`-part -(`= Dzβ‚€ k + o(k)`). -This is the keystone for the joint `(s,w)` regularity of the two-time flow `Ξ¦_{sβ†’t}`: the flow's -partials are `M_s z` (jointly continuous, V2) in `z` and `b_s(Ξ¦_s z)` in `s`. - -**PR-ABLE (Mathlib upstream candidate).** This is a general real-analysis result with no Vlasov -content β€” "a function on `ℝ Γ— E` with a continuous partial derivative in the `ℝ` factor and a -FrΓ©chet partial derivative in the `E` factor is FrΓ©chet-differentiable" β€” filling a genuine gap in -`Mathlib/Analysis/Calculus`. Generalisation worth doing before a PR: replace the `ℝ` factor by an -arbitrary first factor with an analogous "integrate the partial along segments" hypothesis, and -weaken `Continuous Ds` to `ContinuousAt Ds` at the base point (the proof only uses a neighbourhood -of `(sβ‚€,zβ‚€)`). -/ -theorem hasFDerivAt_of_continuous_partials - {E F : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] - {f : ℝ Γ— E β†’ F} {Ds : ℝ Γ— E β†’ F} {Dzβ‚€ : E β†’L[ℝ] F} (sβ‚€ : ℝ) (zβ‚€ : E) - (hDs : βˆ€ p : ℝ Γ— E, HasDerivAt (fun s => f (s, p.2)) (Ds p) p.1) - (hDs_cont : Continuous Ds) - (hDzβ‚€ : HasFDerivAt (fun z => f (sβ‚€, z)) Dzβ‚€ zβ‚€) : - HasFDerivAt f - ((ContinuousLinearMap.fst ℝ ℝ E).smulRight (Ds (sβ‚€, zβ‚€)) - + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) (sβ‚€, zβ‚€) := by - set Dsβ‚€ : F := Ds (sβ‚€, zβ‚€) with hDsβ‚€ - rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] - intro Ξ΅ hΞ΅ - have hBz : βˆ€αΆ  k in 𝓝 (0 : E), - β€–f (sβ‚€, zβ‚€ + k) - f (sβ‚€, zβ‚€) - Dzβ‚€ kβ€– ≀ (Ξ΅ / 2) * β€–kβ€– := by - have hz := hDzβ‚€ - rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] at hz - exact hz (half_pos hΞ΅) - have hBz' : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, - β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– ≀ (Ξ΅ / 2) * β€–p.2β€– := - (continuous_snd.tendsto (0 : ℝ Γ— E)).eventually hBz - have hball : βˆ€αΆ  q in 𝓝 ((sβ‚€, zβ‚€) : ℝ Γ— E), β€–Ds q - Dsβ‚€β€– ≀ Ξ΅ / 2 := by - have hc : Tendsto Ds (𝓝 (sβ‚€, zβ‚€)) (𝓝 Dsβ‚€) := hDs_cont.continuousAt - have hsub : Tendsto (fun q => Ds q - Dsβ‚€) (𝓝 (sβ‚€, zβ‚€)) (𝓝 (Dsβ‚€ - Dsβ‚€)) := - hc.sub tendsto_const_nhds - rw [sub_self] at hsub - have h0 : Tendsto (fun q => β€–Ds q - Dsβ‚€β€–) (𝓝 (sβ‚€, zβ‚€)) (𝓝 0) := by - simpa using hsub.norm - exact h0.eventually (Iic_mem_nhds (half_pos hΞ΅)) - obtain ⟨δ, hΞ΄pos, hδ⟩ := Metric.eventually_nhds_iff.mp hball - have hAs : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, - β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– ≀ (Ξ΅ / 2) * β€–pβ€– := by - filter_upwards [Metric.ball_mem_nhds (0 : ℝ Γ— E) hΞ΄pos] with p hp - rw [mem_ball_zero_iff] at hp - have hcont_u : Continuous (fun u => Ds (u, zβ‚€ + p.2)) := - hDs_cont.comp (continuous_id.prodMk continuous_const) - have hg_deriv : βˆ€ u : ℝ, HasDerivAt (fun s => f (s, zβ‚€ + p.2)) (Ds (u, zβ‚€ + p.2)) u := - fun u => hDs (u, zβ‚€ + p.2) - have hftc : ∫ u in sβ‚€..(sβ‚€ + p.1), Ds (u, zβ‚€ + p.2) - = f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) := by - rw [intervalIntegral.integral_eq_sub_of_hasDerivAt (fun u _ => hg_deriv u) - (hcont_u.intervalIntegrable _ _)] - have hbound_u : βˆ€ u ∈ Set.uIoc sβ‚€ (sβ‚€ + p.1), β€–Ds (u, zβ‚€ + p.2) - Dsβ‚€β€– ≀ Ξ΅ / 2 := by - intro u hu - refine @hΞ΄ (u, zβ‚€ + p.2) ?_ - have hple : |p.1| ≀ β€–pβ€– := by rw [← Real.norm_eq_abs]; exact norm_fst_le p - have hp1 : |u - sβ‚€| ≀ β€–pβ€– := by - rcases Set.mem_uIcc.mp (Set.uIoc_subset_uIcc hu) with ⟨ha, hb⟩ | ⟨ha, hb⟩ - Β· rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ u - sβ‚€)] - rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ p.1)] at hple; linarith - Β· rw [abs_of_nonpos (by linarith : u - sβ‚€ ≀ 0)] - rw [abs_of_nonpos (by linarith : p.1 ≀ 0)] at hple; linarith - have hp2 : β€–p.2β€– ≀ β€–pβ€– := norm_snd_le p - rw [Prod.dist_eq] - simp only [dist_eq_norm, add_sub_cancel_left, Real.norm_eq_abs] - exact lt_of_le_of_lt (max_le hp1 hp2) hp - have hA_eq : f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€ - = ∫ u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€) := by - rw [intervalIntegral.integral_sub (hcont_u.intervalIntegrable _ _) - (intervalIntegrable_const), hftc, intervalIntegral.integral_const, - add_sub_cancel_left] - rw [hA_eq] - calc β€–βˆ« u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€)β€– - ≀ (Ξ΅ / 2) * |(sβ‚€ + p.1) - sβ‚€| := - intervalIntegral.norm_integral_le_of_norm_le_const hbound_u - _ = (Ξ΅ / 2) * β€–p.1β€– := by rw [add_sub_cancel_left, Real.norm_eq_abs] - _ ≀ (Ξ΅ / 2) * β€–pβ€– := mul_le_mul_of_nonneg_left (norm_fst_le p) (by positivity) - filter_upwards [hAs, hBz'] with p hAp hBp - have hdecomp : - f ((sβ‚€, zβ‚€) + p) - f (sβ‚€, zβ‚€) - - ((ContinuousLinearMap.fst ℝ ℝ E).smulRight Dsβ‚€ - + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) p - = (f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) - + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2) := by - rw [show ((sβ‚€, zβ‚€) + p : ℝ Γ— E) = (sβ‚€ + p.1, zβ‚€ + p.2) from rfl] - simp only [add_apply, ContinuousLinearMap.smulRight_apply, - ContinuousLinearMap.coe_fst', ContinuousLinearMap.comp_apply, - ContinuousLinearMap.coe_snd'] - abel - rw [hdecomp] - calc β€–(f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) - + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2)β€– - ≀ β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– - + β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– := norm_add_le _ _ - _ ≀ (Ξ΅ / 2) * β€–pβ€– + (Ξ΅ / 2) * β€–pβ€– := - add_le_add hAp (le_trans hBp (mul_le_mul_of_nonneg_left (norm_snd_le p) (by positivity))) - _ = Ξ΅ * β€–pβ€– := by ring - -/-- **Step 3 gating lemma (LOCAL / open-set form)** β€” joint `HasFDerivAt` from continuous partial -derivatives on an open set `U βŠ† ℝ Γ— E`. The open-set generalisation of -`hasFDerivAt_of_continuous_partials` (which is the `U := univ` special case) that the PR-note above -flagged: the `s`-partial is required only on `U`, and `Ds` only `ContinuousOn U`. This is the form -the Vlasov flow needs β€” its partials exist and are continuous only on the open window -`Ioo 0 T Γ—Λ’ univ`. Proof = the global proof + ball-in-`U` bookkeeping (`B((sβ‚€,zβ‚€),r) βŠ† U`; the FTC -segment points `(u, zβ‚€+p.2)`, `u ∈ uIcc sβ‚€ (sβ‚€+p.1)`, lie within `β€–pβ€– < min Ξ΄ (r/2)` of `(sβ‚€,zβ‚€)`, -hence in `U` and within the continuity radius `Ξ΄`). - -NOTE (consolidation TODO): the global `hasFDerivAt_of_continuous_partials` above is the `univ` -special case of this; a follow-up cleanup should rewrite it as the one-line corollary -`hasFDerivAt_of_continuous_partials_open isOpen_univ (Set.mem_univ _) (fun p _ => hDs p) -hDs_cont.continuousOn hDzβ‚€` to drop the duplicated proof. **PR-ABLE** (the more -general statement). -/ -theorem hasFDerivAt_of_continuous_partials_open - {E F : Type*} [NormedAddCommGroup E] [NormedSpace ℝ E] - [NormedAddCommGroup F] [NormedSpace ℝ F] [CompleteSpace F] - {f : ℝ Γ— E β†’ F} {Ds : ℝ Γ— E β†’ F} {Dzβ‚€ : E β†’L[ℝ] F} - {U : Set (ℝ Γ— E)} (hU : IsOpen U) {sβ‚€ : ℝ} {zβ‚€ : E} (hmem : (sβ‚€, zβ‚€) ∈ U) - (hDs : βˆ€ p ∈ U, HasDerivAt (fun s => f (s, p.2)) (Ds p) p.1) - (hDs_cont : ContinuousOn Ds U) - (hDzβ‚€ : HasFDerivAt (fun z => f (sβ‚€, z)) Dzβ‚€ zβ‚€) : - HasFDerivAt f - ((ContinuousLinearMap.fst ℝ ℝ E).smulRight (Ds (sβ‚€, zβ‚€)) - + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) (sβ‚€, zβ‚€) := by - set Dsβ‚€ : F := Ds (sβ‚€, zβ‚€) with hDsβ‚€ - obtain ⟨r, hrpos, hrU⟩ := Metric.isOpen_iff.mp hU (sβ‚€, zβ‚€) hmem - rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] - intro Ξ΅ hΞ΅ - have hBz : βˆ€αΆ  k in 𝓝 (0 : E), - β€–f (sβ‚€, zβ‚€ + k) - f (sβ‚€, zβ‚€) - Dzβ‚€ kβ€– ≀ (Ξ΅ / 2) * β€–kβ€– := by - have hz := hDzβ‚€ - rw [hasFDerivAt_iff_isLittleO_nhds_zero, isLittleO_iff] at hz - exact hz (half_pos hΞ΅) - have hBz' : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, - β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– ≀ (Ξ΅ / 2) * β€–p.2β€– := - (continuous_snd.tendsto (0 : ℝ Γ— E)).eventually hBz - have hball : βˆ€αΆ  q in 𝓝 ((sβ‚€, zβ‚€) : ℝ Γ— E), β€–Ds q - Dsβ‚€β€– ≀ Ξ΅ / 2 := by - have hc : Tendsto Ds (𝓝 (sβ‚€, zβ‚€)) (𝓝 Dsβ‚€) := hDs_cont.continuousAt (hU.mem_nhds hmem) - have hsub : Tendsto (fun q => Ds q - Dsβ‚€) (𝓝 (sβ‚€, zβ‚€)) (𝓝 (Dsβ‚€ - Dsβ‚€)) := - hc.sub tendsto_const_nhds - rw [sub_self] at hsub - have h0 : Tendsto (fun q => β€–Ds q - Dsβ‚€β€–) (𝓝 (sβ‚€, zβ‚€)) (𝓝 0) := by - simpa using hsub.norm - exact h0.eventually (Iic_mem_nhds (half_pos hΞ΅)) - obtain ⟨δ, hΞ΄pos, hδ⟩ := Metric.eventually_nhds_iff.mp hball - set ρr : ℝ := min Ξ΄ (r / 2) with hρr - have hρrpos : 0 < ρr := lt_min hΞ΄pos (by positivity) - have hAs : βˆ€αΆ  p : ℝ Γ— E in 𝓝 0, - β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– ≀ (Ξ΅ / 2) * β€–pβ€– := by - filter_upwards [Metric.ball_mem_nhds (0 : ℝ Γ— E) hρrpos] with p hp - rw [mem_ball_zero_iff] at hp - have hdist : βˆ€ u ∈ Set.uIcc sβ‚€ (sβ‚€ + p.1), - dist ((u, zβ‚€ + p.2) : ℝ Γ— E) (sβ‚€, zβ‚€) ≀ β€–pβ€– := by - intro u hu - have hple : |p.1| ≀ β€–pβ€– := by rw [← Real.norm_eq_abs]; exact norm_fst_le p - have hp1 : |u - sβ‚€| ≀ β€–pβ€– := by - rcases Set.mem_uIcc.mp hu with ⟨ha, hb⟩ | ⟨ha, hb⟩ - Β· rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ u - sβ‚€)] - rw [abs_of_nonneg (by linarith : (0 : ℝ) ≀ p.1)] at hple; linarith - Β· rw [abs_of_nonpos (by linarith : u - sβ‚€ ≀ 0)] - rw [abs_of_nonpos (by linarith : p.1 ≀ 0)] at hple; linarith - have hp2 : β€–p.2β€– ≀ β€–pβ€– := norm_snd_le p - rw [Prod.dist_eq] - refine max_le ?_ ?_ - Β· rw [dist_eq_norm]; simpa [Real.norm_eq_abs] using hp1 - Β· rw [dist_eq_norm, add_sub_cancel_left]; exact hp2 - have hmemU : βˆ€ u ∈ Set.uIcc sβ‚€ (sβ‚€ + p.1), ((u, zβ‚€ + p.2) : ℝ Γ— E) ∈ U := by - intro u hu - apply hrU - rw [Metric.mem_ball] - exact lt_of_le_of_lt (hdist u hu) - (lt_of_lt_of_le hp (le_trans (min_le_right _ _) (by linarith))) - have hcont_u : ContinuousOn (fun u => Ds (u, zβ‚€ + p.2)) (Set.uIcc sβ‚€ (sβ‚€ + p.1)) := by - refine hDs_cont.comp (continuous_id.prodMk continuous_const).continuousOn ?_ - exact fun u hu => hmemU u hu - have hg_deriv : βˆ€ u ∈ Set.uIcc sβ‚€ (sβ‚€ + p.1), - HasDerivAt (fun s => f (s, zβ‚€ + p.2)) (Ds (u, zβ‚€ + p.2)) u := - fun u hu => hDs (u, zβ‚€ + p.2) (hmemU u hu) - have hftc : ∫ u in sβ‚€..(sβ‚€ + p.1), Ds (u, zβ‚€ + p.2) - = f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) := by - rw [intervalIntegral.integral_eq_sub_of_hasDerivAt (fun u hu => hg_deriv u hu) - (hcont_u.intervalIntegrable)] - have hbound_u : βˆ€ u ∈ Set.uIoc sβ‚€ (sβ‚€ + p.1), β€–Ds (u, zβ‚€ + p.2) - Dsβ‚€β€– ≀ Ξ΅ / 2 := by - intro u hu - refine @hΞ΄ (u, zβ‚€ + p.2) ?_ - have hmem' := hdist u (Set.uIoc_subset_uIcc hu) - exact lt_of_le_of_lt hmem' (lt_of_lt_of_le hp (min_le_left _ _)) - have hA_eq : f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€ - = ∫ u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€) := by - rw [intervalIntegral.integral_sub (hcont_u.intervalIntegrable) - (intervalIntegrable_const), hftc, intervalIntegral.integral_const, - add_sub_cancel_left] - rw [hA_eq] - calc β€–βˆ« u in sβ‚€..(sβ‚€ + p.1), (Ds (u, zβ‚€ + p.2) - Dsβ‚€)β€– - ≀ (Ξ΅ / 2) * |(sβ‚€ + p.1) - sβ‚€| := - intervalIntegral.norm_integral_le_of_norm_le_const hbound_u - _ = (Ξ΅ / 2) * β€–p.1β€– := by rw [add_sub_cancel_left, Real.norm_eq_abs] - _ ≀ (Ξ΅ / 2) * β€–pβ€– := mul_le_mul_of_nonneg_left (norm_fst_le p) (by positivity) - filter_upwards [hAs, hBz'] with p hAp hBp - have hdecomp : - f ((sβ‚€, zβ‚€) + p) - f (sβ‚€, zβ‚€) - - ((ContinuousLinearMap.fst ℝ ℝ E).smulRight Dsβ‚€ - + Dzβ‚€.comp (ContinuousLinearMap.snd ℝ ℝ E)) p - = (f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) - + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2) := by - rw [show ((sβ‚€, zβ‚€) + p : ℝ Γ— E) = (sβ‚€ + p.1, zβ‚€ + p.2) from rfl] - simp only [add_apply, ContinuousLinearMap.smulRight_apply, - ContinuousLinearMap.coe_fst', ContinuousLinearMap.comp_apply, - ContinuousLinearMap.coe_snd'] - abel - rw [hdecomp] - calc β€–(f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€) - + (f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2)β€– - ≀ β€–f (sβ‚€ + p.1, zβ‚€ + p.2) - f (sβ‚€, zβ‚€ + p.2) - p.1 β€’ Dsβ‚€β€– - + β€–f (sβ‚€, zβ‚€ + p.2) - f (sβ‚€, zβ‚€) - Dzβ‚€ p.2β€– := norm_add_le _ _ - _ ≀ (Ξ΅ / 2) * β€–pβ€– + (Ξ΅ / 2) * β€–pβ€– := - add_le_add hAp (le_trans hBp (mul_le_mul_of_nonneg_left (norm_snd_le p) (by positivity))) - _ = Ξ΅ * β€–pβ€– := by ring - -end Step3Joint - -omit [NeZero d] in -/-- **Step 3 β€” the forward flow `(s,z) ↦ Ξ¦_s z` is jointly continuous** on `Icc 0 T Γ—Λ’ univ` -(`(s,z)`-order). Gronwall Lipschitz-in-`z` (uniform over `[0,T]`) + per-`z` continuity-in-`s`, via -the generic `continuousOn_prod_of_lipschitz_continuousOn`, then a prod-order swap. Extracted from -`#3`'s V2-branch pattern so the joint `CΒΉ`-ness (Step 3 (iii)) can reuse it directly. -/ -lemma charFlow_continuousOn_joint - (gradW : PhysSpace d β†’ PhysSpace d) (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) (hT : 0 ≀ T) - (hinit : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z) - (hcontIcc : βˆ€ z, ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) - (hderiv : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt (fun s => (charX s z, charV s z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s) : - ContinuousOn (fun p : ℝ Γ— PhaseSpace d => (charX p.1 p.2, charV p.1 p.2)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := by - have hgron := charFlow_lipschitzInZ_via_gronwall_Ioo gradW L hL ρ h_int charX charV T hT - hinit hcontIcc hderiv - have hjoint_zs : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => (charX p.2 p.1, charV p.2 p.1)) - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := by - refine continuousOn_prod_of_lipschitz_continuousOn (fun z s => (charX s z, charV s z)) T - (Real.exp (((max 1 L : NNReal) : ℝ) * T)) (fun s hs z₁ zβ‚‚ => ?_) hcontIcc - calc dist ((charX s z₁, charV s z₁) : PhaseSpace d) (charX s zβ‚‚, charV s zβ‚‚) - ≀ dist z₁ zβ‚‚ * Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) := hgron s hs z₁ zβ‚‚ - _ = Real.exp (((max 1 L : NNReal) : ℝ) * (s - 0)) * dist z₁ zβ‚‚ := by ring - _ ≀ Real.exp (((max 1 L : NNReal) : ℝ) * T) * dist z₁ zβ‚‚ := by - refine mul_le_mul_of_nonneg_right (Real.exp_le_exp.mpr ?_) dist_nonneg - have hsT : s - 0 ≀ T := by simp only [sub_zero]; exact hs.2 - exact mul_le_mul_of_nonneg_left hsT (by positivity) - have hswap : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := (continuous_snd.prodMk continuous_fst).continuousOn - have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := - fun p hp => ⟨Set.mem_univ _, hp.1⟩ - exact hjoint_zs.comp hswap hmaps - -omit [NeZero d] in -/-- **Step 3 (ii) β€” the field along the flow `(s,z) ↦ b_s(Ξ¦_s z)` is jointly continuous** on -`Icc 0 T Γ—Λ’ univ`. First component `charV` from flow joint continuity; second component -`-(βˆ‡W βˆ— ρ_s)(charX s z)` from `(s,x) ↦ (βˆ‡Wβˆ—Ο_s)(x)` jointly continuous (equi-Lipschitz-in-`x` from -`convolveFunctionMeasure_lipschitz_in_x` + continuous-in-`s` from `hf_cont`) composed with the flow. -This is the partial-`s`-derivative continuity input to the joint `CΒΉ`-ness (Step 3 (iii)). -/ -lemma vlasovField_along_flow_continuousOn - (gradW : PhysSpace d β†’ PhysSpace d) (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T : ℝ) - (hflowjoint : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => (charX p.1 p.2, charV p.1 p.2)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ)) : - ContinuousOn (fun p : ℝ Γ— PhaseSpace d => - vlasovVectorField gradW ρ p.1 (charX p.1 p.2, charV p.1 p.2)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := by - have hcomp1 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => charV p.1 p.2) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := continuous_snd.comp_continuousOn hflowjoint - have hcharX : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => charX p.1 p.2) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := continuous_fst.comp_continuousOn hflowjoint - have hconv_joint : ContinuousOn - (fun p : PhysSpace d Γ— ℝ => convolveFunctionMeasure gradW (ρ p.2) p.1) - (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := - continuousOn_prod_of_lipschitz_continuousOn - (fun (x : PhysSpace d) (s : ℝ) => convolveFunctionMeasure gradW (ρ s) x) T (L:ℝ) - (fun s _ x₁ xβ‚‚ => - (convolveFunctionMeasure_lipschitz_in_x gradW L hL (ρ s) (h_int s)).dist_le_mul x₁ xβ‚‚) - (fun x => (hf_cont x).continuousOn) - have hg2 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => ((charX p.1 p.2, p.1) : PhysSpace d Γ— ℝ)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := hcharX.prodMk continuousOn_fst - have hg2maps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((charX p.1 p.2, p.1) : PhysSpace d Γ— ℝ)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) (Set.univ Γ—Λ’ Set.Icc (0 : ℝ) T) := - fun p hp => ⟨Set.mem_univ _, hp.1⟩ - have hconv_along : ContinuousOn - (fun p : ℝ Γ— PhaseSpace d => convolveFunctionMeasure gradW (ρ p.1) (charX p.1 p.2)) - (Set.Icc (0 : ℝ) T Γ—Λ’ Set.univ) := hconv_joint.comp hg2 hg2maps - have heq : (fun p : ℝ Γ— PhaseSpace d => - vlasovVectorField gradW ρ p.1 (charX p.1 p.2, charV p.1 p.2)) - = fun p => ((charV p.1 p.2), - -(convolveFunctionMeasure gradW (ρ p.1) (charX p.1 p.2))) := by - funext p; rfl - rw [heq] - exact hcomp1.prodMk hconv_along.neg - -omit [NeZero d] in -/-- **Step 3 (iii) β€” the forward flow `(s,z) ↦ Ξ¦_s z` is jointly `CΒΉ`** on `U := Ioo 0 T Γ—Λ’ univ`: -FrΓ©chet-differentiable at every point with a jointly-continuous total derivative `DΞ¦`. Built by -composing the open-set gating theorem (`hasFDerivAt_of_continuous_partials_open`) β€” fed the -`s`-partial `b_s(Ξ¦_s z)` (flow ODE, jointly continuous by item (ii)) and the `z`-partial `M_s z` -(the fundamental matrix, via D1c, jointly continuous by item (i)). Per L14 the matrix is rebuilt -concretely (`fundamentalMatrix (A z) s`), NOT routed through `#3`'s existential. - -The field `bfun` and matrix `Mfun` are made opaque locals (`clear_value`, the D1c lesson) so the -gating unification stays syntactic and never unfolds the `vlasovVectorField`/`vlasovFieldJacobian` -integrals β€” the per-point derivative facts are established in terms of them *before* clearing. -`A` is kept transparent through the D1c call (whose coefficient is -`vlasovFieldJacobian`) and cleared -only afterwards (before the projection-reduction defeqs). No `maxHeartbeats` bump needed. -/ -theorem charFlow_hasFDerivAt_joint - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT : 0 < T) - (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) - (hcontIcc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : - βˆƒ DΞ¦ : ℝ Γ— PhaseSpace d β†’ (ℝ Γ— PhaseSpace d β†’L[ℝ] PhaseSpace d), - (βˆ€ p ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)), - HasFDerivAt (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) (DΞ¦ p) p) ∧ - ContinuousOn DΞ¦ (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := by - set A : PhaseSpace d β†’ ℝ β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := - fun z s => vlasovFieldJacobian gradW ρ (s, (charX s z, charV s z)) with hA_def - have hAcont : βˆ€ z, ContinuousOn (A z) (Set.Icc 0 T) := fun z => - vlasovVariationalCoeff_continuousOn gradW ρ charX charV T z (hcontIcc z) hρD_cont - have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := fun z => - Prod.ext_iff.mpr ⟨(hflow.1 z (Set.mem_univ z)).1, (hflow.1 z (Set.mem_univ z)).2⟩ - have h_deriv : βˆ€ z, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivWithinAt (fun s => (charX s z, charV s z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) (Set.Ici s) s := fun z s hs => - (HasDerivAt.prodMk (hflow.2.1 s hs z (Set.mem_univ z)) - (hflow.2.2 s hs z (Set.mem_univ z))).hasDerivWithinAt - have hflowjoint_sz : ContinuousOn (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) - (Set.Icc 0 T Γ—Λ’ Set.univ) := - charFlow_continuousOn_joint gradW L hL ρ h_int charX charV T hT.le h_init hcontIcc h_deriv - -- field as an opaque local - set bfun : ℝ Γ— PhaseSpace d β†’ PhaseSpace d := - fun q => vlasovVectorField gradW ρ q.1 (charX q.1 q.2, charV q.1 q.2) with hbfun_def - have hb_cont : ContinuousOn bfun (Set.Icc 0 T Γ—Λ’ Set.univ) := - vlasovField_along_flow_continuousOn gradW L hL ρ h_int hf_cont charX charV T hflowjoint_sz - -- `A` jointly continuous + bounded β‡’ `M` jointly continuous (item (i)) - have hflowjoint_zs : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => (charX p.2 p.1, charV p.2 p.1)) - (Set.univ Γ—Λ’ Set.Icc 0 T) := by - have hswap : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => ((p.2, p.1) : ℝ Γ— PhaseSpace d)) - (Set.univ Γ—Λ’ Set.Icc 0 T) := (continuous_snd.prodMk continuous_fst).continuousOn - have hmaps : Set.MapsTo (fun p : PhaseSpace d Γ— ℝ => ((p.2, p.1) : ℝ Γ— PhaseSpace d)) - (Set.univ Γ—Λ’ Set.Icc 0 T) (Set.Icc 0 T Γ—Λ’ Set.univ) := fun p hp => ⟨hp.2, Set.mem_univ _⟩ - exact hflowjoint_sz.comp hswap hmaps - have hg : ContinuousOn - (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) - (Set.univ Γ—Λ’ Set.Icc 0 T) := continuousOn_snd.prodMk hflowjoint_zs - have hmapsg : Set.MapsTo - (fun p : PhaseSpace d Γ— ℝ => ((p.2, (charX p.2 p.1, charV p.2 p.1)) : ℝ Γ— PhaseSpace d)) - (Set.univ Γ—Λ’ Set.Icc 0 T) (Set.Icc 0 T Γ—Λ’ Set.univ) := fun p hp => ⟨hp.2, Set.mem_univ _⟩ - have hA_contOn : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => A p.1 p.2) (Set.univ Γ—Λ’ Set.Icc 0 T) := - (vlasovFieldJacobian_continuousOn gradW ρ T hρD_cont).comp hg hmapsg - have hA_bound : βˆ€ z, βˆ€ s ∈ Set.Icc (0 : ℝ) T, β€–A z sβ€– ≀ ((max 1 L : NNReal) : ℝ) := by - intro z s _ - have heq : A z s = fderiv ℝ (vlasovVectorField gradW ρ s) (charX s z, charV s z) := by - simp only [hA_def] - exact (vlasovVectorField_hasFDerivAt_in_z gradW hgradW_C1 L hL ρ h_int s - (charX s z, charV s z)).fderiv.symm - rw [heq] - exact norm_fderiv_le_of_lipschitz ℝ (vlasovVectorField_lipschitzWith gradW L hL ρ h_int s) - have hM_zs : ContinuousOn (fun p : PhaseSpace d Γ— ℝ => fundamentalMatrix (A p.1) p.2) - (Set.univ Γ—Λ’ Set.Icc 0 T) := - fundamentalMatrix_continuous_param_joint A T hT.le ((max 1 L : NNReal) : ℝ) (by positivity) - hA_contOn hA_bound - have hU_open : IsOpen (Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := - isOpen_Ioo.prod isOpen_univ - have hU_sub : Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)) βŠ† Set.Icc 0 T Γ—Λ’ Set.univ := - Set.prod_mono Set.Ioo_subset_Icc_self (subset_refl _) - -- matrix as a local (kept transparent for the D1c call, which needs `A`'s coefficient) - set Mfun : ℝ Γ— PhaseSpace d β†’ (PhaseSpace d β†’L[ℝ] PhaseSpace d) := - fun p => fundamentalMatrix (A p.2) p.1 with hMfun_def - -- z-partial at base via D1c β€” needs `A` TRANSPARENT (its coefficient is `vlasovFieldJacobian`). - have hDz_all : βˆ€ sβ‚€ ∈ Set.Ioo (0 : ℝ) T, βˆ€ zβ‚€ : PhaseSpace d, - HasFDerivAt (fun z => (charX sβ‚€ z, charV sβ‚€ z)) (Mfun (sβ‚€, zβ‚€)) zβ‚€ := by - intro sβ‚€ hsβ‚€ zβ‚€ - obtain ⟨h0, hMcont, hMderiv⟩ := fundamentalMatrix_spec (A zβ‚€) T hT.le (hAcont zβ‚€) - exact charFlow_hasFDerivAt_of_fundamentalMatrix gradW hgradW_C1 L hL ρ charX charV T hT hflow - h_int hρD_cont zβ‚€ hcontIcc (fundamentalMatrix (A zβ‚€)) h0 hMcont hMderiv sβ‚€ hsβ‚€ - have hDs_all : βˆ€ p ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)), - HasDerivAt (fun s => ((charX s p.2, charV s p.2) : PhaseSpace d)) (bfun p) p.1 := by - intro p hp' - exact HasDerivAt.prodMk (hflow.2.1 p.1 hp'.1 p.2 (Set.mem_univ _)) - (hflow.2.2 p.1 hp'.1 p.2 (Set.mem_univ _)) - -- NOW make `A`/field/matrix opaque so the projection-reduction defeqs below never unfold the - -- heavy `vlasovFieldJacobian`/`vlasovVectorField` integrals (D1c lesson). - clear_value A bfun Mfun - have hM_sz : ContinuousOn Mfun (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := by - rw [hMfun_def] - have hswap : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) - (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := (continuous_snd.prodMk continuous_fst).continuousOn - have hmaps : Set.MapsTo (fun p : ℝ Γ— PhaseSpace d => ((p.2, p.1) : PhaseSpace d Γ— ℝ)) - (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) (Set.univ Γ—Λ’ Set.Icc 0 T) := - fun p hp => ⟨Set.mem_univ _, Set.Ioo_subset_Icc_self hp.1⟩ - exact hM_zs.comp hswap hmaps - refine ⟨fun p => (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).smulRight (bfun p) - + (Mfun p).comp (ContinuousLinearMap.snd ℝ ℝ (PhaseSpace d)), ?_, ?_⟩ - Β· rintro ⟨sβ‚€, zβ‚€βŸ© hp - obtain ⟨hsβ‚€, _⟩ := hp - exact hasFDerivAt_of_continuous_partials_open - (f := fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) (Ds := bfun) - hU_open ⟨hsβ‚€, Set.mem_univ _⟩ hDs_all (hb_cont.mono hU_sub) (hDz_all sβ‚€ hsβ‚€ zβ‚€) - Β· have hT1 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => - (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).smulRight (bfun p)) - (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := by - have hc : Continuous (fun v : PhaseSpace d => - (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).smulRight v) := - (ContinuousLinearMap.smulRightL ℝ (ℝ Γ— PhaseSpace d) (PhaseSpace d) - (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d))).continuous - exact hc.comp_continuousOn (hb_cont.mono hU_sub) - have hT2 : ContinuousOn (fun p : ℝ Γ— PhaseSpace d => - (Mfun p).comp (ContinuousLinearMap.snd ℝ ℝ (PhaseSpace d))) - (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := hM_sz.clm_comp continuousOn_const - exact hT1.add hT2 - -omit [NeZero d] in -/-- **Step 3 (iv-A) β€” the forward flow `(s,z) ↦ Ξ¦_s z` is `ContDiffAt ℝ 1`** at each point of the -open window (the chart-IFT input for item (iv)). Lifts item (iii)'s `HasFDerivAt`-everywhere + -`ContinuousOn`-derivative to `ContDiffAt` via `contDiffAt_succ_iff_hasFDerivAt`. -/ -lemma charFlow_contDiffAt_joint - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT : 0 < T) - (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) - (hcontIcc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : - βˆ€ p ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)), - ContDiffAt ℝ 1 (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) p := by - obtain ⟨DΞ¦, hFDeriv, hDΞ¦_cont⟩ := - charFlow_hasFDerivAt_joint gradW hgradW_C1 L hL ρ charX charV T hT - hflow h_int hf_cont hρD_cont hcontIcc - have hU_open : IsOpen (Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := - isOpen_Ioo.prod isOpen_univ - intro p hp - have hmain : ContDiffAt ℝ ((0:β„•) + 1) - (fun q : ℝ Γ— PhaseSpace d => (charX q.1 q.2, charV q.1 q.2)) p := by - rw [contDiffAt_succ_iff_hasFDerivAt] - refine ⟨DΞ¦, ⟨Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ, hU_open.mem_nhds hp, fun y hy => hFDeriv y hy⟩, ?_⟩ - exact contDiffAt_zero.mpr ⟨Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ, hU_open.mem_nhds hp, hDΞ¦_cont⟩ - simpa using hmain - -open Filter Topology in -omit [NeZero d] in -/-- **Step 3 (iv) β€” the per-slice inverse `Ξ¨_s := Ξ¦_s⁻¹` is jointly `CΒΉ`** on `Ioo 0 T Γ—Λ’ univ`, -the keystone of the two-time flow `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹`. - -**PROVEN (axiom-clean)** via the space-time chart inverse-function theorem β€” see the proof plan -below, realized exactly as scouted: `charFlow_contDiffAt_joint` (iv-A) for the chart `ContDiffAt`, -the block-triangular `≃L` (invertibility from Step 2's `e zβ‚€` via `HasFDerivAt.unique` + -`ofBijective`), `ContDiffAt.to_localInverse`, and the global patch via `localInverse_unique` (the -global per-slice inverse is a local left inverse of the chart, by injectivity on the window). - -Per slice `s ∈ Ioo 0 T`, Step 2 (`exists_charFlow_inverse_On`) already gives the inverse `Ξ¨_s` and -its invertible derivative family `e` (`= M_s z`, `#3`/D1c); here we upgrade to JOINT `(s,w)` -regularity via the space-time chart. - -**Proof plan (atoms scouted + verified, 2026-06-16):** -1. **Forward chart `Ξ : (s,z) ↦ (s, Ξ¦_s z)` is `ContDiffAt ℝ 1` at each - `(sβ‚€,zβ‚€) ∈ Ioo 0 T Γ—Λ’ univ`.** - `Ξ¦ := (charXΒ·, charVΒ·)` is jointly `CΒΉ` (`charFlow_hasFDerivAt_joint`, item (iii) β€” `βˆƒ DΞ¦`, - `HasFDerivAt`-everywhere + `ContinuousOn DΞ¦`); lift to `ContDiffAt ℝ 1 Ξ¦` via - `contDiffAt_succ_iff_hasFDerivAt` (`Mathlib/.../ContDiff/Defs.lean:994`, `n := 0`: feed `DΞ¦`, the - open nbhd `U ∈ 𝓝`, `HasFDerivAt`-on-`U`, and `ContDiffAt 0 DΞ¦` from `contDiffAt_zero` + - `ContinuousOn DΞ¦ U`). `Ξ = (fst, Ξ¦)` so `ContDiffAt ℝ 1 Ξ` via `ContDiffAt.prod` with - `contDiffAt_fst`. -2. **`DΞ(sβ‚€,zβ‚€)` is an invertible `≃L`.** Block-lower-triangular `(h,k) ↦ (h, hβ€’b + MΒ·k)` with - `b := b_{sβ‚€}(Ξ¦_{sβ‚€}zβ‚€)`, `M := M_{sβ‚€}zβ‚€` invertible (Step 2's `eβ‚€ zβ‚€`). Build the `ℝ×E ≃L ℝ×E` - via `ContinuousLinearEquiv.ofBijective` (inject: `(h,k)↦0 β‡’ h=0`, then `M k=0 β‡’ k=0`; finite-dim - `LinearMap.injective_iff_surjective`). `HasStrictFDerivAt Ξ (this ≃L) (sβ‚€,zβ‚€)` via - `ContDiffAt.hasStrictFDerivAt'`. -3. **Local `CΒΉ` inverse + patch.** `ContDiffAt.to_localInverse` - (`Mathlib/.../InverseFunctionTheorem/ContDiff.lean:66`) β‡’ `Ξ.localInverse` is `ContDiffAt ℝ 1` at - `Ξ(sβ‚€,zβ‚€) = (sβ‚€, Ξ¦_{sβ‚€}zβ‚€)`. The global `(s,w)↦(s, Ξ¨_s w)` agrees with - `Ξ.localInverse` on a nbhd - (both left-inverses; `Ξ` injective on `Ioo 0 T Γ—Λ’ univ` since `s` is preserved + each `Ξ¦_s` - injective per Step 2) β‡’ `ContDiffAt.congr` β‡’ `(s,w)↦(s,Ξ¨_s w)` is `ContDiffAt ℝ 1` at each point - β‡’ `ContDiffOn ℝ 1` (projecting off the `s` component, `ContDiffAt.snd`). -4. **Bijectivity** is the per-slice `LeftInverse`/`RightInverse` from `exists_charFlow_inverse_On`, - packaged into the `s`-indexed `Ξ¨`. -The two-time flow `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¨_s` is then jointly `CΒΉ` by composing with `Ξ¦_t` (`CΒΉ` in its -argument, `#3`), and the dual core's transport identity differentiates it. -/ -theorem charFlow_inverse_contDiffOn_joint - (gradW : PhysSpace d β†’ PhysSpace d) (hgradW_C1 : ContDiff ℝ 1 gradW) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ s, IsProbabilityMeasure (ρ s)] - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT : 0 < T) - (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (h_int : βˆ€ s (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ s)) - (hf_cont : βˆ€ x, Continuous (fun s => convolveFunctionMeasure gradW (ρ s) x)) - (hρD_cont : ContinuousOn - (fun p : ℝ Γ— PhysSpace d => ∫ y, fderiv ℝ gradW (p.2 - y) βˆ‚(ρ p.1)) - (Set.Icc 0 T Γ—Λ’ (Set.univ : Set (PhysSpace d)))) - (hcontIcc : βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) : - βˆƒ Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d, - (βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - Function.LeftInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) ∧ - (βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - Function.RightInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) ∧ - ContDiffOn ℝ 1 (fun p : ℝ Γ— PhaseSpace d => Ξ¨ p.1 p.2) (Set.Ioo 0 T Γ—Λ’ Set.univ) := by - classical - obtain ⟨DΞ¦, hFDeriv, -⟩ := charFlow_hasFDerivAt_joint gradW hgradW_C1 L hL ρ charX charV T hT - hflow h_int hf_cont hρD_cont hcontIcc - have hΞ¦_cda := charFlow_contDiffAt_joint gradW hgradW_C1 L hL ρ charX charV T hT - hflow h_int hf_cont hρD_cont hcontIcc - have hstep2 := exists_charFlow_inverse_On gradW hgradW_C1 L hL ρ charX charV T hT - hflow h_int hρD_cont hcontIcc - have hbij : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - Function.Bijective (fun z => ((charX s z, charV s z) : PhaseSpace d)) := by - intro s hs - obtain ⟨Ψ', e, _, hL', hR', _, _⟩ := hstep2 s hs - exact ⟨hL'.injective, hR'.surjective⟩ - set Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d := - fun s => Function.invFun (fun z => (charX s z, charV s z)) with hΞ¨_def - have hLeft : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - Function.LeftInverse (Ξ¨ s) (fun z => (charX s z, charV s z)) := - fun s hs => Function.leftInverse_invFun (hbij s hs).1 - have hRight : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - Function.RightInverse (Ξ¨ s) (fun z => (charX s z, charV s z)) := - fun s hs => Function.rightInverse_invFun (hbij s hs).2 - refine ⟨Ψ, hLeft, hRight, ?_⟩ - set Ξ : ℝ Γ— PhaseSpace d β†’ ℝ Γ— PhaseSpace d := - fun x => (x.1, (charX x.1 x.2, charV x.1 x.2)) with hΞ_def - intro pt hpt - obtain ⟨hsβ‚€, -⟩ := hpt - obtain ⟨Ψ', e, he_deriv, -, -, -, -⟩ := hstep2 pt.1 hsβ‚€ - set zβ‚€ : PhaseSpace d := Ξ¨ pt.1 pt.2 with hzβ‚€_def - have hΞ¦zβ‚€ : (charX pt.1 zβ‚€, charV pt.1 zβ‚€) = pt.2 := hRight pt.1 hsβ‚€ pt.2 - have hΞ_cda : ContDiffAt ℝ 1 Ξ (pt.1, zβ‚€) := - contDiffAt_fst.prodMk (hΞ¦_cda (pt.1, zβ‚€) ⟨hsβ‚€, Set.mem_univ _⟩) - set DΞ : (ℝ Γ— PhaseSpace d) β†’L[ℝ] (ℝ Γ— PhaseSpace d) := - (ContinuousLinearMap.fst ℝ ℝ (PhaseSpace d)).prod (DΞ¦ (pt.1, zβ‚€)) with hDΞ_def - have hΞ_hd : HasFDerivAt Ξ DΞ (pt.1, zβ‚€) := - (hasFDerivAt_fst).prodMk (hFDeriv (pt.1, zβ‚€) ⟨hsβ‚€, Set.mem_univ _⟩) - have hincl : HasFDerivAt (fun z : PhaseSpace d => ((pt.1, z) : ℝ Γ— PhaseSpace d)) - ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d))) zβ‚€ := - (hasFDerivAt_const (pt.1 : ℝ) zβ‚€).prodMk (hasFDerivAt_id zβ‚€) - have hslice : HasFDerivAt (fun z => (charX pt.1 z, charV pt.1 z)) - ((DΞ¦ (pt.1, zβ‚€)).comp - ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d)))) zβ‚€ := - (hFDeriv (pt.1, zβ‚€) ⟨hsβ‚€, Set.mem_univ _⟩).comp zβ‚€ hincl - have hcomp_eq : (DΞ¦ (pt.1, zβ‚€)).comp - ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d))) - = (e zβ‚€ : PhaseSpace d β†’L[ℝ] PhaseSpace d) := - hslice.unique (he_deriv zβ‚€) - have hslice_app : βˆ€ k : PhaseSpace d, - DΞ¦ (pt.1, zβ‚€) ((0 : ℝ), k) = (e zβ‚€ : PhaseSpace d β†’L[ℝ] PhaseSpace d) k := by - intro k - have h1 : ((0 : PhaseSpace d β†’L[ℝ] ℝ).prod (ContinuousLinearMap.id ℝ (PhaseSpace d))) k - = ((0 : ℝ), k) := by simp - rw [← h1, ← ContinuousLinearMap.comp_apply, hcomp_eq] - have hker : LinearMap.ker (DΞ : (ℝ Γ— PhaseSpace d) β†’β‚—[ℝ] (ℝ Γ— PhaseSpace d)) = βŠ₯ := by - refine LinearMap.ker_eq_bot'.mpr (fun x hx => ?_) - have hxapp : (x.1, DΞ¦ (pt.1, zβ‚€) x) = ((0 : ℝ), (0 : PhaseSpace d)) := by - have : DΞ x = ((0 : ℝ), (0 : PhaseSpace d)) := hx - simpa [hDΞ_def, ContinuousLinearMap.prod_apply] using this - have hx1 : x.1 = 0 := (Prod.ext_iff.mp hxapp).1 - have hx2 : DΞ¦ (pt.1, zβ‚€) x = 0 := (Prod.ext_iff.mp hxapp).2 - have hxz : x = ((0 : ℝ), x.2) := Prod.ext hx1 rfl - have hez : (e zβ‚€ : PhaseSpace d β†’L[ℝ] PhaseSpace d) x.2 = 0 := by - rw [← hslice_app x.2, ← hxz]; exact hx2 - have : x.2 = 0 := by - have hinj := (e zβ‚€).injective - have : (e zβ‚€) x.2 = (e zβ‚€) 0 := by rw [map_zero]; exact_mod_cast hez - exact hinj this - exact Prod.ext hx1 this - have hrange : LinearMap.range (DΞ : (ℝ Γ— PhaseSpace d) β†’β‚—[ℝ] (ℝ Γ— PhaseSpace d)) = ⊀ := - LinearMap.range_eq_top.mpr - (LinearMap.injective_iff_surjective.mp (LinearMap.ker_eq_bot.mp hker)) - set eΞ : (ℝ Γ— PhaseSpace d) ≃L[ℝ] (ℝ Γ— PhaseSpace d) := - ContinuousLinearEquiv.ofBijective DΞ hker hrange with heΞ_def - have hΞ_hd' : HasFDerivAt Ξ (eΞ : (ℝ Γ— PhaseSpace d) β†’L[ℝ] (ℝ Γ— PhaseSpace d)) (pt.1, zβ‚€) := - hΞ_hd - have hlocinv : ContDiffAt ℝ 1 (hΞ_cda.localInverse hΞ_hd' one_ne_zero) (Ξ (pt.1, zβ‚€)) := - hΞ_cda.to_localInverse hΞ_hd' one_ne_zero - have hstrict := hΞ_cda.hasStrictFDerivAt' hΞ_hd' (one_ne_zero) - have hloc : βˆ€αΆ  x in 𝓝 ((pt.1, zβ‚€) : ℝ Γ— PhaseSpace d), - ((fun y : ℝ Γ— PhaseSpace d => ((y.1, Ξ¨ y.1 y.2) : ℝ Γ— PhaseSpace d)) (Ξ x)) = x := by - have hIoo : βˆ€αΆ  x in 𝓝 ((pt.1, zβ‚€) : ℝ Γ— PhaseSpace d), x.1 ∈ Set.Ioo (0 : ℝ) T := - continuous_fst.continuousAt.eventually_mem (isOpen_Ioo.mem_nhds hsβ‚€) - filter_upwards [hIoo] with x hx - have hL2 : Ξ¨ x.1 (charX x.1 x.2, charV x.1 x.2) = x.2 := hLeft x.1 hx x.2 - simp only [hΞ_def] - rw [hL2] - have huniq : βˆ€αΆ  y in 𝓝 (Ξ (pt.1, zβ‚€)), - ((y.1, Ξ¨ y.1 y.2) : ℝ Γ— PhaseSpace d) = (hΞ_cda.localInverse hΞ_hd' one_ne_zero) y := - hstrict.localInverse_unique hloc - have hΞeq : Ξ (pt.1, zβ‚€) = (pt.1, pt.2) := by rw [hΞ_def]; exact Prod.ext rfl hΞ¦zβ‚€ - have hG_cda : ContDiffAt ℝ 1 - (fun y : ℝ Γ— PhaseSpace d => ((y.1, Ξ¨ y.1 y.2) : ℝ Γ— PhaseSpace d)) (pt.1, pt.2) := by - rw [← hΞeq] - exact hlocinv.congr_of_eventuallyEq huniq - have hpt_eq : pt = (pt.1, pt.2) := rfl - rw [hpt_eq] - exact (hG_cda.snd).contDiffWithinAt - -/-! ### Step 4 β€” the transported test function and the transport identity - -The dual core's `s ↦ ∫ ψ_s d(f s)` argument rests on the backward-transported test -`ψ_s := Ο† ∘ Ξ¦_{sβ†’t}` where `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹` is the two-time flow (Step 3 gave it jointly -`CΒΉ`). Two deliverables, both taking the *outputs* of Step 3 (the inverse `Ξ¨` + the `CΒΉ` terminal -map `Ξ¦_t`) as hypotheses rather than re-deriving them from the flow-construction data: -/ - -omit [NeZero d] in -/-- **Step 4 (4a) β€” the two-time flow `Ξ¦_{sβ†’t} = Ξ¦_t ∘ Ξ¦_s⁻¹` is jointly `CΒΉ`** on -`Ioo 0 T Γ—Λ’ univ`. - -The two-time flow `(s,w) ↦ (charX t (Ξ¨_s w), charV t (Ξ¨_s w))` is the composition of the terminal -map `Ξ¦_t = (charX t Β·, charV t Β·)` (`CΒΉ` in its argument β€” `hΞ¦t_C1`, from Step 2 / item (iii) at the -fixed time `t`) with the jointly-`CΒΉ` inverse family `(s,w) ↦ Ξ¨_s w` (`hΞ¨_C1`, item (iv)). Proof: -`ContDiff.comp_contDiffOn`. -/ -theorem twoTimeFlow_contDiffOn_joint - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T t : ℝ) - (Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d) - (hΞ¨_C1 : ContDiffOn ℝ 1 (fun p : ℝ Γ— PhaseSpace d => Ξ¨ p.1 p.2) - (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ)) - (hΞ¦t_C1 : ContDiff ℝ 1 (fun z : PhaseSpace d => (charX t z, charV t z))) : - ContDiffOn ℝ 1 - (fun p : ℝ Γ— PhaseSpace d => ((charX t (Ξ¨ p.1 p.2), charV t (Ξ¨ p.1 p.2)) : PhaseSpace d)) - (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := - hΞ¦t_C1.comp_contDiffOn hΞ¨_C1 - -omit [NeZero d] in -/-- **Step 4 (4b) β€” the transport identity `βˆ‚_s ψ_s + Dψ_s Β· b_s = 0`.** - -For the backward-transported test `ψ_s(w) := Ο†(Ξ¦_t(Ξ¨_s w)) = Ο†(Ξ¦_{sβ†’t} w)`, the partial -`s`-derivative cancels the spatial directional derivative along the field: -`βˆ‚_s ψ_s(w) = -(Dψ_s(w))(b_s(w))`, where `b_s = vlasovVectorField gradW ρ s` and -`Dψ_s(w) = fderiv ℝ (ψ s) w`. This is the dual of `vlasov_traj_chain_rule` (the pushforward -direction) and the engine that makes `s ↦ ∫ ψ_s d(f s)` constant in Step 6. - -Proof: -* `ψ` is jointly `CΒΉ` on `Ioo 0 T Γ—Λ’ univ` (4a + `Ο†` smooth), so `HasFDerivAt (uncurry ψ) Dψ (s,w)` - at the interior point `(s,w)`, with `Dψ` the joint FrΓ©chet derivative. -* Constancy curve: set `zβ‚€ := Ξ¨_s w`, so `w = Ξ¦_s zβ‚€` (`hΞ¨_right`). The composite - `s' ↦ ψ_{s'}(Ξ¦_{s'} zβ‚€) = Ο†(Ξ¦_t(Ξ¨_{s'}(Ξ¦_{s'} zβ‚€))) = Ο†(Ξ¦_t zβ‚€)` is **constant** in `s'` - (`hΞ¨_left`: `Ξ¨_{s'} ∘ Ξ¦_{s'} = id`), hence has zero `s'`-derivative. -* The curve `c(s') := (s', Ξ¦_{s'} zβ‚€)` has `HasDerivAt c (1, b_s w) s` (`hflow_ode` + `id`), with - `c(s) = (s, w)`. Chain rule: `0 = Dψ(s,w)(1, b_s w) = Dψ(s,w)(1,0) + Dψ(s,w)(0, b_s w)`. -* `Dψ(s,w)(1,0) = βˆ‚_s ψ_s(w)` (compose `uncurry ψ` with `s' ↦ (s', w)`) and - `Dψ(s,w)(0,k) = (fderiv ℝ (ψ s) w) k` (compose with `w' ↦ (s, w')`). Surjectivity (`hΞ¨_right`) - covers every `w`. Rearrange to the claimed `HasDerivAt`. -/ -theorem transportedTest_transport_identity - (gradW : PhysSpace d β†’ PhysSpace d) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (T t : ℝ) - (Ο† : PhaseSpace d β†’ ℝ) (hΟ† : ContDiff ℝ (⊀ : β„•βˆž) Ο†) - (Ξ¨ : ℝ β†’ PhaseSpace d β†’ PhaseSpace d) - (hΞ¨_left : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - Function.LeftInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) - (hΞ¨_right : βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - Function.RightInverse (Ξ¨ s) (fun z => (charX s z, charV s z))) - (hΞ¨_C1 : ContDiffOn ℝ 1 (fun p : ℝ Γ— PhaseSpace d => Ξ¨ p.1 p.2) - (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ)) - (hΞ¦t_C1 : ContDiff ℝ 1 (fun z : PhaseSpace d => (charX t z, charV t z))) - (hflow_ode : βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ioo (0 : ℝ) T, - HasDerivAt (fun s' => (charX s' z, charV s' z)) - (vlasovVectorField gradW ρ s (charX s z, charV s z)) s) - (s : ℝ) (hs : s ∈ Set.Ioo (0 : ℝ) T) (w : PhaseSpace d) : - HasDerivAt (fun s' => Ο† (charX t (Ξ¨ s' w), charV t (Ξ¨ s' w))) - (-(fderiv ℝ (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) w - (vlasovVectorField gradW ρ s w))) s := by - classical - -- uncurried two-time flow and transported test - set G2 : ℝ Γ— PhaseSpace d β†’ PhaseSpace d := - fun p => (charX t (Ξ¨ p.1 p.2), charV t (Ξ¨ p.1 p.2)) with hG2_def - set g : ℝ Γ— PhaseSpace d β†’ ℝ := fun p => Ο† (G2 p) with hg_def - have hopen : IsOpen (Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d))) := - isOpen_Ioo.prod isOpen_univ - have hmem : ((s, w) : ℝ Γ— PhaseSpace d) ∈ Set.Ioo (0 : ℝ) T Γ—Λ’ (Set.univ : Set (PhaseSpace d)) := - ⟨hs, Set.mem_univ _⟩ - -- right-inverse identity: Ξ¦_s (Ξ¨_s w) = w - have hw : (charX s (Ξ¨ s w), charV s (Ξ¨ s w)) = w := hΞ¨_right s hs w - -- g is jointly CΒΉ, hence HasFDerivAt at the interior point (s,w) - have hG2_cd : ContDiffOn ℝ 1 G2 (Set.Ioo (0 : ℝ) T Γ—Λ’ Set.univ) := - twoTimeFlow_contDiffOn_joint charX charV T t Ξ¨ hΞ¨_C1 hΞ¦t_C1 - have hG2_diff : DifferentiableAt ℝ G2 (s, w) := - hG2_cd.differentiableOn_one.differentiableAt (hopen.mem_nhds hmem) - have hΟ†_diff : DifferentiableAt ℝ Ο† (G2 (s, w)) := hΟ†.differentiable (by simp) _ - have hg_fderiv : HasFDerivAt g (fderiv ℝ g (s, w)) (s, w) := - (hΟ†_diff.comp (s, w) hG2_diff).hasFDerivAt - set G := fderiv ℝ g (s, w) with hG_def - -- (A) spatial slice w' ↦ g (s, w') : fderiv = G ∘ inr - have hslice_fderiv : HasFDerivAt (fun w' : PhaseSpace d => g (s, w')) - (G.comp (ContinuousLinearMap.inr ℝ ℝ (PhaseSpace d))) w := by - have := hg_fderiv.comp w (hasFDerivAt_prodMk_right s w) - simpa only [Function.comp_def] using this - -- (B) βˆ‚_s slice s' ↦ g (s', w) : HasDerivAt with value G (1, 0) - have hscurve : HasDerivAt (fun s' => ((s', w) : ℝ Γ— PhaseSpace d)) - ((1 : ℝ), (0 : PhaseSpace d)) s := - (hasDerivAt_id s).prodMk (hasDerivAt_const s w) - have hs_slice : HasDerivAt (fun s' => g (s', w)) (G ((1 : ℝ), (0 : PhaseSpace d))) s := by - have := hg_fderiv.comp_hasDerivAt s hscurve - simpa only [Function.comp_def] using this - -- (C) constancy curve c(s') = (s', Ξ¦_{s'} (Ξ¨_s w)); chain rule gives G(1, b) - have hccurve : HasDerivAt - (fun s' => ((s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w))) : ℝ Γ— PhaseSpace d)) - ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) s := - (hasDerivAt_id s).prodMk (hflow_ode (Ξ¨ s w) s hs) - have hcs : ((s, (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) : ℝ Γ— PhaseSpace d) = (s, w) := by rw [hw] - have hgc : HasDerivAt (fun s' => g (s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w)))) - (G ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w)))) s := by - have hF := hg_fderiv - rw [← hcs] at hF - have := hF.comp_hasDerivAt s hccurve - simpa only [Function.comp_def] using this - -- (D) the composite is eventually constant near s, so its derivative is 0 - have hconst : (fun s' => g (s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w)))) =αΆ [nhds s] - (fun _ => Ο† (charX t (Ξ¨ s w), charV t (Ξ¨ s w))) := by - filter_upwards [isOpen_Ioo.mem_nhds hs] with s' hs' - simp only [hg_def, hG2_def] - rw [hΞ¨_left s' hs' (Ξ¨ s w)] - have hgc0 : HasDerivAt (fun s' => g (s', (charX s' (Ξ¨ s w), charV s' (Ξ¨ s w)))) 0 s := - (hasDerivAt_const s (Ο† (charX t (Ξ¨ s w), charV t (Ξ¨ s w)))).congr_of_eventuallyEq hconst - -- (E) uniqueness: G (1, b) = 0 - have hGzero : G ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) = 0 := - hgc.unique hgc0 - -- (F) split G(1,b) = G(1,0) + G(0,b); identify G(0,b) with the target fderiv applied to b - have hsplit : ((1 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) - = ((1 : ℝ), (0 : PhaseSpace d)) - + ((0 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) := by - ext <;> simp - have hb_eq : vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w)) - = vlasovVectorField gradW ρ s w := by rw [hw] - have hG0b : G ((0 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) - = (fderiv ℝ (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) w) - (vlasovVectorField gradW ρ s w) := by - have hfd : fderiv ℝ (fun w' : PhaseSpace d => g (s, w')) w - = G.comp (ContinuousLinearMap.inr ℝ ℝ (PhaseSpace d)) := hslice_fderiv.fderiv - have hfun : (fun w' : PhaseSpace d => g (s, w')) - = (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) := rfl - rw [hfun] at hfd - rw [hfd, ContinuousLinearMap.comp_apply, ContinuousLinearMap.inr_apply, hb_eq] - -- (G) G(1,0) = -(target fderiv)(b) - have hval : G ((1 : ℝ), (0 : PhaseSpace d)) - = -(fderiv ℝ (fun w' : PhaseSpace d => Ο† (charX t (Ξ¨ s w'), charV t (Ξ¨ s w'))) w) - (vlasovVectorField gradW ρ s w) := by - have hsum : G ((1 : ℝ), (0 : PhaseSpace d)) - + G ((0 : ℝ), vlasovVectorField gradW ρ s (charX s (Ξ¨ s w), charV s (Ξ¨ s w))) = 0 := by - rw [← map_add, ← hsplit]; exact hGzero - rw [hG0b] at hsum - linarith [hsum] - -- (H) conclude - have hgoalfun : (fun s' => Ο† (charX t (Ξ¨ s' w), charV t (Ξ¨ s' w))) - = (fun s' => g (s', w)) := rfl - rw [hgoalfun, ← hval] - exact hs_slice - - -open Filter Topology Metric in -open scoped Convolution in -omit [NeZero d] in -/-- Helper 1 β€” uniform mollification of a continuous, compactly-supported function. -The mollified family `ρ_n ⋆ g` converges to `g` **uniformly** (not just pointwise), the -load-bearing analytic input the `CΒΉ_c` test-class enlargement (#4) needs. Proof: uniform -continuity of `g` (compact support) gives a single `Ξ΄`; once `rOut_n < Ξ΄`, the pointwise bump -estimate `dist_normed_convolution_le` fires at *every* base point simultaneously. -/ -theorem mollifier_tendstoUniformly {E : Type*} - [NormedAddCommGroup E] [NormedSpace ℝ E] [CompleteSpace E] - (g : PhaseSpace d β†’ E) (hg_cont : Continuous g) (hg_cs : HasCompactSupport g) - (Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d)) - (hΟ† : Tendsto (fun n => (Ο† n).rOut) atTop (𝓝 0)) : - TendstoUniformly - (fun n x => ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] g) x) g atTop := by - have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by - rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from - Measure.volume_eq_prod _ _] - infer_instance - have hg_uc : UniformContinuous g := hg_cs.uniformContinuous_of_continuous hg_cont - rw [Metric.uniformContinuous_iff] at hg_uc - rw [Metric.tendstoUniformly_iff] - intro Ξ΅ hΞ΅ - obtain ⟨δ, hΞ΄, hΞ΄_prop⟩ := hg_uc (Ξ΅ / 2) (by positivity) - have hev : βˆ€αΆ  n in atTop, (Ο† n).rOut < Ξ΄ := hΟ†.eventually (Iio_mem_nhds hΞ΄) - filter_upwards [hev] with n hn - intro xβ‚€ - rw [dist_comm] - have hball : βˆ€ x ∈ ball xβ‚€ (Ο† n).rOut, dist (g x) (g xβ‚€) ≀ Ξ΅ / 2 := by - intro x hx - exact le_of_lt (hΞ΄_prop (lt_trans (mem_ball.mp hx) hn)) - have hbump := ContDiffBump.dist_normed_convolution_le (ΞΌ := volume) (Ο† := Ο† n) (g := g) - hg_cont.aestronglyMeasurable hball - exact lt_of_le_of_lt hbump (half_lt_self hΞ΅) - -open Filter Topology Metric in -open scoped Convolution in -omit [NeZero d] in -/-- Helper 2 β€” the mollified FrΓ©chet derivative converges uniformly. -`fderiv (ρ_n ⋆ Ο‡) = ρ_n ⋆ (fderiv Ο‡)` (convolution commutes onto the `CΒΉ` factor via -`HasCompactSupport.hasFDerivAt_convolution_right`, with `precompR` reconciled to `lsmul` on the -operator codomain), and the right-hand side converges uniformly to `fderiv Ο‡` by Helper 1 applied -to the continuous, compactly-supported `fderiv Ο‡`. -/ -theorem mollifiedFDeriv_tendstoUniformly - (Ο‡ : PhaseSpace d β†’ ℝ) (hΟ‡_C1 : ContDiff ℝ 1 Ο‡) (hΟ‡c : HasCompactSupport Ο‡) - (Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d)) - (hΟ† : Tendsto (fun n => (Ο† n).rOut) atTop (𝓝 0)) : - TendstoUniformly - (fun n z => fderiv ℝ ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡) z) - (fderiv ℝ Ο‡) atTop := by - have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by - rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from - Measure.volume_eq_prod _ _] - infer_instance - have hdf_cont : Continuous (fderiv ℝ Ο‡) := hΟ‡_C1.continuous_fderiv one_ne_zero - have hdf_cs : HasCompactSupport (fderiv ℝ Ο‡) := hΟ‡c.fderiv ℝ - -- the `precompR` bilinear map coincides with `lsmul` on the operator codomain - have hbridge : (ContinuousLinearMap.lsmul ℝ ℝ).precompR (PhaseSpace d) - = (ContinuousLinearMap.lsmul ℝ ℝ : - ℝ β†’L[ℝ] (PhaseSpace d β†’L[ℝ] ℝ) β†’L[ℝ] (PhaseSpace d β†’L[ℝ] ℝ)) := by - refine ContinuousLinearMap.ext fun u => ?_ - refine ContinuousLinearMap.ext fun v => ?_ - refine ContinuousLinearMap.ext fun x => ?_ - simp [ContinuousLinearMap.precompR_apply, ContinuousLinearMap.lsmul_apply] - have hfd : βˆ€ n, (fun z => fderiv ℝ - ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡) z) - = (fun z => ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fderiv ℝ Ο‡) z) := by - intro n - funext z - rw [(hΟ‡c.hasFDerivAt_convolution_right (L := ContinuousLinearMap.lsmul ℝ ℝ) - ((Ο† n).continuous_normed.locallyIntegrable) hΟ‡_C1 z).fderiv, hbridge] - have hgoal_eq : - (fun n z => fderiv ℝ ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡) z) - = (fun n z => - ((Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] fderiv ℝ Ο‡) z) := by - funext n; exact hfd n - rw [hgoal_eq] - exact mollifier_tendstoUniformly (fderiv ℝ Ο‡) hdf_cont hdf_cs Ο† hΟ† - --- ── Helpers for `weakEvolution_test_C1c_On`, extracted from its proof body (the --- mathematical content is unchanged; each piece is generic in the test function). ── - -omit [NeZero d] in -/-- Norm bound for the dual-composed difference of two FrΓ©chet derivatives. -/ -lemma toDualSymm_comp_sub_norm_le (ψ Ο• : PhaseSpace d β†’ ℝ) - (z : PhaseSpace d) (e : PhysSpace d β†’L[ℝ] PhaseSpace d) : - β€–(InnerProductSpace.toDual ℝ (PhysSpace d)).symm ((fderiv ℝ ψ z).comp e) - - (InnerProductSpace.toDual ℝ (PhysSpace d)).symm ((fderiv ℝ Ο• z).comp e)β€– - ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * β€–eβ€– := by - rw [← map_sub, LinearIsometryEquiv.norm_map, ← ContinuousLinearMap.sub_comp] - exact ContinuousLinearMap.opNorm_comp_le _ _ - -omit [NeZero d] in -/-- Chain rule: the FrΓ©chet derivative of an `x`-slice is the composition with `inl`. -/ -lemma fderiv_slice_fst (ψ : PhaseSpace d β†’ ℝ) (hψ : Differentiable ℝ ψ) (z : PhaseSpace d) : - fderiv ℝ (fun x => ψ (x, z.2)) z.1 - = (fderiv ℝ ψ z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := by - have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := - hasFDerivAt_prodMk_left z.1 z.2 - exact ((hψ z).hasFDerivAt.comp z.1 h2).fderiv - -omit [NeZero d] in -/-- Chain rule: the FrΓ©chet derivative of a `v`-slice is the composition with `inr`. -/ -lemma fderiv_slice_snd (ψ : PhaseSpace d β†’ ℝ) (hψ : Differentiable ℝ ψ) (z : PhaseSpace d) : - fderiv ℝ (fun v => ψ (z.1, v)) z.2 - = (fderiv ℝ ψ z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := by - have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) - (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := - hasFDerivAt_prodMk_right z.1 z.2 - exact ((hψ z).hasFDerivAt.comp z.2 h2).fderiv - -omit [NeZero d] in -/-- Continuity of the first-slot partial-gradient field of a `CΒΉ` test function. -/ -lemma continuous_gradientSlice_fst (ψ : PhaseSpace d β†’ ℝ) (g : PhaseSpace d β†’ PhysSpace d) - (hψ : Differentiable ℝ ψ) (hψ' : Continuous (fderiv ℝ ψ)) - (hg : βˆ€ z, g z = gradient (fun x => ψ (x, z.2)) z.1) : Continuous g := by - have heq : g = fun z => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm - ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))) := by - funext z; rw [hg z]; simp only [gradient]; rw [fderiv_slice_fst ψ hψ z] - rw [heq] - exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp - (hψ'.clm_comp continuous_const) - -omit [NeZero d] in -/-- Continuity of the second-slot partial-gradient field of a `CΒΉ` test function. -/ -lemma continuous_gradientSlice_snd (ψ : PhaseSpace d β†’ ℝ) (g : PhaseSpace d β†’ PhysSpace d) - (hψ : Differentiable ℝ ψ) (hψ' : Continuous (fderiv ℝ ψ)) - (hg : βˆ€ z, g z = gradient (fun v => ψ (z.1, v)) z.2) : Continuous g := by - have heq : g = fun z => (InnerProductSpace.toDual ℝ (PhysSpace d)).symm - ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))) := by - funext z; rw [hg z]; simp only [gradient]; rw [fderiv_slice_snd ψ hψ z] - rw [heq] - exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp - (hψ'.clm_comp continuous_const) - -omit [NeZero d] in -/-- Compact support of the first-slot partial-gradient field. -/ -lemma hasCompactSupport_gradientSlice_fst (ψ : PhaseSpace d β†’ ℝ) - (g : PhaseSpace d β†’ PhysSpace d) (hψ : Differentiable ℝ ψ) (hψcs : HasCompactSupport ψ) - (hg : βˆ€ z, g z = gradient (fun x => ψ (x, z.2)) z.1) : HasCompactSupport g := by - apply HasCompactSupport.intro hψcs - intro z hz - have hf0 : fderiv ℝ ψ z = 0 := fderiv_of_notMem_tsupport ℝ hz - rw [hg z]; simp only [gradient]; rw [fderiv_slice_fst ψ hψ z, hf0]; simp - -omit [NeZero d] in -/-- Compact support of the second-slot partial-gradient field. -/ -lemma hasCompactSupport_gradientSlice_snd (ψ : PhaseSpace d β†’ ℝ) - (g : PhaseSpace d β†’ PhysSpace d) (hψ : Differentiable ℝ ψ) (hψcs : HasCompactSupport ψ) - (hg : βˆ€ z, g z = gradient (fun v => ψ (z.1, v)) z.2) : HasCompactSupport g := by - apply HasCompactSupport.intro hψcs - intro z hz - have hf0 : fderiv ℝ ψ z = 0 := fderiv_of_notMem_tsupport ℝ hz - rw [hg z]; simp only [gradient]; rw [fderiv_slice_snd ψ hψ z, hf0]; simp - -omit [NeZero d] in -/-- First-slot partial gradients of two tests differ by at most the full -FrΓ©chet-derivative difference. -/ -lemma gradientSlice_fst_sub_norm_le (ψ Ο• : PhaseSpace d β†’ ℝ) - (hψ : Differentiable ℝ ψ) (hΟ• : Differentiable ℝ Ο•) - (gψ gΟ• : PhaseSpace d β†’ PhysSpace d) - (hgψ : βˆ€ z, gψ z = gradient (fun x => ψ (x, z.2)) z.1) - (hgΟ• : βˆ€ z, gΟ• z = gradient (fun x => Ο• (x, z.2)) z.1) (z : PhaseSpace d) : - β€–gψ z - gΟ• zβ€– ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := by - have e1 : gψ z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm - ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))) := by - rw [hgψ z]; simp only [gradient]; rw [fderiv_slice_fst ψ hψ z] - have e2 : gΟ• z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm - ((fderiv ℝ Ο• z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))) := by - rw [hgΟ• z]; simp only [gradient]; rw [fderiv_slice_fst Ο• hΟ• z] - rw [e1, e2] - refine le_trans (toDualSymm_comp_sub_norm_le ψ Ο• z _) ?_ - calc β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * β€–ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)β€– - ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * 1 := by - gcongr; exact ContinuousLinearMap.norm_inl_le_one ℝ (PhysSpace d) (PhysSpace d) - _ = β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := mul_one _ - -omit [NeZero d] in -/-- Second-slot partial gradients of two tests differ by at most the full -FrΓ©chet-derivative difference. -/ -lemma gradientSlice_snd_sub_norm_le (ψ Ο• : PhaseSpace d β†’ ℝ) - (hψ : Differentiable ℝ ψ) (hΟ• : Differentiable ℝ Ο•) - (gψ gΟ• : PhaseSpace d β†’ PhysSpace d) - (hgψ : βˆ€ z, gψ z = gradient (fun v => ψ (z.1, v)) z.2) - (hgΟ• : βˆ€ z, gΟ• z = gradient (fun v => Ο• (z.1, v)) z.2) (z : PhaseSpace d) : - β€–gψ z - gΟ• zβ€– ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := by - have e1 : gψ z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm - ((fderiv ℝ ψ z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))) := by - rw [hgψ z]; simp only [gradient]; rw [fderiv_slice_snd ψ hψ z] - have e2 : gΟ• z = (InnerProductSpace.toDual ℝ (PhysSpace d)).symm - ((fderiv ℝ Ο• z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))) := by - rw [hgΟ• z]; simp only [gradient]; rw [fderiv_slice_snd Ο• hΟ• z] - rw [e1, e2] - refine le_trans (toDualSymm_comp_sub_norm_le ψ Ο• z _) ?_ - calc β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * β€–ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)β€– - ≀ β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– * 1 := by - gcongr; exact ContinuousLinearMap.norm_inr_le_one ℝ (PhysSpace d) (PhysSpace d) - _ = β€–fderiv ℝ ψ z - fderiv ℝ Ο• zβ€– := mul_one _ - -omit [NeZero d] in -/-- Integrability of the weak-evolution integrand against a probability measure: -continuous with compact support (both gradient slots), continuous field. -/ -lemma inner_integrand_integrable - (ΞΌ : Measure (PhaseSpace d)) [IsProbabilityMeasure ΞΌ] - (fld : PhysSpace d β†’ PhysSpace d) (hfld : Continuous fld) - (gX gV : PhaseSpace d β†’ PhysSpace d) - (hgXc : Continuous gX) (hgVc : Continuous gV) - (hgXcs : HasCompactSupport gX) (hgVcs : HasCompactSupport gV) : - Integrable (fun z => @inner ℝ (PhysSpace d) _ z.2 (gX z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) ΞΌ := by - have hcont : Continuous (fun z => @inner ℝ (PhysSpace d) _ z.2 (gX z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) := - (continuous_snd.inner hgXc).sub ((hfld.comp continuous_fst).inner hgVc) - have hcs : HasCompactSupport (fun z => @inner ℝ (PhysSpace d) _ z.2 (gX z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) := by - apply HasCompactSupport.intro (IsCompact.union hgXcs hgVcs) - intro z hz - simp only [Set.mem_union, not_or] at hz - rw [image_eq_zero_of_notMem_tsupport hz.1, image_eq_zero_of_notMem_tsupport hz.2] - simp - exact hcont.integrable_of_hasCompactSupport hcs - -omit [NeZero d] in -/-- Pointwise bound on the difference of two weak-evolution integrands: on the -common support `K` it is `(R_K + B) * Ξ΄` (norm bound `R_K` on `K`, field bound `B` -on `K`, gradient-slot distance `Ξ΄`); off `K` both integrands agree. -/ -lemma inner_integrand_sub_norm_le - (K : Set (PhaseSpace d)) (R_K : ℝ) (hR_K_nn : 0 ≀ R_K) (hR_K : βˆ€ z ∈ K, β€–zβ€– ≀ R_K) - (fld : PhysSpace d β†’ PhysSpace d) (B : ℝ) (hB_nn : 0 ≀ B) - (hfld_K : βˆ€ z ∈ K, β€–fld (Prod.fst z)β€– ≀ B) - (gX gV gX' gV' : PhaseSpace d β†’ PhysSpace d) (Ξ΄ : ℝ) (hΞ΄_nn : 0 ≀ Ξ΄) - (hXd : βˆ€ z, β€–gX' z - gX zβ€– ≀ Ξ΄) (hVd : βˆ€ z, β€–gV' z - gV zβ€– ≀ Ξ΄) - (hXoff : βˆ€ z βˆ‰ K, gX' z = gX z) (hVoff : βˆ€ z βˆ‰ K, gV' z = gV z) - (z : PhaseSpace d) : - β€–(@inner ℝ (PhysSpace d) _ z.2 (gX z) - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) - - (@inner ℝ (PhysSpace d) _ z.2 (gX' z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV' z))β€– - ≀ (R_K + B) * Ξ΄ := by - by_cases hzK : z ∈ K - Β· have hrw : (@inner ℝ (PhysSpace d) _ z.2 (gX z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z)) - - (@inner ℝ (PhysSpace d) _ z.2 (gX' z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV' z)) - = @inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z) := by - rw [inner_sub_right, inner_sub_right]; ring - rw [Real.norm_eq_abs, hrw] - have hb1 : |@inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z)| ≀ R_K * Ξ΄ := by - refine le_trans (abs_real_inner_le_norm _ _) ?_ - have hz2 : β€–z.2β€– ≀ R_K := le_trans (norm_snd_le z) (hR_K z hzK) - rw [norm_sub_rev (gX z)] - exact mul_le_mul hz2 (hXd z) (norm_nonneg _) hR_K_nn - have hb2 : |@inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z)| ≀ B * Ξ΄ := by - refine le_trans (abs_real_inner_le_norm _ _) ?_ - rw [norm_sub_rev (gV z)] - exact mul_le_mul (hfld_K z hzK) (hVd z) (norm_nonneg _) hB_nn - calc |@inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z) - - @inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z)| - ≀ |@inner ℝ (PhysSpace d) _ z.2 (gX z - gX' z)| - + |@inner ℝ (PhysSpace d) _ (fld z.1) (gV z - gV' z)| := abs_sub _ _ - _ ≀ R_K * Ξ΄ + B * Ξ΄ := by linarith - _ = (R_K + B) * Ξ΄ := by ring - Β· rw [hXoff z hzK, hVoff z hzK] - simp only [sub_self, norm_zero] - positivity - -omit [NeZero d] in -/-- On the window, the frozen convolution field over the spatial marginal is -integrable (in force form), linearly bounded, and continuous β€” packaged for -consumers that quantify over the window. -/ -lemma convolveField_window_setup - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (f : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) - (hf_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) - (M_ρ : ℝ) - (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M_ρ) - (Ξ΅β‚€ : ℝ) (hΞ΅β‚€_def : Ξ΅β‚€ = β€–gradW 0β€– + (L : ℝ) * M_ρ) : - βˆ€ Οƒ ∈ Set.Icc (0 : ℝ) T, - (Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (f Οƒ))) - ∧ (βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) (spatialMarginal (f Οƒ))) - ∧ (βˆ€ x : PhysSpace d, - β€–convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) xβ€– ≀ Ξ΅β‚€ + (L:ℝ) * β€–xβ€–) - ∧ Continuous (fun x => convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) x) := by - intro Οƒ hΟƒ - have : IsProbabilityMeasure (f Οƒ) := (hf_mom Οƒ hΟƒ).1 - have hprob_m : IsProbabilityMeasure (spatialMarginal (f Οƒ)) := - (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - -- β€–Β·β€– integrable wrt the spatial marginal (from the finite first moment of f Οƒ) - have h_y_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (f Οƒ)) := by - unfold spatialMarginal - rw [integrable_map_measure (continuous_norm.measurable).aestronglyMeasurable - measurable_fst.aemeasurable] - refine Integrable.mono' (hf_mom Οƒ hΟƒ).2 - ((continuous_norm.comp continuous_fst).aestronglyMeasurable) - (Filter.Eventually.of_forall fun z => ?_) - change |β€–z.1β€–| ≀ β€–zβ€– - rw [abs_of_nonneg (norm_nonneg _)]; exact norm_fst_le z - -- force-integrability (Lipschitz growth + finite moment) - have h_int : βˆ€ x : PhysSpace d, - Integrable (fun y => gradW (x - y)) (spatialMarginal (f Οƒ)) := by - intro x - have h_aesm : AEStronglyMeasurable (fun y : PhysSpace d => gradW (x - y)) - (spatialMarginal (f Οƒ)) := - (hL.continuous.comp (continuous_const.sub continuous_id)).aestronglyMeasurable - have h_dom : βˆ€ y : PhysSpace d, - β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L:ℝ) * β€–xβ€– + (L:ℝ) * β€–yβ€– := by - intro y - have hd := hL.dist_le_mul (x - y) 0 - simp only [dist_eq_norm, sub_zero] at hd - have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by - have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - have h_sub_le : β€–x - yβ€– ≀ β€–xβ€– + β€–yβ€– := norm_sub_le x y - have h_mul := mul_le_mul_of_nonneg_left h_sub_le L.coe_nonneg - linarith - have h_dom_int : Integrable - (fun y : PhysSpace d => β€–gradW 0β€– + (L:ℝ) * β€–xβ€– + (L:ℝ) * β€–yβ€–) - (spatialMarginal (f Οƒ)) := by - have h_eq : (fun y : PhysSpace d => β€–gradW 0β€– + (L:ℝ) * β€–xβ€– + (L:ℝ) * β€–yβ€–) - = fun y => (β€–gradW 0β€– + (L:ℝ) * β€–xβ€–) + (L:ℝ) * β€–yβ€– := by funext y; ring - rw [h_eq]; exact (integrable_const _).add (h_y_int.const_mul _) - exact Integrable.mono' h_dom_int h_aesm (Filter.Eventually.of_forall h_dom) - -- field bound (CharFlow idiom) - have hbound : βˆ€ x : PhysSpace d, - β€–convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) xβ€– ≀ Ξ΅β‚€ + (L:ℝ) * β€–xβ€– := by - intro x - unfold convolveFunctionMeasure - have h_sub_int : Integrable (fun y => β€–x - yβ€–) (spatialMarginal (f Οƒ)) := - Integrable.mono' ((integrable_const β€–xβ€–).add h_y_int) - ((aestronglyMeasurable_const (b := x)).sub aestronglyMeasurable_id |>.norm) - (Filter.Eventually.of_forall fun y => by - simp only [Real.norm_of_nonneg (norm_nonneg _)]; exact norm_sub_le x y) - have h_bnd_int : Integrable (fun y => β€–gradW 0β€– + (L:ℝ) * β€–x - yβ€–) (spatialMarginal (f Οƒ)) := - (integrable_const _).add (h_sub_int.const_mul _) - have h_pt : βˆ€ y, β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L:ℝ) * β€–x - yβ€– := by - intro y - have hd := hL.dist_le_mul (x - y) 0 - simp only [dist_eq_norm, sub_zero] at hd - have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by - have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - linarith - calc β€–βˆ« y, gradW (x - y) βˆ‚(spatialMarginal (f Οƒ))β€– - ≀ ∫ y, β€–gradW (x - y)β€– βˆ‚(spatialMarginal (f Οƒ)) := norm_integral_le_integral_norm _ - _ ≀ ∫ y, (β€–gradW 0β€– + (L:ℝ) * β€–x - yβ€–) βˆ‚(spatialMarginal (f Οƒ)) := - integral_mono (h_int x).norm h_bnd_int (fun y => h_pt y) - _ = β€–gradW 0β€– + (L:ℝ) * ∫ y, β€–x - yβ€– βˆ‚(spatialMarginal (f Οƒ)) := by - rw [integral_add (integrable_const _) (h_sub_int.const_mul _)] - simp [integral_const, measureReal_def, measure_univ, integral_const_mul] - _ ≀ Ξ΅β‚€ + (L:ℝ) * β€–xβ€– := by - have h_int_le : ∫ y, β€–x - yβ€– βˆ‚(spatialMarginal (f Οƒ)) ≀ β€–xβ€– + M_ρ := by - calc ∫ y, β€–x - yβ€– βˆ‚(spatialMarginal (f Οƒ)) - ≀ ∫ y, (β€–xβ€– + β€–yβ€–) βˆ‚(spatialMarginal (f Οƒ)) := - integral_mono h_sub_int ((integrable_const _).add h_y_int) - (fun y => norm_sub_le x y) - _ = β€–xβ€– + ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f Οƒ)) := by - rw [integral_add (integrable_const _) h_y_int] - simp [integral_const, measureReal_def, measure_univ] - _ ≀ β€–xβ€– + M_ρ := by linarith [hM_ρ Οƒ hΟƒ] - simp only [hΞ΅β‚€_def] - linarith [mul_le_mul_of_nonneg_left h_int_le (NNReal.coe_nonneg L)] - -- field continuity from the Lipschitz-in-x lemma - have hcont : Continuous (fun x => convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) x) := - (convolveFunctionMeasure_lipschitz_in_x gradW L hL (spatialMarginal (f Οƒ)) h_int).continuous - exact ⟨h_y_int, h_int, hbound, hcont⟩ - -omit [NeZero d] in -open Filter Topology Metric in -/-- Uniform convergence of integrands implies convergence of the integrals against -a probability measure (every term integrable). -/ -lemma integral_tendsto_of_tendstoUniformly - (ΞΌ : Measure (PhaseSpace d)) [IsProbabilityMeasure ΞΌ] - (g : β„• β†’ PhaseSpace d β†’ ℝ) (gβ‚€ : PhaseSpace d β†’ ℝ) - (hUnif : TendstoUniformly g gβ‚€ atTop) - (hgβ‚€_int : Integrable gβ‚€ ΞΌ) (hg_int : βˆ€ n, Integrable (g n) ΞΌ) : - Tendsto (fun n => ∫ z, g n z βˆ‚ΞΌ) atTop (𝓝 (∫ z, gβ‚€ z βˆ‚ΞΌ)) := by - rw [Metric.tendsto_atTop] - intro Ξ΅ hΞ΅ - obtain ⟨N, hN⟩ := eventually_atTop.mp - (Metric.tendstoUniformly_iff.mp hUnif (Ξ΅/2) (by positivity)) - refine ⟨N, fun n hn => ?_⟩ - rw [Real.dist_eq] - have hpt : βˆ€ z, |g n z - gβ‚€ z| ≀ Ξ΅/2 := by - intro z - have h := hN n hn z - rw [Real.dist_eq, abs_sub_comm] at h - exact le_of_lt h - calc |∫ z, g n z βˆ‚ΞΌ - ∫ z, gβ‚€ z βˆ‚ΞΌ| - = |∫ z, (g n z - gβ‚€ z) βˆ‚ΞΌ| := by rw [integral_sub (hg_int n) hgβ‚€_int] - _ ≀ ∫ z, |g n z - gβ‚€ z| βˆ‚ΞΌ := abs_integral_le_integral_abs - _ ≀ ∫ _z, (Ξ΅/2) βˆ‚ΞΌ := - integral_mono_of_nonneg (Eventually.of_forall fun z => abs_nonneg _) - (integrable_const _) (Eventually.of_forall hpt) - _ = Ξ΅/2 := by simp - _ < Ξ΅ := half_lt_self hΞ΅ - --- #4 (Step 5 interface): the weak evolution equation extended to CΒΉ_c test functions. -open Filter Topology Metric in -open scoped Convolution Pointwise in -omit [NeZero d] in -theorem weakEvolution_test_C1c_On - (gradW : PhysSpace d β†’ PhysSpace d) - (f : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) - (hf_weak : IsVlasovSolutionOn gradW f T) - (hf_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) - -- B2 enrichment (mollification proof): the velocity-term needs a uniform-in-Οƒ bound on the - -- frozen field `β€–βˆ‡Wβˆ—Ο_Οƒβ€–` over the fixed compact support of the test, supplied by the - -- Lipschitz growth of `gradW` (`hL`) and the uniform first-moment bound `hM_ρ`. - (L : NNReal) (hL : LipschitzWith L gradW) - (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) - (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M_ρ) - (Ο‡ : PhaseSpace d β†’ ℝ) (hΟ‡_C1 : ContDiff ℝ 1 Ο‡) (hΟ‡c : HasCompactSupport Ο‡) - (gradXΟ‡ gradVΟ‡ : PhaseSpace d β†’ PhysSpace d) - (hgradXΟ‡ : βˆ€ z, gradXΟ‡ z = gradient (fun x => Ο‡ (x, z.2)) z.1) - (hgradVΟ‡ : βˆ€ z, gradVΟ‡ z = gradient (fun v => Ο‡ (z.1, v)) z.2) - (s : ℝ) (hs : s ∈ Set.Ioo (0 : ℝ) T) : - HasDerivAt (fun Οƒ => ∫ z, Ο‡ z βˆ‚(f Οƒ)) - (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f s)) z.1) - (gradVΟ‡ z)) βˆ‚(f s)) s := by - classical - have hHaar : (volume : Measure (PhaseSpace d)).IsAddHaarMeasure := by - rw [show (volume : Measure (PhaseSpace d)) = (volume : Measure (PhysSpace d)).prod volume from - Measure.volume_eq_prod _ _] - infer_instance - have hvolReg : (volume : Measure (PhaseSpace d)).Regular := - Measure.Regular.of_sigmaCompactSpace_of_isLocallyFiniteMeasure _ - -- mollifier family (shrinking bumps); copy of #9's - set Ο† : β„• β†’ ContDiffBump (0 : PhaseSpace d) := - fun n => ⟨1 / (n + 2), 2 / (n + 2), by positivity, by - rw [div_lt_div_iff_of_pos_right (by positivity)]; norm_num⟩ with hΟ†_def - have hrout : βˆ€ n, (Ο† n).rOut = 2 / (n + 2) := fun n => rfl - have hrout_tendsto : Tendsto (fun n => (Ο† n).rOut) atTop (𝓝 0) := by - simp only [hrout] - apply Filter.Tendsto.div_atTop (tendsto_const_nhds) - exact Filter.tendsto_atTop_add_const_right _ 2 tendsto_natCast_atTop_atTop - -- mollified test functions - set Ο‡n : β„• β†’ PhaseSpace d β†’ ℝ := - fun n => (Ο† n).normed volume ⋆[ContinuousLinearMap.lsmul ℝ ℝ, volume] Ο‡ with hΟ‡n_def - have hΟ‡n_smooth : βˆ€ n, ContDiff ℝ (⊀ : β„•βˆž) (Ο‡n n) := fun n => - ((Ο† n).hasCompactSupport_normed).contDiff_convolution_left _ - (Ο† n).contDiff_normed hΟ‡_C1.continuous.locallyIntegrable - have hΟ‡n_cs : βˆ€ n, HasCompactSupport (Ο‡n n) := fun n => - HasCompactSupport.convolution _ (Ο† n).hasCompactSupport_normed hΟ‡c - -- genuine partial gradients of Ο‡_n - set gXn : β„• β†’ PhaseSpace d β†’ PhysSpace d := - fun n z => gradient (fun x => Ο‡n n (x, z.2)) z.1 with hgXn_def - set gVn : β„• β†’ PhaseSpace d β†’ PhysSpace d := - fun n z => gradient (fun v => Ο‡n n (z.1, v)) z.2 with hgVn_def - -- D_n: the C^∞ weak-evolution derivative, from hf_weak applied to Ο‡_n - have hDn : βˆ€ n, βˆ€ Οƒ ∈ Set.Ioo (0 : ℝ) T, HasDerivAt (fun Οƒ' => ∫ z, Ο‡n n z βˆ‚(f Οƒ')) - (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) z.1) - (gVn n z)) βˆ‚(f Οƒ)) Οƒ := by - intro n Οƒ hΟƒ - have h := hf_weak (Ο‡n n) (hΟ‡n_smooth n) (hΟ‡n_cs n) (gXn n) (gVn n) - (fun z => rfl) (fun z => rfl) Οƒ hΟƒ - simpa using h - -- pointwise convergence (0th order): ∫ Ο‡_n d(f Οƒ) β†’ ∫ Ο‡ d(f Οƒ) - have hfg : βˆ€ Οƒ ∈ Set.Ioo (0 : ℝ) T, Tendsto (fun n => ∫ z, Ο‡n n z βˆ‚(f Οƒ)) atTop - (𝓝 (∫ z, Ο‡ z βˆ‚(f Οƒ))) := by - intro Οƒ hΟƒ - have : IsProbabilityMeasure (f Οƒ) := (hf_mom Οƒ (Set.Ioo_subset_Icc_self hΟƒ)).1 - exact integral_tendsto_of_tendstoUniformly (f Οƒ) Ο‡n Ο‡ - (mollifier_tendstoUniformly Ο‡ hΟ‡_C1.continuous hΟ‡c Ο† hrout_tendsto) - (hΟ‡_C1.continuous.integrable_of_hasCompactSupport hΟ‡c) - (fun n => (hΟ‡n_smooth n).continuous.integrable_of_hasCompactSupport (hΟ‡n_cs n)) - -- uniform-in-Οƒ convergence of the derivatives (the term bound) - -- Helper 2: uniform fderiv convergence - have hH2 := mollifiedFDeriv_tendstoUniformly Ο‡ hΟ‡_C1 hΟ‡c Ο† hrout_tendsto - -- fixed compact K containing all supports - set K : Set (PhaseSpace d) := tsupport Ο‡ + Metric.closedBall (0 : PhaseSpace d) 1 with hK_def - have hK_compact : IsCompact K := IsCompact.add hΟ‡c (isCompact_closedBall 0 1) - obtain ⟨R0, hR0⟩ := (hK_compact.image continuous_norm).bddAbove - set R_K := max R0 0 with hRK_def - have hR_K_nn : (0 : ℝ) ≀ R_K := le_max_right _ _ - have hR_K : βˆ€ z ∈ K, β€–zβ€– ≀ R_K := fun z hz => le_trans (hR0 ⟨z, hz, rfl⟩) (le_max_left _ _) - -- tsupport Ο‡ βŠ† K, and fderiv Ο‡ vanishes off K - have htsuppΟ‡_K : tsupport Ο‡ βŠ† K := by - intro z hz - rw [hK_def] - exact (add_zero z) β–Έ Set.add_mem_add hz (by simp : (0:PhaseSpace d) ∈ Metric.closedBall 0 1) - have hsuppΟ‡ : βˆ€ z βˆ‰ K, fderiv ℝ Ο‡ z = 0 := by - intro z hz - exact fderiv_of_notMem_tsupport ℝ (fun h => hz (htsuppΟ‡_K h)) - -- tsupport (Ο‡n n) βŠ† K, and fderiv (Ο‡n n) vanishes off K - have htsuppΟ‡n_K : βˆ€ n, tsupport (Ο‡n n) βŠ† K := by - intro n - have h1 : Function.support (Ο‡n n) - βŠ† Function.support ((Ο† n).normed volume) + Function.support Ο‡ := - support_convolution_subset _ - have h2 : Function.support ((Ο† n).normed volume) βŠ† Metric.closedBall 0 1 := by - rw [(Ο† n).support_normed_eq] - refine Metric.ball_subset_closedBall.trans (Metric.closedBall_subset_closedBall ?_) - rw [hrout n]; rw [div_le_one (by positivity)]; norm_num - have h4 : Function.support (Ο‡n n) βŠ† K := by - refine h1.trans ?_ - rw [hK_def, add_comm (tsupport Ο‡)] - exact Set.add_subset_add h2 (subset_tsupport Ο‡) - exact (closure_minimal h4 hK_compact.isClosed) - have hsuppΟ‡n : βˆ€ n, βˆ€ z βˆ‰ K, fderiv ℝ (Ο‡n n) z = 0 := by - intro n z hz - exact fderiv_of_notMem_tsupport ℝ (fun h => hz (htsuppΟ‡n_K n h)) - -- partial-gradient projection bounds (X and V), off Helper 2's fderiv difference - -- field: integrability, bound, continuity β€” all on the window - set Ξ΅β‚€ : ℝ := β€–gradW 0β€– + (L : ℝ) * M_ρ with hΞ΅β‚€_def - have hΞ΅β‚€_nn : 0 ≀ Ξ΅β‚€ := by positivity - have hfield_setup := convolveField_window_setup gradW L hL f T hf_mom M_ρ hM_ρ Ξ΅β‚€ hΞ΅β‚€_def - -- THE ESTIMATE - -- continuity of the four partial gradients (off the uniform fderiv) - have htop : ((⊀ : β„•βˆž) : WithTop β„•βˆž) β‰  0 := by simp - have hΟ‡diff : Differentiable ℝ Ο‡ := hΟ‡_C1.differentiable one_ne_zero - have hΟ‡'cont : Continuous (fderiv ℝ Ο‡) := hΟ‡_C1.continuous_fderiv one_ne_zero - have hgXΟ‡c : Continuous gradXΟ‡ := - continuous_gradientSlice_fst Ο‡ gradXΟ‡ hΟ‡diff hΟ‡'cont hgradXΟ‡ - have hgVΟ‡c : Continuous gradVΟ‡ := - continuous_gradientSlice_snd Ο‡ gradVΟ‡ hΟ‡diff hΟ‡'cont hgradVΟ‡ - have hgXnc : βˆ€ n, Continuous (gXn n) := fun n => continuous_gradientSlice_fst (Ο‡n n) (gXn n) - ((hΟ‡n_smooth n).differentiable htop) ((hΟ‡n_smooth n).continuous_fderiv htop) - (fun z => by rw [hgXn_def]) - have hgVnc : βˆ€ n, Continuous (gVn n) := fun n => continuous_gradientSlice_snd (Ο‡n n) (gVn n) - ((hΟ‡n_smooth n).differentiable htop) ((hΟ‡n_smooth n).continuous_fderiv htop) - (fun z => by rw [hgVn_def]) - -- compact support of the four partial gradients (vanish off the test's support) - have hgXΟ‡cs : HasCompactSupport gradXΟ‡ := - hasCompactSupport_gradientSlice_fst Ο‡ gradXΟ‡ hΟ‡diff hΟ‡c hgradXΟ‡ - have hgVΟ‡cs : HasCompactSupport gradVΟ‡ := - hasCompactSupport_gradientSlice_snd Ο‡ gradVΟ‡ hΟ‡diff hΟ‡c hgradVΟ‡ - have hgXncs : βˆ€ n, HasCompactSupport (gXn n) := fun n => - hasCompactSupport_gradientSlice_fst (Ο‡n n) (gXn n) - ((hΟ‡n_smooth n).differentiable htop) (hΟ‡n_cs n) (fun z => by rw [hgXn_def]) - have hgVncs : βˆ€ n, HasCompactSupport (gVn n) := fun n => - hasCompactSupport_gradientSlice_snd (Ο‡n n) (gVn n) - ((hΟ‡n_smooth n).differentiable htop) (hΟ‡n_cs n) (fun z => by rw [hgVn_def]) - -- THE ESTIMATE - have hf'unif : TendstoUniformlyOn - (fun n Οƒ => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) z.1) (gVn n z)) βˆ‚(f Οƒ)) - (fun Οƒ => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) z.1) (gradVΟ‡ z)) βˆ‚(f Οƒ)) - atTop (Set.Ioo 0 T) := by - rw [Metric.tendstoUniformlyOn_iff] - intro Ξ΅ hΞ΅ - set C : ℝ := R_K + (Ξ΅β‚€ + (L:ℝ) * R_K) with hC_def - have hC_nn : (0 : ℝ) ≀ C := by rw [hC_def]; positivity - rw [Metric.tendstoUniformly_iff] at hH2 - filter_upwards [hH2 (Ξ΅/(C+1)) (by positivity)] with n hn - intro Οƒ hΟƒ - have hΟƒ' : Οƒ ∈ Set.Icc (0 : ℝ) T := Set.Ioo_subset_Icc_self hΟƒ - have : IsProbabilityMeasure (f Οƒ) := (hf_mom Οƒ hΟƒ').1 - obtain ⟨_, _, hbnd, hfc⟩ := hfield_setup Οƒ hΟƒ' - -- L15: make the field opaque so defeq never unfolds its Bochner integral - set fldΟƒ : PhysSpace d β†’ PhysSpace d := convolveFunctionMeasure gradW (spatialMarginal (f Οƒ)) - with hfldΟƒ_def - clear_value fldΟƒ - -- projection bounds for this n - have hXp : βˆ€ z, β€–gXn n z - gradXΟ‡ zβ€– ≀ β€–fderiv ℝ (Ο‡n n) z - fderiv ℝ Ο‡ zβ€– := - fun z => gradientSlice_fst_sub_norm_le (Ο‡n n) Ο‡ - ((hΟ‡n_smooth n).differentiable htop) hΟ‡diff (gXn n) gradXΟ‡ - (fun z => by rw [hgXn_def]) hgradXΟ‡ z - have hVp : βˆ€ z, β€–gVn n z - gradVΟ‡ zβ€– ≀ β€–fderiv ℝ (Ο‡n n) z - fderiv ℝ Ο‡ zβ€– := - fun z => gradientSlice_snd_sub_norm_le (Ο‡n n) Ο‡ - ((hΟ‡n_smooth n).differentiable htop) hΟ‡diff (gVn n) gradVΟ‡ - (fun z => by rw [hgVn_def]) hgradVΟ‡ z - -- uniform fderiv bound at this n (uses Ο‡n = the convolution defeq, before clearing) - have hfd_le : βˆ€ z, β€–fderiv ℝ (Ο‡n n) z - fderiv ℝ Ο‡ zβ€– ≀ Ξ΅/(C+1) := by - intro z - have h := hn z - rw [dist_eq_norm, norm_sub_rev] at h - exact le_of_lt h - -- L15: with the projection + fderiv bounds proven, make the heavy convolution defs opaque so - -- the integrand-difference manipulations never unfold their Bochner integrals - clear_value gXn gVn Ο‡n - -- off K both gradient pairs agree (fderivs vanish there) - have hXoff : βˆ€ z βˆ‰ K, gXn n z = gradXΟ‡ z := by - intro z hzK - have hfd0 : fderiv ℝ (Ο‡n n) z = 0 := hsuppΟ‡n n z hzK - have hfd0' : fderiv ℝ Ο‡ z = 0 := hsuppΟ‡ z hzK - have := hXp z; rw [hfd0, hfd0', sub_self, norm_zero] at this - exact sub_eq_zero.mp (norm_le_zero_iff.mp this) - have hVoff : βˆ€ z βˆ‰ K, gVn n z = gradVΟ‡ z := by - intro z hzK - have hfd0 : fderiv ℝ (Ο‡n n) z = 0 := hsuppΟ‡n n z hzK - have hfd0' : fderiv ℝ Ο‡ z = 0 := hsuppΟ‡ z hzK - have := hVp z; rw [hfd0, hfd0', sub_self, norm_zero] at this - exact sub_eq_zero.mp (norm_le_zero_iff.mp this) - -- field bound on K - have hfld_K : βˆ€ z ∈ K, β€–fldΟƒ (Prod.fst z)β€– ≀ Ξ΅β‚€ + (L:ℝ) * R_K := by - intro z hzK - refine le_trans (hbnd z.1) ?_ - have : β€–z.1β€– ≀ R_K := le_trans (norm_fst_le z) (hR_K z hzK) - gcongr - -- pointwise bound on the integrand difference - have hpt : βˆ€ z, β€–(@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) - - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) - (gradVΟ‡ z)) - - (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) - - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) - (gVn n z))β€– ≀ C * (Ξ΅/(C+1)) := by - intro z - have h := inner_integrand_sub_norm_le K R_K hR_K_nn hR_K fldΟƒ - (Ξ΅β‚€ + (L:ℝ) * R_K) (by positivity) hfld_K - gradXΟ‡ gradVΟ‡ (gXn n) (gVn n) (Ξ΅/(C+1)) (by positivity) - (fun z => le_trans (hXp z) (hfd_le z)) (fun z => le_trans (hVp z) (hfd_le z)) - hXoff hVoff z - refine le_trans h (le_of_eq ?_) - rw [hC_def] - -- integrability of both integrands (continuous + compact support in K) - have hGd_int := inner_integrand_integrable (f Οƒ) fldΟƒ hfc gradXΟ‡ gradVΟ‡ - hgXΟ‡c hgVΟ‡c hgXΟ‡cs hgVΟ‡cs - have hGnd_int := inner_integrand_integrable (f Οƒ) fldΟƒ hfc (gXn n) (gVn n) - (hgXnc n) (hgVnc n) (hgXncs n) (hgVncs n) - -- assemble - rw [Real.dist_eq, ← integral_sub hGd_int hGnd_int] - calc |∫ z, ((@inner ℝ (PhysSpace d) _ z.2 (gradXΟ‡ z) - - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) - (gradVΟ‡ z)) - - (@inner ℝ (PhysSpace d) _ z.2 (gXn n z) - - @inner ℝ (PhysSpace d) _ (fldΟƒ z.1) - (gVn n z))) βˆ‚(f Οƒ)| - ≀ ∫ z, C * (Ξ΅/(C+1)) βˆ‚(f Οƒ) := by - refine le_trans (abs_integral_le_integral_abs) ?_ - refine integral_mono_of_nonneg (Filter.Eventually.of_forall fun z => abs_nonneg _) - (integrable_const _) (Filter.Eventually.of_forall fun z => ?_) - have := hpt z; rwa [Real.norm_eq_abs] at this - _ = C * (Ξ΅/(C+1)) := by simp - _ < Ξ΅ := by - have h1 : (0 : ℝ) < C + 1 := by positivity - rw [← mul_div_assoc, div_lt_iffβ‚€ h1] - nlinarith [hΞ΅, hC_nn] - -- assemble via the uniform-limit-of-derivatives theorem - exact hasDerivAt_of_tendstoUniformlyOn isOpen_Ioo hf'unif (Eventually.of_forall hDn) hfg hs - --- NC (consumption form): integral of a jointly-continuous, uniformly-compactly-supported --- family against the weak-solution measure curve is continuous in time. -omit [NeZero d] in -theorem vlasovSolutionOn_integral_continuousOn - (f : ℝ β†’ Measure (PhaseSpace d)) (T : ℝ) - (hf_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) - (hf_narrow : βˆ€ (g : PhaseSpace d β†’ ℝ), Continuous g β†’ HasCompactSupport g β†’ - ContinuousOn (fun s => ∫ z, g z βˆ‚(f s)) (Set.Icc 0 T)) - (G : ℝ β†’ PhaseSpace d β†’ ℝ) - (hG_cont : Continuous (fun p : ℝ Γ— PhaseSpace d => G p.1 p.2)) - (K : Set (PhaseSpace d)) (hK : IsCompact K) - (hG_supp : βˆ€ s, βˆ€ z βˆ‰ K, G s z = 0) : - ContinuousOn (fun s => ∫ z, G s z βˆ‚(f s)) (Set.Icc (0 : ℝ) T) := by - -- Each slice G a is continuous, supported in K, hence integrable wrt the probability f b. - have hGs_cont : βˆ€ a : ℝ, Continuous (fun z => G a z) := fun a => - hG_cont.comp (Continuous.prodMk_right a) - have hGs_cs : βˆ€ a : ℝ, HasCompactSupport (fun z => G a z) := by - intro a - have hsub : tsupport (fun z => G a z) βŠ† K := - closure_minimal (fun z hz => by by_contra hzK; exact hz (hG_supp a z hzK)) hK.isClosed - exact IsCompact.of_isClosed_subset hK (isClosed_tsupport _) hsub - have hGint : βˆ€ (a b : ℝ), b ∈ Set.Icc (0 : ℝ) T β†’ Integrable (fun z => G a z) (f b) := by - intro a b hb - have := (hf_mom b hb).1 - exact (hGs_cont a).integrable_of_hasCompactSupport (hGs_cs a) - -- Uniform continuity of the uncurried G on the compact Icc 0 T Γ—Λ’ K. - have hC : IsCompact (Set.Icc (0 : ℝ) T Γ—Λ’ K) := isCompact_Icc.prod hK - have hG_uc : UniformContinuousOn (fun p : ℝ Γ— PhaseSpace d => G p.1 p.2) - (Set.Icc (0 : ℝ) T Γ—Λ’ K) := - hC.uniformContinuousOn_of_continuous hG_cont.continuousOn - rw [Metric.uniformContinuousOn_iff] at hG_uc - -- Main Ρ–δ. - rw [Metric.continuousOn_iff] - intro sβ‚€ hsβ‚€ Ξ΅ hΞ΅ - obtain βŸ¨Ξ΄β‚, hδ₁, hδ₁_prop⟩ := hG_uc (Ξ΅/2) (by positivity) - -- term2: narrow continuity of f tested against the frozen g := G sβ‚€. - have hterm2 : ContinuousWithinAt (fun s => ∫ z, G sβ‚€ z βˆ‚(f s)) (Set.Icc 0 T) sβ‚€ := - (hf_narrow (fun z => G sβ‚€ z) (hGs_cont sβ‚€) (hGs_cs sβ‚€)) sβ‚€ hsβ‚€ - rw [Metric.continuousWithinAt_iff] at hterm2 - obtain βŸ¨Ξ΄β‚‚, hΞ΄β‚‚, hΞ΄β‚‚_prop⟩ := hterm2 (Ξ΅/2) (by positivity) - refine ⟨min δ₁ Ξ΄β‚‚, lt_min hδ₁ hΞ΄β‚‚, fun s hs hsd => ?_⟩ - have hp_s : IsProbabilityMeasure (f s) := (hf_mom s hs).1 - have hsd1 : dist s sβ‚€ < δ₁ := lt_of_lt_of_le hsd (min_le_left _ _) - have hsd2 : dist s sβ‚€ < Ξ΄β‚‚ := lt_of_lt_of_le hsd (min_le_right _ _) - -- pointwise: |G s z - G sβ‚€ z| ≀ Ξ΅/2 (uniform continuity on K; both zero off K) - have hpoint : βˆ€ z, |G s z - G sβ‚€ z| ≀ Ξ΅/2 := by - intro z - by_cases hzK : z ∈ K - Β· have hp : ((s, z) : ℝ Γ— PhaseSpace d) ∈ Set.Icc (0 : ℝ) T Γ—Λ’ K := ⟨hs, hzK⟩ - have hq : ((sβ‚€, z) : ℝ Γ— PhaseSpace d) ∈ Set.Icc (0 : ℝ) T Γ—Λ’ K := ⟨hsβ‚€, hzK⟩ - have hdpq : dist ((s, z) : ℝ Γ— PhaseSpace d) (sβ‚€, z) < δ₁ := by - rw [Prod.dist_eq] - exact max_lt hsd1 (by rw [dist_self]; exact hδ₁) - have hlt := hδ₁_prop _ hp _ hq hdpq - rw [Real.dist_eq] at hlt - exact le_of_lt hlt - Β· rw [hG_supp s z hzK, hG_supp sβ‚€ z hzK, sub_zero, abs_zero]; positivity - -- split the s-integral - have key : ∫ z, G s z βˆ‚(f s) - ∫ z, G sβ‚€ z βˆ‚(f s) - = ∫ z, (G s z - G sβ‚€ z) βˆ‚(f s) := - (integral_sub (hGint s s hs) (hGint sβ‚€ s hs)).symm - have hfirst : dist (∫ z, G s z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f s)) ≀ Ξ΅/2 := by - rw [Real.dist_eq, key] - calc |∫ z, (G s z - G sβ‚€ z) βˆ‚(f s)| - ≀ ∫ z, |G s z - G sβ‚€ z| βˆ‚(f s) := by - have h := norm_integral_le_integral_norm (ΞΌ := f s) (fun z => G s z - G sβ‚€ z) - simpa only [Real.norm_eq_abs] using h - _ ≀ ∫ _z, (Ξ΅/2) βˆ‚(f s) := - integral_mono (((hGint s s hs).sub (hGint sβ‚€ s hs)).abs) - (integrable_const _) hpoint - _ = Ξ΅/2 := by simp - have hsecond : dist (∫ z, G sβ‚€ z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f sβ‚€)) < Ξ΅/2 := - hΞ΄β‚‚_prop hs hsd2 - calc dist (∫ z, G s z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f sβ‚€)) - ≀ dist (∫ z, G s z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f s)) - + dist (∫ z, G sβ‚€ z βˆ‚(f s)) (∫ z, G sβ‚€ z βˆ‚(f sβ‚€)) := dist_triangle _ _ _ - _ < Ξ΅/2 + Ξ΅/2 := add_lt_add_of_le_of_lt hfirst hsecond - _ = Ξ΅ := by ring - -- ── Helpers for `transportedIntegral_hasDerivAt_zero`, extracted from its proof body. ── omit [NeZero d] in diff --git a/LeanPool/Vlasov/OT/WellPosedness.lean b/LeanPool/Vlasov/OT/WellPosedness.lean index e927c6b8bc..abe857238d 100644 --- a/LeanPool/Vlasov/OT/WellPosedness.lean +++ b/LeanPool/Vlasov/OT/WellPosedness.lean @@ -5,12 +5,11 @@ Authors: Joseph K. Miller -/ module -public import LeanPool.Vlasov.OT.CharacteristicFlow +public import LeanPool.Vlasov.OT.Continuation +import all LeanPool.Vlasov.OT.Continuation +import all LeanPool.Vlasov.OT.LocalWellPosedness import Mathlib.Algebra.Order.Ring.Star import Mathlib.Analysis.Calculus.Deriv.Prod -import Mathlib.Analysis.Calculus.FDeriv.Extend -import Mathlib.Analysis.SpecialFunctions.Trigonometric.Arctan -import Mathlib.MeasureTheory.Covering.Besicovitch /-! # Well-posedness ladder for the Vlasov equation + Dobrushin stability @@ -44,4339 +43,99 @@ namespace Vlasov open MeasureTheory ENNReal -/-! ## Β§9 Theorem (Existence and uniqueness for Vlasov) (tex: thm:vlasov-wp) -/ --- The proof composes directly with the characteristic-flow infrastructure --- developed in `LeanPool/Vlasov/OT/CharacteristicFlow.lean`: `exists_vlasov_characteristicFlow`, --- `flow_distance_growth_bound`, and --- `vlasovSolutionViaPushforward_isLagrangianVlasovSolution`. The --- `HasFiniteFirstMoment` predicate remains in `Basic.lean`. +-- Preserve existing private names when moving their proofs. +private alias envelopeStep_contractionInputs := + _root_.Vlasov.envelopeStep_contractionInputs -/-- **Project-internal: AEMeasurability of the Vlasov characteristic flow's -joint map** `z ↦ (charX s z, charV s z)` on the window `Icc 0 T`. +private alias picardCharFlow_aemeasurable := + _root_.Vlasov.picardCharFlow_aemeasurable -The window-restricted statement (`Icc 0 T`) is exactly what is needed: the -Vlasov flow satisfies `HasDerivAt` only on `Ioo 0 T` (off-window it is -uncontrolled `Classical.choose` data), and the sole consumer applies this -only at `clampToIcc T s ∈ Icc 0 T`. On the window the joint flow's -measurability follows from `charFlow_measurable_via_gronwall` (genuine -`Measurable`, via the boundary bundle through -`characteristicFlow_boundary_regularity`). +private alias picardFlow_clamp_bundle := + _root_.Vlasov.picardFlow_clamp_bundle -**In-project consumer**: `vlasovWellPosedness_local_picard_fixedPointFlow`'s -AEMeasurable conjunct, applied at clamp times `clampToIcc T s ∈ Icc 0 T`. -/ -private lemma picardCharFlow_aemeasurable - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : ℝ β†’ Measure (PhysSpace d)) [βˆ€ t, IsProbabilityMeasure (ρ t)] - (h_int : βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) (ρ t)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - {T : ℝ} (hT : 0 ≀ T) - (hflow : IsCharacteristicFlowOn gradW ρ charX charV (Set.Ioo 0 T) Set.univ) - (hbdry : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (ρ t) (charX t z))) (Set.Icc 0 T) t) - (ΞΌ : Measure (PhaseSpace d)) : - βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) ΞΌ := by - intro s hs - obtain ⟨h_init, h_cont, h_deriv⟩ := - characteristicFlow_boundary_regularity gradW ρ charX charV T hT hflow hbdry - exact (charFlow_measurable_via_gronwall gradW L hL ρ h_int charX charV T hT - h_init h_cont h_deriv s hs).aemeasurable - -/-- **Contraction-input helper**: from a flow's exposed facts (`IsCharacteristicFlowOn` -on `Ioo` + the boundary bundle on `Icc` β€” the `Phi_step_envelope` output shape) -against a curve `Ξ½`, derive the six per-`z` regularity facts that -`Phi_supW1_contraction` consumes. Chains `characteristicFlow_boundary_regularity` -(β†’ init/cont/deriv, the last three EXACT), `charFlow_measurable_via_gronwall` -(β†’ AEMeasurable), and `flow_distance_growth_bound_on` (β†’ growth bound, integrated -to the two integrability facts). -/ -private lemma envelopeStep_contractionInputs {d : β„•} [NeZero d] - (gradW : PhysSpace d β†’ PhysSpace d) (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (h_fβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 ≀ T) {m : ℝ β†’ ℝ} - (Ξ½ : VlasovMeasureCurve d T m) - (Mbar : ℝ) (hMbar_nn : 0 ≀ Mbar) - (hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(Ξ½.extend t) ≀ Mbar) - (cX cV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hflow : IsCharacteristicFlowOn gradW Ξ½.extend cX cV (Set.Ioo 0 T) Set.univ) - (hbdry : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => cX s z) (cV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => cV s z) - (-(convolveFunctionMeasure gradW (Ξ½.extend t) (cX t z))) (Set.Icc 0 T) t) - (h_int_ext : βˆ€ t (x : PhysSpace d), - Integrable (fun y => gradW (x - y)) (Ξ½.extend t)) : - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, AEMeasurable (fun z : PhaseSpace d => cX t z) fβ‚€) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, Integrable (fun z : PhaseSpace d => β€–cX t zβ€–) fβ‚€) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => cX t z) fβ‚€)) ∧ - (βˆ€ z : PhaseSpace d, (cX 0 z, cV 0 z) = z) ∧ - (βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (cX s z, cV s z)) (Set.Icc (0 : ℝ) T)) ∧ - (βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, - HasDerivWithinAt (fun s' => (cX s' z, cV s' z)) - (vlasovVectorField gradW (Ξ½.extend) s (cX s z, cV s z)) - (Set.Ici s) s) := by - have : βˆ€ t, IsProbabilityMeasure (Ξ½.extend t) := VlasovMeasureCurve.extend_isProb Ξ½ - obtain ⟨h_init, h_cont, h_deriv⟩ := - characteristicFlow_boundary_regularity gradW Ξ½.extend cX cV T hT hflow hbdry - have h_meas : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => cX t z) fβ‚€ := by - have h_meas_Icc := charFlow_measurable_via_gronwall gradW L hL Ξ½.extend h_int_ext - cX cV T hT h_init h_cont h_deriv - exact fun t ht => (measurable_fst.comp (h_meas_Icc t ht)).aemeasurable - obtain ⟨C_T, hC_T_nn, h_growth⟩ := - flow_distance_growth_bound_on gradW L hL Ξ½.extend cX cV T hT - h_init h_cont h_deriv Mbar hMbar_nn hM_ρ - (fun t _ => VlasovMeasureCurve.extend_yIntegrable hT Ξ½ t) h_int_ext - have h_int_charX : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun z : PhaseSpace d => β€–cX t zβ€–) fβ‚€ := by - intro t ht - have h_dom_int : Integrable (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) fβ‚€ := by - have h1 : Integrable (fun z : PhaseSpace d => C_T * β€–zβ€–) fβ‚€ := h_fβ‚€_int.const_mul C_T - have h2 : Integrable (fun _ : PhaseSpace d => C_T) fβ‚€ := integrable_const _ - have h_eq : (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) = fun z => C_T * β€–zβ€– + C_T := by - funext z; ring - rw [h_eq]; exact h1.add h2 - refine h_dom_int.mono' (h_meas t ht).norm.aestronglyMeasurable ?_ - refine Filter.Eventually.of_forall fun z => ?_ - rw [Real.norm_of_nonneg (norm_nonneg _)] - exact le_trans (norm_fst_le (cX t z, cV t z)) (h_growth t ht z) - have h_yint_Phi : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => cX t z) fβ‚€) := by - intro t ht - rw [integrable_map_measure continuous_norm.aestronglyMeasurable (h_meas t ht)] - exact h_int_charX t ht - exact ⟨h_meas, h_int_charX, h_yint_Phi, h_init, h_cont, h_deriv⟩ - -/-- Lipschitz growth of the force plus a first moment of the measure make the -shifted force integrable. The workhorse integrability fact behind every -`convolveFunctionMeasure` estimate. -/ -lemma integrable_gradW_shift - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ΞΌ : Measure (PhysSpace d)) [MeasureTheory.IsFiniteMeasure ΞΌ] - (h_yint : Integrable (fun y : PhysSpace d => β€–yβ€–) ΞΌ) - (xp : PhysSpace d) : - Integrable (fun y => gradW (xp - y)) ΞΌ := by - have h_aesm : AEStronglyMeasurable (fun y : PhysSpace d => gradW (xp - y)) ΞΌ := - (hL.continuous.comp (continuous_const.sub continuous_id)).aestronglyMeasurable - have h_dom : βˆ€ y : PhysSpace d, β€–gradW (xp - y)β€– ≀ - β€–gradW 0β€– + (L : ℝ) * β€–xpβ€– + (L : ℝ) * β€–yβ€– := by - intro y - have hd := hL.dist_le_mul (xp - y) 0 - simp only [dist_eq_norm, sub_zero] at hd - have h_tri : β€–gradW (xp - y)β€– ≀ β€–gradW 0β€– + β€–gradW (xp - y) - gradW 0β€– := by - have := norm_add_le (gradW (xp - y) - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - have h_sub_le : β€–xp - yβ€– ≀ β€–xpβ€– + β€–yβ€– := norm_sub_le xp y - have h_mul := mul_le_mul_of_nonneg_left h_sub_le L.coe_nonneg - linarith - have h_dom_int : Integrable - (fun y : PhysSpace d => β€–gradW 0β€– + (L : ℝ) * β€–xpβ€– + (L : ℝ) * β€–yβ€–) ΞΌ := by - have h_eq : (fun y : PhysSpace d => β€–gradW 0β€– + (L : ℝ) * β€–xpβ€– + (L : ℝ) * β€–yβ€–) = - fun y => (β€–gradW 0β€– + (L : ℝ) * β€–xpβ€–) + (L : ℝ) * β€–yβ€– := by funext y; ring - rw [h_eq]; exact (integrable_const _).add (h_yint.const_mul _) - exact h_dom_int.mono' h_aesm (Filter.Eventually.of_forall fun y => h_dom y) - -/-- `LocalSmallnessContraction L T` IS the GrΓΆnwall contraction factor -`gronwallBound 0 (max 1 L) L T < 1`, after unfolding both definitions. -/ -lemma LocalSmallnessContraction.gronwallBound_lt_one - {L : NNReal} {T : ℝ} (hTL_con : LocalSmallnessContraction L T) : - gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T < 1 := by - have hK_pos : (0 : ℝ) < ((max 1 L : NNReal) : ℝ) := by - have : (1 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := by - rw [NNReal.coe_max, NNReal.coe_one]; exact le_max_left _ _ - linarith - have hK_ne : ((max 1 L : NNReal) : ℝ) β‰  0 := ne_of_gt hK_pos - rw [gronwallBound_of_K_ne_0 hK_ne] - simp only [zero_mul, zero_add] - have h_eq : (L : ℝ) / ((max 1 L : NNReal) : ℝ) * - (Real.exp (((max 1 L : NNReal) : ℝ) * T) - 1) = - (L : ℝ) * (Real.exp ((max 1 (L : ℝ)) * T) - 1) / (max 1 (L : ℝ)) := by - rw [NNReal.coe_max, NNReal.coe_one] - ring - rw [h_eq] - exact hTL_con - -/-- The Picard sequence of the local fixed-point construction, with its exposed -per-step flows and the geometric contraction bound. Extracted from -`vlasovWellPosedness_local_picard_fixedPointFlow`; the parameters `q` (the -contraction factor) and `Dβ‚€` (the initial `W₁`-input bound) are threaded with -their defining equations so the parent's `let`-definitions supply `rfl`. -/ -private lemma vlasovWellPosedness_local_picard_sequence - {d : β„•} [NeZero d] - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (hTL_PL : LocalSmallnessPLBuffer L T) - (m : ℝ β†’ ℝ) (hm_mono : MonotoneOn m (Set.Icc 0 T)) - (hm_nn : βˆ€ t ∈ Set.Icc (0 : ℝ) T, 0 ≀ m t) - (hm_inv : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - gronwallBound (∫ z, β€–zβ€– βˆ‚fβ‚€) (1 + (L : ℝ)) (β€–gradW 0β€– + (L : ℝ) * m t) t ≀ m t) - (hMbar_nn : 0 ≀ m T) (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) - (hΞΌβ‚€_prob : IsProbabilityMeasure (spatialMarginal fβ‚€)) - (hΞΌβ‚€_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal fβ‚€)) - (hΞΌβ‚€_le_m : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal fβ‚€) ≀ m t) - (q : ℝ) (hq_nn : 0 ≀ q) - (hq_def : q = gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T) - (Dβ‚€ : ℝ) (hDβ‚€_nn : 0 ≀ Dβ‚€) (hDβ‚€_def : Dβ‚€ = 2 * (m T)) : - βˆƒ (x : β„• β†’ VlasovMeasureCurve d T m) - (charXs charVs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d), - (βˆ€ k, supW1On (Set.Icc 0 T) (x k).ρ (x (k + 1)).ρ ≀ - ENNReal.ofReal (q ^ k * Dβ‚€)) ∧ - (βˆ€ k, - IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) - (Set.Ioo 0 T) Set.univ ∧ - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charVs k s z) - (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) - (Set.Icc 0 T) t) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (x (k + 1)).ρ t - = Measure.map (fun z : PhaseSpace d => charXs k t z) fβ‚€)) := by - have h_int_ext_gen : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) (t : ℝ) (xp : PhysSpace d), - Integrable (fun y => gradW (xp - y)) (Ξ½.extend t) := fun Ξ½ t xp => - integrable_gradW_shift gradW L hL (Ξ½.extend t) - (VlasovMeasureCurve.extend_yIntegrable hT.le Ξ½ t) xp - have step : βˆ€ (Ξ½ : VlasovMeasureCurve d T m), - βˆƒ (Οƒ : VlasovMeasureCurve d T m) (cX cV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, Οƒ.ρ t = Measure.map (fun z => cX t z) fβ‚€) ∧ - IsCharacteristicFlowOn gradW Ξ½.extend cX cV (Set.Ioo 0 T) Set.univ ∧ - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => cX s z) (cV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => cV s z) - (-(convolveFunctionMeasure gradW (Ξ½.extend t) (cX t z))) (Set.Icc 0 T) t) := by - intro Ξ½ - obtain ⟨cX, cV, hflow, hbdry, Οƒ, hΟƒβŸ© := - Phi_step_envelope W gradW hgradW L hL fβ‚€ hfβ‚€_int hT.le m hm_mono hm_nn hm_inv hTL_PL - Ξ½ (h_int_ext_gen Ξ½) - exact βŸ¨Οƒ, cX, cV, hΟƒ, hflow, hbdry⟩ - have hΞΌβ‚€_prob_inst : IsProbabilityMeasure (spatialMarginal fβ‚€) := hΞΌβ‚€_prob - let base : VlasovMeasureCurve d T m := constantCurve (spatialMarginal fβ‚€) hΞΌβ‚€_int hΞΌβ‚€_le_m - let x : β„• β†’ VlasovMeasureCurve d T m := - fun n => Nat.rec base (fun _ Ξ½ => Classical.choose (step Ξ½)) n - let charXs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d := - fun k => Classical.choose (Classical.choose_spec (step (x k))) - let charVs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d := - fun k => Classical.choose (Classical.choose_spec (Classical.choose_spec (step (x k)))) - have hx_succ : βˆ€ k, x (k + 1) = Classical.choose (step (x k)) := fun _ => rfl - have hspec : βˆ€ k, - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (Classical.choose (step (x k))).ρ t = Measure.map (fun z => charXs k t z) fβ‚€) ∧ - IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) - (Set.Ioo 0 T) Set.univ ∧ - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charVs k s z) - (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) - (Set.Icc 0 T) t) := - fun k => Classical.choose_spec - (Classical.choose_spec (Classical.choose_spec (step (x k)))) - have h_flow : βˆ€ k, - IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) - (Set.Ioo 0 T) Set.univ ∧ - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charVs k s z) - (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) - (Set.Icc 0 T) t) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (x (k + 1)).ρ t = Measure.map (fun z : PhaseSpace d => charXs k t z) fβ‚€) := by - intro k - obtain ⟨hpush, hcf, hbd⟩ := hspec k - refine ⟨hcf, hbd, fun t ht => ?_⟩ - rw [hx_succ k]; exact hpush t ht - have hCI : βˆ€ k, - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, AEMeasurable (fun z : PhaseSpace d => charXs k t z) fβ‚€) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, Integrable (fun z : PhaseSpace d => β€–charXs k t zβ€–) fβ‚€) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => charXs k t z) fβ‚€)) ∧ - (βˆ€ z : PhaseSpace d, (charXs k 0 z, charVs k 0 z) = z) ∧ - (βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charXs k s z, charVs k s z)) (Set.Icc (0 : ℝ) T)) ∧ - (βˆ€ z : PhaseSpace d, βˆ€ s ∈ Set.Ico (0 : ℝ) T, - HasDerivWithinAt (fun s' => (charXs k s' z, charVs k s' z)) - (vlasovVectorField gradW ((x k).extend) s (charXs k s z, charVs k s z)) - (Set.Ici s) s) := - fun k => envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le (x k) (m T) hMbar_nn - (fun t _ => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le (x k) t) - (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t))) - (charXs k) (charVs k) (h_flow k).1 (h_flow k).2.1 (h_int_ext_gen (x k)) - have hK_ne : ((max 1 L : NNReal) : ℝ) β‰  0 := by - have h1 : (1:ℝ) ≀ ((max 1 L : NNReal):ℝ) := by - rw [NNReal.coe_max, NNReal.coe_one]; exact le_max_left _ _ - linarith - have hq_scale : βˆ€ D : ℝ, - gronwallBound 0 ((max 1 L : NNReal):ℝ) ((L:ℝ)*D) T = D * q := by - intro D - rw [hq_def, gronwallBound_of_K_ne_0 hK_ne, gronwallBound_of_K_ne_0 hK_ne]; ring - have hPext : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) (t : ℝ), - IsProbabilityMeasure (Ξ½.extend t) := - fun Ξ½ => VlasovMeasureCurve.extend_isProb Ξ½ - have h_contract : βˆ€ k, supW1On (Set.Icc 0 T) (x k).ρ (x (k + 1)).ρ ≀ - ENNReal.ofReal (q ^ k * Dβ‚€) := by - intro k - induction k with - | zero => - simp only [pow_zero, one_mul] - rw [hDβ‚€_def] - exact supW1On_le_two_moment_of_VlasovMeasureCurve (m T) hMbar_mono (x 0) (x 1) - | succ k ih => - set D : ℝ := q ^ k * Dβ‚€ with hD_def - have hD_nn : 0 ≀ D := mul_nonneg (pow_nonneg hq_nn k) hDβ‚€_nn - have he : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) s, s ∈ Set.Icc (0 : ℝ) T β†’ Ξ½.extend s = Ξ½.ρ s := by - intro Ξ½ s hs - unfold VlasovMeasureCurve.extend clampToIcc; congr 1 - rw [min_eq_left hs.2, max_eq_right hs.1] - have h_W1_fin : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - wasserstein1 ((x k).extend s) ((x (k+1)).extend s) β‰  ⊀ := by - intro s hs - rw [he (x k) s hs, he (x (k+1)) s hs] - have := (x k).isProb s; have := (x (k+1)).isProb s - exact wasserstein1_ne_top_of_finite_moment _ _ - ((x k).yIntegrable s hs) ((x (k+1)).yIntegrable s hs) - have h_W1_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - (wasserstein1 ((x k).extend s) ((x (k+1)).extend s)).toReal ≀ D := by - intro s hs - rw [he (x k) s hs, he (x (k+1)) s hs] - have h_le : wasserstein1 ((x k).ρ s) ((x (k+1)).ρ s) - ≀ ENNReal.ofReal D := - le_trans (wasserstein1_le_supW1On _ _ _ s hs) ih - have h_ne : wasserstein1 ((x k).ρ s) ((x (k+1)).ρ s) β‰  ⊀ := by - have := (x k).isProb s; have := (x (k+1)).isProb s - exact wasserstein1_ne_top_of_finite_moment _ _ - ((x k).yIntegrable s hs) ((x (k+1)).yIntegrable s hs) - calc (wasserstein1 ((x k).ρ s) ((x (k+1)).ρ s)).toReal - ≀ (ENNReal.ofReal D).toReal := ENNReal.toReal_mono ENNReal.ofReal_ne_top h_le - _ = D := ENNReal.toReal_ofReal hD_nn - have h_contr := @Phi_supW1_contraction d gradW L hL ((x k).extend) ((x (k+1)).extend) - (hPext (x k)) (hPext (x (k+1))) - (h_int_ext_gen (x k)) (h_int_ext_gen (x (k+1))) T hT.le D hD_nn h_W1_fin h_W1_bound - (charXs k) (charVs k) (charXs (k+1)) (charVs (k+1)) fβ‚€ _ - (hCI k).1 (hCI (k+1)).1 (hCI k).2.1 (hCI (k+1)).2.1 - (hCI k).2.2.1 (hCI (k+1)).2.2.1 (hCI k).2.2.2.1 (hCI (k+1)).2.2.2.1 - (hCI k).2.2.2.2.1 (hCI (k+1)).2.2.2.2.1 (hCI k).2.2.2.2.2 (hCI (k+1)).2.2.2.2.2 - rw [hq_scale D] at h_contr - have h_supW1_eq : supW1On (Set.Icc 0 T) (x (k+1)).ρ (x (k+1+1)).ρ - = supW1On (Set.Icc 0 T) - (fun t => Measure.map (fun z => charXs k t z) fβ‚€) - (fun t => Measure.map (fun z => charXs (k+1) t z) fβ‚€) := by - unfold supW1On - exact iSup_congr fun t => iSup_congr fun ht => by - rw [(h_flow k).2.2 t ht, (h_flow (k+1)).2.2 t ht] - have hDq : D * q = q ^ (k + 1) * Dβ‚€ := by rw [hD_def, pow_succ]; ring - rw [hDq] at h_contr - have h_ne_top : supW1On (Set.Icc 0 T) - (fun t => Measure.map (fun z => charXs k t z) fβ‚€) - (fun t => Measure.map (fun z => charXs (k+1) t z) fβ‚€) β‰  ⊀ := by - rw [← h_supW1_eq] - exact supW1On_ne_top_of_VlasovMeasureCurve (m T) hMbar_mono (x (k+1)) (x (k+1+1)) - have h_pow_nn : 0 ≀ q ^ (k + 1) * Dβ‚€ := mul_nonneg (pow_nonneg hq_nn _) hDβ‚€_nn - rw [h_supW1_eq] - rw [← ENNReal.toReal_le_toReal h_ne_top ENNReal.ofReal_ne_top, - ENNReal.toReal_ofReal h_pow_nn] - exact h_contr - exact ⟨x, charXs, charVs, h_contract, h_flow⟩ - -/-- Pointwise contraction of the Picard step between an iterate and the limit -curve: the pushforwards under the two flows are `DΒ·q`-close whenever the curves -are uniformly `D`-close in `W₁`. Wraps `Phi_pointwise_contraction` + -`gronwallBound` monotonicity for a single curve pair. -/ -private lemma picardLimit_flow_pointwise_contraction - {d : β„•} [NeZero d] - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (m : ℝ β†’ ℝ) (hMbar_nn : 0 ≀ m T) - (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) - (Ξ½ ρl : VlasovMeasureCurve d T m) - (cX cV charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hflow_Ξ½ : IsCharacteristicFlowOn gradW Ξ½.extend cX cV (Set.Ioo 0 T) Set.univ) - (hbdry_Ξ½ : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => cX s z) (cV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => cV s z) - (-(convolveFunctionMeasure gradW (Ξ½.extend t) (cX t z))) (Set.Icc 0 T) t) - (hflow_l : IsCharacteristicFlowOn gradW ρl.extend charX charV (Set.Ioo 0 T) Set.univ) - (hbdry_l : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (ρl.extend t) (charX t z))) (Set.Icc 0 T) t) - (D : ℝ) (hD_nn : 0 ≀ D) - (h_W1_fin : βˆ€ s ∈ Set.Icc (0 : ℝ) T, wasserstein1 (Ξ½.extend s) (ρl.extend s) β‰  ⊀) - (h_W1_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - (wasserstein1 (Ξ½.extend s) (ρl.extend s)).toReal ≀ D) - (q : ℝ) (hq_def : q = gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (wasserstein1 (Measure.map (fun z => cX t z) fβ‚€) - (Measure.map (fun z => charX t z) fβ‚€)).toReal ≀ D * q := by - have hK_ge1 : (1 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := by - rw [NNReal.coe_max, NNReal.coe_one]; exact le_max_left _ _ - have hK_ne : ((max 1 L : NNReal) : ℝ) β‰  0 := ne_of_gt (by linarith) - have hK_pos : (0 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := by linarith - have hMm : βˆ€ (ΞΌ : VlasovMeasureCurve d T m), βˆ€ t ∈ Set.Icc (0 : ℝ) T, - ∫ y, β€–yβ€– βˆ‚(ΞΌ.extend t) ≀ m T := - fun ΞΌ t _ => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le ΞΌ t) - (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t)) - have h_int_Ξ½ : βˆ€ t (xp : PhysSpace d), - Integrable (fun y => gradW (xp - y)) (Ξ½.extend t) := fun t xp => - integrable_gradW_shift gradW L hL (Ξ½.extend t) - (VlasovMeasureCurve.extend_yIntegrable hT.le Ξ½ t) xp - have h_int_l : βˆ€ t (xp : PhysSpace d), - Integrable (fun y => gradW (xp - y)) (ρl.extend t) := fun t xp => - integrable_gradW_shift gradW L hL (ρl.extend t) - (VlasovMeasureCurve.extend_yIntegrable hT.le ρl t) xp - have hCI_Ξ½ := envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le Ξ½ - (m T) hMbar_nn (hMm Ξ½) cX cV hflow_Ξ½ hbdry_Ξ½ h_int_Ξ½ - have hCI_l := envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le ρl - (m T) hMbar_nn (hMm ρl) charX charV hflow_l hbdry_l h_int_l - have hq_scale : gronwallBound 0 ((max 1 L : NNReal) : ℝ) ((L:ℝ) * D) T = D * q := by - rw [hq_def, gronwallBound_of_K_ne_0 hK_ne, gronwallBound_of_K_ne_0 hK_ne]; ring - intro t ht - have hpt := @Phi_pointwise_contraction d gradW L hL (Ξ½.extend) (ρl.extend) - (VlasovMeasureCurve.extend_isProb Ξ½) (VlasovMeasureCurve.extend_isProb ρl) - h_int_Ξ½ h_int_l T hT.le D hD_nn h_W1_fin h_W1_bound - cX cV charX charV fβ‚€ _ - hCI_Ξ½.1 hCI_l.1 hCI_Ξ½.2.1 hCI_l.2.1 - hCI_Ξ½.2.2.2.1 hCI_l.2.2.2.1 hCI_Ξ½.2.2.2.2.1 hCI_l.2.2.2.2.1 - hCI_Ξ½.2.2.2.2.2 hCI_l.2.2.2.2.2 t ht - have h_mono : gronwallBound 0 ((max 1 L : NNReal) : ℝ) ((L:ℝ) * D) t - ≀ gronwallBound 0 ((max 1 L : NNReal) : ℝ) ((L:ℝ) * D) T := - gronwallBound_mono (le_refl 0) (mul_nonneg L.coe_nonneg hD_nn) hK_pos ht.2 - rw [hq_scale] at h_mono - exact le_trans hpt h_mono - -/-- The Picard fixed-point equation at the limit: if the iterates converge to the -limit curve in `W₁` and each step's pushforward is `Dβ‚™Β·q`-close to the limit -flow's pushforward with `Dβ‚™Β·q β†’ 0`, the limit curve equals the limit flow's -pushforward. Triangle through the iterates + the `W₁` separation lemma. -/ -private lemma picardLimit_fixed_point_eq - {d : β„•} [NeZero d] - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - {T : ℝ} - (m : ℝ β†’ ℝ) (x : β„• β†’ VlasovMeasureCurve d T m) (ρl : VlasovMeasureCurve d T m) - (charXs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (charX : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_push : βˆ€ n, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (x (n + 1)).ρ t = Measure.map (fun z : PhaseSpace d => charXs n t z) fβ‚€) - (h_tendsto : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Filter.Tendsto (fun n => wasserstein1 ((x n).ρ t) (ρl.ρ t)) Filter.atTop (nhds 0)) - (h_aem_n : βˆ€ n, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => charXs n t z) fβ‚€) - (h_aem_lim : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => charX t z) fβ‚€) - (h_mom_n : βˆ€ n, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => charXs n t z) fβ‚€)) - (h_mom_lim : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) (Measure.map (fun z => charX t z) fβ‚€)) - (Dn : β„• β†’ ℝ) (q : ℝ) - (hDnq_tendsto : Filter.Tendsto (fun n => Dn n * q) Filter.atTop (nhds 0)) - (h_term2 : βˆ€ n t, t ∈ Set.Icc (0 : ℝ) T β†’ - (wasserstein1 (Measure.map (fun z => charXs n t z) fβ‚€) - (Measure.map (fun z => charX t z) fβ‚€)).toReal ≀ Dn n * q) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, ρl.ρ t = Measure.map (fun z => charX t z) fβ‚€ := by - intro t ht - have hP1 : IsProbabilityMeasure (ρl.ρ t) := ρl.isProb t - have hP2 : IsProbabilityMeasure (Measure.map (fun z => charX t z) fβ‚€) := - (Measure.isProbabilityMeasure_map_iff (h_aem_lim t ht)).mpr inferInstance - refine (wasserstein1_eq_zero_iff_measure_eq (ρl.ρ t) - (Measure.map (fun z => charX t z) fβ‚€)).mp ?_ - have h_le_seq : βˆ€ n, wasserstein1 (ρl.ρ t) (Measure.map (fun z => charX t z) fβ‚€) - ≀ wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) + ENNReal.ofReal (Dn n * q) := by - intro n - have h_mid : (x (n+1)).ρ t = Measure.map (fun z => charXs n t z) fβ‚€ := h_push n t ht - calc wasserstein1 (ρl.ρ t) (Measure.map (fun z => charX t z) fβ‚€) - ≀ wasserstein1 (ρl.ρ t) ((x (n+1)).ρ t) - + wasserstein1 ((x (n+1)).ρ t) (Measure.map (fun z => charX t z) fβ‚€) := - wasserstein1_triangle _ _ _ - _ = wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) - + wasserstein1 ((x (n+1)).ρ t) (Measure.map (fun z => charX t z) fβ‚€) := by - rw [wasserstein1_comm (ρl.ρ t) ((x (n+1)).ρ t)] - _ ≀ wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) + ENNReal.ofReal (Dn n * q) := by - gcongr - rw [h_mid] - have h_fin : wasserstein1 (Measure.map (fun z => charXs n t z) fβ‚€) - (Measure.map (fun z => charX t z) fβ‚€) β‰  ⊀ := by - have : IsProbabilityMeasure (Measure.map (fun z => charXs n t z) fβ‚€) := - (Measure.isProbabilityMeasure_map_iff (h_aem_n n t ht)).mpr inferInstance - exact wasserstein1_ne_top_of_finite_moment _ _ - (h_mom_n n t ht) (h_mom_lim t ht) - rw [← ENNReal.ofReal_toReal h_fin] - exact ENNReal.ofReal_le_ofReal (h_term2 n t ht) - have hA : Filter.Tendsto (fun n => wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t)) - Filter.atTop (nhds 0) := - (h_tendsto t ht).comp (Filter.tendsto_add_atTop_nat 1) - have hB : Filter.Tendsto (fun n => ENNReal.ofReal (Dn n * q)) Filter.atTop (nhds 0) := by - have := (ENNReal.continuous_ofReal.tendsto 0).comp hDnq_tendsto - simpa [Function.comp_def] using this - have h_seq : Filter.Tendsto - (fun n => wasserstein1 ((x (n+1)).ρ t) (ρl.ρ t) + ENNReal.ofReal (Dn n * q)) - Filter.atTop (nhds 0) := by - have := hA.add hB - simpa using this - exact le_antisymm (ge_of_tendsto' h_seq h_le_seq) (zero_le) - -/-- Bundle the self-consistent Picard-limit flow, CLAMPED to the window, into the -seven-conjunct conclusion of `vlasovWellPosedness_local_picard_fixedPointFlow`. -The raw flow is controlled only on `[0, T]`; clamping (`clampToIcc`) makes every -universal-in-`s` conjunct reduce to the window, where the clamp is the identity. -/ -private lemma picardFlow_clamp_bundle - {d : β„•} [NeZero d] - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) - {T : ℝ} (hT : 0 < T) - (m : ℝ β†’ ℝ) (hMbar_nn : 0 ≀ m T) - (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) - (ρ_lim : VlasovMeasureCurve d T m) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hflow_on_ρlim : IsCharacteristicFlowOn gradW ρ_lim.extend charX charV - (Set.Ioo 0 T) Set.univ) - (h_boundary_ρlim : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (ρ_lim.extend t) (charX t z))) (Set.Icc 0 T) t) - (h_int_ρ_lim : βˆ€ t (x_pt : PhysSpace d), - Integrable (fun y => gradW (x_pt - y)) (ρ_lim.extend t)) - (h_self_consist : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - ρ_lim.extend t = - spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) : - βˆƒ (charX' charV' : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (M_ρ : ℝ), 0 ≀ M_ρ ∧ - IsCharacteristicFlowOn gradW - (fun t => spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ t)) - charX' charV' (Set.Ioo 0 T) Set.univ ∧ - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX' s z) (charV' t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV' s z) - (-(convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ t)) - (charX' t z))) - (Set.Icc 0 T) t) ∧ - (βˆ€ s ∈ Set.Icc (0 : ℝ) T, - ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s)) ≀ M_ρ) ∧ - (βˆ€ s ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) - (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s))) ∧ - (βˆ€ s, Continuous (fun x => - convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s)) x)) ∧ - (βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX' s z, charV' s z)) fβ‚€) ∧ - (βˆ€ s (x : PhysSpace d), - Integrable (fun y => gradW (x - y)) - (spatialMarginal (vlasovSolutionViaPushforward charX' charV' fβ‚€ s))) := by - have hclamp_id : βˆ€ s ∈ Set.Icc (0 : ℝ) T, clampToIcc T s = s := fun s hs => by - unfold clampToIcc; rw [min_eq_left hs.2, max_eq_right hs.1] - have hclamp0 : clampToIcc T 0 = 0 := hclamp_id 0 ⟨le_refl 0, hT.le⟩ - have h_rho_clamp : βˆ€ s : ℝ, - spatialMarginal (vlasovSolutionViaPushforward - (fun s' z => charX (clampToIcc T s') z) - (fun s' z => charV (clampToIcc T s') z) fβ‚€ s) = - ρ_lim.extend (clampToIcc T s) := by - intro s - have h1 : spatialMarginal (vlasovSolutionViaPushforward - (fun s' z => charX (clampToIcc T s') z) - (fun s' z => charV (clampToIcc T s') z) fβ‚€ s) = - spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ (clampToIcc T s)) := - rfl - rw [h1, ← h_self_consist (clampToIcc T s) (clampToIcc_mem hT.le s)] - refine ⟨fun s z => charX (clampToIcc T s) z, fun s z => charV (clampToIcc T s) z, - m T, hMbar_nn, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ - Β· refine ⟨fun z _hz => ?_, fun t ht z _hz => ?_, fun t ht z _hz => ?_⟩ - Β· change charX (clampToIcc T 0) z = z.1 ∧ charV (clampToIcc T 0) z = z.2 - rw [hclamp0]; exact hflow_on_ρlim.1 z (Set.mem_univ z) - Β· have hEv : (fun s => charX (clampToIcc T s) z) =αΆ [nhds t] - (fun s => charX s z) := by - filter_upwards [Ioo_mem_nhds ht.1 ht.2] with s hs - rw [hclamp_id s (Set.Ioo_subset_Icc_self hs)] - change HasDerivAt (fun s => charX (clampToIcc T s) z) (charV (clampToIcc T t) z) t - rw [hclamp_id t (Set.Ioo_subset_Icc_self ht)] - exact (hflow_on_ρlim.2.1 t ht z (Set.mem_univ z)).congr_of_eventuallyEq hEv - Β· have hEv : (fun s => charV (clampToIcc T s) z) =αΆ [nhds t] - (fun s => charV s z) := by - filter_upwards [Ioo_mem_nhds ht.1 ht.2] with s hs - rw [hclamp_id s (Set.Ioo_subset_Icc_self hs)] - change HasDerivAt (fun s => charV (clampToIcc T s) z) - (-(convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward - (fun s' z' => charX (clampToIcc T s') z') - (fun s' z' => charV (clampToIcc T s') z') fβ‚€ t)) - (charX (clampToIcc T t) z))) t - rw [h_rho_clamp t, hclamp_id t (Set.Ioo_subset_Icc_self ht)] - exact (hflow_on_ρlim.2.2 t ht z (Set.mem_univ z)).congr_of_eventuallyEq hEv - Β· intro z t ht - have hEqOn : Set.EqOn (fun s => charX (clampToIcc T s) z) (fun s => charX s z) - (Set.Icc 0 T) := fun s hs => by - change charX (clampToIcc T s) z = charX s z; rw [hclamp_id s hs] - have hEqOnV : Set.EqOn (fun s => charV (clampToIcc T s) z) (fun s => charV s z) - (Set.Icc 0 T) := fun s hs => by - change charV (clampToIcc T s) z = charV s z; rw [hclamp_id s hs] - obtain ⟨h1, h2⟩ := h_boundary_ρlim z t ht - refine ⟨?_, ?_⟩ - Β· change HasDerivWithinAt (fun s => charX (clampToIcc T s) z) - (charV (clampToIcc T t) z) (Set.Icc 0 T) t - rw [hclamp_id t ht] - exact h1.congr hEqOn (hEqOn ht) - Β· change HasDerivWithinAt (fun s => charV (clampToIcc T s) z) - (-(convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward - (fun s' z' => charX (clampToIcc T s') z') - (fun s' z' => charV (clampToIcc T s') z') fβ‚€ t)) - (charX (clampToIcc T t) z))) (Set.Icc 0 T) t - rw [h_rho_clamp t, hclamp_id t ht] - exact h2.congr hEqOnV (hEqOnV ht) - Β· intro s hs - rw [h_rho_clamp s, hclamp_id s hs] - exact le_trans (VlasovMeasureCurve.extend_hasMoment hT.le ρ_lim s) - (hMbar_mono (clampToIcc T s) (clampToIcc_mem hT.le s)) - Β· intro s hs - rw [h_rho_clamp s, hclamp_id s hs] - exact VlasovMeasureCurve.extend_yIntegrable hT.le ρ_lim s - Β· intro s - rw [h_rho_clamp s] - have : IsProbabilityMeasure (ρ_lim.extend (clampToIcc T s)) := - VlasovMeasureCurve.extend_isProb ρ_lim (clampToIcc T s) - exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL - (ρ_lim.extend (clampToIcc T s)) (h_int_ρ_lim (clampToIcc T s))).continuous - Β· intro s - exact picardCharFlow_aemeasurable gradW L hL ρ_lim.extend h_int_ρ_lim charX charV hT.le - hflow_on_ρlim h_boundary_ρlim fβ‚€ (clampToIcc T s) (clampToIcc_mem hT.le s) - Β· intro s x - rw [h_rho_clamp s] - exact h_int_ρ_lim (clampToIcc T s) x - -/-- **Sub-helper for `_picard_fixedPointFlow`** β€” the Picard fixed-point -self-consistency equation. For `t ∈ Icc 0 T`, - -`ρ_lim.extend t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)`, - -proved by the triangle through the iterates `x n`: the marginal-vs-limit leg -tends to `0` by `h_tendsto`, the flow-pushforward leg is `≀ Dn n Β· q` by the -pointwise contraction `picardLimit_flow_pointwise_contraction` (with -`Dn n := (supW1On (Icc 0 T) (x n).ρ ρ_lim.ρ).toReal β†’ 0` from the -supW1On-Cauchy structure), and `picardLimit_fixed_point_eq` closes. The -contraction ratio `q` is threaded by its defining equation `hq_def` -(let-bound parent supplies `rfl`). -/ -private lemma picardLimit_self_consistency - {d : β„•} [NeZero d] - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (m : ℝ β†’ ℝ) (hMbar_nn : 0 ≀ m T) - (hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T) - (q : ℝ) (hq_nn : 0 ≀ q) (hq_lt : q < 1) - (hq_def : q = gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T) - (Dβ‚€ : ℝ) (hDβ‚€_nn : 0 ≀ Dβ‚€) - (x : β„• β†’ VlasovMeasureCurve d T m) - (charXs charVs : β„• β†’ ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_contract : βˆ€ k, supW1On (Set.Icc 0 T) (x k).ρ (x (k + 1)).ρ ≀ - ENNReal.ofReal (q ^ k * Dβ‚€)) - (h_flow : βˆ€ k, - IsCharacteristicFlowOn gradW (x k).extend (charXs k) (charVs k) - (Set.Ioo 0 T) Set.univ ∧ - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charXs k s z) (charVs k t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charVs k s z) - (-(convolveFunctionMeasure gradW ((x k).extend t) (charXs k t z))) - (Set.Icc 0 T) t) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, - (x (k + 1)).ρ t = Measure.map (fun z : PhaseSpace d => charXs k t z) fβ‚€)) - (ρ_lim : VlasovMeasureCurve d T m) - (h_tendsto : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Filter.Tendsto (fun n => wasserstein1 ((x n).ρ t) (ρ_lim.ρ t)) - Filter.atTop (nhds 0)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hflow_on_ρlim : IsCharacteristicFlowOn gradW ρ_lim.extend charX charV - (Set.Ioo 0 T) Set.univ) - (h_boundary_ρlim : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (ρ_lim.extend t) (charX t z))) - (Set.Icc 0 T) t) - (h_int_ρ_lim : βˆ€ t (x_pt : PhysSpace d), - Integrable (fun y => gradW (x_pt - y)) (ρ_lim.extend t)) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, - ρ_lim.extend t = - spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) := by - have he : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) s, s ∈ Set.Icc (0 : ℝ) T β†’ - Ξ½.extend s = Ξ½.ρ s := by - intro Ξ½ s hs - unfold VlasovMeasureCurve.extend clampToIcc; congr 1 - rw [min_eq_left hs.2, max_eq_right hs.1] - have hMm : βˆ€ (Ξ½ : VlasovMeasureCurve d T m), βˆ€ t ∈ Set.Icc (0 : ℝ) T, - ∫ y, β€–yβ€– βˆ‚(Ξ½.extend t) ≀ m T := - fun Ξ½ t _ => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le Ξ½ t) - (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t)) - have h_int_ext_gen : βˆ€ (Ξ½ : VlasovMeasureCurve d T m) (t : ℝ) (xp : PhysSpace d), - Integrable (fun y => gradW (xp - y)) (Ξ½.extend t) := fun Ξ½ t xp => - integrable_gradW_shift gradW L hL (Ξ½.extend t) - (VlasovMeasureCurve.extend_yIntegrable hT.le Ξ½ t) xp - have hCI := fun k => envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le (x k) - (m T) hMbar_nn (hMm (x k)) (charXs k) (charVs k) - (h_flow k).1 (h_flow k).2.1 (h_int_ext_gen (x k)) - have hCI_lim := envelopeStep_contractionInputs gradW L hL fβ‚€ hfβ‚€_int hT.le ρ_lim - (m T) hMbar_nn (hMm ρ_lim) charX charV hflow_on_ρlim h_boundary_ρlim h_int_ρ_lim - have h_marg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s) - = Measure.map (fun z => charX s z) fβ‚€ := by - intro s hs - have h_pair_meas := charFlow_measurable_via_gronwall gradW L hL ρ_lim.extend h_int_ρ_lim - charX charV T hT.le hCI_lim.2.2.2.1 hCI_lim.2.2.2.2.1 hCI_lim.2.2.2.2.2 s hs - unfold spatialMarginal vlasovSolutionViaPushforward - rw [Measure.map_map measurable_fst h_pair_meas] - rfl - have h_cauchy := picard_iterate_isCauchy_of_contraction - (Set.Icc (0 : ℝ) T) (fun n => (x n).ρ) q hq_nn hq_lt Dβ‚€ hDβ‚€_nn h_contract - have h_uniform := picard_iterate_limit_uniform_tendsto - (Set.Icc (0 : ℝ) T) (fun n => (x n).ρ) ρ_lim.ρ h_cauchy h_tendsto - have h_sup_ne_top : βˆ€ n, supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ β‰  ⊀ := - fun n => supW1On_ne_top_of_VlasovMeasureCurve (m T) hMbar_mono (x n) ρ_lim - have h_sup_tendsto : Filter.Tendsto - (fun n => supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ) Filter.atTop (nhds 0) := by - rw [ENNReal.tendsto_atTop_zero] - intro Ξ΅ hΞ΅ - obtain ⟨N, hN⟩ := h_uniform Ξ΅ hΞ΅ - refine ⟨N, fun n hn => ?_⟩ - unfold supW1On - exact iSup_le fun s => iSup_le fun hs => hN n hn s hs - set Dn : β„• β†’ ℝ := fun n => (supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ).toReal with hDn_def - have hDn_nn : βˆ€ n, 0 ≀ Dn n := fun n => ENNReal.toReal_nonneg - have hDn_tendsto : Filter.Tendsto Dn Filter.atTop (nhds 0) := by - have h := (ENNReal.tendsto_toReal (show (0:ENNReal) β‰  ⊀ by simp)).comp h_sup_tendsto - rw [ENNReal.toReal_zero] at h - exact h - have h_W1_fin_curve : βˆ€ n, βˆ€ s ∈ Set.Icc (0 : ℝ) T, - wasserstein1 ((x n).extend s) (ρ_lim.extend s) β‰  ⊀ := by - intro n s hs - rw [he (x n) s hs, he ρ_lim s hs] - have := (x n).isProb s; have := ρ_lim.isProb s - exact wasserstein1_ne_top_of_finite_moment _ _ - ((x n).yIntegrable s hs) (ρ_lim.yIntegrable s hs) - have h_W1_bound_curve : βˆ€ n, βˆ€ s ∈ Set.Icc (0 : ℝ) T, - (wasserstein1 ((x n).extend s) (ρ_lim.extend s)).toReal ≀ Dn n := by - intro n s hs - rw [he (x n) s hs, he ρ_lim s hs] - exact ENNReal.toReal_mono (h_sup_ne_top n) - (wasserstein1_le_supW1On (Set.Icc 0 T) (x n).ρ ρ_lim.ρ s hs) - have h_term2 : βˆ€ n t, t ∈ Set.Icc (0 : ℝ) T β†’ - (wasserstein1 (Measure.map (fun z => charXs n t z) fβ‚€) - (Measure.map (fun z => charX t z) fβ‚€)).toReal ≀ Dn n * q := - fun n t ht => picardLimit_flow_pointwise_contraction gradW L hL fβ‚€ hfβ‚€_int hT - m hMbar_nn hMbar_mono (x n) ρ_lim (charXs n) (charVs n) charX charV - (h_flow n).1 (h_flow n).2.1 hflow_on_ρlim h_boundary_ρlim - (Dn n) (hDn_nn n) (h_W1_fin_curve n) (h_W1_bound_curve n) q hq_def t ht - intro t ht - rw [he ρ_lim t ht, h_marg t ht] - exact picardLimit_fixed_point_eq fβ‚€ m x ρ_lim charXs charX - (fun n t' ht' => (h_flow n).2.2 t' ht') h_tendsto - (fun n t' ht' => (hCI n).1 t' ht') (fun t' ht' => hCI_lim.1 t' ht') - (fun n t' ht' => (hCI n).2.2.1 t' ht') (fun t' ht' => hCI_lim.2.2.1 t' ht') - Dn q (by simpa using hDn_tendsto.mul_const q) h_term2 t ht - -/-- **Sub-helper for `vlasovWellPosedness_local`** β€” the Picard fixed-point -self-consistent flow. - -Given `fβ‚€ : Measure (PhaseSpace d)` with finite first moment, produces a -characteristic flow `(charX, charV)` whose **own pushforward's spatial -marginal** is the reference measure the flow is built against β€” i.e., the -Picard fixed point at the spatial-marginal-curve level: - - `ρ_t := spatialMarginal (Measure.map (z ↦ (charX t z, charV t z)) fβ‚€)` - `charX, charV solve the Vlasov ODE against this ρ`. - -The body carries the substantive Picard analysis: - -* M-fixed-point: pick a moment bound `M β‰₯ A/(1 - B)` where - `A = gronwallBound 1 (1+L) β€–gradW 0β€– T Β· (M_fβ‚€ + 1)` and - `B = L Β· (exp((1+L)Β·T) - 1)/(1+L) Β· (M_fβ‚€ + 1)`. Requires `B < 1`, - which is the genuine convergence criterion for the moment iteration - (stronger than the contraction predicate `LocalSmallnessContraction - L T` alone for large `M_fβ‚€` β€” the contraction predicate gates the q - factor; the M-fixed-point additionally requires the moment iteration - to converge). -* Picard sequence `x_n : β„• β†’ VlasovMeasureCurve d T M` starting from - `x_0 := constantCurve (spatialMarginal fβ‚€)` and `x_{n+1} := Phi_step(x_n)`. -* Contraction via `Phi_supW1_contraction`: `supW1On (Φρ) (Φσ) ≀ q Β· D` - with `q < 1`. Apply `picard_iterate_isCauchy_of_contraction` + - `picard_iterate_exists_limit` to get the W₁-limit - `ρ_lim : VlasovMeasureCurve d T M`. -* Self-consistency `Ξ¦(ρ_lim) = ρ_lim`: triangle through `x_n`. -* Apply `exists_vlasov_characteristicFlow_global_smallT` to `ρ_lim.extend` - to get the flow. - -**Metric-dependence note**. The convergence rests on two independent -predicates: -* `LocalSmallnessContraction L T := L Β· (exp((max 1 L)Β·T) - 1) / (max 1 L) < 1` - β€” exponential in T, from `Phi_supW1_contraction`'s W₁-based shape. -* `LocalSmallnessPLBuffer L T := L Β· TΒ² < 1` β€” quadratic, from - per-ball Picard-LindelΓΆf's ball geometry. - -These are genuinely independent (neither universally implies the other), so -each predicate matches its own sub-argument. - -Under the Wbar refactor (Dobrushin 1979, Β§5), both constraints become -linear-in-T and align: `LocalSmallnessContraction` reduces to -`Cβ‚‚(L)Β·T < 1`, and the single algebraic constraint then suffices and is -satisfiable for any `L > 0` by taking `T < 1/Cβ‚‚(L)`. - -**Output bundle** (designed to feed -`vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn` directly): - -* Flow `(charX, charV)` against the *spatial marginal of the pushforward* - β€” the load-bearing self-consistency conjunct. -* Boundary regularity. -* Uniform moment bound `M_ρ` on the spatial marginal trajectory. -/ -theorem vlasovWellPosedness_local_picard_fixedPointFlow - {d : β„•} [NeZero d] - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (hTL_PL : LocalSmallnessPLBuffer L T) - (hTL_con : LocalSmallnessContraction L T) - (hB : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T) - 1) < 1) : - βˆƒ (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (M_ρ : ℝ), 0 ≀ M_ρ ∧ - -- Self-consistent characteristic flow: against the spatial marginal - -- of its own phase-space pushforward. - IsCharacteristicFlowOn gradW - (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - charX charV (Set.Ioo 0 T) Set.univ ∧ - -- Boundary regularity: HasDerivWithinAt on `Icc 0 T` for every z and - -- t ∈ Icc 0 T. - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - (charX t z))) - (Set.Icc 0 T) t) ∧ - -- Uniform first-moment bound on the spatial-marginal trajectory. - (βˆ€ s ∈ Set.Icc (0 : ℝ) T, - ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) ≀ M_ρ) ∧ - -- First-moment integrability on the spatial-marginal trajectory. - (βˆ€ s ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) ∧ - -- Continuity of the convolution force in `x` (uniformly in `s`). - (βˆ€ s, Continuous (fun x => - convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) x)) ∧ - -- **AEMeasurable witness**, projected from the Picard fixed-point - -- construction's continuity-in-z β€” supplies the `h_aemeas` conjunct - -- in downstream `_finalAssembly_*`. - (βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) ∧ - -- **Universal-in-s convolution integrability**. For `s ∈ Icc 0 T` - -- follows from `h_y_int_ρ` + Lipschitz of `gradW`; the extension to - -- all `s` uses constant-extension (clamp) past T inside the Picard - -- construction. Supplies the `h_int_conv` conjunct in downstream - -- `_finalAssembly_*`. - (βˆ€ s (x : PhysSpace d), - Integrable (fun y => gradW (x - y)) - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) := by - -- ============================================================ - -- Step 1: Spatial marginal setup. - -- ΞΌβ‚€ := spatialMarginal fβ‚€ = Measure.map Prod.fst fβ‚€. - -- IsProbabilityMeasure ΞΌβ‚€ via Measure.isProbabilityMeasure_map. - -- Integrable β€–Β·β€– ΞΌβ‚€ from hfβ‚€_int via integral_map on Prod.fst. - -- ============================================================ - have hΞΌβ‚€_prob : IsProbabilityMeasure (spatialMarginal fβ‚€) := - (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - have hΞΌβ‚€_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal fβ‚€) := by - unfold spatialMarginal - rw [integrable_map_measure - (Continuous.aestronglyMeasurable continuous_norm) measurable_fst.aemeasurable] - -- Need: Integrable (β€–Β·β€– ∘ Prod.fst) fβ‚€ = Integrable (fun z => β€–z.1β€–) fβ‚€. - -- This follows from hfβ‚€_int (Integrable β€–Β·β€– fβ‚€) and β€–z.1β€– ≀ β€–zβ€–. - refine hfβ‚€_int.mono' ?_ (Filter.Eventually.of_forall fun z => ?_) - Β· exact (measurable_fst.norm.aestronglyMeasurable) - Β· simp only [Function.comp_def, Real.norm_of_nonneg (norm_nonneg _)] - exact (norm_fst_le z) - -- **F1 (phase-space anchor)**: `M_fβ‚€` is the *phase-space* first moment - -- `∫zβ€–zβ€–βˆ‚fβ‚€`, NOT the spatial marginal β€” matching `phi_moment_envelope_le`'s - -- (A.2) `integral_map` initial value, so the envelope dominates both the - -- pushforward moments (A.2) and the spatial base case (`βˆ«β€–xβ€–βˆ‚ΞΌβ‚€ ≀ M_fβ‚€`). - let M_fβ‚€ : ℝ := ∫ z : PhaseSpace d, β€–zβ€– βˆ‚fβ‚€ - have hM_fβ‚€_nn : 0 ≀ M_fβ‚€ := integral_nonneg (fun z => norm_nonneg z) - -- ============================================================ - -- Step 2: time-dependent moment envelope `m` (option 2, dissolving the - -- constant-`M` fixed-point). `gronwall_envelope_exists` (Piece A.3) under - -- `hB := B(T) < 1` yields a monotone `m` that is `Ξ¦`-invariant at the moment - -- level, so `Ξ¦ : space(m) β†’ space(m)` and the Picard sequence stays in one - -- fixed curve space. - -- ============================================================ - obtain ⟨m, hm_mono, hm_ge, hm_inv⟩ := - gronwall_envelope_exists M_fβ‚€ β€–gradW 0β€– hM_fβ‚€_nn (norm_nonneg _) L T hT.le hB - have hm_nn : βˆ€ t ∈ Set.Icc (0 : ℝ) T, 0 ≀ m t := - fun t ht => le_trans hM_fβ‚€_nn (hm_ge t ht) - have hMbar_nn : 0 ≀ m T := hm_nn T ⟨hT.le, le_refl T⟩ - have hMbar_mono : βˆ€ t ∈ Set.Icc (0 : ℝ) T, m t ≀ m T := - fun t ht => hm_mono ht ⟨hT.le, le_refl T⟩ ht.2 - -- ============================================================ - -- Step 3: Convolution integrability for constantCurve. - -- For the base case x 0 = constantCurve ΞΌβ‚€, need h_int_ext: - -- βˆ€ t (x : PhysSpace d), Integrable (fun y => gradW (x - y)) ((constantCurve ΞΌβ‚€).extend t). - -- This reduces to: Integrable (fun y => gradW (x - y)) ΞΌβ‚€, which follows - -- from hΞΌβ‚€_int + Lipschitz bound on gradW. - -- Integrability of gradW against ΞΌβ‚€. - -- ============================================================ - have h_int_gradW_ΞΌβ‚€ : βˆ€ (x_pt : PhysSpace d), - Integrable (fun y => gradW (x_pt - y)) (spatialMarginal fβ‚€) := - fun x_pt => integrable_gradW_shift gradW L hL (spatialMarginal fβ‚€) hΞΌβ‚€_int x_pt - -- ============================================================ - -- Step 4: Picard sequence + contraction bound. - -- The sequence x : β„• β†’ VlasovMeasureCurve d T M is built by Phi_step + - -- induction; the contraction estimate uses Phi_supW1_contraction applied - -- to consecutive iterates. - -- ============================================================ - -- `q` is the M-INDEPENDENT genuine contraction ratio (not 2MΒ·q_true). - -- `Phi_supW1_contraction` outputs `q Β· D` per step, so `q^k Β· Dβ‚€ = - -- q^k Β· (2M)` is the iterated contraction bound; the contraction factor - -- `q = gronwallBound 0 (max 1 L) L T = (L/(max 1 L)) Β· (exp((max 1 L)Β·T) - 1)` - -- is separated from the W₁-input bound `Dβ‚€ = 2M`. `hq_lt` closes by direct - -- citation of `hTL_con` (LocalSmallnessContraction) after one unfold. - let q : ℝ := gronwallBound 0 ((max 1 L : NNReal) : ℝ) (L : ℝ) T - have hq_nn : 0 ≀ q := by - have hK_nn : (0 : ℝ) ≀ ((max 1 L : NNReal) : ℝ) := NNReal.coe_nonneg _ - have hΞ΅_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg - have := gronwallBound_mono (Ξ΄ := (0 : ℝ)) (K := ((max 1 L : NNReal) : ℝ)) - (Ξ΅ := (L : ℝ)) (le_refl 0) hΞ΅_nn hK_nn hT.le - rw [gronwallBound_x0] at this; exact this - -- Direct citation: `LocalSmallnessContraction L T` IS `q < 1` after - -- unfolding both definitions. No local derivation; the named-lemma - -- pattern from the soundness-fix mechanism. - have hq_lt : q < 1 := hTL_con.gronwallBound_lt_one - -- Dβ‚€: initial supW1On bound = supW1On (x 0).ρ (x 1).ρ ≀ 2 * M. - let Dβ‚€ : ℝ := 2 * (m T) - have hDβ‚€_nn : 0 ≀ Dβ‚€ := by linarith [hMbar_nn] - -- Picard sequence + contraction, in the fixed envelope space `m`. The - -- recursion uses `Phi_step_envelope` per step + `Phi_supW1_contraction` - -- for the geometric bound. - -- **Enriched existential**: the Picard sequence exposes, per - -- step `k`, the flow `(charXs k, charVs k)` against `(x k).extend` β€” exactly - -- `Phi_step_envelope`'s output shape β€” plus the pushforward identity - -- `(x(k+1)).ρ t = map (charXs k t) fβ‚€`. Exposing the flows lets the - -- self-consistency proof (Step 8) feed them directly to `Phi_supW1_contraction`, - -- dissolving the (un-banked) ODE-uniqueness that re-deriving them would need. - have hΞΌβ‚€_int_fst : Integrable (fun z : PhaseSpace d => β€–z.1β€–) fβ‚€ := - hfβ‚€_int.mono' measurable_fst.norm.aestronglyMeasurable - (Filter.Eventually.of_forall fun z => by - rw [Real.norm_of_nonneg (norm_nonneg _)]; exact norm_fst_le z) - have hΞΌβ‚€_le_m : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - ∫ y, β€–yβ€– βˆ‚(spatialMarginal fβ‚€) ≀ m t := by - intro t ht - have h_eq : ∫ y, β€–yβ€– βˆ‚(spatialMarginal fβ‚€) = ∫ z, β€–z.1β€– βˆ‚fβ‚€ := by - unfold spatialMarginal - rw [integral_map measurable_fst.aemeasurable continuous_norm.aestronglyMeasurable] - have h_le : ∫ z, β€–z.1β€– βˆ‚fβ‚€ ≀ M_fβ‚€ := - integral_mono hΞΌβ‚€_int_fst hfβ‚€_int (fun z => norm_fst_le z) - rw [h_eq]; exact le_trans h_le (hm_ge t ht) - obtain ⟨x, charXs, charVs, h_contract, h_flow⟩ := - vlasovWellPosedness_local_picard_sequence W gradW hgradW L hL fβ‚€ hfβ‚€_int hT hTL_PL - m hm_mono hm_nn hm_inv hMbar_nn hMbar_mono hΞΌβ‚€_prob hΞΌβ‚€_int hΞΌβ‚€_le_m - q hq_nn rfl Dβ‚€ hDβ‚€_nn rfl - -- ============================================================ - -- Step 5: Extract limit ρ_lim via picard_iterate_exists_limit. - -- ============================================================ - obtain ⟨ρ_lim, h_tendsto⟩ := - picard_iterate_exists_limit x q hq_nn hq_lt Dβ‚€ hDβ‚€_nn h_contract - -- ============================================================ - -- Step 6: Convolution integrability for ρ_lim.extend. - -- Needed by exists_vlasov_characteristicFlow_global_smallT. - -- Integrability of gradW against ρ_lim.extend t. - -- ============================================================ - have h_int_ρ_lim : βˆ€ t (x_pt : PhysSpace d), - Integrable (fun y => gradW (x_pt - y)) (ρ_lim.extend t) := fun t x_pt => - integrable_gradW_shift gradW L hL (ρ_lim.extend t) - (VlasovMeasureCurve.extend_yIntegrable hT.le ρ_lim t) x_pt - -- Convolution continuity for ρ_lim.extend, universal in t. - -- Deduced from ρ_lim.extend_convCont + h_int_ρ_lim restricted to Icc 0 T. - have h_conv_cont_ρ_lim : βˆ€ x : PhysSpace d, - Continuous (fun t => convolveFunctionMeasure gradW (ρ_lim.extend t) x) := by - intro x_pt - have h_int_Icc : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y => gradW (x_pt - y)) (ρ_lim.ρ t) := by - intro t ht - have h_eq : ρ_lim.extend t = ρ_lim.ρ t := by - unfold VlasovMeasureCurve.extend clampToIcc - congr 1 - rw [min_eq_left ht.2, max_eq_right ht.1] - rw [← h_eq]; exact h_int_ρ_lim t x_pt - exact VlasovMeasureCurve.extend_convCont gradW L hL hT.le ρ_lim x_pt h_int_Icc - -- ============================================================ - -- Step 7: Flow construction via exists_vlasov_characteristicFlow_global_smallT. - -- Build (charX, charV) against ρ_lim.extend. - -- ============================================================ - obtain ⟨charX, charV, hflow_on_ρlim, h_boundary_ρlim⟩ := - exists_vlasov_characteristicFlow_global_smallT W gradW hgradW L hL - ρ_lim.extend h_int_ρ_lim h_conv_cont_ρ_lim - (fun t => VlasovMeasureCurve.extend_yIntegrable hT.le ρ_lim t) - (m T) hMbar_nn - (fun t => le_trans (VlasovMeasureCurve.extend_hasMoment hT.le ρ_lim t) - (hMbar_mono (clampToIcc T t) (clampToIcc_mem hT.le t))) - T hT.le hTL_PL - -- ============================================================ - -- Step 8: Self-consistency. For t ∈ Icc 0 T, - -- ρ_lim.ρ t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t). - -- This is the Picard fixed-point equation: Phi charX fβ‚€ t = ρ_lim.ρ t, - -- proved by triangle through x n using contraction + tendsto. - -- ============================================================ - -- ============================================================ - -- Self-consistency on Icc 0 T. - -- For t ∈ Icc 0 T: - -- ρ_lim.extend t = ρ_lim.ρ t (by clampToIcc identity on Icc) - -- ρ_lim.ρ t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) - -- The second equality is the Picard fixed-point equation, proved by triangle - -- through x n using contraction + tendsto. - -- ============================================================ - have h_self_consist : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - ρ_lim.extend t = - spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) := - -- Step 8 extracted as `picardLimit_self_consistency`; the let-bound `q`'s - -- defining equation is supplied by `rfl`. - picardLimit_self_consistency gradW L hL fβ‚€ hfβ‚€_int hT m hMbar_nn hMbar_mono - q hq_nn hq_lt rfl Dβ‚€ hDβ‚€_nn x charXs charVs h_contract h_flow - ρ_lim h_tendsto charX charV hflow_on_ρlim h_boundary_ρlim h_int_ρ_lim - -- ============================================================ - -- Step 9: Bundle with a CLAMPED flow `cX s := charX (clampToIcc T s)`. - -- - -- The raw flow from `exists_vlasov_characteristicFlow_global_smallT` is - -- controlled only on `[0, T]`; off-window it is uncontrolled - -- `Classical.choose` data with no growth bound. The conclusion's - -- universal-in-`s` conjuncts (convolution integrability + continuity-in-x - -- for ALL `s`) therefore cannot hold for the raw flow. We return instead - -- the clamped flow, whose pushforward at any `s` equals the on-window - -- pushforward at `clampToIcc T s ∈ [0, T]` β€” hence globally controlled. - -- On `[0, T]` the clamp is the identity (`clampToIcc T s = s`), so every - -- window conjunct (flow ODE on Ioo, boundary on Icc, moment, integrability) - -- transfers from the raw flow via `clampToIcc`-congruence. - -- ============================================================ - exact picardFlow_clamp_bundle gradW L hL fβ‚€ hT m hMbar_nn hMbar_mono ρ_lim - charX charV hflow_on_ρlim h_boundary_ρlim h_int_ρ_lim h_self_consist - -/-- **Sub-helper for `vlasovWellPosedness_local`** β€” moment-bound transport. - -Given the Picard fixed-point flow's bundle (from -`_picard_fixedPointFlow`), produces `HasFiniteFirstMoment (f t)` for -`t ∈ Icc 0 T`, where `f := vlasovSolutionViaPushforward charX charV fβ‚€`. - -**Proof strategy**: - -1. Boundary transport: extract `h_init / h_cont_Icc / h_deriv_Ico` from - `hflow_on + h_boundary` via `characteristicFlow_boundary_regularity`. -2. `flow_distance_growth_bound_on` applied to `(charX, charV)` produces - the growth constant `C_T` with `β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1)`. -3. Probability of `f t = Measure.map (z ↦ (charX t z, charV t z)) fβ‚€` from - the AEMeasurable witness. -4. Integrable `β€–Β·β€–` on `f t`: via `integrable_map_measure` + growth bound + - `Integrable β€–Β·β€– fβ‚€`. - -Factored out to keep `vlasovWellPosedness_local`'s body a clean glue. -/ -theorem vlasovWellPosedness_local_moment - {d : β„•} - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (_hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (_hTL_PL : LocalSmallnessPLBuffer L T) - (_hTL_con : LocalSmallnessContraction L T) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) - (hflow_on : IsCharacteristicFlowOn gradW - (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - charX charV (Set.Ioo 0 T) Set.univ) - (h_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - (charX t z))) - (Set.Icc 0 T) t) - (hM_ρ_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) ≀ M_ρ) - (h_y_int_ρ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) - (_hconv_cont : βˆ€ s, Continuous (fun x => - convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) x)) - -- Passed from `_picard_fixedPointFlow`'s enriched output: the - -- AEMeasurable witness + universal-in-s convolution integrability. - (h_aemeas : βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) - (h_int_conv : βˆ€ s (x : PhysSpace d), - Integrable (fun y => gradW (x - y)) - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) - (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) T) : - HasFiniteFirstMoment (vlasovSolutionViaPushforward charX charV fβ‚€ t) := by - -- IsProbabilityMeasure for the spatial marginal (needed for the flow typeclass). - -- spatialMarginal ΞΌ = Measure.map Prod.fst ΞΌ, so IsProbabilityMeasure_map needs - -- AEMeasurable Prod.fst (Measure.map ... fβ‚€). Since Prod.fst is measurable, - -- it is AEMeasurable wrt any measure. - have hρ_prob : βˆ€ s, IsProbabilityMeasure - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) := by - intro s - unfold spatialMarginal vlasovSolutionViaPushforward - -- Need IsProbabilityMeasure (Measure.map Prod.fst (Measure.map (fun z => ...) fβ‚€)) - -- Use Measure.map_map to compose, then isProbabilityMeasure_map_iff on the composition. - have h_aemeas_pair : AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€ := - h_aemeas s - have h_prob_inner : IsProbabilityMeasure - (Measure.map (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) := - (Measure.isProbabilityMeasure_map_iff h_aemeas_pair).mpr inferInstance - exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - -- Step 1: Extract h_init, h_cont_Icc, h_deriv_Ico via boundary transport. - obtain ⟨h_init, h_cont_Icc, h_deriv_Ico⟩ := - characteristicFlow_boundary_regularity gradW - (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - charX charV T hT.le hflow_on h_boundary - -- Step 2: Growth bound from flow_distance_growth_bound_on. - obtain ⟨C_T, hC_T_nn, h_growth⟩ := - flow_distance_growth_bound_on gradW L hL - (fun s => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) - charX charV T hT.le - h_init h_cont_Icc h_deriv_Ico - M_ρ hM_ρ_nn hM_ρ_bound h_y_int_ρ h_int_conv - -- Step 3: Conclude HasFiniteFirstMoment. - unfold HasFiniteFirstMoment vlasovSolutionViaPushforward - refine ⟨(Measure.isProbabilityMeasure_map_iff (h_aemeas t)).mpr inferInstance, ?_⟩ - -- Integrable β€–Β·β€– wrt Measure.map (fun z => (charX t z, charV t z)) fβ‚€. - rw [integrable_map_measure - (Continuous.aestronglyMeasurable continuous_norm) (h_aemeas t)] - -- Now need: Integrable (fun z : PhaseSpace d => β€–(charX t z, charV t z)β€–) fβ‚€. - have h_dom_int : Integrable (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) fβ‚€ := by - have h1 : Integrable (fun z : PhaseSpace d => C_T * β€–zβ€–) fβ‚€ := - hfβ‚€_int.const_mul C_T - have h2 : Integrable (fun _ : PhaseSpace d => C_T) fβ‚€ := integrable_const _ - have h_eq : (fun z : PhaseSpace d => C_T * (β€–zβ€– + 1)) = - fun z => C_T * β€–zβ€– + C_T := by funext z; ring - rw [h_eq]; exact h1.add h2 - -- The goal after rw is: Integrable (β€–Β·β€– ∘ fun z => (charX t z, charV t z)) fβ‚€ - -- = Integrable (fun z => β€–(charX t z, charV t z)β€–) fβ‚€. - -- Dominator: C_T * (β€–zβ€– + 1); AE bound from h_growth. - have h_norm_aesm : AEStronglyMeasurable - (fun z : PhaseSpace d => β€–(charX t z, charV t z)β€–) fβ‚€ := - (h_aemeas t).norm.aestronglyMeasurable - refine h_dom_int.mono' ?_ (Filter.Eventually.of_forall fun z => ?_) - Β· -- AEStronglyMeasurable of β€–Β·β€– ∘ (charX t, charV t). - -- After integrable_map_measure rewrite, goal is for the composition form. - convert h_norm_aesm using 1 - rfl - Β· -- Pointwise bound: β€–(charX t z, charV t z)β€– ≀ C_T * (β€–zβ€– + 1). - -- The norm in the goal is β€–(β€–Β·β€– ∘ ...)(z)β€– = β€–β€–(charX t z, charV t z)β€–β€–. - simp only [Function.comp_def, Real.norm_of_nonneg (norm_nonneg _)] - exact h_growth t ht z - -/-- **Sub-helper for `vlasovWellPosedness_local`** β€” IsLagrangianVlasovSolutionOn -threading. - -Given the Picard fixed-point flow's bundle (from -`_picard_fixedPointFlow`), produces the -`IsLagrangianVlasovSolutionOn gradW f T` conjunct via the 20-hypothesis -threading through -`vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. - -**Proof strategy**: - -1. Boundary transport: extract `h_init / h_cont_Icc / h_deriv_Ico`. -2. Universal-in-`s` convolution integrability (handling `s` outside - `[0, T]` via the clamp-extension argument). -3. AEMeasurable witness. -4. `IsCharacteristicFlowSelfConsistent`: `βˆ€ t, ρ_lim t = Ξ¦ charX fβ‚€ t`, - which expands by definition since `ρ_lim = spatialMarginal ∘ f` and - `f = vlasovSolutionViaPushforward charX charV fβ‚€`; spatial marginal - of pushforward = pushforward under `Prod.fst ∘ ...` = `Ξ¦ charX fβ‚€`. - The composition is the `Measure.map_map`-with-AEMeasurable bridge. -5. Continuity of `gradW`: `hL.continuous`. -6. Probability instance of `spatialMarginal ∘ f`: derived from - AEMeasurable + IsProbabilityMeasure fβ‚€. -7. Final invocation: `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn` - with the full hypothesis bundle. - -Factored out to keep `vlasovWellPosedness_local`'s body a clean glue. -/ -theorem vlasovWellPosedness_local_isLagrangian - {d : β„•} - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (_hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (_hTL_PL : LocalSmallnessPLBuffer L T) - (_hTL_con : LocalSmallnessContraction L T) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (M_ρ : ℝ) (hM_ρ_nn : 0 ≀ M_ρ) - (hflow_on : IsCharacteristicFlowOn gradW - (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - charX charV (Set.Ioo 0 T) Set.univ) - (h_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - (charX t z))) - (Set.Icc 0 T) t) - (hM_ρ_bound : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - ∫ y, β€–yβ€– βˆ‚(spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) ≀ M_ρ) - (h_y_int_ρ : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) - (hconv_cont : βˆ€ s, Continuous (fun x => - convolveFunctionMeasure gradW - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) x)) - -- Passed from `_picard_fixedPointFlow`'s enriched output: the - -- AEMeasurable witness + universal-in-s convolution integrability. - (h_aemeas : βˆ€ s, AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) - (h_int_conv : βˆ€ s (x : PhysSpace d), - Integrable (fun y => gradW (x - y)) - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s))) : - IsLagrangianVlasovSolutionOn gradW - (vlasovSolutionViaPushforward charX charV fβ‚€) T := by - -- IsProbabilityMeasure for the spatial marginal (needed for the target typeclass). - have hρ_prob : βˆ€ s, IsProbabilityMeasure - (spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ s)) := by - intro s - unfold spatialMarginal vlasovSolutionViaPushforward - have h_aemeas_pair : AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€ := - h_aemeas s - have _h_prob_inner : IsProbabilityMeasure - (Measure.map (fun z : PhaseSpace d => (charX s z, charV s z)) fβ‚€) := - (Measure.isProbabilityMeasure_map_iff h_aemeas_pair).mpr inferInstance - exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - -- Step 1: Extract h_init, h_cont_Icc, h_deriv_Ico via boundary transport. - obtain ⟨h_init, h_cont_Icc, h_deriv_Ico⟩ := - characteristicFlow_boundary_regularity gradW - (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) - charX charV T hT.le hflow_on h_boundary - -- Step 2: IsCharacteristicFlowSelfConsistent - -- ρ t = spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t) - -- = Measure.map Prod.fst (Measure.map (fun z => (charX t z, charV t z)) fβ‚€) - -- = Measure.map (Prod.fst ∘ fun z => (charX t z, charV t z)) fβ‚€ - -- [by map_map_of_aemeasurable] - -- = Measure.map (charX t) fβ‚€ - have hself : IsCharacteristicFlowSelfConsistent charX fβ‚€ - (fun t => spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ t)) := by - intro t - simp only [] - unfold spatialMarginal vlasovSolutionViaPushforward - -- Goal: Measure.map Prod.fst (Measure.map (fun z => (charX t z, charV t z)) fβ‚€) - -- = Measure.map (fun z => charX t z) fβ‚€ - have h_comp : Measure.map Prod.fst - (Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) fβ‚€) = - Measure.map (Prod.fst ∘ fun z : PhaseSpace d => (charX t z, charV t z)) fβ‚€ := by - apply AEMeasurable.map_map_of_aemeasurable - Β· exact measurable_fst.aemeasurable - Β· exact h_aemeas t - rw [h_comp]; congr 1 - -- Step 3: Apply the main threading theorem. - exact vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn - gradW L hL charX charV fβ‚€ hfβ‚€_int hT - hflow_on h_init h_cont_Icc h_deriv_Ico - M_ρ hM_ρ_nn hM_ρ_bound h_y_int_ρ h_int_conv - hself h_aemeas hL.continuous hconv_cont - -/-- **Local existence of a Vlasov solution on `[0, T]`.** - -Under the joint constraint `LocalSmallnessPLBuffer L T` (`L Β· TΒ² < 1`) + -`LocalSmallnessContraction L T`, produces a local-time Vlasov solution -`f : ℝ β†’ Measure (PhaseSpace d)` on `[0, T]` satisfying initial -condition + local finite first moment + `IsLagrangianVlasovSolutionOn`. - -The forward-iteration continuation extends from local `T` to arbitrary -`T_target` via **fixed-`T_0`** iteration: the contraction time `T_0` -depends only on `L` (not on the moment bound `M_n` propagating through -iterations), because `Phi_supW1_contraction`'s `q` is -`gronwallBound 0 (max 1 L) (L Β· D) T` β€” independent of `M_n`. So the -continuation iterates `[0, T_0], [T_0, 2 T_0], …` with constant step `T_0`, -reaching any `T_target` in `⌈T_target / T_0βŒ‰` windows; gluing then bridges -from `IsLagrangianVlasovSolutionOn` (local) to `IsLagrangianVlasovSolution` -(global). - -**Proof strategy**: - -1. Initial spatial marginal: `ΞΌβ‚€ := spatialMarginal fβ‚€`. By - `HasFiniteFirstMoment fβ‚€`, `ΞΌβ‚€` is a probability measure with - `Integrable β€–Β·β€–`. Let `M_fβ‚€ := ∫ β€–zβ€– βˆ‚fβ‚€` (finite by - `hfβ‚€.2.integral_norm_le`). - -2. Picard sequence on spatial marginals: - - `ρ_0 := constantCurve ΞΌβ‚€`. - - `ρ_{n+1}` obtained via `Phi_step` applied to `ρ_n`'s flow. - - Each `ρ_n` lives in `VlasovMeasureCurve d T M` for an appropriate - `M` chosen so that the growth bound from - `flow_distance_growth_bound_on` stays within `M` across iterations - (the M-preservation constraint). - -3. Contraction estimate via `Phi_supW1_contraction`: - `supW1On (ρ_n.ρ) (ρ_{n+1}.ρ) ≀ ENNReal.ofReal (q^n * Dβ‚€)` - for `q := gronwallBound 0 (max 1 L) (L Β· D) T < 1` (since `T` is - small enough per the joint constraint). - -4. Apply `picard_iterate_isCauchy_of_contraction` to get the ENNReal-form - Cauchy condition on the `supW1On` pseudodistance. - -5. Apply `picard_iterate_exists_limit` to extract the - limit `ρ_lim : VlasovMeasureCurve d T M` plus pointwise W₁-tendsto. - -6. Self-consistency `Ξ¦(ρ_lim) = ρ_lim`: triangle through `ρ_n` using - the uniform-tendsto helper, contraction, and pointwise tendsto. - -7. Apply `exists_vlasov_characteristicFlow_global_smallT` - to `ρ_lim.extend` to get the characteristic flow `(charX, charV)` - against the self-consistent limit. - -8. Define `f := vlasovSolutionViaPushforward charX charV fβ‚€`. Verify: - - `f 0 = fβ‚€` (from `IsCharacteristicFlowOn`'s initial-condition - clause + `Measure.map_id`). - - `HasFiniteFirstMoment (f t)` on `[0, T]` (from - `flow_distance_growth_bound_on` applied to `(charX, charV)` + - `hfβ‚€.2`). - - `IsLagrangianVlasovSolutionOn gradW f T` via - `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. - -The body invokes `vlasovWellPosedness_local_picard_fixedPointFlow` for the -Picard fixed-point flow, then `vlasovWellPosedness_local_finalAssembly_*` -for the moment and Lagrangian conjuncts, deriving `f 0 = fβ‚€` inline. -/ -theorem vlasovWellPosedness_local - {d : β„•} [NeZero d] - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) - (hfβ‚€ : HasFiniteFirstMoment fβ‚€) - {T : ℝ} (hT : 0 < T) - (hTL_PL : LocalSmallnessPLBuffer L T) - (hTL_con : LocalSmallnessContraction L T) - (hB : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T) - 1) < 1) : - βˆƒ (f : ℝ β†’ Measure (PhaseSpace d)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), - f 0 = fβ‚€ ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f t)) ∧ - -- FLAT (window-constant) uniform first-moment bound on the spatial marginal. - (βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M) ∧ - IsLagrangianVlasovSolutionOn gradW f T ∧ - -- Explicit flow bundle: pushforward, AEMeasurable, and boundary derivatives. - -- These use the SAME charX charV as the outer βˆƒ (not the hidden witnesses - -- inside IsLagrangianVlasovSolutionOn), enabling downstream consumers to - -- use them without witness-identity issues. - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f t = Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) (f 0)) ∧ - (βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) (f 0)) ∧ - (βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f t)) (charX t z))) - (Set.Icc 0 T) t) ∧ - -- Initial condition for the outer charX charV (same witnesses as boundary bundle above). - (βˆ€ z : PhaseSpace d, charX 0 z = z.1 ∧ charV 0 z = z.2) := by - -- The body is decomposed into two sub-helpers plus an inline glue: - -- * `vlasovWellPosedness_local_picard_fixedPointFlow` carries the Picard - -- mathematics β€” spatial-marginal setup, the Picard sequence via - -- `Phi_step`, the contraction estimate via `Phi_supW1_contraction`, - -- the limit via `picard_iterate_exists_limit`, - -- self-consistency `Ξ¦(ρ_lim) = ρ_lim`, and the flow construction via - -- `exists_vlasov_characteristicFlow_global_smallT`. - -- * `vlasovWellPosedness_local_finalAssembly_*` thread the moment and - -- `IsLagrangianVlasovSolutionOn` conjuncts through - -- `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. - -- * This body invokes both, derives `f 0 = fβ‚€` inline, and assembles. - obtain ⟨hfβ‚€_prob, hfβ‚€_int⟩ := hfβ‚€ - have : IsProbabilityMeasure fβ‚€ := hfβ‚€_prob - -- Sub-helper invocation: produces the self-consistent flow + regularity - -- + AEMeasurable witness + universal-in-s convolution integrability. - obtain ⟨charX, charV, _M_ρ, _hM_ρ_nn, _hflow_on, _h_boundary, - _hM_ρ_bound, _h_y_int_ρ, _hconv_cont, _h_aemeas, _h_int_conv⟩ := - vlasovWellPosedness_local_picard_fixedPointFlow W gradW hgradW L hL - fβ‚€ hfβ‚€_int hT hTL_PL hTL_con hB - -- Bundle the f-shape result. - refine ⟨vlasovSolutionViaPushforward charX charV fβ‚€, charX, charV, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ - Β· -- (a) f 0 = fβ‚€. The flow's initial-condition clause gives - -- (charX 0 z, charV 0 z) = z for every z, so the pushforward at t = 0 - -- is `Measure.map id fβ‚€ = fβ‚€`. Proved inline via the sub-helper's - -- initial-condition projection at t = 0. - have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := by - intro z - have := (_hflow_on.1 z (Set.mem_univ z)) - exact Prod.ext this.1 this.2 - change vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€ - unfold vlasovSolutionViaPushforward - have h_at_0 : (fun z : PhaseSpace d => (charX 0 z, charV 0 z)) = id := by - funext z; exact h_init z - rw [h_at_0, Measure.map_id] - Β· -- (b) HasFiniteFirstMoment (f t) on Icc 0 T. Deferred to the - -- _finalAssembly sub-helper (since it requires C_T from - -- flow_distance_growth_bound_on, plus the integral_map + - -- pushforward-moment-bound chain β€” exactly the threading work that - -- the _finalAssembly sub-helper handles). - intro t ht - exact vlasovWellPosedness_local_moment W gradW hgradW L hL - fβ‚€ hfβ‚€_int hT hTL_PL hTL_con charX charV - _M_ρ _hM_ρ_nn _hflow_on _h_boundary _hM_ρ_bound _h_y_int_ρ _hconv_cont - _h_aemeas _h_int_conv - t ht - Β· -- (bβ€²) FLAT uniform first-moment bound on the spatial marginal. - -- The picard fixed-point flow already exposes exactly this bound - -- (`_hM_ρ_bound`) for `M_ρ := _M_ρ` against - -- `spatialMarginal (vlasovSolutionViaPushforward charX charV fβ‚€ Β·)`, - -- which is `spatialMarginal (f Β·)` by definition of `f` here. - exact ⟨_M_ρ, _hM_ρ_nn, _hM_ρ_bound⟩ - Β· -- (c) IsLagrangianVlasovSolutionOn gradW f T. Handled by the - -- _finalAssembly sub-helper: it derives the AEMeasurable witness, the - -- IsCharacteristicFlowSelfConsistent discharge, the universal-in-s - -- convolution integrability (extension of `_hconv_cont`'s implications), - -- and threads all the hypotheses through - -- `vlasovSolutionViaPushforward_isLagrangianVlasovSolutionOn`. - exact vlasovWellPosedness_local_isLagrangian W gradW hgradW L hL - fβ‚€ hfβ‚€_int hT hTL_PL hTL_con charX charV - _M_ρ _hM_ρ_nn _hflow_on _h_boundary _hM_ρ_bound _h_y_int_ρ _hconv_cont - _h_aemeas _h_int_conv - Β· -- (d) Explicit pushforward equation for the outer charX charV. - -- vlasovSolutionViaPushforward charX charV fβ‚€ t = Measure.map (charX t, charV t) fβ‚€ - -- by DEFINITION. And f 0 = fβ‚€ (from goal (a), which used the initial condition). - -- So f t = Measure.map (charX t, charV t) (f 0) by congruence on f 0 = fβ‚€. - have h_f0_eq : vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€ := by - have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := - fun z => Prod.ext (_hflow_on.1 z (Set.mem_univ z)).1 (_hflow_on.1 z (Set.mem_univ z)).2 - simp [vlasovSolutionViaPushforward, - show (fun z : PhaseSpace d => (charX 0 z, charV 0 z)) = id from funext h_init] - intro t _ - show vlasovSolutionViaPushforward charX charV fβ‚€ t = - Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) - (vlasovSolutionViaPushforward charX charV fβ‚€ 0) - rw [h_f0_eq] - -- After rw, goal is: vlasovSolutionViaPushforward charX charV fβ‚€ t = Measure.map ... fβ‚€ - -- This is rfl by definition of vlasovSolutionViaPushforward. - rfl - Β· -- (e) Explicit AEMeasurable for the outer charX charV. - -- AEMeasurable (fun z => (charX s z, charV s z)) fβ‚€ comes from _h_aemeas. - -- The expected type uses (f 0) = vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€. - have h_f0_eq : vlasovSolutionViaPushforward charX charV fβ‚€ 0 = fβ‚€ := by - have h_init : βˆ€ z : PhaseSpace d, (charX 0 z, charV 0 z) = z := - fun z => Prod.ext (_hflow_on.1 z (Set.mem_univ z)).1 (_hflow_on.1 z (Set.mem_univ z)).2 - simp [vlasovSolutionViaPushforward, - show (fun z : PhaseSpace d => (charX 0 z, charV 0 z)) = id from funext h_init] - intro s _ - rw [h_f0_eq] - exact _h_aemeas s - Β· -- (f) Boundary regularity bundle: HasDerivWithinAt on Icc 0 T for all z, t. - -- Directly from `_h_boundary` (the picard fixed-point flow's boundary output). - -- The measure in the velocity derivative uses spatialMarginal (f t) where - -- f = vlasovSolutionViaPushforward charX charV fβ‚€, which is the same as - -- what _h_boundary was built against. - exact _h_boundary - Β· -- (g) Initial condition for the outer charX charV witnesses. - -- From _hflow_on.1 (IsCharacteristicFlowOn's first conjunct). - intro z - exact _hflow_on.1 z (Set.mem_univ z) +private alias picardLimit_fixed_point_eq := + _root_.Vlasov.picardLimit_fixed_point_eq -/-! ## Banked infrastructure: localized `hasDerivAt_of_hasDerivAt_of_ne` -/ --- Generic real-analysis helper banked for `vlasovWellPosedness_glue` case (a)'s substantive --- close. Mathlib's `hasDerivAt_of_hasDerivAt_of_ne` --- (Mathlib/Analysis/Calculus/FDeriv/Extend.lean) requires a UNIVERSAL --- `βˆ€ y β‰  x, HasDerivAt f (g y) y` hypothesis; the `vlasovWellPosedness_glue` setting only --- gives HasDerivAt on a bounded interval `Ioo 0 (T + T_0)`. This helper --- localizes the Mathlib pattern to a neighborhood-eventually hypothesis, --- enabling case (a)'s close via union of one-sided extension lemmas. +private alias picardLimit_flow_pointwise_contraction := + _root_.Vlasov.picardLimit_flow_pointwise_contraction -section HasDerivAtPunctured -open scoped Topology -open Filter +private alias picardLimit_self_consistency := + _root_.Vlasov.picardLimit_self_consistency -/-- Local version of `hasDerivAt_of_hasDerivAt_of_ne` (Mathlib/Analysis/Calculus/ -FDeriv/Extend.lean): if `f : ℝ β†’ ℝ` has HasDerivAt with derivative `g(y)` at -every `y β‰  xβ‚€` in some neighborhood of `xβ‚€`, and both `f` and `g` are continuous -at `xβ‚€`, then `f` has HasDerivAt with derivative `g(xβ‚€)` at `xβ‚€`. +private alias vlasovWellPosedness_local_picard_sequence := + _root_.Vlasov.vlasovWellPosedness_local_picard_sequence -The proof composes `hasDerivWithinAt_Iic_of_tendsto_deriv` (left side) + -`hasDerivWithinAt_Ici_of_tendsto_deriv` (right side) + `HasDerivWithinAt.union`, -following the Mathlib lemma's proof structure but with locally-quantified -hypothesis (enabling use when the punctured-HasDerivAt holds only on a bounded -interval, not all of ℝ). -/ -theorem hasDerivAt_of_hasDerivAt_of_ne_in_nhds - {f g : ℝ β†’ ℝ} {xβ‚€ : ℝ} - (h_diff_ne : βˆ€αΆ  y in 𝓝 xβ‚€, y β‰  xβ‚€ β†’ HasDerivAt f (g y) y) - (hf : ContinuousAt f xβ‚€) (hg : ContinuousAt g xβ‚€) : - HasDerivAt f (g xβ‚€) xβ‚€ := by - -- Extract an open ball around xβ‚€ on which the punctured HasDerivAt holds. - obtain ⟨U, hU_sub, hU_open, hxβ‚€_U⟩ := mem_nhds_iff.mp h_diff_ne - obtain ⟨Ρ, Ξ΅_pos, hΡ⟩ := Metric.isOpen_iff.mp hU_open xβ‚€ hxβ‚€_U - -- Right side: HasDerivWithinAt on Ici xβ‚€ via hasDerivWithinAt_Ici_of_tendsto_deriv. - have h_right : HasDerivWithinAt f (g xβ‚€) (Set.Ici xβ‚€) xβ‚€ := by - have hs_right : Set.Ioo xβ‚€ (xβ‚€ + Ξ΅) ∈ 𝓝[>] xβ‚€ := - Ioo_mem_nhdsGT (by linarith : xβ‚€ < xβ‚€ + Ξ΅) - have h_diff_right : DifferentiableOn ℝ f (Set.Ioo xβ‚€ (xβ‚€ + Ξ΅)) := by - intro y hy - have hy_U : y ∈ U := hΞ΅ (by - rw [Metric.mem_ball, Real.dist_eq, abs_lt] - exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) - exact (hU_sub hy_U (ne_of_gt hy.1)).differentiableAt.differentiableWithinAt - apply hasDerivWithinAt_Ici_of_tendsto_deriv h_diff_right hf.continuousWithinAt hs_right - have h_g_tendsto : Tendsto g (𝓝[>] xβ‚€) (𝓝 (g xβ‚€)) := tendsto_inf_left hg - apply h_g_tendsto.congr' - apply mem_of_superset hs_right - intro y hy - have hy_U : y ∈ U := hΞ΅ (by - rw [Metric.mem_ball, Real.dist_eq, abs_lt] - exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) - exact (hU_sub hy_U (ne_of_gt hy.1)).deriv.symm - -- Left side: symmetric. - have h_left : HasDerivWithinAt f (g xβ‚€) (Set.Iic xβ‚€) xβ‚€ := by - have hs_left : Set.Ioo (xβ‚€ - Ξ΅) xβ‚€ ∈ 𝓝[<] xβ‚€ := - Ioo_mem_nhdsLT (by linarith : xβ‚€ - Ξ΅ < xβ‚€) - have h_diff_left : DifferentiableOn ℝ f (Set.Ioo (xβ‚€ - Ξ΅) xβ‚€) := by - intro y hy - have hy_U : y ∈ U := hΞ΅ (by - rw [Metric.mem_ball, Real.dist_eq, abs_lt] - exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) - exact (hU_sub hy_U (ne_of_lt hy.2)).differentiableAt.differentiableWithinAt - apply hasDerivWithinAt_Iic_of_tendsto_deriv h_diff_left hf.continuousWithinAt hs_left - have h_g_tendsto : Tendsto g (𝓝[<] xβ‚€) (𝓝 (g xβ‚€)) := tendsto_inf_left hg - apply h_g_tendsto.congr' - apply mem_of_superset hs_left - intro y hy - have hy_U : y ∈ U := hΞ΅ (by - rw [Metric.mem_ball, Real.dist_eq, abs_lt] - exact ⟨by linarith [hy.1, hy.2], by linarith [hy.1, hy.2]⟩) - exact (hU_sub hy_U (ne_of_lt hy.2)).deriv.symm - -- Union via Set.Iic_union_Ici = Set.univ β†’ HasDerivAt at xβ‚€. - simpa using h_left.union h_right +private alias dobrushinFlow_marginal_gradW_integrable := + _root_.Vlasov.dobrushinFlow_marginal_gradW_integrable -end HasDerivAtPunctured +private alias vlasovGlue_composed_integral_eq := + _root_.Vlasov.vlasovGlue_composed_integral_eq -/-! ## Variable-`T_target` continuation via fixed-`T_0` iteration -/ --- Composes `vlasovWellPosedness_local` against itself to extend the local --- solution from `[0, T_0]` to `[0, T_target]` for any `T_target > 0`. The --- contraction time `T_0` is *fixed* (depends only on `L`, not on iteration- --- accumulated moment bounds) β€” see the docstring on `vlasovWellPosedness_local` --- (above) for why fixed-`T_0` is the correct iteration shape (the --- `Phi_supW1_contraction` factor `q` depends only on `L` and `T`). --- --- Two sub-theorems: --- * `vlasovWellPosedness_glue`: extend a solution on `[0, T]` by one --- window of length `T_0`, gluing at `t = T`. --- * `vlasovWellPosedness_forward`: `Nat.rec` iteration of `vlasovWellPosedness_glue` --- to reach any `T_target`. --- --- The universal-in-`t` bridge (below) then goes from --- `IsLagrangianVlasovSolutionOn` (any `T_target`) to --- `IsLagrangianVlasovSolution` (universal-in-`t`), and uniqueness follows. +private alias vlasovGlue_composed_pushforward := + _root_.Vlasov.vlasovGlue_composed_pushforward -/-- The `t = T` seam of the glue: both one-sided derivatives of the spliced -flow at the junction agree (`g`'s flow starts at the identity on -`f_prev T`'s data), so `HasDerivWithinAt.union` on `Iic T βˆͺ Ici T = univ` -gives the two-sided derivative, restricted back to `Icc 0 (T + T_0)`. -/ -private lemma vlasovWellPosedness_glue_boundary_seam {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) - (f_prev g f_next : ℝ β†’ Measure (PhaseSpace d)) - (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hdef_f : f_next = fun t => if t ≀ T then f_prev t else g (t - T)) - (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) - (Set.Icc 0 T) t) - (hg_boundary : βˆ€ (w : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T_0 β†’ - HasDerivWithinAt (fun s => charX_g s w) (charV_g t w) (Set.Icc 0 T_0) t ∧ - HasDerivWithinAt (fun s => charV_g s w) - (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t w))) - (Set.Icc 0 T_0) t) - (hg_init : g 0 = f_prev T) - (hg_init_cond : βˆ€ (w : PhaseSpace d), charX_g 0 w = w.1 ∧ charV_g 0 w = w.2) - (z : PhaseSpace d) : - HasDerivWithinAt - (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_prev T z) (Set.Icc 0 (T + T_0)) T ∧ - HasDerivWithinAt - (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) (charX_prev T z))) - (Set.Icc 0 (T + T_0)) T := by - have hT_in : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_bX := (h_prev_boundary z T hT_in).1 - have h_bV := (h_prev_boundary z T hT_in).2 - have h0_T0_in : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ - have h_g_bX := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_T0_in).1 - have h_g_bV := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_T0_in).2 - have h_nhd_L : Set.Icc 0 T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT_pos - have h_nhd_R : Set.Icc 0 T_0 ∈ nhdsWithin (0 : ℝ) (Set.Ici 0) := Icc_mem_nhdsGE hT_0_pos - -- charX: left one-sided - have hX_Lic := h_bX.mono_of_mem_nhdsWithin h_nhd_L - have hX_left : HasDerivWithinAt - (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_prev T z) (Set.Iic T) T := - hX_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) Set.self_mem_Iic - -- charX: right one-sided via chain rule on g's boundary - have hX_Ici0 := h_g_bX.mono_of_mem_nhdsWithin h_nhd_R - have h_sub_R : HasDerivWithinAt (Β· - T) 1 (Set.Ici T) T := - ((hasDerivAt_id' T).sub_const T).hasDerivWithinAt - have h_mapR : Set.MapsTo (Β· - T) (Set.Ici T) (Set.Ici 0) := - fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) - have h_chainX : HasDerivWithinAt - (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_g 0 (charX_prev T z, charV_prev T z)) (Set.Ici T) T := by - have := HasDerivWithinAt.scomp_of_eq T hX_Ici0 h_sub_R h_mapR (sub_self T).symm - simpa [Function.comp_def, one_smul] using this - have hVg0_eq : charV_g 0 (charX_prev T z, charV_prev T z) = charV_prev T z := - (hg_init_cond (charX_prev T z, charV_prev T z)).2 - rw [hVg0_eq] at h_chainX - have hX_right : HasDerivWithinAt - (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_prev T z) (Set.Ici T) T := - h_chainX.congr_of_mem - (fun s hs => by - by_cases hle : s ≀ T - Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) - simp [heq, sub_self, - (hg_init_cond (charX_prev T z, charV_prev T z)).1] - Β· simp [hle]) - Set.self_mem_Ici - have hX_union := hX_left.union hX_right - rw [Set.Iic_union_Ici] at hX_union - -- charV: analogously - have hV_Lic := h_bV.mono_of_mem_nhdsWithin h_nhd_L - have hV_left : HasDerivWithinAt - (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) (charX_prev T z))) - (Set.Iic T) T := by - simp only [hdef_f, ite_eq_left (le_refl T)] - exact hV_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) Set.self_mem_Iic - have hV_Ici0 := h_g_bV.mono_of_mem_nhdsWithin h_nhd_R - have h_chainV : HasDerivWithinAt - (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW - (spatialMarginal (g 0)) - (charX_g 0 (charX_prev T z, charV_prev T z)))) - (Set.Ici T) T := by - have := HasDerivWithinAt.scomp_of_eq T hV_Ici0 h_sub_R h_mapR (sub_self T).symm - simpa [Function.comp_def, one_smul] using this - have hXg0_eq : charX_g 0 (charX_prev T z, charV_prev T z) = charX_prev T z := - (hg_init_cond (charX_prev T z, charV_prev T z)).1 - have hg0_spat : spatialMarginal (g 0) = spatialMarginal (f_prev T) := - congrArg spatialMarginal hg_init - have hfnextT : spatialMarginal (f_next T) = spatialMarginal (f_prev T) := - congrArg spatialMarginal (by rw [hdef_f]; simp only [ite_eq_left (le_refl T)]) - rw [hXg0_eq, hg0_spat, ← hfnextT] at h_chainV - have hV_right : HasDerivWithinAt - (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) (charX_prev T z))) - (Set.Ici T) T := - h_chainV.congr_of_mem - (fun s hs => by - by_cases hle : s ≀ T - Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) - simp [heq, sub_self, - (hg_init_cond (charX_prev T z, charV_prev T z)).2] - Β· simp [hle]) - Set.self_mem_Ici - have hV_union := hV_left.union hV_right - rw [Set.Iic_union_Ici] at hV_union - exact ⟨hX_union.hasDerivAt Filter.univ_mem |>.hasDerivWithinAt, - hV_union.hasDerivAt Filter.univ_mem |>.hasDerivWithinAt⟩ +private alias vlasovGlue_conv_force_bound := + _root_.Vlasov.vlasovGlue_conv_force_bound -private lemma vlasovWellPosedness_glue_boundary {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) - (f_prev g f_next : ℝ β†’ Measure (PhaseSpace d)) - (charX_prev charV_prev charX_g charV_g charX_next charV_next : - ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hdef_X : charX_next = fun t z => - if t ≀ T then charX_prev t z else charX_g (t - T) (charX_prev T z, charV_prev T z)) - (hdef_V : charV_next = fun t z => - if t ≀ T then charV_prev t z else charV_g (t - T) (charX_prev T z, charV_prev T z)) - (hdef_f : f_next = fun t => if t ≀ T then f_prev t else g (t - T)) - (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) - (Set.Icc 0 T) t) - (hg_boundary : βˆ€ (w : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T_0 β†’ - HasDerivWithinAt (fun s => charX_g s w) (charV_g t w) (Set.Icc 0 T_0) t ∧ - HasDerivWithinAt (fun s => charV_g s w) - (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t w))) - (Set.Icc 0 T_0) t) - (hg_init : g 0 = f_prev T) - (hg_init_cond : βˆ€ (w : PhaseSpace d), charX_g 0 w = w.1 ∧ charV_g 0 w = w.2) : - βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) (T + T_0) β†’ - HasDerivWithinAt (fun s => charX_next s z) (charV_next t z) (Set.Icc 0 (T + T_0)) t ∧ - HasDerivWithinAt (fun s => charV_next s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next t)) (charX_next t z))) - (Set.Icc 0 (T + T_0)) t := by - subst hdef_X hdef_V - intro z t ht - simp only [] - -- Abbreviate the initial phase-space point for g - have hzβ‚€_def : (charX_prev T z, charV_prev T z) = (charX_prev T z, charV_prev T z) := rfl - by_cases ht_le : t ≀ T - Β· -- t ≀ T: use h_prev_boundary + upgrade to Icc 0 (T + T_0) - simp only [ite_eq_left ht_le] - have ht_in : t ∈ Set.Icc (0 : ℝ) T := ⟨ht.1, ht_le⟩ - have h_bX := (h_prev_boundary z t ht_in).1 - have h_bV := (h_prev_boundary z t ht_in).2 - by_cases ht_eqT : t = T - Β· -- t = T: the seam case, extracted as `_glue_boundary_seam`. - rw [ht_eqT] - exact vlasovWellPosedness_glue_boundary_seam gradW hT_pos hT_0_pos f_prev g f_next - charX_prev charV_prev charX_g charV_g hdef_f h_prev_boundary hg_boundary - hg_init hg_init_cond z - Β· -- t < T: use mono_of_mem_nhdsWithin to extend to Icc 0 (T + T_0) - have ht_ltT : t < T := lt_of_le_of_ne ht_le ht_eqT - -- Get Icc 0 T ∈ nhdsWithin t (Icc 0 (T + T_0)) - have h_mem : Set.Icc (0 : ℝ) T ∈ nhdsWithin t (Set.Icc 0 (T + T_0)) := by - rcases eq_or_lt_of_le ht.1 with rfl | ht_pos - Β· exact (nhdsWithin_mono 0 Set.Icc_subset_Ici_self) (Icc_mem_nhdsGE hT_pos) - Β· exact mem_nhdsWithin_of_mem_nhds (Icc_mem_nhds ht_pos ht_ltT) - -- Upgrade HasDerivWithinAt from Icc 0 T to Icc 0 (T + T_0) - have hX_big := h_bX.mono_of_mem_nhdsWithin h_mem - have hV_big := h_bV.mono_of_mem_nhdsWithin h_mem - -- Congr: charX_next = charX_prev on Icc 0 T (within Icc 0 (T+T_0)) - have hX_ev : (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - =αΆ [nhdsWithin t (Set.Icc 0 (T + T_0))] (charX_prev Β· z) := - Filter.Eventually.mono h_mem (fun s hs => by simp [hs.2]) - have hV_ev : (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - =αΆ [nhdsWithin t (Set.Icc 0 (T + T_0))] (charV_prev Β· z) := - Filter.Eventually.mono h_mem (fun s hs => by simp [hs.2]) - -- f_next t = f_prev t, so marginals match - have hfnext : f_next t = f_prev t := by rw [hdef_f]; simp only [ite_eq_left ht_le] - have hfnext_spat : spatialMarginal (f_next t) = spatialMarginal (f_prev t) := - congrArg spatialMarginal hfnext - rw [← hfnext_spat] at hV_big - constructor - Β· exact hX_big.congr_of_eventuallyEq_of_mem hX_ev ht - Β· exact hV_big.congr_of_eventuallyEq_of_mem hV_ev ht - Β· -- T < t: use hg_boundary + chain rule - push Not at ht_le - simp only [ite_eq_right (not_le.mpr ht_le)] - have htT_mem : t - T ∈ Set.Icc (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ - have h_bdry_gX := (hg_boundary (charX_prev T z, charV_prev T z) (t - T) htT_mem).1 - have h_bdry_gV := (hg_boundary (charX_prev T z, charV_prev T z) (t - T) htT_mem).2 - by_cases ht_ltTT0 : t < T + T_0 - Β· -- t ∈ Ioo T (T + T_0): interior case, use HasDerivAt + congr - have htT_Ioo : t - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith⟩ - have hX_da := h_bdry_gX.hasDerivAt (Icc_mem_nhds htT_Ioo.1 htT_Ioo.2) - have hV_da := h_bdry_gV.hasDerivAt (Icc_mem_nhds htT_Ioo.1 htT_Ioo.2) - have h_sub : HasDerivAt (Β· - T) 1 t := (hasDerivAt_id' t).sub_const T - have h_chainX : HasDerivAt (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_g (t - T) (charX_prev T z, charV_prev T z)) t := by - have := HasDerivAt.scomp_of_eq t hX_da h_sub rfl - simpa [Function.comp_def, one_smul] using this - have h_chainV : HasDerivAt (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW - (spatialMarginal (g (t - T))) - (charX_g (t - T) (charX_prev T z, charV_prev T z)))) t := by - have := HasDerivAt.scomp_of_eq t hV_da h_sub rfl - simpa [Function.comp_def, one_smul] using this - -- f_next t = g (t - T), so marginals match - have h_fnext_t : f_next t = g (t - T) := by - rw [hdef_f]; simp only [ite_eq_right (not_le.mpr ht_le)] - rw [← congrArg spatialMarginal h_fnext_t] at h_chainV - -- piecewise = charX_g (Β· - T) (charX_prev T z, charV_prev T z) near t (since T < t) - have h_ev_gt : βˆ€αΆ  s in nhds t, T < s := eventually_gt_nhds ht_le - have hX_ev : (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - =αΆ [nhds t] (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) := - Filter.Eventually.mono h_ev_gt (fun s hs => by simp [not_le.mpr hs]) - have hV_ev : (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - =αΆ [nhds t] (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) := - Filter.Eventually.mono h_ev_gt (fun s hs => by simp [not_le.mpr hs]) - exact ⟨(h_chainX.congr_of_eventuallyEq hX_ev).hasDerivWithinAt, - (h_chainV.congr_of_eventuallyEq hV_ev).hasDerivWithinAt⟩ - Β· -- t = T + T_0: endpoint, use mono_of_mem_nhdsWithin + chain rule + mono - push Not at ht_ltTT0 - have htT0 : t = T + T_0 := le_antisymm ht.2 ht_ltTT0 - rw [show t - T = T_0 from by linarith] at h_bdry_gX h_bdry_gV - -- Upgrade to Iic T_0 via Icc_mem_nhdsLE - have h_nhd_LE : Set.Icc 0 T_0 ∈ nhdsWithin T_0 (Set.Iic T_0) := Icc_mem_nhdsLE hT_0_pos - have hX_Lic := h_bdry_gX.mono_of_mem_nhdsWithin h_nhd_LE - have hV_Lic := h_bdry_gV.mono_of_mem_nhdsWithin h_nhd_LE - -- Chain rule: (Β· - T) maps Iic (T + T_0) to Iic T_0 - have h_sub_LE : HasDerivWithinAt (Β· - T) 1 (Set.Iic (T + T_0)) (T + T_0) := - ((hasDerivAt_id' (T + T_0)).sub_const T).hasDerivWithinAt.mono - (fun _ _ => Set.mem_univ _) - have h_mapLE : Set.MapsTo (Β· - T) (Set.Iic (T + T_0)) (Set.Iic T_0) := - fun s hs => Set.mem_Iic.mpr (by linarith [Set.mem_Iic.mp hs]) - have h_chainX : HasDerivWithinAt - (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_g T_0 (charX_prev T z, charV_prev T z)) (Set.Iic (T + T_0)) (T + T_0) := by - have := HasDerivWithinAt.scomp_of_eq (T + T_0) hX_Lic h_sub_LE h_mapLE - (show T_0 = (T + T_0) - T by ring) - simpa [Function.comp_def, one_smul] using this - have h_chainV : HasDerivWithinAt - (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW - (spatialMarginal (g T_0)) - (charX_g T_0 (charX_prev T z, charV_prev T z)))) - (Set.Iic (T + T_0)) (T + T_0) := by - have := HasDerivWithinAt.scomp_of_eq (T + T_0) hV_Lic h_sub_LE h_mapLE - (show T_0 = (T + T_0) - T by ring) - simpa [Function.comp_def, one_smul] using this - -- Congr: near T+T_0 within Iic (T+T_0), points > T eventually - have h_ev_gt2 : βˆ€αΆ  s in nhdsWithin (T + T_0) (Set.Iic (T + T_0)), T < s := - (eventually_gt_nhds (show T < T + T_0 by linarith)).filter_mono nhdsWithin_le_nhds - have hX_ev2 : (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - =αΆ [nhdsWithin (T + T_0) (Set.Iic (T + T_0))] - (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) := - Filter.Eventually.mono h_ev_gt2 (fun s hs => by simp [not_le.mpr hs]) - have hV_ev2 : (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - =αΆ [nhdsWithin (T + T_0) (Set.Iic (T + T_0))] - (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) := - Filter.Eventually.mono h_ev_gt2 (fun s hs => by simp [not_le.mpr hs]) - have h_Iic_sub : Set.Icc 0 (T + T_0) βŠ† Set.Iic (T + T_0) := Set.Icc_subset_Iic_self - have h_TT0_Iic : (T + T_0) ∈ Set.Iic (T + T_0) := Set.mem_Iic.mpr (le_refl _) - -- f_next (T + T_0) = g T_0 - have h_fnext_TT0 : f_next (T + T_0) = g T_0 := by - simp [hdef_f, not_le.mpr (show T < T + T_0 by linarith)] - constructor - Β· have h_cX : HasDerivWithinAt - (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_g T_0 (charX_prev T z, charV_prev T z)) - (Set.Icc 0 (T + T_0)) (T + T_0) := - (h_chainX.congr_of_eventuallyEq_of_mem hX_ev2 h_TT0_Iic).mono h_Iic_sub - rw [htT0] - rw [show T + T_0 - T = T_0 from by ring] - exact h_cX - Β· have h_cV : HasDerivWithinAt - (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW - (spatialMarginal (g T_0)) - (charX_g T_0 (charX_prev T z, charV_prev T z)))) - (Set.Icc 0 (T + T_0)) (T + T_0) := - (h_chainV.congr_of_eventuallyEq_of_mem hV_ev2 h_TT0_Iic).mono h_Iic_sub - rw [htT0] - rw [h_fnext_TT0] - rw [show T + T_0 - T = T_0 from by ring] - exact h_cV +private alias vlasovGlue_diff_ne := + _root_.Vlasov.vlasovGlue_diff_ne +private alias vlasovGlue_flowV_hasDerivAt := + _root_.Vlasov.vlasovGlue_flowV_hasDerivAt -/-- **Route 2 inner kernel for `glue_step` `h_cont_g`** (LEFT / `Iic T`): continuity -at the seam `T` of `s ↦ (βˆ‡W βˆ— ΞΌ_s)(charX s z)`, where the window measure curve `ΞΌ` is -the flow-pushforward of `fβ‚€`. +private alias vlasovGlue_flowX_hasDerivAt := + _root_.Vlasov.vlasovGlue_flowX_hasDerivAt -Proven from PROVEN tools only (no deferred OT). The pushforward rewrite -`(βˆ‡W βˆ— ΞΌ_s)(x) = ∫ z', gradW (x βˆ’ charX s z') βˆ‚fβ‚€` (`integral_map`) turns the -moving-measure convolution into a fixed-`fβ‚€` integral with moving integrand, closed by -dominated convergence: convergence from the flow's seam continuity `h_charX_cont`, -domination from the Gronwall growth bound `hC_T` (Piece A) against `fβ‚€`'s finite first -moment. This is the structural reason `h_cont_g` does NOT need the general narrowβ†’W₁ -kernel β€” its consumer carries a pushforward representation. -/ -lemma flowConv_continuousWithinAt_Iic_seam - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (charX : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT : 0 < T) - (ΞΌ : ℝ β†’ Measure (PhysSpace d)) - (h_push : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - ΞΌ s = Measure.map (fun z : PhaseSpace d => charX s z) fβ‚€) - (h_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => charX s z) fβ‚€) - (h_charX_cont : βˆ€ z : PhaseSpace d, - ContinuousWithinAt (fun s => charX s z) (Set.Icc (0 : ℝ) T) T) - (C_T : ℝ) (_hC_T_nn : 0 ≀ C_T) - (hC_T : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1)) - (z : PhaseSpace d) : - ContinuousWithinAt (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) - (Set.Iic T) T := by - have h_nhd_L : Set.Icc (0 : ℝ) T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT - have hgradW_cont : Continuous gradW := hL.continuous - have hL_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg - -- Pushforward rewrite of the convolution, eventually in s (on the window). - have h_eq : (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) - =αΆ [nhdsWithin T (Set.Iic T)] - (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) := by - apply Filter.Eventually.mono h_nhd_L - intro s hs - change ∫ y, gradW (charX s z - y) βˆ‚(ΞΌ s) - = ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€ - rw [h_push s hs] - exact integral_map (h_aemeas s hs) - (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable - -- The rewritten fβ‚€-integral is continuous at T by dominated convergence. - have h_cont_rhs : ContinuousWithinAt - (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) (Set.Iic T) T := by - apply continuousWithinAt_of_dominated - (bound := fun z' => β€–gradW 0β€– + (L : ℝ) * (C_T * (β€–zβ€– + 1)) - + (L : ℝ) * (C_T * (β€–z'β€– + 1))) - Β· -- AEStronglyMeasurable in z', eventually in s - apply Filter.Eventually.mono h_nhd_L - intro s hs - exact (hgradW_cont.measurable.comp_aemeasurable - (aemeasurable_const.sub (h_aemeas s hs))).aestronglyMeasurable - Β· -- pointwise dominator bound, eventually in s - apply Filter.Eventually.mono h_nhd_L - intro s hs - apply Filter.Eventually.of_forall - intro z' - have h1 : β€–gradW (charX s z - charX s z')β€– - ≀ β€–gradW 0β€– + (L : ℝ) * β€–charX s z - charX s z'β€– := by - have hd := hL.dist_le_mul (charX s z - charX s z') 0 - simp only [dist_eq_norm, sub_zero] at hd - have htri : β€–gradW (charX s z - charX s z')β€– - ≀ β€–gradW 0β€– + β€–gradW (charX s z - charX s z') - gradW 0β€– := by - have := norm_add_le (gradW (charX s z - charX s z') - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - linarith - have h2 : β€–charX s z - charX s z'β€– ≀ β€–charX s zβ€– + β€–charX s z'β€– := norm_sub_le _ _ - have h3 : β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1) := hC_T s hs z - have h4 : β€–charX s z'β€– ≀ C_T * (β€–z'β€– + 1) := hC_T s hs z' - nlinarith [mul_le_mul_of_nonneg_left (h2.trans (add_le_add h3 h4)) hL_nn] - Β· -- integrability of the dominator - apply Integrable.add (integrable_const _) - exact ((hfβ‚€_int.add (integrable_const (1 : ℝ))).const_mul C_T).const_mul (L : ℝ) - Β· -- pointwise continuity in s, a.e. z' - apply Filter.Eventually.of_forall - intro z' - have hcz : ContinuousWithinAt (fun s => charX s z) (Set.Iic T) T := - (h_charX_cont z).mono_of_mem_nhdsWithin h_nhd_L - have hcz' : ContinuousWithinAt (fun s => charX s z') (Set.Iic T) T := - (h_charX_cont z').mono_of_mem_nhdsWithin h_nhd_L - exact hgradW_cont.continuousAt.comp_continuousWithinAt (hcz.sub hcz') - -- Bridge value at T and conclude. - have h_val_T : convolveFunctionMeasure gradW (ΞΌ T) (charX T z) - = ∫ z', gradW (charX T z - charX T z') βˆ‚fβ‚€ := by - have hT_mem : T ∈ Set.Icc (0 : ℝ) T := ⟨hT.le, le_refl T⟩ - change ∫ y, gradW (charX T z - y) βˆ‚(ΞΌ T) - = ∫ z', gradW (charX T z - charX T z') βˆ‚fβ‚€ - rw [h_push T hT_mem] - exact integral_map (h_aemeas T hT_mem) - (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable - exact h_cont_rhs.congr_of_eventuallyEq h_eq h_val_T - -/-- **Route 2 inner kernel for `glue_step` `h_cont_g`** (RIGHT / `Ici a`): the -exact mirror of `flowConv_continuousWithinAt_Iic_seam`, but on `Set.Ici a` over a -generic window `[a, b]` with the seam at the lower endpoint `a`. Same proof shape; -the only set-dependent swaps are `Iic T β†’ Ici a`, `Icc_mem_nhdsLE β†’ Icc_mem_nhdsGE`, -and the window `[0, T] β†’ [a, b]`. Used for the RIGHT side of the seam at `T` where -`charX` is the composed position flow `Z_s z = charX_g (s-T) (charX_prev T z, …)` and -`ΞΌ s = spatialMarginal (g (s-T))` is its pushforward of `fβ‚€`. -/ -lemma flowConv_continuousWithinAt_Ici_seam - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (charX : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {a b : ℝ} (hab : a < b) - (ΞΌ : ℝ β†’ Measure (PhysSpace d)) - (h_push : βˆ€ s ∈ Set.Icc a b, - ΞΌ s = Measure.map (fun z : PhaseSpace d => charX s z) fβ‚€) - (h_aemeas : βˆ€ s ∈ Set.Icc a b, - AEMeasurable (fun z : PhaseSpace d => charX s z) fβ‚€) - (h_charX_cont : βˆ€ z : PhaseSpace d, - ContinuousWithinAt (fun s => charX s z) (Set.Ici a) a) - (C_T : ℝ) (_hC_T_nn : 0 ≀ C_T) - (hC_T : βˆ€ s ∈ Set.Icc a b, βˆ€ z : PhaseSpace d, β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1)) - (z : PhaseSpace d) : - ContinuousWithinAt (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) - (Set.Ici a) a := by - have h_nhd_R : Set.Icc a b ∈ nhdsWithin a (Set.Ici a) := Icc_mem_nhdsGE hab - have hgradW_cont : Continuous gradW := hL.continuous - have hL_nn : (0 : ℝ) ≀ (L : ℝ) := L.coe_nonneg - -- Pushforward rewrite of the convolution, eventually in s (on the window). - have h_eq : (fun s => convolveFunctionMeasure gradW (ΞΌ s) (charX s z)) - =αΆ [nhdsWithin a (Set.Ici a)] - (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) := by - apply Filter.Eventually.mono h_nhd_R - intro s hs - change ∫ y, gradW (charX s z - y) βˆ‚(ΞΌ s) - = ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€ - rw [h_push s hs] - exact integral_map (h_aemeas s hs) - (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable - -- The rewritten fβ‚€-integral is continuous at a by dominated convergence. - have h_cont_rhs : ContinuousWithinAt - (fun s => ∫ z', gradW (charX s z - charX s z') βˆ‚fβ‚€) (Set.Ici a) a := by - apply continuousWithinAt_of_dominated - (bound := fun z' => β€–gradW 0β€– + (L : ℝ) * (C_T * (β€–zβ€– + 1)) - + (L : ℝ) * (C_T * (β€–z'β€– + 1))) - Β· -- AEStronglyMeasurable in z', eventually in s - apply Filter.Eventually.mono h_nhd_R - intro s hs - exact (hgradW_cont.measurable.comp_aemeasurable - (aemeasurable_const.sub (h_aemeas s hs))).aestronglyMeasurable - Β· -- pointwise dominator bound, eventually in s - apply Filter.Eventually.mono h_nhd_R - intro s hs - apply Filter.Eventually.of_forall - intro z' - have h1 : β€–gradW (charX s z - charX s z')β€– - ≀ β€–gradW 0β€– + (L : ℝ) * β€–charX s z - charX s z'β€– := by - have hd := hL.dist_le_mul (charX s z - charX s z') 0 - simp only [dist_eq_norm, sub_zero] at hd - have htri : β€–gradW (charX s z - charX s z')β€– - ≀ β€–gradW 0β€– + β€–gradW (charX s z - charX s z') - gradW 0β€– := by - have := norm_add_le (gradW (charX s z - charX s z') - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - linarith - have h2 : β€–charX s z - charX s z'β€– ≀ β€–charX s zβ€– + β€–charX s z'β€– := norm_sub_le _ _ - have h3 : β€–charX s zβ€– ≀ C_T * (β€–zβ€– + 1) := hC_T s hs z - have h4 : β€–charX s z'β€– ≀ C_T * (β€–z'β€– + 1) := hC_T s hs z' - nlinarith [mul_le_mul_of_nonneg_left (h2.trans (add_le_add h3 h4)) hL_nn] - Β· -- integrability of the dominator - apply Integrable.add (integrable_const _) - exact ((hfβ‚€_int.add (integrable_const (1 : ℝ))).const_mul C_T).const_mul (L : ℝ) - Β· -- pointwise continuity in s, a.e. z' - apply Filter.Eventually.of_forall - intro z' - have hcz : ContinuousWithinAt (fun s => charX s z) (Set.Ici a) a := h_charX_cont z - have hcz' : ContinuousWithinAt (fun s => charX s z') (Set.Ici a) a := h_charX_cont z' - exact hgradW_cont.continuousAt.comp_continuousWithinAt (hcz.sub hcz') - -- Bridge value at a and conclude. - have h_val_a : convolveFunctionMeasure gradW (ΞΌ a) (charX a z) - = ∫ z', gradW (charX a z - charX a z') βˆ‚fβ‚€ := by - have ha_mem : a ∈ Set.Icc a b := ⟨le_refl a, hab.le⟩ - change ∫ y, gradW (charX a z - y) βˆ‚(ΞΌ a) - = ∫ z', gradW (charX a z - charX a z') βˆ‚fβ‚€ - rw [h_push a ha_mem] - exact integral_map (h_aemeas a ha_mem) - (hgradW_cont.comp (continuous_const.sub continuous_id)).aestronglyMeasurable - exact h_cont_rhs.congr_of_eventuallyEq h_eq h_val_a +private alias vlasovGlue_flow_aemeasurable := + _root_.Vlasov.vlasovGlue_flow_aemeasurable -/-- gradW-kernel integrability on the spatial marginals of a finite-first-moment -curve (window-generic over the curve `ΞΌ`). The first-moment transfer to the -marginal feeds `integrable_gradW_shift`. -/ -private lemma dobrushinFlow_marginal_gradW_integrable - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (T : ℝ) (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) - (hΞΌ_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (ΞΌ t)) : - βˆ€ t ∈ Set.Icc (0 : ℝ) T, βˆ€ (x_pt : PhysSpace d), - Integrable (fun y => gradW (x_pt - y)) (spatialMarginal (ΞΌ t)) := by - intro t ht x_pt - have : IsProbabilityMeasure (ΞΌ t) := (hΞΌ_mom t ht).1 - have : IsProbabilityMeasure (spatialMarginal (ΞΌ t)) := - (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - have h_y_int : Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (ΞΌ t)) := by - unfold spatialMarginal - rw [integrable_map_measure - (by exact (continuous_norm.measurable).aestronglyMeasurable) - measurable_fst.aemeasurable] - refine Integrable.mono' (hΞΌ_mom t ht).2 - ((continuous_norm.comp continuous_fst).aestronglyMeasurable) - (Filter.Eventually.of_forall fun z => ?_) - change |β€–z.1β€–| ≀ β€–zβ€– - rw [abs_of_nonneg (norm_nonneg _)]; exact norm_fst_le z - exact integrable_gradW_shift gradW L hL (spatialMarginal (ΞΌ t)) h_y_int x_pt +private alias vlasovGlue_flow_growthBound := + _root_.Vlasov.vlasovGlue_flow_growthBound -/-- First-moment integrability transfers to the spatial marginal: -`∫ β€–zβ€– βˆ‚ΞΌ < ∞` gives `∫ β€–yβ€– βˆ‚(spatialMarginal ΞΌ) < ∞`. -/ -private lemma vlasovGlue_marginal_norm_integrable - {d : β„•} - (ΞΌ : Measure (PhaseSpace d)) (hΞΌ : HasFiniteFirstMoment ΞΌ) : - Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal ΞΌ) := by - have : IsProbabilityMeasure ΞΌ := hΞΌ.1 - unfold spatialMarginal - rw [integrable_map_measure - (by exact (continuous_norm.measurable).aestronglyMeasurable) - measurable_fst.aemeasurable] - refine Integrable.mono' hΞΌ.2 - ((continuous_norm.comp continuous_fst).aestronglyMeasurable) - (Filter.Eventually.of_forall fun z => ?_) - change |β€–z.1β€–| ≀ β€–zβ€– - rw [abs_of_nonneg (norm_nonneg _)]; exact norm_fst_le z +private alias vlasovGlue_gradVΟ†_continuous := + _root_.Vlasov.vlasovGlue_gradVΟ†_continuous -/-- Continuity of the spatial-gradient component `gradXΟ†` of a smooth test -function `Ο†` on phase space. -/ -private lemma vlasovGlue_gradXΟ†_continuous - {d : β„•} - (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) - (gradXΟ† : PhaseSpace d β†’ PhysSpace d) - (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) : - Continuous gradXΟ† := by - have hfderiv_X : βˆ€ z : PhaseSpace d, - fderiv ℝ (fun x => Ο† (x, z.2)) z.1 = - (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := - fun z => by - have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := - (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt - have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := - hasFDerivAt_prodMk_left z.1 z.2 - exact (h1.comp z.1 h2).fderiv - have heqX : gradXΟ† = fun z => gradient (fun x => Ο† (x, z.2)) z.1 := - funext hgradXΟ† - rw [heqX] - simp_rw [gradient, hfderiv_X] - exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp - ((ContinuousLinearMap.isBoundedLinearMap_comp_right - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d))).continuous.comp - (hΟ†_smooth.continuous_fderiv (by simp))) +private alias vlasovGlue_gradXΟ†_continuous := + _root_.Vlasov.vlasovGlue_gradXΟ†_continuous -/-- Continuity of the velocity-gradient component `gradVΟ†` of a smooth test -function `Ο†` on phase space. -/ -private lemma vlasovGlue_gradVΟ†_continuous - {d : β„•} - (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) - (gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : - Continuous gradVΟ† := by - have hfderiv_V : βˆ€ z : PhaseSpace d, - fderiv ℝ (fun v => Ο† (z.1, v)) z.2 = - (fderiv ℝ Ο† z).comp (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := - fun z => by - have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := - (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt - have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) - (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := - hasFDerivAt_prodMk_right z.1 z.2 - exact (h1.comp z.2 h2).fderiv - have heqV : gradVΟ† = fun z => gradient (fun v => Ο† (z.1, v)) z.2 := - funext hgradVΟ† - rw [heqV] - simp_rw [gradient, hfderiv_V] - exact (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.continuous.comp - ((ContinuousLinearMap.isBoundedLinearMap_comp_right - (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d))).continuous.comp - (hΟ†_smooth.continuous_fderiv (by simp))) +private alias vlasovGlue_gradΟ†_bound := + _root_.Vlasov.vlasovGlue_gradΟ†_bound -/-- Uniform sup-bound on both gradient components of a compactly supported -smooth test function: `β€–βˆ‡_x Ο†β€–, β€–βˆ‡_v Ο†β€– ≀ M_Ο† := sup β€–fderiv Ο†β€–`. -/ -private lemma vlasovGlue_gradΟ†_bound - {d : β„•} - (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) - (hΟ†_compact : HasCompactSupport Ο†) - (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) - (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : - βˆƒ M_Ο† : ℝ, (βˆ€ z : PhaseSpace d, β€–gradXΟ† zβ€– ≀ M_Ο†) ∧ - (βˆ€ z : PhaseSpace d, β€–gradVΟ† zβ€– ≀ M_Ο†) := by - have hfderiv_cont : Continuous (fderiv ℝ Ο†) := - hΟ†_smooth.continuous_fderiv (by norm_num) - have hfderiv_compact : HasCompactSupport (fderiv ℝ Ο†) := - HasCompactSupport.fderiv (π•œ := ℝ) hΟ†_compact - obtain ⟨M_Ο†, hM_Ο†βŸ© := hfderiv_cont.bounded_above_of_compact_support hfderiv_compact - refine ⟨M_Ο†, fun z => ?_, fun z => ?_⟩ - Β· have hfd : fderiv ℝ (fun x => Ο† (x, z.2)) z.1 = - (fderiv ℝ Ο† z).comp - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) := by - have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := - (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt - have h2 : HasFDerivAt (fun x : PhysSpace d => (x, z.2)) - (ContinuousLinearMap.inl ℝ (PhysSpace d) (PhysSpace d)) z.1 := - hasFDerivAt_prodMk_left z.1 z.2 - exact (h1.comp z.1 h2).fderiv - rw [hgradXΟ† z, gradient, hfd, - (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.norm_map] - refine le_trans (ContinuousLinearMap.opNorm_comp_le _ _) ?_ - refine le_trans (mul_le_mul_of_nonneg_left - (ContinuousLinearMap.norm_inl_le_one (π•œ := ℝ) - (E := PhysSpace d) (F := PhysSpace d)) (norm_nonneg _)) ?_ - rw [mul_one]; exact hM_Ο† z - Β· have hfd : fderiv ℝ (fun v => Ο† (z.1, v)) z.2 = - (fderiv ℝ Ο† z).comp - (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) := by - have h1 : HasFDerivAt Ο† (fderiv ℝ Ο† z) z := - (hΟ†_smooth.differentiable (by simp) z).hasFDerivAt - have h2 : HasFDerivAt (fun v : PhysSpace d => (z.1, v)) - (ContinuousLinearMap.inr ℝ (PhysSpace d) (PhysSpace d)) z.2 := - hasFDerivAt_prodMk_right z.1 z.2 - exact (h1.comp z.2 h2).fderiv - rw [hgradVΟ† z, gradient, hfd, - (InnerProductSpace.toDual ℝ (PhysSpace d)).symm.norm_map] - refine le_trans (ContinuousLinearMap.opNorm_comp_le _ _) ?_ - refine le_trans (mul_le_mul_of_nonneg_left - (ContinuousLinearMap.norm_inr_le_one (π•œ := ℝ) - (E := PhysSpace d) (F := PhysSpace d)) (norm_nonneg _)) ?_ - rw [mul_one]; exact hM_Ο† z +private alias vlasovGlue_intCont_left := + _root_.Vlasov.vlasovGlue_intCont_left -/-- Convolution force bound from a first-moment envelope: -`β€–(gradW ⋆ ρ) xβ€– ≀ β€–gradW 0β€– + LΒ·β€–xβ€– + LΒ·M` for a probability measure `ρ` -with `∫ β€–yβ€– βˆ‚Ο ≀ M`. -/ -private lemma vlasovGlue_conv_force_bound - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ρ : Measure (PhysSpace d)) [IsProbabilityMeasure ρ] - (M : ℝ) (hM : ∫ y, β€–yβ€– βˆ‚Ο ≀ M) - (h_y_int : Integrable (fun y : PhysSpace d => β€–yβ€–) ρ) - (h_int : βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) ρ) - (x : PhysSpace d) : - β€–convolveFunctionMeasure gradW ρ xβ€– - ≀ β€–gradW 0β€– + (L : ℝ) * β€–xβ€– + (L : ℝ) * M := by - unfold convolveFunctionMeasure - have h_sub_int : Integrable (fun y => β€–x - yβ€–) ρ := - Integrable.mono' ((integrable_const β€–xβ€–).add h_y_int) - ((aestronglyMeasurable_const (b := x)).sub aestronglyMeasurable_id |>.norm) - (Filter.Eventually.of_forall fun y => by - simp only [Real.norm_of_nonneg (norm_nonneg _)]; exact norm_sub_le x y) - have h_pt : βˆ€ y : PhysSpace d, - β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€– := by - intro y - have hd := hL.dist_le_mul (x - y) 0 - simp only [dist_eq_norm, sub_zero] at hd - have h_tri : β€–gradW (x - y)β€– ≀ β€–gradW 0β€– + β€–gradW (x - y) - gradW 0β€– := by - have := norm_add_le (gradW (x - y) - gradW 0) (gradW 0) - simp only [sub_add_cancel] at this; linarith - linarith - have h_bnd_int : - Integrable (fun y => β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) ρ := - (integrable_const _).add (h_sub_int.const_mul _) - calc β€–βˆ« y, gradW (x - y) βˆ‚Οβ€– - ≀ ∫ y, β€–gradW (x - y)β€– βˆ‚Ο := - norm_integral_le_integral_norm _ - _ ≀ ∫ y, (β€–gradW 0β€– + (L : ℝ) * β€–x - yβ€–) βˆ‚Ο := - integral_mono (h_int x).norm h_bnd_int h_pt - _ = β€–gradW 0β€– + (L : ℝ) * ∫ y, β€–x - yβ€– βˆ‚Ο := by - rw [integral_add (integrable_const _) (h_sub_int.const_mul _)] - simp [integral_const, measureReal_def, measure_univ, integral_const_mul] - _ ≀ β€–gradW 0β€– + (L : ℝ) * β€–xβ€– + (L : ℝ) * M := by - have h_int_le : ∫ y, β€–x - yβ€– βˆ‚Ο ≀ β€–xβ€– + M := by - calc ∫ y, β€–x - yβ€– βˆ‚Ο - ≀ ∫ y, (β€–xβ€– + β€–yβ€–) βˆ‚Ο := - integral_mono h_sub_int ((integrable_const _).add h_y_int) - (fun y => norm_sub_le x y) - _ = β€–xβ€– + ∫ y, β€–yβ€– βˆ‚Ο := by - rw [integral_add (integrable_const _) h_y_int] - simp [integral_const, measureReal_def, measure_univ] - _ ≀ β€–xβ€– + M := by linarith - nlinarith [mul_le_mul_of_nonneg_left h_int_le L.coe_nonneg] +private alias vlasovGlue_intCont_right := + _root_.Vlasov.vlasovGlue_intCont_right -/-- Window growth bound for a characteristic flow given boundary regularity: -clamps the marginal curve into `[0, T]` (for the universal probability -instance), derives the interior `IsCharacteristicFlowOn` from the boundary -bundle, and applies `characteristicFlow_boundary_regularity` + -`flow_distance_growth_bound_on`. Returns the linear growth constant `C` -together with per-`z` window continuity of the joint flow curve. -/ -private lemma vlasovGlue_flow_growthBound - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (ΞΌ : ℝ β†’ Measure (PhaseSpace d)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (T : ℝ) (hT_pos : 0 < T) - (hΞΌ_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (ΞΌ t)) - (hM : βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (ΞΌ t)) ≀ M) - (h_ic : βˆ€ z : PhaseSpace d, charX 0 z = z.1 ∧ charV 0 z = z.2) - (h_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (ΞΌ t)) (charX t z))) - (Set.Icc 0 T) t) : - βˆƒ C : ℝ, 0 ≀ C ∧ - (βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, - β€–(charX s z, charV s z)β€– ≀ C * (β€–zβ€– + 1)) ∧ - (βˆ€ z : PhaseSpace d, - ContinuousOn (fun s => (charX s z, charV s z)) (Set.Icc (0 : ℝ) T)) := by - obtain ⟨M, hM_nn, hM_bd⟩ := hM - set clampT : ℝ β†’ ℝ := fun t => max 0 (min t T) with hclampT_def - have hclampT_mem : βˆ€ t, clampT t ∈ Set.Icc (0 : ℝ) T := by - intro t - simp only [hclampT_def, Set.mem_Icc] - exact ⟨le_max_left _ _, max_le hT_pos.le (min_le_right _ _)⟩ - have hclampT_id : βˆ€ t ∈ Set.Icc (0 : ℝ) T, clampT t = t := by - intro t ht - simp only [hclampT_def, min_eq_left ht.2, max_eq_right ht.1] - set ρc : ℝ β†’ Measure (PhysSpace d) := - fun t => spatialMarginal (ΞΌ (clampT t)) with hρc_def - have hρc_isProb : βˆ€ t, IsProbabilityMeasure (ρc t) := by - intro t - have : IsProbabilityMeasure (ΞΌ (clampT t)) := - (hΞΌ_mom (clampT t) (hclampT_mem t)).1 - exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - have hM_ρ : βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(ρc t) ≀ M := by - intro t _ht - rw [hρc_def] - exact hM_bd (clampT t) (hclampT_mem t) - have h_y_int_ρc : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) (ρc t) := by - intro t ht - have h_eq : ρc t = spatialMarginal (ΞΌ t) := by - simp only [hρc_def, hclampT_id t ht] - rw [h_eq] - exact vlasovGlue_marginal_norm_integrable (ΞΌ t) (hΞΌ_mom t ht) - have h_int_ρc : βˆ€ t (x : PhysSpace d), - Integrable (fun y => gradW (x - y)) (ρc t) := - fun t x => by - have := dobrushinFlow_marginal_gradW_integrable gradW L hL T ΞΌ hΞΌ_mom - (clampT t) (hclampT_mem t) x - simpa only [hρc_def] using this - have h_bdry_ρc : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T, - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (ρc t) (charX t z))) - (Set.Icc 0 T) t := by - intro z t ht - have h_eq : ρc t = spatialMarginal (ΞΌ t) := by - simp only [hρc_def, hclampT_id t ht] - rw [h_eq] - exact h_boundary z t ht - have h_flow_ρc : IsCharacteristicFlowOn gradW ρc charX charV - (Set.Ioo 0 T) Set.univ := by - refine ⟨fun z _ => h_ic z, fun t ht z _ => ?_, fun t ht z _ => ?_⟩ - Β· have ht_Icc : t ∈ Set.Icc (0 : ℝ) T := ⟨ht.1.le, ht.2.le⟩ - exact ((h_bdry_ρc z t ht_Icc).1).hasDerivAt (Icc_mem_nhds ht.1 ht.2) - Β· have ht_Icc : t ∈ Set.Icc (0 : ℝ) T := ⟨ht.1.le, ht.2.le⟩ - exact ((h_bdry_ρc z t ht_Icc).2).hasDerivAt (Icc_mem_nhds ht.1 ht.2) - obtain ⟨h_init_ρc, h_cont_Icc_ρc, h_deriv_Ico_ρc⟩ := - characteristicFlow_boundary_regularity gradW ρc charX charV T hT_pos.le - h_flow_ρc h_bdry_ρc - obtain ⟨C, hC_nn, hC_pair⟩ := - flow_distance_growth_bound_on gradW L hL ρc charX charV T hT_pos.le - h_init_ρc h_cont_Icc_ρc h_deriv_Ico_ρc M hM_nn hM_ρ h_y_int_ρc h_int_ρc - exact ⟨C, hC_nn, hC_pair, h_cont_Icc_ρc⟩ +private alias vlasovGlue_marginal_norm_integrable := + _root_.Vlasov.vlasovGlue_marginal_norm_integrable -/-- Generic seam continuity of the force-integral functional -`s ↦ ∫ βŸͺV s z, βˆ‡β‚“Ο†(Ξ¦ s z)⟫ βˆ’ βŸͺ(gradW ⋆ ρ s)(X s z), βˆ‡α΅₯Ο†(Ξ¦ s z)⟫ βˆ‚fβ‚€` -at a window endpoint, by dominated convergence. `S` is the one-sided -neighborhood filter set (`Iic T` or `Ici T`), `W` the compact window -(`Icc 0 T` or `Icc T (T+Tβ‚€)`) carrying the uniform data: a linear growth -bound `C` on the flow, a moment envelope `M` on the marginal curve `ρ`, and -kernel integrability. Instantiated on the LEFT by `f_prev`'s window flow and -on the RIGHT by the composed flow off `g`. -/ -private lemma vlasovGlue_seam_forceIntegral_cont - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (hgradXΟ†_cont : Continuous gradXΟ†) (hgradVΟ†_cont : Continuous gradVΟ†) - (M_Ο† : ℝ) - (hgradXΟ†_bd : βˆ€ z : PhaseSpace d, β€–gradXΟ† zβ€– ≀ M_Ο†) - (hgradVΟ†_bd : βˆ€ z : PhaseSpace d, β€–gradVΟ† zβ€– ≀ M_Ο†) - (ρ : ℝ β†’ Measure (PhysSpace d)) - (X V : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (Tβ‚€ : ℝ) (S : Set ℝ) (W : Set ℝ) - (hW_nhd : W ∈ nhdsWithin Tβ‚€ S) - (hρ_prob : βˆ€ s ∈ W, IsProbabilityMeasure (ρ s)) - (M : ℝ) (hM : βˆ€ s ∈ W, ∫ y, β€–yβ€– βˆ‚(ρ s) ≀ M) - (h_y_int : βˆ€ s ∈ W, Integrable (fun y : PhysSpace d => β€–yβ€–) (ρ s)) - (h_int : βˆ€ s ∈ W, βˆ€ x : PhysSpace d, Integrable (fun y => gradW (x - y)) (ρ s)) - (C : ℝ) - (hC_pair : βˆ€ s ∈ W, βˆ€ z : PhaseSpace d, β€–(X s z, V s z)β€– ≀ C * (β€–zβ€– + 1)) - (h_aemeas : βˆ€ s ∈ W, AEMeasurable (fun z : PhaseSpace d => (X s z, V s z)) fβ‚€) - (h_X_cont : βˆ€ z : PhaseSpace d, ContinuousWithinAt (fun s => X s z) S Tβ‚€) - (h_V_cont : βˆ€ z : PhaseSpace d, ContinuousWithinAt (fun s => V s z) S Tβ‚€) - (h_conv_cwn : βˆ€ z : PhaseSpace d, ContinuousWithinAt - (fun s => convolveFunctionMeasure gradW (ρ s) (X s z)) S Tβ‚€) : - ContinuousWithinAt - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ s) (X s z)) - (gradVΟ† (X s z, V s z))) βˆ‚fβ‚€) S Tβ‚€ := by - set bound_fn : PhaseSpace d β†’ ℝ := fun z => - M_Ο† * (C * (β€–zβ€– + 1)) - + (β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M) * M_Ο† - with hbound_def - have hbound_int : Integrable bound_fn fβ‚€ := by - have ha : Integrable - (fun z : PhaseSpace d => - (M_Ο† * C + L * M_Ο† * C) * β€–zβ€– - + (M_Ο† * C + (β€–gradW 0β€– + L * C + L * M) * M_Ο†)) fβ‚€ := - (hfβ‚€_int.const_mul _).add (integrable_const _) - refine ha.congr (Filter.Eventually.of_forall fun z => ?_) - simp only [hbound_def]; ring - have h_conv_force : βˆ€ s ∈ W, βˆ€ x : PhysSpace d, - β€–convolveFunctionMeasure gradW (ρ s) xβ€– - ≀ β€–gradW 0β€– + (L : ℝ) * β€–xβ€– + (L : ℝ) * M := by - intro s hs x - have := hρ_prob s hs - exact vlasovGlue_conv_force_bound gradW L hL (ρ s) M (hM s hs) - (h_y_int s hs) (h_int s hs) x - have hB : βˆ€ s ∈ W, βˆ€ z : PhaseSpace d, - β€–@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ s) (X s z)) - (gradVΟ† (X s z, V s z))β€– ≀ bound_fn z := by - intro s hs z - have hV : β€–V s zβ€– ≀ C * (β€–zβ€– + 1) := - le_trans (norm_snd_le (X s z, V s z)) (hC_pair s hs z) - have hX : β€–X s zβ€– ≀ C * (β€–zβ€– + 1) := - le_trans (norm_fst_le (X s z, V s z)) (hC_pair s hs z) - have ht1 : β€–@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z))β€– - ≀ M_Ο† * (C * (β€–zβ€– + 1)) := by - refine le_trans (norm_inner_le_norm _ _) ?_ - have := mul_le_mul hV (hgradXΟ†_bd (X s z, V s z)) - (norm_nonneg _) (le_trans (norm_nonneg _) hV) - calc β€–V s zβ€– * β€–gradXΟ† (X s z, V s z)β€– - ≀ (C * (β€–zβ€– + 1)) * M_Ο† := this - _ = M_Ο† * (C * (β€–zβ€– + 1)) := by ring - have ht2 : β€–@inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ s) (X s z)) - (gradVΟ† (X s z, V s z))β€– - ≀ (β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M) * M_Ο† := by - refine le_trans (norm_inner_le_norm _ _) ?_ - have hc : β€–convolveFunctionMeasure gradW (ρ s) (X s z)β€– - ≀ β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M := by - refine le_trans (h_conv_force s hs (X s z)) ?_ - have := mul_le_mul_of_nonneg_left hX L.coe_nonneg - linarith - have hcnn : 0 ≀ β€–gradW 0β€– + (L : ℝ) * (C * (β€–zβ€– + 1)) + (L : ℝ) * M := - le_trans (norm_nonneg _) hc - exact mul_le_mul hc (hgradVΟ†_bd (X s z, V s z)) (norm_nonneg _) hcnn - calc β€–_ - _β€– - ≀ β€–@inner ℝ (PhysSpace d) _ (V s z) (gradXΟ† (X s z, V s z))β€– - + β€–@inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ s) (X s z)) - (gradVΟ† (X s z, V s z))β€– := norm_sub_le _ _ - _ ≀ bound_fn z := by simp only [hbound_def]; linarith - apply continuousWithinAt_of_dominated (bound := bound_fn) - Β· -- AEStronglyMeasurable in z, eventually in s - apply Filter.Eventually.mono hW_nhd - intro s hs - have h_aem_pair := h_aemeas s hs - have h_aem_X : AEMeasurable (fun z : PhaseSpace d => X s z) fβ‚€ := - measurable_fst.comp_aemeasurable h_aem_pair - have h_aem_V : AEMeasurable (fun z : PhaseSpace d => V s z) fβ‚€ := - measurable_snd.comp_aemeasurable h_aem_pair - have h1 : AEStronglyMeasurable - (fun z : PhaseSpace d => @inner ℝ (PhysSpace d) _ (V s z) - (gradXΟ† (X s z, V s z))) fβ‚€ := by - have hg : AEMeasurable (fun z : PhaseSpace d => gradXΟ† (X s z, V s z)) fβ‚€ := - hgradXΟ†_cont.measurable.comp_aemeasurable (h_aem_X.prodMk h_aem_V) - exact (continuous_inner.measurable.comp_aemeasurable - (h_aem_V.prodMk hg)).aestronglyMeasurable - have h2 : AEStronglyMeasurable - (fun z : PhaseSpace d => @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ s) (X s z)) - (gradVΟ† (X s z, V s z))) fβ‚€ := by - have hconv_aem : AEMeasurable - (fun z : PhaseSpace d => convolveFunctionMeasure gradW (ρ s) (X s z)) fβ‚€ := by - have hconv_cont' : Continuous (fun x : PhysSpace d => - convolveFunctionMeasure gradW (ρ s) x) := by - have := hρ_prob s hs - exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL - (ρ s) (h_int s hs)).continuous - exact hconv_cont'.measurable.comp_aemeasurable h_aem_X - have hg : AEMeasurable (fun z : PhaseSpace d => gradVΟ† (X s z, V s z)) fβ‚€ := - hgradVΟ†_cont.measurable.comp_aemeasurable (h_aem_X.prodMk h_aem_V) - exact (continuous_inner.measurable.comp_aemeasurable - (hconv_aem.prodMk hg)).aestronglyMeasurable - exact h1.sub h2 - Β· -- dominator bound, eventually in s - apply Filter.Eventually.mono hW_nhd - intro s hs - exact Filter.Eventually.of_forall fun z => hB s hs z - Β· exact hbound_int - Β· -- pointwise continuity in s, for every z - apply Filter.Eventually.of_forall - intro z - have h_pair_cwn : ContinuousWithinAt (fun s => (X s z, V s z)) S Tβ‚€ := - (h_X_cont z).prodMk (h_V_cont z) - have h_gX_cwn : ContinuousWithinAt - (fun s => gradXΟ† (X s z, V s z)) S Tβ‚€ := - hgradXΟ†_cont.continuousAt.comp_continuousWithinAt h_pair_cwn - have h_gV_cwn : ContinuousWithinAt - (fun s => gradVΟ† (X s z, V s z)) S Tβ‚€ := - hgradVΟ†_cont.continuousAt.comp_continuousWithinAt h_pair_cwn - have h_term1 : ContinuousWithinAt - (fun s => @inner ℝ (PhysSpace d) _ (V s z) - (gradXΟ† (X s z, V s z))) S Tβ‚€ := - (h_V_cont z).inner h_gX_cwn - have h_term2 : ContinuousWithinAt - (fun s => @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (ρ s) (X s z)) - (gradVΟ† (X s z, V s z))) S Tβ‚€ := - (h_conv_cwn z).inner h_gV_cwn - exact h_term1.sub h_term2 +private alias vlasovGlue_moment := + _root_.Vlasov.vlasovGlue_moment -/-- LEFT seam continuity of the force-integral functional at `T`: on `Iic T` -the glued solution agrees with `f_prev` (via `hf_next_le`), whose window -pushforward representation reduces the claim to the generic seam DCT lemma -`vlasovGlue_seam_forceIntegral_cont` on `f_prev`'s window flow. -/ -private lemma vlasovGlue_seam_contLeft - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT_pos : 0 < T) - (f_prev : ℝ β†’ Measure (PhaseSpace d)) - (h_prev_init : f_prev 0 = fβ‚€) - (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) - (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) - (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) - (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) - (Set.Icc 0 T) t) - (h_prev_ic : βˆ€ z : PhaseSpace d, charX_prev 0 z = z.1 ∧ charV_prev 0 z = z.2) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (Ο† : PhaseSpace d β†’ ℝ) - (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) (hΟ†_compact : HasCompactSupport Ο†) - (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) - (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : - ContinuousWithinAt - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) (Set.Iic T) T := by - have h_nhd_L : Set.Icc (0 : ℝ) T ∈ nhdsWithin T (Set.Iic T) := - Icc_mem_nhdsLE hT_pos - have hgradXΟ†_cont : Continuous gradXΟ† := - vlasovGlue_gradXΟ†_continuous Ο† hΟ†_smooth gradXΟ† hgradXΟ† - have hgradVΟ†_cont : Continuous gradVΟ† := - vlasovGlue_gradVΟ†_continuous Ο† hΟ†_smooth gradVΟ† hgradVΟ† - have h_int_marg := dobrushinFlow_marginal_gradW_integrable gradW L hL T - f_prev h_prev_mom - have h_push_marg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - spatialMarginal (f_prev s) - = Measure.map (fun z : PhaseSpace d => charX_prev s z) fβ‚€ := by - intro s hs - have h_pair_aem : AEMeasurable - (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas s hs - unfold spatialMarginal - rw [h_prev_push s hs, h_prev_init, - AEMeasurable.map_map_of_aemeasurable measurable_fst.aemeasurable h_pair_aem] - rfl - have h_aemeas_marg : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => charX_prev s z) fβ‚€ := by - intro s hs - have h_pair_aem : AEMeasurable - (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas s hs - exact measurable_fst.comp_aemeasurable h_pair_aem - obtain ⟨M_ρ, hM_ρ_nn, hM_ρ⟩ := hM_prev - have h_y_int_marg : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (f_prev t)) := - fun t ht => vlasovGlue_marginal_norm_integrable (f_prev t) (h_prev_mom t ht) - obtain ⟨C_T, hC_T_nn, hC_T_pair, h_cont_Icc_prev⟩ := - vlasovGlue_flow_growthBound gradW L hL f_prev charX_prev charV_prev - T hT_pos h_prev_mom ⟨M_ρ, hM_ρ_nn, hM_ρ⟩ h_prev_ic h_prev_boundary - have hC_T : βˆ€ s ∈ Set.Icc (0 : ℝ) T, βˆ€ z : PhaseSpace d, - β€–charX_prev s zβ€– ≀ C_T * (β€–zβ€– + 1) := by - intro s hs z - exact le_trans (norm_fst_le (charX_prev s z, charV_prev s z)) - (hC_T_pair s hs z) - have h_conv_z_cont : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - Continuous (fun z : PhaseSpace d => - convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) z.1) := by - intro s hs - have : IsProbabilityMeasure (f_prev s) := (h_prev_mom s hs).1 - have : IsProbabilityMeasure (spatialMarginal (f_prev s)) := - (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL - (spatialMarginal (f_prev s)) (h_int_marg s hs)).continuous.comp continuous_fst - have h_integrand_cont : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - Continuous (fun z : PhaseSpace d => - @inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) z.1) - (gradVΟ† z)) := by - intro s hs - exact (continuous_snd.inner hgradXΟ†_cont).sub - ((h_conv_z_cont s hs).inner hgradVΟ†_cont) - have h_eq_L : (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) - =αΆ [nhdsWithin T (Set.Iic T)] - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev s z) - (gradXΟ† (charX_prev s z, charV_prev s z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) - (charX_prev s z)) - (gradVΟ† (charX_prev s z, charV_prev s z))) βˆ‚fβ‚€) := by - apply Filter.Eventually.mono h_nhd_L - intro s hs - have h_fnext : f_next s = f_prev s := hf_next_le s hs.2 - have h_marg : spatialMarginal (f_next s) = spatialMarginal (f_prev s) := - congrArg spatialMarginal h_fnext - have h_aemeas_fβ‚€ : AEMeasurable - (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas s hs - change (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) - = ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev s z) - (gradXΟ† (charX_prev s z, charV_prev s z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) - (charX_prev s z)) - (gradVΟ† (charX_prev s z, charV_prev s z))) βˆ‚fβ‚€ - have h_meq : f_next s - = Measure.map - (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := by - rw [h_fnext, h_prev_push s hs, h_prev_init] - rw [h_marg, h_meq, - integral_map h_aemeas_fβ‚€ - (h_integrand_cont s hs).aestronglyMeasurable] - obtain ⟨M_Ο†, hgradXΟ†_bd, hgradVΟ†_bd⟩ := - vlasovGlue_gradΟ†_bound Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† - have h_X_cont : βˆ€ z : PhaseSpace d, - ContinuousWithinAt (fun s => charX_prev s z) (Set.Iic T) T := fun z => - ((h_prev_boundary z T - ⟨hT_pos.le, le_refl T⟩).1.continuousWithinAt).mono_of_mem_nhdsWithin h_nhd_L - have h_V_cont : βˆ€ z : PhaseSpace d, - ContinuousWithinAt (fun s => charV_prev s z) (Set.Iic T) T := fun z => - ((h_prev_boundary z T - ⟨hT_pos.le, le_refl T⟩).2.continuousWithinAt).mono_of_mem_nhdsWithin h_nhd_L - have h_conv_cwn : βˆ€ z : PhaseSpace d, ContinuousWithinAt - (fun s => convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) - (charX_prev s z)) (Set.Iic T) T := fun z => - flowConv_continuousWithinAt_Iic_seam gradW L hL charX_prev fβ‚€ - hfβ‚€_int hT_pos (fun s => spatialMarginal (f_prev s)) - h_push_marg h_aemeas_marg - (fun z' => (h_cont_Icc_prev z').continuousWithinAt - (Set.right_mem_Icc.mpr hT_pos.le) |>.fst) C_T hC_T_nn hC_T z - have h_cont_pf : ContinuousWithinAt - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev s z) - (gradXΟ† (charX_prev s z, charV_prev s z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_prev s)) - (charX_prev s z)) - (gradVΟ† (charX_prev s z, charV_prev s z))) βˆ‚fβ‚€) - (Set.Iic T) T := - vlasovGlue_seam_forceIntegral_cont gradW L hL fβ‚€ hfβ‚€_int gradXΟ† gradVΟ† - hgradXΟ†_cont hgradVΟ†_cont M_Ο† hgradXΟ†_bd hgradVΟ†_bd - (fun s => spatialMarginal (f_prev s)) charX_prev charV_prev - T (Set.Iic T) (Set.Icc 0 T) h_nhd_L - (fun s hs => by - have : IsProbabilityMeasure (f_prev s) := (h_prev_mom s hs).1 - exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance) - M_ρ hM_ρ h_y_int_marg h_int_marg C_T hC_T_pair - (fun s hs => h_prev_init β–Έ h_prev_aemeas s hs) - h_X_cont h_V_cont h_conv_cwn - have h_val_T : (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next T)) z.1) - (gradVΟ† z)) βˆ‚(f_next T)) - = ∫ z, (@inner ℝ (PhysSpace d) _ (charV_prev T z) - (gradXΟ† (charX_prev T z, charV_prev T z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_prev T)) - (charX_prev T z)) - (gradVΟ† (charX_prev T z, charV_prev T z))) βˆ‚fβ‚€ := by - have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_fnext_T : f_next T = f_prev T := hf_next_le T (le_refl T) - have h_marg : spatialMarginal (f_next T) = spatialMarginal (f_prev T) := - congrArg spatialMarginal h_fnext_T - have h_aemeas_fβ‚€_T : AEMeasurable - (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas T hT_Icc - have h_meq : f_next T - = Measure.map - (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := by - rw [h_fnext_T, h_prev_push T hT_Icc, h_prev_init] - rw [h_marg, h_meq, - integral_map h_aemeas_fβ‚€_T (h_integrand_cont T hT_Icc).aestronglyMeasurable] - exact h_cont_pf.congr_of_eventuallyEq h_eq_L h_val_T +private alias vlasovGlue_moment_flat := + _root_.Vlasov.vlasovGlue_moment_flat -/-- A shifted flow curve `s ↦ Ξ¦ (s βˆ’ T) w` is continuous within `Ici T` at `T` -when the unshifted curve has a one-sided derivative at `0` on `[0, T_0]`. -/ -private lemma vlasovGlue_shifted_flow_contWithin - {d : β„•} - (charW : ℝ β†’ PhaseSpace d β†’ PhysSpace d) (w : PhaseSpace d) {vβ‚€ : PhysSpace d} - (T : ℝ) {T_0 : ℝ} (hT_0_pos : 0 < T_0) - (hb : HasDerivWithinAt (fun s => charW s w) vβ‚€ (Set.Icc 0 T_0) 0) : - ContinuousWithinAt (fun s => charW (s - T) w) (Set.Ici T) T := by - have h_nhdsW_0 : Set.Icc (0 : ℝ) T_0 ∈ nhdsWithin 0 (Set.Ici 0) := - Icc_mem_nhdsGE hT_0_pos - have h_cont : ContinuousWithinAt (fun s => charW s w) (Set.Ici 0) 0 := - hb.continuousWithinAt.mono_of_mem_nhdsWithin h_nhdsW_0 - have h_sub_cont : ContinuousWithinAt (fun s : ℝ => s - T) (Set.Ici T) T := - ((continuous_id.sub continuous_const).continuousAt).continuousWithinAt - have h_sub_maps : Set.MapsTo (fun s : ℝ => s - T) (Set.Ici T) (Set.Ici 0) := - fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) - exact ContinuousWithinAt.comp_of_eq h_cont h_sub_cont h_sub_maps (sub_self T) +private alias vlasovGlue_pushforward_eq := + _root_.Vlasov.vlasovGlue_pushforward_eq -/-- Composed-pushforward infrastructure on the glued window `[T, T+T_0]`: -`g (sβˆ’T)` is the pushforward of `fβ‚€` by the composed phase-space flow -(`g`'s window flow after the outer time-`T` map `(XT, VT)`), its spatial -marginal is the pushforward by the composed position map, and both composed -maps are a.e.-measurable. -/ -private lemma vlasovGlue_composed_pushforward - {d : β„•} - (fβ‚€ : Measure (PhaseSpace d)) - (g : ℝ β†’ Measure (PhaseSpace d)) - (f_prevT : Measure (PhaseSpace d)) - (charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (XT VT : PhaseSpace d β†’ PhysSpace d) - {T T_0 : ℝ} - (h_outer_aemeas : AEMeasurable (fun z : PhaseSpace d => (XT z, VT z)) fβ‚€) - (h_prevT_push : f_prevT = Measure.map (fun z : PhaseSpace d => (XT z, VT z)) fβ‚€) - (hg_init : g 0 = f_prevT) - (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) - (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) : - (βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => - (charX_g Ο„ (XT z, VT z), charV_g Ο„ (XT z, VT z))) fβ‚€) ∧ - (βˆ€ s ∈ Set.Icc T (T + T_0), - g (s - T) = Measure.map (fun z : PhaseSpace d => - (charX_g (s - T) (XT z, VT z), charV_g (s - T) (XT z, VT z))) fβ‚€) ∧ - (βˆ€ s ∈ Set.Icc T (T + T_0), - spatialMarginal (g (s - T)) = Measure.map (fun z : PhaseSpace d => - charX_g (s - T) (XT z, VT z)) fβ‚€) ∧ - (βˆ€ s ∈ Set.Icc T (T + T_0), - AEMeasurable (fun z : PhaseSpace d => charX_g (s - T) (XT z, VT z)) fβ‚€) := by - have h_g_at_aemeas : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => (charX_g Ο„ z, charV_g Ο„ z)) - (Measure.map (fun z : PhaseSpace d => (XT z, VT z)) fβ‚€) := by - intro Ο„ hΟ„ - have := hg_aemeas_ex Ο„ hΟ„ - rw [hg_init, h_prevT_push] at this - exact this - have h_comp_aemeas : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => - (charX_g Ο„ (XT z, VT z), charV_g Ο„ (XT z, VT z))) fβ‚€ := by - intro Ο„ hΟ„ - exact (h_g_at_aemeas Ο„ hΟ„).comp_aemeasurable h_outer_aemeas - have h_push_comp : βˆ€ s ∈ Set.Icc T (T + T_0), - g (s - T) = Measure.map (fun z : PhaseSpace d => - (charX_g (s - T) (XT z, VT z), charV_g (s - T) (XT z, VT z))) fβ‚€ := by - intro s hs - have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - rw [hg_push_ex (s - T) hsT_Icc, hg_init, h_prevT_push, - AEMeasurable.map_map_of_aemeasurable - (h_g_at_aemeas (s - T) hsT_Icc) h_outer_aemeas] - rfl - refine ⟨h_comp_aemeas, h_push_comp, fun s hs => ?_, fun s hs => ?_⟩ - Β· have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - unfold spatialMarginal - rw [h_push_comp s hs, - AEMeasurable.map_map_of_aemeasurable measurable_fst.aemeasurable - (h_comp_aemeas (s - T) hsT_Icc)] - rfl - Β· have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - exact measurable_fst.comp_aemeasurable (h_comp_aemeas (s - T) hsT_Icc) +private alias vlasovGlue_seam_contLeft := + _root_.Vlasov.vlasovGlue_seam_contLeft -/-- Pointwise composed-pushforward rewrite of the force integral on the glued -window: for `s ∈ [T, T+T_0]` the integral of the force integrand against -`f_next s` equals the integral of the flow-composed integrand against `fβ‚€`. -Serves both the eventually-equal rewrite and the value-at-`T` bridge of the -RIGHT seam close. -/ -private lemma vlasovGlue_composed_integral_eq - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (fβ‚€ : Measure (PhaseSpace d)) - {T T_0 : ℝ} (hT_pos : 0 < T) - (f_prev g : ℝ β†’ Measure (PhaseSpace d)) - (h_prev_init : f_prev 0 = fβ‚€) - (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (hg_init : g 0 = f_prev T) - (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_T : f_next T = f_prev T) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) - (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (h_comp_aemeas : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => - (charX_g Ο„ (charX_prev T z, charV_prev T z), - charV_g Ο„ (charX_prev T z, charV_prev T z))) fβ‚€) - (h_g_push_comp : βˆ€ s ∈ Set.Icc T (T + T_0), - g (s - T) = Measure.map (fun z : PhaseSpace d => - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€) - (h_integrand_cont : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - Continuous (fun z : PhaseSpace d => - @inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (g Ο„)) z.1) - (gradVΟ† z))) - (s : ℝ) (hs : s ∈ Set.Icc T (T + T_0)) : - (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) - = ∫ z, (@inner ℝ (PhysSpace d) _ - (charV_g (s - T) (charX_prev T z, charV_prev T z)) - (gradXΟ† (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) - (charX_g (s - T) (charX_prev T z, charV_prev T z))) - (gradVΟ† (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z)))) βˆ‚fβ‚€ := by - have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - by_cases hs_eq : s = T - Β· -- s = T: f_next T = f_prev T = composed pushforward (collapse g at 0 = id) - have hs_T_zero : s - T = 0 := by rw [hs_eq]; exact sub_self T - have h_fnext_s : f_next s = f_prev T := by - rw [hs_eq]; exact hf_next_T - have h_marg_eq : spatialMarginal (f_next s) = spatialMarginal (g (s - T)) := by - rw [h_fnext_s, hs_T_zero, hg_init] - have h_meq : f_next s = Measure.map - (fun z : PhaseSpace d => - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := by - rw [h_fnext_s, h_prev_push T hT_Icc, h_prev_init] - apply Measure.map_congr - apply Filter.Eventually.of_forall - intro z - simp only [hs_T_zero, (hg_init_cond _).1, (hg_init_cond _).2] - rw [h_marg_eq, h_meq, - integral_map (h_comp_aemeas (s - T) hsT_Icc) - (h_integrand_cont (s - T) hsT_Icc).aestronglyMeasurable] - Β· -- s > T: f_next s = g (s βˆ’ T) = composed pushforward - have hs_gt : T < s := lt_of_le_of_ne hs.1 (Ne.symm hs_eq) - have h_fnext_s : f_next s = g (s - T) := hf_next_gt s hs_gt - have h_marg_eq : spatialMarginal (f_next s) = spatialMarginal (g (s - T)) := - congrArg spatialMarginal h_fnext_s - have h_meq : f_next s = Measure.map - (fun z : PhaseSpace d => - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := by - rw [h_fnext_s]; exact h_g_push_comp s hs - rw [h_marg_eq, h_meq, - integral_map (h_comp_aemeas (s - T) hsT_Icc) - (h_integrand_cont (s - T) hsT_Icc).aestronglyMeasurable] +private alias vlasovGlue_seam_contRight := + _root_.Vlasov.vlasovGlue_seam_contRight -/-- RIGHT seam continuity of the force-integral functional at `T`: on `Ici T` -the glued solution is `g (Β·βˆ’T)` (via `hf_next_T`/`hf_next_gt`), represented as -the composed pushforward of `fβ‚€` by `g`'s window flow after `f_prev`'s time-`T` -flow; the claim reduces to the generic seam DCT lemma -`vlasovGlue_seam_forceIntegral_cont` on the composed flow. -/ -private lemma vlasovGlue_seam_contRight - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - (hfβ‚€_int : Integrable (fun z : PhaseSpace d => β€–zβ€–) fβ‚€) - {T : ℝ} (hT_pos : 0 < T) {T_0 : ℝ} (hT_0_pos : 0 < T_0) - (f_prev : ℝ β†’ Measure (PhaseSpace d)) - (h_prev_init : f_prev 0 = fβ‚€) - (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) - (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) - (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) - (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) - (Set.Icc 0 T) t) - (h_prev_ic : βˆ€ z : PhaseSpace d, charX_prev 0 z = z.1 ∧ charV_prev 0 z = z.2) - (g : ℝ β†’ Measure (PhaseSpace d)) - (charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hg_init : g 0 = f_prev T) - (hg_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, HasFiniteFirstMoment (g t)) - (hg_mom_unif : βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (g t)) ≀ M) - (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) - (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) - (hg_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - HasDerivWithinAt (fun s => charX_g s z) (charV_g t z) (Set.Icc 0 T_0) t ∧ - HasDerivWithinAt (fun s => charV_g s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t z))) - (Set.Icc 0 T_0) t) - (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_T : f_next T = f_prev T) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) - (Ο† : PhaseSpace d β†’ ℝ) - (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) (hΟ†_compact : HasCompactSupport Ο†) - (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) - (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : - ContinuousWithinAt - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) (Set.Ici T) T := by - have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_nhd_R : Set.Icc T (T + T_0) ∈ nhdsWithin T (Set.Ici T) := - Icc_mem_nhdsGE (by linarith : T < T + T_0) - have h_outer_aemeas : AEMeasurable - (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas T hT_Icc - set Zpos : ℝ β†’ PhaseSpace d β†’ PhysSpace d := - fun s z => charX_g (s - T) (charX_prev T z, charV_prev T z) with hZpos_def - set Zvel : ℝ β†’ PhaseSpace d β†’ PhysSpace d := - fun s z => charV_g (s - T) (charX_prev T z, charV_prev T z) with hZvel_def - have hgradXΟ†_cont : Continuous gradXΟ† := - vlasovGlue_gradXΟ†_continuous Ο† hΟ†_smooth gradXΟ† hgradXΟ† - have hgradVΟ†_cont : Continuous gradVΟ† := - vlasovGlue_gradVΟ†_continuous Ο† hΟ†_smooth gradVΟ† hgradVΟ† - have h_int_marg_g := dobrushinFlow_marginal_gradW_integrable gradW L hL T_0 - g hg_mom - -- Composed pushforward of g's spatial marginal (hoisted helper), bridged to - -- the Zpos/Zvel forms. - have h_prevT_push : f_prev T - = Measure.map (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := by - rw [h_prev_push T hT_Icc, h_prev_init] - obtain ⟨h_comp_aemeas, h_g_push_comp', h_push_marg', h_aemeas_marg'⟩ := - vlasovGlue_composed_pushforward fβ‚€ g (f_prev T) charX_g charV_g - (charX_prev T) (charV_prev T) h_outer_aemeas h_prevT_push hg_init - hg_push_ex hg_aemeas_ex - have h_g_push_comp : βˆ€ s ∈ Set.Icc T (T + T_0), - g (s - T) = Measure.map - (fun z : PhaseSpace d => (Zpos s z, Zvel s z)) fβ‚€ := by - intro s hs - simpa only [hZpos_def, hZvel_def] using h_g_push_comp' s hs - have h_push_marg : βˆ€ s ∈ Set.Icc T (T + T_0), - spatialMarginal (g (s - T)) - = Measure.map (fun z : PhaseSpace d => Zpos s z) fβ‚€ := by - intro s hs - simpa only [hZpos_def] using h_push_marg' s hs - have h_aemeas_marg : βˆ€ s ∈ Set.Icc T (T + T_0), - AEMeasurable (fun z : PhaseSpace d => Zpos s z) fβ‚€ := by - intro s hs - simpa only [hZpos_def] using h_aemeas_marg' s hs - -- Composed growth bound: Piece A on g over [0,T_0] composed with Piece A on - -- prev at T (both via the hoisted clamp construction). - obtain ⟨C_prev, hC_prev_nn, hC_prev_pair, _h_cont_Icc_prev⟩ := - vlasovGlue_flow_growthBound gradW L hL f_prev charX_prev charV_prev - T hT_pos h_prev_mom hM_prev h_prev_ic h_prev_boundary - obtain ⟨C_g, hC_g_nn, hC_g_pair, _h_cont_Icc_g⟩ := - vlasovGlue_flow_growthBound gradW L hL g charX_g charV_g - T_0 hT_0_pos hg_mom hg_mom_unif hg_init_cond hg_boundary - obtain ⟨M_g, _hM_g_nn, hM_g_bd⟩ := hg_mom_unif - have h_y_int_marg_g : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - Integrable (fun y : PhysSpace d => β€–yβ€–) (spatialMarginal (g Ο„)) := - fun Ο„ hΟ„ => vlasovGlue_marginal_norm_integrable (g Ο„) (hg_mom Ο„ hΟ„) - set C_comp : ℝ := C_g * C_prev + C_g with hC_comp_def - have hC_comp_nn : 0 ≀ C_comp := by positivity - have hC_comp_pair : βˆ€ s ∈ Set.Icc T (T + T_0), βˆ€ z : PhaseSpace d, - β€–(Zpos s z, Zvel s z)β€– ≀ C_comp * (β€–zβ€– + 1) := by - intro s hs z - have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - have h_prev : β€–(charX_prev T z, charV_prev T z)β€– ≀ C_prev * (β€–zβ€– + 1) := - hC_prev_pair T hT_Icc z - have h_g : β€–(charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))β€– - ≀ C_g * (β€–(charX_prev T z, charV_prev T z)β€– + 1) := - hC_g_pair (s - T) hsT_Icc (charX_prev T z, charV_prev T z) - have hz1 : (0 : ℝ) ≀ β€–zβ€– + 1 := by positivity - calc β€–(Zpos s z, Zvel s z)β€– - = β€–(charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))β€– := by - simp only [hZpos_def, hZvel_def] - _ ≀ C_g * (β€–(charX_prev T z, charV_prev T z)β€– + 1) := h_g - _ ≀ C_g * (C_prev * (β€–zβ€– + 1) + 1) := by - apply mul_le_mul_of_nonneg_left _ hC_g_nn; linarith - _ ≀ C_comp * (β€–zβ€– + 1) := by - simp only [hC_comp_def] - nlinarith [mul_nonneg hC_g_nn (norm_nonneg z), - mul_nonneg (mul_nonneg hC_g_nn hC_prev_nn) hz1] - have hC_comp_X : βˆ€ s ∈ Set.Icc T (T + T_0), βˆ€ z : PhaseSpace d, - β€–Zpos s zβ€– ≀ C_comp * (β€–zβ€– + 1) := by - intro s hs z - exact le_trans (norm_fst_le (Zpos s z, Zvel s z)) (hC_comp_pair s hs z) - -- Seam continuity of the composed flow at T (hoisted shift helper). - have h_Zpos_cont : βˆ€ z : PhaseSpace d, - ContinuousWithinAt (fun s => Zpos s z) (Set.Ici T) T := by - intro z - have := vlasovGlue_shifted_flow_contWithin charX_g - (charX_prev T z, charV_prev T z) T hT_0_pos - (hg_boundary (charX_prev T z, charV_prev T z) 0 ⟨le_refl 0, hT_0_pos.le⟩).1 - simpa only [hZpos_def] using this - have h_Zvel_cont : βˆ€ z : PhaseSpace d, - ContinuousWithinAt (fun s => Zvel s z) (Set.Ici T) T := by - intro z - have := vlasovGlue_shifted_flow_contWithin charV_g - (charX_prev T z, charV_prev T z) T hT_0_pos - (hg_boundary (charX_prev T z, charV_prev T z) 0 ⟨le_refl 0, hT_0_pos.le⟩).2 - simpa only [hZvel_def] using this - -- Continuity of the un-pushed integrand in z (for integral_map's - -- AEStronglyMeasurable side). - have h_conv_z_cont : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - Continuous (fun z : PhaseSpace d => - convolveFunctionMeasure gradW (spatialMarginal (g Ο„)) z.1) := by - intro Ο„ hΟ„ - have : IsProbabilityMeasure (g Ο„) := (hg_mom Ο„ hΟ„).1 - have : IsProbabilityMeasure (spatialMarginal (g Ο„)) := - (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance - exact (convolveFunctionMeasure_lipschitz_in_x gradW L hL - (spatialMarginal (g Ο„)) (h_int_marg_g Ο„ hΟ„)).continuous.comp continuous_fst - have h_integrand_cont : βˆ€ Ο„ ∈ Set.Icc (0 : ℝ) T_0, - Continuous (fun z : PhaseSpace d => - @inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (g Ο„)) z.1) - (gradVΟ† z)) := by - intro Ο„ hΟ„ - exact (continuous_snd.inner hgradXΟ†_cont).sub - ((h_conv_z_cont Ο„ hΟ„).inner hgradVΟ†_cont) - -- Eventually-equal rewrite to the composed-pushforward form (pointwise helper). - have h_intg_eq := vlasovGlue_composed_integral_eq gradW fβ‚€ hT_pos f_prev g - h_prev_init charX_prev charV_prev charX_g charV_g h_prev_push hg_init - hg_init_cond f_next hf_next_T hf_next_gt gradXΟ† gradVΟ† h_comp_aemeas - h_g_push_comp' h_integrand_cont - have h_eq_R : (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) - =αΆ [nhdsWithin T (Set.Ici T)] - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (Zvel s z) - (gradXΟ† (Zpos s z, Zvel s z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) - (Zpos s z)) - (gradVΟ† (Zpos s z, Zvel s z))) βˆ‚fβ‚€) := by - apply Filter.Eventually.mono h_nhd_R - intro s hs - simpa only [hZpos_def, hZvel_def] using h_intg_eq s hs - obtain ⟨M_Ο†, hgradXΟ†_bd, hgradVΟ†_bd⟩ := - vlasovGlue_gradΟ†_bound Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† - -- DCT via the generic seam lemma on the composed flow. - have h_conv_cwn : βˆ€ z : PhaseSpace d, ContinuousWithinAt - (fun s => convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) - (Zpos s z)) (Set.Ici T) T := fun z => - flowConv_continuousWithinAt_Ici_seam gradW L hL Zpos fβ‚€ - hfβ‚€_int (by linarith : T < T + T_0) - (fun s => spatialMarginal (g (s - T))) - h_push_marg h_aemeas_marg h_Zpos_cont C_comp hC_comp_nn hC_comp_X z - have h_aemeas_W : βˆ€ s ∈ Set.Icc T (T + T_0), - AEMeasurable (fun z : PhaseSpace d => (Zpos s z, Zvel s z)) fβ‚€ := by - intro s hs - have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - simpa only [hZpos_def, hZvel_def] using h_comp_aemeas (s - T) hsT_Icc - have h_cont_pf : ContinuousWithinAt - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ (Zvel s z) - (gradXΟ† (Zpos s z, Zvel s z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (g (s - T))) - (Zpos s z)) - (gradVΟ† (Zpos s z, Zvel s z))) βˆ‚fβ‚€) - (Set.Ici T) T := - vlasovGlue_seam_forceIntegral_cont gradW L hL fβ‚€ hfβ‚€_int gradXΟ† gradVΟ† - hgradXΟ†_cont hgradVΟ†_cont M_Ο† hgradXΟ†_bd hgradVΟ†_bd - (fun s => spatialMarginal (g (s - T))) Zpos Zvel - T (Set.Ici T) (Set.Icc T (T + T_0)) h_nhd_R - (fun s hs => by - have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - have : IsProbabilityMeasure (g (s - T)) := (hg_mom (s - T) hsT_Icc).1 - exact (Measure.isProbabilityMeasure_map_iff measurable_fst.aemeasurable).mpr inferInstance) - M_g - (fun s hs => hM_g_bd (s - T) ⟨by linarith [hs.1], by linarith [hs.2]⟩) - (fun s hs => h_y_int_marg_g (s - T) ⟨by linarith [hs.1], by linarith [hs.2]⟩) - (fun s hs => h_int_marg_g (s - T) ⟨by linarith [hs.1], by linarith [hs.2]⟩) - C_comp hC_comp_pair h_aemeas_W h_Zpos_cont h_Zvel_cont h_conv_cwn - -- Value at T bridge (pointwise helper at s = T). - have h_val_T : (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next T)) z.1) - (gradVΟ† z)) βˆ‚(f_next T)) - = ∫ z, (@inner ℝ (PhysSpace d) _ (Zvel T z) - (gradXΟ† (Zpos T z, Zvel T z)) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (g (T - T))) - (Zpos T z)) - (gradVΟ† (Zpos T z, Zvel T z))) βˆ‚fβ‚€ := by - simpa only [hZpos_def, hZvel_def] using - h_intg_eq T ⟨le_refl T, by linarith⟩ - exact h_cont_pf.congr_of_eventuallyEq h_eq_R h_val_T +private alias vlasovGlue_seam_forceIntegral_cont := + _root_.Vlasov.vlasovGlue_seam_forceIntegral_cont -/-- `HasDerivAt` of the glued position flow at interior times of the extended -window: piecewise from `f_prev`'s flow (`t < T`), the two-sided union of the -boundary bundles (`t = T`), and `g`'s shifted flow (`t > T`). Pure ODE gluing β€” -takes only the position projections of the flow hypotheses. -/ -private lemma vlasovGlue_flowX_hasDerivAt - {d : β„•} - (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) - (h_prev_flowX : βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z : PhaseSpace d, - HasDerivAt (fun s => charX_prev s z) (charV_prev t z) t) - (h_prev_boundaryX : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t) - (hg_boundaryX : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - HasDerivWithinAt (fun s => charX_g s z) (charV_g t z) (Set.Icc 0 T_0) t) - (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) - (t : ℝ) (ht : t ∈ Set.Ioo (0 : ℝ) (T + T_0)) (z : PhaseSpace d) : - HasDerivAt (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - (if t ≀ T then charV_prev t z - else charV_g (t - T) (charX_prev T z, charV_prev T z)) t := by - by_cases ht_le : t ≀ T - Β· simp only [ite_eq_left ht_le] - -- Sub-case: t < T (strict interior) vs t = T (boundary) - by_cases ht_lt : t < T - Β· -- t < T strict: piecewise function = charX_prev Β· z near t - have h_ev : (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] - (fun s => charX_prev s z) := by - apply Filter.Eventually.mono (eventually_lt_nhds ht_lt) - intro s hs; simp [le_of_lt hs] - exact ((h_prev_flowX t ⟨ht.1, ht_lt⟩ z).congr_of_eventuallyEq h_ev) - Β· -- t = T: boundary HasDerivAt via HasDerivWithinAt.union (Iic T βˆͺ Ici T = univ) - push Not at ht_lt - have h_t_eq : t = T := le_antisymm ht_le ht_lt - have hT_in : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_bX := h_prev_boundaryX z T hT_in - have h0_T0_in : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ - have h_g_bX := hg_boundaryX (charX_prev T z, charV_prev T z) 0 h0_T0_in - have h_nhd_L : Set.Icc 0 T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT_pos - have h_nhd_R : Set.Icc 0 T_0 ∈ nhdsWithin (0 : ℝ) (Set.Ici 0) := - Icc_mem_nhdsGE hT_0_pos - -- LEFT: HasDerivWithinAt charX_prev on Iic T at T - have hX_Lic := h_bX.mono_of_mem_nhdsWithin h_nhd_L - have hX_left : HasDerivWithinAt - (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_prev T z) (Set.Iic T) T := - hX_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) Set.self_mem_Iic - -- RIGHT: chain rule from g's boundary at 0 - have hX_Ici0 := h_g_bX.mono_of_mem_nhdsWithin h_nhd_R - have h_sub_R : HasDerivWithinAt (Β· - T) 1 (Set.Ici T) T := - ((hasDerivAt_id' T).sub_const T).hasDerivWithinAt - have h_mapR : Set.MapsTo (Β· - T) (Set.Ici T) (Set.Ici 0) := - fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) - have h_chainX : HasDerivWithinAt - (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_g 0 (charX_prev T z, charV_prev T z)) (Set.Ici T) T := by - have := HasDerivWithinAt.scomp_of_eq T hX_Ici0 h_sub_R h_mapR (sub_self T).symm - simpa [Function.comp_def, one_smul] using this - have hVg0_eq : charV_g 0 (charX_prev T z, charV_prev T z) = charV_prev T z := - (hg_init_cond (charX_prev T z, charV_prev T z)).2 - rw [hVg0_eq] at h_chainX - have hX_right : HasDerivWithinAt - (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_prev T z) (Set.Ici T) T := - h_chainX.congr_of_mem - (fun s hs => by - by_cases hle : s ≀ T - Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) - simp [heq, sub_self, - (hg_init_cond (charX_prev T z, charV_prev T z)).1] - Β· simp [hle]) - Set.self_mem_Ici - have hX_union := hX_left.union hX_right - rw [Set.Iic_union_Ici] at hX_union - rw [h_t_eq] - exact hX_union.hasDerivAt Filter.univ_mem - Β· simp only [ite_eq_right ht_le] - push Not at ht_le - -- t > T: use hg_boundaryX at (t - T) with chain rule for (s ↦ s - T) - have htT_mem : t - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ - have h_g_deriv : HasDerivAt (fun s => charX_g s (charX_prev T z, charV_prev T z)) - (charV_g (t - T) (charX_prev T z, charV_prev T z)) (t - T) := - (hg_boundaryX (charX_prev T z, charV_prev T z) (t - T) - (Set.Ioo_subset_Icc_self htT_mem)).hasDerivAt - (Icc_mem_nhds htT_mem.1 htT_mem.2) - have h_sub : HasDerivAt (Β· - T) 1 t := (hasDerivAt_id' t).sub_const T - have h_chain : HasDerivAt (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) - (charV_g (t - T) (charX_prev T z, charV_prev T z)) t := by - have := HasDerivAt.scomp_of_eq t h_g_deriv h_sub rfl - simpa [Function.comp_def, one_smul] using this - have h_ev : (fun s => if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] - (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) := by - apply Filter.Eventually.mono (eventually_gt_nhds ht_le) - intro s hs; simp [not_le.mpr hs] - exact h_chain.congr_of_eventuallyEq h_ev +private alias vlasovGlue_shifted_flow_contWithin := + _root_.Vlasov.vlasovGlue_shifted_flow_contWithin -/-- `HasDerivAt` of the glued velocity flow at interior times of the extended -window, with the force term against the glued measure `f_next` (consumed only -through its value hypotheses). Mirrors `vlasovGlue_flowX_hasDerivAt` with the -velocity projections and the marginal bridges. -/ -private lemma vlasovGlue_flowV_hasDerivAt - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (f_prev g : ℝ β†’ Measure (PhaseSpace d)) - (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - {T T_0 : ℝ} (hT_pos : 0 < T) (hT_0_pos : 0 < T_0) - (h_prev_flowV : βˆ€ t ∈ Set.Ioo (0 : ℝ) T, βˆ€ z : PhaseSpace d, - HasDerivAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) - (charX_prev t z))) t) - (h_prev_boundaryV : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) - (Set.Icc 0 T) t) - (hg_boundaryV : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - HasDerivWithinAt (fun s => charV_g s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t z))) - (Set.Icc 0 T_0) t) - (hg_init : g 0 = f_prev T) - (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) - (t : ℝ) (ht : t ∈ Set.Ioo (0 : ℝ) (T + T_0)) (z : PhaseSpace d) : - HasDerivAt (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next t)) - (if t ≀ T then charX_prev t z - else charX_g (t - T) (charX_prev T z, charV_prev T z)))) t := by - by_cases ht_le : t ≀ T - Β· simp only [ite_eq_left ht_le] - -- Sub-case: t < T (strict interior) vs t = T (boundary) - by_cases ht_lt : t < T - Β· -- t < T strict: piecewise function = charV_prev Β· z near t - have h_ev : (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] - (fun s => charV_prev s z) := by - apply Filter.Eventually.mono (eventually_lt_nhds ht_lt) - intro s hs; simp [le_of_lt hs] - have h_fnext_t : f_next t = f_prev t := hf_next_le t ht_le - have h_prev_deriv := h_prev_flowV t ⟨ht.1, ht_lt⟩ z - have h_eq_marg : spatialMarginal (f_prev t) = spatialMarginal (f_next t) := - congrArg spatialMarginal h_fnext_t.symm - simp only [h_eq_marg] at h_prev_deriv - exact h_prev_deriv.congr_of_eventuallyEq h_ev - Β· -- t = T: boundary HasDerivAt via HasDerivWithinAt.union (same as charX case) - push Not at ht_lt - have h_t_eq : t = T := le_antisymm ht_le ht_lt - have hT_in : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_bV := h_prev_boundaryV z T hT_in - have h0_T0_in : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ - have h_g_bV := hg_boundaryV (charX_prev T z, charV_prev T z) 0 h0_T0_in - have h_nhd_L : Set.Icc 0 T ∈ nhdsWithin T (Set.Iic T) := Icc_mem_nhdsLE hT_pos - have h_nhd_R : Set.Icc 0 T_0 ∈ nhdsWithin (0 : ℝ) (Set.Ici 0) := - Icc_mem_nhdsGE hT_0_pos - -- Bridge f_prev T ↔ f_next T (for spatial marginal in goal vs h_bV) - have hfnextT : f_next T = f_prev T := hf_next_le T (le_refl T) - have hfnextT_spat : spatialMarginal (f_next T) = spatialMarginal (f_prev T) := - congrArg spatialMarginal hfnextT - -- LEFT: HasDerivWithinAt charV_prev on Iic T at T - have hV_Lic := h_bV.mono_of_mem_nhdsWithin h_nhd_L - have hV_left : HasDerivWithinAt - (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) - (charX_prev T z))) - (Set.Iic T) T := by - rw [hfnextT_spat] - exact hV_Lic.congr_of_mem (fun s hs => by simp [Set.mem_Iic.mp hs]) - Set.self_mem_Iic - -- RIGHT: chain rule from g's boundary at 0 - have hV_Ici0 := h_g_bV.mono_of_mem_nhdsWithin h_nhd_R - have h_sub_R : HasDerivWithinAt (Β· - T) 1 (Set.Ici T) T := - ((hasDerivAt_id' T).sub_const T).hasDerivWithinAt - have h_mapR : Set.MapsTo (Β· - T) (Set.Ici T) (Set.Ici 0) := - fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) - have h_chainV : HasDerivWithinAt - (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW - (spatialMarginal (g 0)) - (charX_g 0 (charX_prev T z, charV_prev T z)))) - (Set.Ici T) T := by - have := HasDerivWithinAt.scomp_of_eq T hV_Ici0 h_sub_R h_mapR (sub_self T).symm - simpa [Function.comp_def, one_smul] using this - have hXg0_eq : charX_g 0 (charX_prev T z, charV_prev T z) = charX_prev T z := - (hg_init_cond (charX_prev T z, charV_prev T z)).1 - have hg0_spat : spatialMarginal (g 0) = spatialMarginal (f_prev T) := - congrArg spatialMarginal hg_init - rw [hXg0_eq, hg0_spat, ← hfnextT_spat] at h_chainV - have hV_right : HasDerivWithinAt - (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next T)) - (charX_prev T z))) - (Set.Ici T) T := - h_chainV.congr_of_mem - (fun s hs => by - by_cases hle : s ≀ T - Β· have heq : s = T := le_antisymm hle (Set.mem_Ici.mp hs) - simp [heq, sub_self, - (hg_init_cond (charX_prev T z, charV_prev T z)).2] - Β· simp [hle]) - Set.self_mem_Ici - have hV_union := hV_left.union hV_right - rw [Set.Iic_union_Ici] at hV_union - rw [h_t_eq] - exact hV_union.hasDerivAt Filter.univ_mem - Β· simp only [ite_eq_right ht_le] - push Not at ht_le - -- t > T: use hg_boundaryV at (t - T) - have htT_mem : t - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ - have h_g_deriv : HasDerivAt (fun s => charV_g s (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (g (t - T))) - (charX_g (t - T) (charX_prev T z, charV_prev T z)))) (t - T) := - (hg_boundaryV (charX_prev T z, charV_prev T z) (t - T) - (Set.Ioo_subset_Icc_self htT_mem)).hasDerivAt - (Icc_mem_nhds htT_mem.1 htT_mem.2) - have h_sub : HasDerivAt (Β· - T) 1 t := (hasDerivAt_id' t).sub_const T - have h_chain : HasDerivAt (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) - (-(convolveFunctionMeasure gradW (spatialMarginal (g (t - T))) - (charX_g (t - T) (charX_prev T z, charV_prev T z)))) t := by - have := HasDerivAt.scomp_of_eq t h_g_deriv h_sub rfl - simpa [Function.comp_def, one_smul] using this - -- f_next t = g (t - T) when t > T - have h_fnext_t : f_next t = g (t - T) := hf_next_gt t ht_le - -- Rewrite derivative value: g (t-T) β†’ f_next t - rw [← congrArg spatialMarginal h_fnext_t] at h_chain - have h_ev : (fun s => if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)) =αΆ [nhds t] - (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) := by - apply Filter.Eventually.mono (eventually_gt_nhds ht_le) - intro s hs; simp [not_le.mpr hs] - exact h_chain.congr_of_eventuallyEq h_ev +private alias vlasovWellPosedness_glue_boundary := + _root_.Vlasov.vlasovWellPosedness_glue_boundary -/-- The weak PDE holds at every time `t' β‰  T` near the seam: to the left the -glued solution is `f_prev` (use its weak PDE), to the right it is `g (Β·βˆ’T)` -(use `g`'s weak PDE with the shift chain rule). -/ -private lemma vlasovGlue_diff_ne - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (f_prev g : ℝ β†’ Measure (PhaseSpace d)) - {T T_0 : ℝ} - (h_prev_vlasov : IsVlasovSolutionOn gradW f_prev T) - (h_g_vlasov : IsVlasovSolutionOn gradW g T_0) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) - (Ο† : PhaseSpace d β†’ ℝ) - (hΟ†_smooth : ContDiff ℝ (⊀ : β„•βˆž) Ο†) (hΟ†_compact : HasCompactSupport Ο†) - (gradXΟ† gradVΟ† : PhaseSpace d β†’ PhysSpace d) - (hgradXΟ† : βˆ€ z : PhaseSpace d, gradXΟ† z = gradient (fun x => Ο† (x, z.2)) z.1) - (hgradVΟ† : βˆ€ z : PhaseSpace d, gradVΟ† z = gradient (fun v => Ο† (z.1, v)) z.2) : - βˆ€ t' ∈ Set.Ioo (0 : ℝ) (T + T_0), t' β‰  T β†’ HasDerivAt - (fun s => ∫ z, Ο† z βˆ‚f_next s) - ((∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next t')) z.1) - (gradVΟ† z)) βˆ‚(f_next t')) + 0) t' := by - intro t' ht' ht'_ne - rcases lt_or_gt_of_ne ht'_ne with ht'_lt | ht'_gt - Β· -- t' < T: use h_prev_vlasov + bridge f_next = f_prev on left of T - have ht'_prev : t' ∈ Set.Ioo (0 : ℝ) T := ⟨ht'.1, ht'_lt⟩ - have h_ev : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhds t'] - (fun s => ∫ z, Ο† z βˆ‚f_prev s) := by - apply Filter.Eventually.mono (eventually_lt_nhds ht'_lt) - intro s hs; simp [hf_next_le s (le_of_lt hs)] - have h_fnext_t' : f_next t' = f_prev t' := hf_next_le t' (le_of_lt ht'_lt) - have h_deriv := h_prev_vlasov Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† - hgradXΟ† hgradVΟ† t' ht'_prev - rw [show (fun _ => (0 : ℝ)) t' = 0 from rfl, add_zero] at h_deriv - have h_marg : spatialMarginal (f_next t') = spatialMarginal (f_prev t') := - congrArg spatialMarginal h_fnext_t' - rw [add_zero, h_marg, h_fnext_t'] - exact h_deriv.congr_of_eventuallyEq h_ev - Β· -- t' > T: use h_g_vlasov + chain rule + bridge f_next = g (Β·-T) - have ht'_g : t' - T ∈ Set.Ioo (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht'.2]⟩ - have h_ev : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhds t'] - (fun s => ∫ z, Ο† z βˆ‚g (s - T)) := by - apply Filter.Eventually.mono (eventually_gt_nhds ht'_gt) - intro s hs; simp [hf_next_gt s hs] - have h_fnext_t' : f_next t' = g (t' - T) := hf_next_gt t' ht'_gt - have h_g_deriv := h_g_vlasov Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† - hgradXΟ† hgradVΟ† (t' - T) ht'_g - rw [show (fun _ => (0 : ℝ)) (t' - T) = 0 from rfl, add_zero] at h_g_deriv - have h_sub : HasDerivAt (Β· - T) 1 t' := (hasDerivAt_id' t').sub_const T - have h_chain : HasDerivAt (fun s => ∫ z, Ο† z βˆ‚g (s - T)) - (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (g (t' - T))) z.1) - (gradVΟ† z)) βˆ‚g (t' - T)) t' := by - have := HasDerivAt.comp_of_eq t' h_g_deriv h_sub rfl - simpa [Function.comp_def, mul_one] using this - have h_marg : spatialMarginal (f_next t') = spatialMarginal (g (t' - T)) := - congrArg spatialMarginal h_fnext_t' - rw [add_zero, h_marg, h_fnext_t'] - exact h_chain.congr_of_eventuallyEq h_ev - -/-- LEFT seam continuity of the plain test-function integral at `T`: on `Iic T` -the glued solution agrees with `f_prev`; DCT with the constant dominator `CΟ†` -against the window pushforward. -/ -private lemma vlasovGlue_intCont_left - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - {T : ℝ} (hT_pos : 0 < T) - (f_prev : ℝ β†’ Measure (PhaseSpace d)) - (h_prev_init : f_prev 0 = fβ‚€) - (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) - (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) - (Set.Icc 0 T) t) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_cont : Continuous Ο†) - (CΟ† : ℝ) (hCΟ† : βˆ€ z : PhaseSpace d, β€–Ο† zβ€– ≀ CΟ†) : - ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) (Set.Iic T) T := by - have h_nhd_L : Set.Icc (0 : ℝ) T ∈ nhdsWithin T (Set.Iic T) := - Icc_mem_nhdsLE hT_pos - -- Equation: f_next = f_prev = pushforward of fβ‚€ on Icc 0 T - have h_eq_L : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhdsWithin T (Set.Iic T)] - (fun s => ∫ z, Ο† (charX_prev s z, charV_prev s z) βˆ‚fβ‚€) := by - apply Filter.Eventually.mono h_nhd_L - intro s hs - change ∫ z, Ο† z βˆ‚f_next s = ∫ z, Ο† (charX_prev s z, charV_prev s z) βˆ‚fβ‚€ - have h_fnext : f_next s = f_prev s := hf_next_le s hs.2 - have h_aemeas_fβ‚€ : AEMeasurable - (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas s hs - rw [h_fnext, h_prev_push s hs, h_prev_init] - exact integral_map h_aemeas_fβ‚€ hΟ†_cont.aestronglyMeasurable - -- DCT for the pushforward-composed form - have h_cont_pf : ContinuousWithinAt - (fun s => ∫ z, Ο† (charX_prev s z, charV_prev s z) βˆ‚fβ‚€) (Set.Iic T) T := by - apply continuousWithinAt_of_dominated (bound := fun _ => CΟ†) - Β· apply Filter.Eventually.mono h_nhd_L - intro s hs - have h_pair_aem : AEMeasurable - (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas s hs - exact (hΟ†_cont.measurable.comp_aemeasurable h_pair_aem).aestronglyMeasurable - Β· apply Filter.Eventually.mono h_nhd_L - intro s _ - exact Filter.Eventually.of_forall fun z => hCΟ† _ - Β· exact integrable_const _ - Β· apply Filter.Eventually.of_forall - intro z - have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_bX := (h_prev_boundary z T hT_Icc).1 - have h_bV := (h_prev_boundary z T hT_Icc).2 - have h_pair_Icc : ContinuousWithinAt - (fun s => (charX_prev s z, charV_prev s z)) (Set.Icc 0 T) T := - h_bX.continuousWithinAt.prodMk h_bV.continuousWithinAt - have h_pair_Iic : ContinuousWithinAt - (fun s => (charX_prev s z, charV_prev s z)) (Set.Iic T) T := - h_pair_Icc.mono_of_mem_nhdsWithin h_nhd_L - exact hΟ†_cont.continuousAt.comp_continuousWithinAt h_pair_Iic - -- Value at T: bridge via the pushforward formula - have h_val_T : (∫ z, Ο† z βˆ‚f_next T) - = ∫ z, Ο† (charX_prev T z, charV_prev T z) βˆ‚fβ‚€ := by - have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_fnext_T : f_next T = f_prev T := hf_next_le T (le_refl T) - have h_aemeas_fβ‚€_T : AEMeasurable - (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas T hT_Icc - rw [h_fnext_T, h_prev_push T hT_Icc, h_prev_init] - exact integral_map h_aemeas_fβ‚€_T hΟ†_cont.aestronglyMeasurable - exact h_cont_pf.congr_of_eventuallyEq h_eq_L h_val_T - -/-- RIGHT seam continuity of the plain test-function integral at `T`: on -`Ici T` the glued solution is the composed pushforward off `g`; DCT with the -constant dominator `CΟ†`. -/ -private lemma vlasovGlue_intCont_right - {d : β„•} - (gradW : PhysSpace d β†’ PhysSpace d) - (fβ‚€ : Measure (PhaseSpace d)) [IsProbabilityMeasure fβ‚€] - {T : ℝ} (hT_pos : 0 < T) {T_0 : ℝ} (hT_0_pos : 0 < T_0) - (f_prev : ℝ β†’ Measure (PhaseSpace d)) - (h_prev_init : f_prev 0 = fβ‚€) - (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) - (g : ℝ β†’ Measure (PhaseSpace d)) - (charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (hg_init : g 0 = f_prev T) - (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) - (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) - (hg_boundary : βˆ€ z : PhaseSpace d, βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - HasDerivWithinAt (fun s => charX_g s z) (charV_g t z) (Set.Icc 0 T_0) t ∧ - HasDerivWithinAt (fun s => charV_g s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (g t)) (charX_g t z))) - (Set.Icc 0 T_0) t) - (hg_init_cond : βˆ€ z : PhaseSpace d, charX_g 0 z = z.1 ∧ charV_g 0 z = z.2) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_T : f_next T = f_prev T) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) - (Ο† : PhaseSpace d β†’ ℝ) (hΟ†_cont : Continuous Ο†) - (CΟ† : ℝ) (hCΟ† : βˆ€ z : PhaseSpace d, β€–Ο† zβ€– ≀ CΟ†) : - ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) (Set.Ici T) T := by - have h_nhd_R : Set.Icc T (T + T_0) ∈ nhdsWithin T (Set.Ici T) := - Icc_mem_nhdsGE (by linarith : T < T + T_0) - have hT_Icc : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have h_outer_aemeas : AEMeasurable - (fun z : PhaseSpace d => (charX_prev T z, charV_prev T z)) fβ‚€ := - h_prev_init β–Έ h_prev_aemeas T hT_Icc - -- Eventually-equal: f_next s = composed pushforward on Icc T (T+T_0) - have h_eq_R : (fun s => ∫ z, Ο† z βˆ‚f_next s) =αΆ [nhdsWithin T (Set.Ici T)] - (fun s => ∫ z, Ο† - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€) := by - apply Filter.Eventually.mono h_nhd_R - intro s hs - change ∫ z, Ο† z βˆ‚f_next s = ∫ z, Ο† - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€ - have hs_T : T ≀ s := hs.1 - have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith, by linarith [hs.2]⟩ - by_cases hs_eq : s = T - Β· -- s = T: f_next s = f_next T = f_prev T = (charX_prev T, charV_prev T)#fβ‚€ - -- RHS at s = T uses hg_init_cond to collapse (charX_g 0, charV_g 0) = id - have hs_T_zero : s - T = 0 := by rw [hs_eq]; exact sub_self T - have h_fnext_s : f_next s = f_prev T := by - rw [hs_eq]; exact hf_next_T - rw [h_fnext_s, h_prev_push T hT_Icc, h_prev_init, - integral_map h_outer_aemeas hΟ†_cont.aestronglyMeasurable] - congr 1 - funext z - rw [hs_T_zero, (hg_init_cond _).1, (hg_init_cond _).2] - Β· -- s > T: f_next s = g (s - T) = composed pushforward - have hs_gt : T < s := lt_of_le_of_ne hs_T (Ne.symm hs_eq) - have h_fnext_s : f_next s = g (s - T) := hf_next_gt s hs_gt - rw [h_fnext_s, hg_push_ex (s - T) hsT_Icc, hg_init, - h_prev_push T hT_Icc, h_prev_init] - have h_g_at_sT : AEMeasurable - (fun z : PhaseSpace d => (charX_g (s - T) z, charV_g (s - T) z)) - (Measure.map (fun z : PhaseSpace d => - (charX_prev T z, charV_prev T z)) fβ‚€) := by - have := hg_aemeas_ex (s - T) hsT_Icc - rw [hg_init, h_prev_push T hT_Icc, h_prev_init] at this - exact this - have h_comp_aem : AEMeasurable - (fun z : PhaseSpace d => - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := - h_g_at_sT.comp_aemeasurable h_outer_aemeas - rw [AEMeasurable.map_map_of_aemeasurable h_g_at_sT h_outer_aemeas] - exact integral_map h_comp_aem hΟ†_cont.aestronglyMeasurable - -- DCT for the composed-pushforward form - have h_cont_pf : ContinuousWithinAt - (fun s => ∫ z, Ο† - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€) - (Set.Ici T) T := by - apply continuousWithinAt_of_dominated (bound := fun _ => CΟ†) - Β· apply Filter.Eventually.mono h_nhd_R - intro s hs - have hsT_Icc : s - T ∈ Set.Icc (0 : ℝ) T_0 := - ⟨by linarith [hs.1], by linarith [hs.2]⟩ - have h_g_at_sT : AEMeasurable - (fun z : PhaseSpace d => (charX_g (s - T) z, charV_g (s - T) z)) - (Measure.map (fun z : PhaseSpace d => - (charX_prev T z, charV_prev T z)) fβ‚€) := by - have := hg_aemeas_ex (s - T) hsT_Icc - rw [hg_init, h_prev_push T hT_Icc, h_prev_init] at this - exact this - have h_comp_aem : AEMeasurable - (fun z : PhaseSpace d => - (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))) fβ‚€ := - h_g_at_sT.comp_aemeasurable h_outer_aemeas - exact (hΟ†_cont.measurable.comp_aemeasurable h_comp_aem).aestronglyMeasurable - Β· apply Filter.Eventually.mono h_nhd_R - intro s _ - exact Filter.Eventually.of_forall fun z => hCΟ† _ - Β· exact integrable_const _ - Β· -- Pointwise continuity: chain rule for (Β· - T) at T with charX_g/charV_g at 0 - apply Filter.Eventually.of_forall - intro z - have h0_Icc : (0 : ℝ) ∈ Set.Icc (0 : ℝ) T_0 := ⟨le_refl 0, hT_0_pos.le⟩ - have h_g_bX := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_Icc).1 - have h_g_bV := (hg_boundary (charX_prev T z, charV_prev T z) 0 h0_Icc).2 - have h_nhdsW_0 : Set.Icc (0 : ℝ) T_0 ∈ nhdsWithin 0 (Set.Ici 0) := - Icc_mem_nhdsGE hT_0_pos - have h_g_bX_cont : ContinuousWithinAt - (fun s' => charX_g s' (charX_prev T z, charV_prev T z)) - (Set.Ici 0) 0 := - h_g_bX.continuousWithinAt.mono_of_mem_nhdsWithin h_nhdsW_0 - have h_g_bV_cont : ContinuousWithinAt - (fun s' => charV_g s' (charX_prev T z, charV_prev T z)) - (Set.Ici 0) 0 := - h_g_bV.continuousWithinAt.mono_of_mem_nhdsWithin h_nhdsW_0 - have h_sub_cont : ContinuousWithinAt (fun s : ℝ => s - T) (Set.Ici T) T := - ((continuous_id.sub continuous_const).continuousAt).continuousWithinAt - have h_sub_maps : Set.MapsTo (fun s : ℝ => s - T) (Set.Ici T) (Set.Ici 0) := - fun s hs => Set.mem_Ici.mpr (by linarith [Set.mem_Ici.mp hs]) - have h_chainX : ContinuousWithinAt - (fun s => charX_g (s - T) (charX_prev T z, charV_prev T z)) - (Set.Ici T) T := - ContinuousWithinAt.comp_of_eq h_g_bX_cont h_sub_cont h_sub_maps (sub_self T) - have h_chainV : ContinuousWithinAt - (fun s => charV_g (s - T) (charX_prev T z, charV_prev T z)) - (Set.Ici T) T := - ContinuousWithinAt.comp_of_eq h_g_bV_cont h_sub_cont h_sub_maps (sub_self T) - have h_pair : ContinuousWithinAt - (fun s => (charX_g (s - T) (charX_prev T z, charV_prev T z), - charV_g (s - T) (charX_prev T z, charV_prev T z))) - (Set.Ici T) T := - h_chainX.prodMk h_chainV - exact hΟ†_cont.continuousAt.comp_continuousWithinAt h_pair - -- Value at T: integrate the s = T case - have h_val_T : (∫ z, Ο† z βˆ‚f_next T) = ∫ z, Ο† - (charX_g (T - T) (charX_prev T z, charV_prev T z), - charV_g (T - T) (charX_prev T z, charV_prev T z)) βˆ‚fβ‚€ := by - rw [hf_next_T, h_prev_push T hT_Icc, h_prev_init, - integral_map h_outer_aemeas hΟ†_cont.aestronglyMeasurable] - congr 1; funext z - rw [show T - T = (0 : ℝ) from sub_self T, - (hg_init_cond _).1, (hg_init_cond _).2] - exact h_cont_pf.congr_of_eventuallyEq h_eq_R h_val_T - -/-- Pushforward equation for the glued solution against the glued piecewise -flow, on the extended window. Serves both `IsLagrangianVlasovSolutionOn`'s -pushforward conjunct and the explicit conjunct (v). -/ -private lemma vlasovGlue_pushforward_eq - {d : β„•} - (f_prev g : ℝ β†’ Measure (PhaseSpace d)) - (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - {T T_0 : ℝ} (hT_pos : 0 < T) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) - (hg_init : g 0 = f_prev T) - (hg_push_ex : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, - g t = Measure.map (fun z : PhaseSpace d => (charX_g t z, charV_g t z)) (g 0)) - (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) - (t : ℝ) (ht : t ∈ Set.Icc (0 : ℝ) (T + T_0)) : - f_next t = Measure.map (fun z : PhaseSpace d => - ((if t ≀ T then charX_prev t z - else charX_g (t - T) (charX_prev T z, charV_prev T z)), - (if t ≀ T then charV_prev t z - else charV_g (t - T) (charX_prev T z, charV_prev T z)))) (f_next 0) := by - rw [hf_next_le 0 hT_pos.le] - by_cases ht_le : t ≀ T - Β· simp only [ite_eq_left ht_le] - rw [hf_next_le t ht_le] - exact h_prev_push t ⟨ht.1, ht_le⟩ - Β· simp only [ite_eq_right ht_le] - push Not at ht_le - rw [hf_next_gt t ht_le] - have hT_mem : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have htT_mem : t - T ∈ Set.Icc (0 : ℝ) T_0 := ⟨by linarith, by linarith [ht.2]⟩ - rw [hg_push_ex (t - T) htT_mem, hg_init, h_prev_push T hT_mem] - have h_prev_T_aemeas := h_prev_aemeas T hT_mem - have h_g_at_tT := hg_aemeas_ex (t - T) htT_mem - rw [hg_init, h_prev_push T hT_mem] at h_g_at_tT - rw [AEMeasurable.map_map_of_aemeasurable h_g_at_tT h_prev_T_aemeas] - rfl - -/-- AEMeasurability of the glued piecewise flow against `f_next 0` on the -extended window. Serves both `IsLagrangianVlasovSolutionOn`'s conjunct and -the explicit conjunct (vi). -/ -private lemma vlasovGlue_flow_aemeasurable - {d : β„•} - (f_prev g : ℝ β†’ Measure (PhaseSpace d)) - (charX_prev charV_prev charX_g charV_g : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - {T T_0 : ℝ} (hT_pos : 0 < T) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) - (hg_init : g 0 = f_prev T) - (hg_aemeas_ex : βˆ€ s ∈ Set.Icc (0 : ℝ) T_0, - AEMeasurable (fun z : PhaseSpace d => (charX_g s z, charV_g s z)) (g 0)) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (s : ℝ) (hs : s ∈ Set.Icc (0 : ℝ) (T + T_0)) : - AEMeasurable (fun z : PhaseSpace d => - ((if s ≀ T then charX_prev s z - else charX_g (s - T) (charX_prev T z, charV_prev T z)), - (if s ≀ T then charV_prev s z - else charV_g (s - T) (charX_prev T z, charV_prev T z)))) (f_next 0) := by - rw [hf_next_le 0 hT_pos.le] - by_cases hs_le : s ≀ T - Β· simp only [ite_eq_left hs_le] - exact h_prev_aemeas s ⟨hs.1, hs_le⟩ - Β· simp only [ite_eq_right hs_le] - push Not at hs_le - have hT_mem : T ∈ Set.Icc (0 : ℝ) T := ⟨hT_pos.le, le_refl T⟩ - have hsT_mem : s - T ∈ Set.Icc (0 : ℝ) T_0 := ⟨by linarith, by linarith [hs.2]⟩ - have h_g_at_sT := hg_aemeas_ex (s - T) hsT_mem - rw [hg_init, h_prev_push T hT_mem] at h_g_at_sT - exact h_g_at_sT.comp_aemeasurable (h_prev_aemeas T hT_mem) - -/-- Finite first moment of the glued solution on the extended window, -piecewise from the two window moment hypotheses. -/ -private lemma vlasovGlue_moment - {d : β„•} - (f_prev g : ℝ β†’ Measure (PhaseSpace d)) - {T T_0 : ℝ} - (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) - (hg_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, HasFiniteFirstMoment (g t)) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) : - βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), HasFiniteFirstMoment (f_next t) := by - intro t ht - by_cases ht_le : t ≀ T - Β· rw [hf_next_le t ht_le] - exact h_prev_mom t ⟨ht.1, ht_le⟩ - Β· push Not at ht_le - rw [hf_next_gt t ht_le] - exact hg_mom (t - T) ⟨by linarith, by linarith [ht.2]⟩ - -/-- FLAT uniform first-moment bound on the glued solution's spatial marginal: -`max` of the two window envelopes, no cross-term. -/ -private lemma vlasovGlue_moment_flat - {d : β„•} - (f_prev g : ℝ β†’ Measure (PhaseSpace d)) - {T T_0 : ℝ} - (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) - (hg_mom_unif : βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T_0, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (g t)) ≀ M) - (f_next : ℝ β†’ Measure (PhaseSpace d)) - (hf_next_le : βˆ€ s, s ≀ T β†’ f_next s = f_prev s) - (hf_next_gt : βˆ€ s, T < s β†’ f_next s = g (s - T)) : - βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), - ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_next t)) ≀ M := by - obtain ⟨M_prev, hM_prev_nn, hM_prev_bd⟩ := hM_prev - obtain ⟨M_g, _hM_g_nn, hM_g_bd⟩ := hg_mom_unif - refine ⟨max M_prev M_g, le_trans hM_prev_nn (le_max_left _ _), fun t ht => ?_⟩ - by_cases ht_le : t ≀ T - Β· rw [hf_next_le t ht_le] - exact le_trans (hM_prev_bd t ⟨ht.1, ht_le⟩) (le_max_left _ _) - Β· push Not at ht_le - rw [hf_next_gt t ht_le] - exact le_trans (hM_g_bd (t - T) ⟨by linarith, by linarith [ht.2]⟩) (le_max_right _ _) - -/-- **One-window glue step.** - -Given a solution `f_prev : ℝ β†’ Measure (PhaseSpace d)` on `[0, T]` -satisfying the local-existence conjuncts (initial condition + finite first -moment + `IsLagrangianVlasovSolutionOn`), and a window length `T_0` -satisfying the smallness constraints `LocalSmallnessPLBuffer L T_0` + -`LocalSmallnessContraction L T_0`, produces a glued solution -`f_next : ℝ β†’ Measure (PhaseSpace d)` on `[0, T + T_0]` that agrees with -`f_prev` on `[0, T]`. - -**Proof strategy**: - -1. Shift the initial condition: apply `vlasovWellPosedness_local` to - `f_prev T` (which has finite first moment by `h_prev_mom T`) with - window length `T_0`. Gives a solution `g : ℝ β†’ Measure (PhaseSpace d)` - on `[0, T_0]` with `g 0 = f_prev T`. - -2. Glue: define `f_next t := if t ≀ T then f_prev t else g (t - T)`. - Agreement at `t = T` is by `g 0 = f_prev T`. - -3. Verify the four output conjuncts: - - Initial: `f_next 0 = f_prev 0 = fβ‚€`. - - Moment: piecewise from `h_prev_mom` and `g`'s moment bound. - - `IsLagrangianVlasovSolutionOn` on `[0, T + T_0]`: - * `IsVlasovSolutionOn`: weak PDE on `Ioo 0 (T + T_0)` β€” split at `T`, - use `h_prev_lag.1` for `Ioo 0 T` part and `g`'s for `Ioo T (T+T_0)`, - continuity at `T` from the integral being continuous. - * Flow: glue the per-window flows via standard ODE composition - (charX_next(t, z) := if t ≀ T then charX_prev(t, z) else - charX_g(t - T, (charX_prev(T, z), charV_prev(T, z)))). - * Pushforward equation: holds piecewise. - * AEMeasurable witness: composition of AEMeasurable maps. -/ -theorem vlasovWellPosedness_glue - {d : β„•} [NeZero d] - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (fβ‚€ : Measure (PhaseSpace d)) - (hfβ‚€ : HasFiniteFirstMoment fβ‚€) - {T : ℝ} (hT_pos : 0 < T) - (f_prev : ℝ β†’ Measure (PhaseSpace d)) - (h_prev_init : f_prev 0 = fβ‚€) - (h_prev_mom : βˆ€ t ∈ Set.Icc (0 : ℝ) T, HasFiniteFirstMoment (f_prev t)) - -- FLAT (window-constant) uniform first-moment bound on f_prev's spatial marginal. - (hM_prev : βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) T, ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_prev t)) ≀ M) - -- Explicit flow witnesses for f_prev (avoids witness-identity issues with - -- IsLagrangianVlasovSolutionOn) - (charX_prev charV_prev : ℝ β†’ PhaseSpace d β†’ PhysSpace d) - (h_prev_vlasov : IsVlasovSolutionOn gradW f_prev T) - (h_prev_flow : IsCharacteristicFlowOn gradW (fun t => spatialMarginal (f_prev t)) - charX_prev charV_prev (Set.Ioo 0 T) Set.univ) - (h_prev_push : βˆ€ t ∈ Set.Icc (0 : ℝ) T, - f_prev t = - Measure.map (fun z : PhaseSpace d => (charX_prev t z, charV_prev t z)) (f_prev 0)) - (h_prev_aemeas : βˆ€ s ∈ Set.Icc (0 : ℝ) T, - AEMeasurable (fun z : PhaseSpace d => (charX_prev s z, charV_prev s z)) (f_prev 0)) - (h_prev_boundary : βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) T β†’ - HasDerivWithinAt (fun s => charX_prev s z) (charV_prev t z) (Set.Icc 0 T) t ∧ - HasDerivWithinAt (fun s => charV_prev s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_prev t)) (charX_prev t z))) - (Set.Icc 0 T) t) - (h_prev_ic : βˆ€ z : PhaseSpace d, charX_prev 0 z = z.1 ∧ charV_prev 0 z = z.2) - {T_0 : ℝ} (hT_0_pos : 0 < T_0) - (hT_0_small_PL : LocalSmallnessPLBuffer L T_0) - (hT_0_small_con : LocalSmallnessContraction L T_0) - (hT_0_small_B : (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) < 1) : - βˆƒ (f_next : ℝ β†’ Measure (PhaseSpace d)) - (charX_next charV_next : ℝ β†’ PhaseSpace d β†’ PhysSpace d), - (βˆ€ t ∈ Set.Icc (0 : ℝ) T, f_next t = f_prev t) ∧ - f_next 0 = fβ‚€ ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), HasFiniteFirstMoment (f_next t)) ∧ - -- FLAT (window-constant) uniform first-moment bound on the spatial marginal. - (βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f_next t)) ≀ M) ∧ - IsLagrangianVlasovSolutionOn gradW f_next (T + T_0) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) (T + T_0), - f_next t = - Measure.map (fun z : PhaseSpace d => (charX_next t z, charV_next t z)) (f_next 0)) ∧ - (βˆ€ s ∈ Set.Icc (0 : ℝ) (T + T_0), - AEMeasurable (fun z : PhaseSpace d => (charX_next s z, charV_next s z)) (f_next 0)) ∧ - (βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) (T + T_0) β†’ - HasDerivWithinAt (fun s => charX_next s z) (charV_next t z) (Set.Icc 0 (T + T_0)) t ∧ - HasDerivWithinAt (fun s => charV_next s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f_next t)) (charX_next t z))) - (Set.Icc 0 (T + T_0)) t) ∧ - (βˆ€ z : PhaseSpace d, charX_next 0 z = z.1 ∧ charV_next 0 z = z.2) := by - -- The gluing closes the boundary at `t = T` by combining the boundary - -- regularity bundles from both windows: HasDerivWithinAt at T from the - -- LEFT (via f_prev's boundary bundle at endpoint T) and HasDerivWithinAt - -- at 0 from the RIGHT (via g's boundary bundle at endpoint 0), giving - -- HasDerivAt at t = T in `f_next`'s frame. - -- - -- Step 1: invoke vlasovWellPosedness_local on f_prev T to get g on [0, T_0] - have h_prev_T_mom : HasFiniteFirstMoment (f_prev T) := - h_prev_mom T (Set.right_mem_Icc.mpr hT_pos.le) - obtain ⟨g, charX_g, charV_g, hg_init, hg_mom, hg_mom_unif, hg_lag, hg_push_ex, hg_aemeas_ex, - hg_boundary, hg_init_cond⟩ := - vlasovWellPosedness_local W gradW hgradW L hL - (f_prev T) h_prev_T_mom hT_0_pos hT_0_small_PL hT_0_small_con hT_0_small_B - -- Step 2: define the glued solution piecewise - let f_next : ℝ β†’ Measure (PhaseSpace d) := - fun t => if t ≀ T then f_prev t else g (t - T) - -- Step 3: verify the output conjuncts - -- Piecewise flow: for t ≀ T use charX_prev, for t > T compose with charX_g shifted - let charX_next : ℝ β†’ PhaseSpace d β†’ PhysSpace d := fun t z => - if t ≀ T then charX_prev t z else charX_g (t - T) (charX_prev T z, charV_prev T z) - let charV_next : ℝ β†’ PhaseSpace d β†’ PhysSpace d := fun t z => - if t ≀ T then charV_prev t z else charV_g (t - T) (charX_prev T z, charV_prev T z) - have h_g_vlasov : IsVlasovSolutionOn gradW g T_0 := hg_lag.1 - refine ⟨f_next, charX_next, charV_next, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ - Β· -- Conjunct (i): agreement on [0, T] - intro t ht - simp only [f_next] - have ht_le : t ≀ T := ht.2 - simp [ht_le] - Β· -- Conjunct (ii): initial condition f_next 0 = fβ‚€ - simp only [f_next] - have h0_le : (0 : ℝ) ≀ T := hT_pos.le - simp [h0_le, h_prev_init] - Β· -- Conjunct (iii): HasFiniteFirstMoment on [0, T + T_0] (hoisted helper) - exact vlasovGlue_moment f_prev g h_prev_mom hg_mom f_next - (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) - Β· -- Conjunct (iiiβ€²): FLAT uniform first-moment bound (hoisted helper) - exact vlasovGlue_moment_flat f_prev g hM_prev hg_mom_unif f_next - (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) - Β· -- Conjunct (iv): IsLagrangianVlasovSolutionOn gradW f_next (T + T_0) - refine ⟨?_, charX_next, charV_next, ?_, ?_, ?_⟩ - Β· -- IsVlasovSolutionOn gradW f_next (T + T_0) - -- Sub-sorry: PDE gluing β€” on Ioo 0 (T + T_0), piecewise from h_prev_vlasov and h_g_vlasov - -- Sub-sorry (a): IsVlasovSolutionOn for the glued solution. - -- Strategy: for t ∈ Ioo 0 T use h_prev_vlasov (with f_next = f_prev near t); - -- for t ∈ Ioo T (T+T_0) use h_g_vlasov shifted (f_next t = g (t-T)); - -- at t = T use continuity of t ↦ ∫ Ο† βˆ‚f_next t from both sides. - have h_vlasov_glue : IsVlasovSolutionOn gradW f_next (T + T_0) := by - intro Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht - -- Off-seam weak PDE at every t' β‰  T (hoisted helper); the two strict - -- branches consume it directly, the seam derives its eventual form. - have h_diff_ne := vlasovGlue_diff_ne gradW f_prev g - h_prev_vlasov h_g_vlasov f_next (fun s hs => ite_eq_left hs) - (fun s hs => ite_eq_right (not_le.mpr hs)) Ο† hΟ†_smooth hΟ†_compact - gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† - by_cases ht_lt : t < T - Β· -- t ∈ Ioo 0 T: off-seam weak PDE - rw [show (fun _ => (0 : ℝ)) t = 0 from rfl] - exact h_diff_ne t ht (ne_of_lt ht_lt) - Β· by_cases ht_gt : T < t - Β· -- t ∈ Ioo T (T + T_0): off-seam weak PDE - rw [show (fun _ => (0 : ℝ)) t = 0 from rfl] - exact h_diff_ne t ht (ne_of_gt ht_gt) - Β· -- t = T: boundary case via `hasDerivAt_of_hasDerivAt_of_ne_in_nhds`. - -- Three sub-arguments: (1) HasDerivAt at every nearby t' β‰  T from the - -- off-seam helper; (2) ContinuousAt of the integral function at T; - -- (3) ContinuousAt of the derivative function at T. - push Not at ht_gt - have h_t_eq : t = T := le_antisymm ht_gt (not_lt.mp ht_lt) - -- Step 1: HasDerivAt at every nearby t' β‰  T, in eventual form. - have h_diff_ne_ev : βˆ€αΆ  t' in nhds T, t' β‰  T β†’ HasDerivAt - (fun s => ∫ z, Ο† z βˆ‚f_next s) - ((∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next t')) z.1) - (gradVΟ† z)) βˆ‚(f_next t')) + 0) t' := by - have hU_mem : Set.Ioo (0 : ℝ) (T + T_0) ∈ nhds T := - Ioo_mem_nhds hT_pos (by linarith) - exact Filter.Eventually.mono hU_mem (fun t' ht' => h_diff_ne t' ht') - -- Step 2: ContinuousAt of integral function at T. - -- Decomposed into LEFT (Iic T) + RIGHT (Ici T) closes, joined via - -- `Iic_union_Ici = univ`. - have hΟ†_cont : Continuous Ο† := hΟ†_smooth.continuous - obtain ⟨CΟ†, hCΟ†βŸ© := hΟ†_cont.bounded_above_of_compact_support hΟ†_compact - obtain ⟨hfβ‚€_prob, hfβ‚€_int⟩ := hfβ‚€ - have : IsProbabilityMeasure fβ‚€ := hfβ‚€_prob - -- LEFT side: substantive close via DCT on f_prev's pushforward. - have h_cont_f_left : ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) - (Set.Iic T) T := - vlasovGlue_intCont_left gradW fβ‚€ hT_pos f_prev h_prev_init - charX_prev charV_prev h_prev_push h_prev_aemeas h_prev_boundary - f_next (fun s hs => ite_eq_left hs) Ο† hΟ†_cont CΟ† hCΟ† - -- RIGHT side: substantive close via DCT on the composed pushforward - -- (charX_g (s-T), charV_g (s-T)) ∘ (charX_prev T, charV_prev T). - -- At s = T, hg_init_cond bridges (charX_g 0, charV_g 0) = id, matching f_prev T. - have h_cont_f_right : ContinuousWithinAt (fun s => ∫ z, Ο† z βˆ‚f_next s) - (Set.Ici T) T := - vlasovGlue_intCont_right gradW fβ‚€ hT_pos hT_0_pos f_prev h_prev_init - charX_prev charV_prev h_prev_push h_prev_aemeas g charX_g charV_g - hg_init hg_push_ex hg_aemeas_ex hg_boundary hg_init_cond - f_next (ite_eq_left (le_refl T)) (fun s hs => ite_eq_right (not_le.mpr hs)) - Ο† hΟ†_cont CΟ† hCΟ† - -- Combine via union - have h_cont_f : ContinuousAt (fun s => ∫ z, Ο† z βˆ‚f_next s) T := by - have h_union := h_cont_f_left.union h_cont_f_right - rw [Set.Iic_union_Ici] at h_union - exact h_union.continuousAt Filter.univ_mem - -- Step 3: ContinuousAt of the derivative functional at the seam T. - -- Mirror `h_cont_f`'s one-sided-union structure (Iic/Ici + - -- `Set.Iic_union_Ici`). Each side discharges by push-to-fβ‚€ + - -- DCT; the integrand's force term carries - -- `convolveFunctionMeasure gradW (spatialMarginal (f_next Β·)) z.1`, whose - -- seam continuity closes from PROVEN TOOLS via the pushforward - -- representation: `f_prev`/`g` are flow-pushforwards of `fβ‚€`, so the - -- convolution rewrites by `integral_map` to a fixed-`fβ‚€` integral, closed - -- by the inner kernels `flowConv_continuousWithinAt_{Iic,Ici}_seam` - -- (Piece-A-dominated DCT). LEFT uses `spatialMarginal (f_prev Β·)`, - -- RIGHT the composed flow off `g`. - have h_cont_g : ContinuousAt (fun t' => - (∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next t')) z.1) - (gradVΟ† z)) βˆ‚(f_next t')) + 0) T := by - simp only [add_zero] - -- LEFT side (s ≀ T): f_next = f_prev = pushforward of fβ‚€; force term - -- uses `spatialMarginal (f_prev Β·)`. Discharge: push-to-fβ‚€ + DCT. - have h_left : ContinuousWithinAt - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) (Set.Iic T) T := - vlasovGlue_seam_contLeft gradW L hL fβ‚€ hfβ‚€_int hT_pos f_prev h_prev_init - h_prev_mom hM_prev charX_prev charV_prev h_prev_push h_prev_aemeas - h_prev_boundary h_prev_ic f_next (fun s hs => ite_eq_left hs) - Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† - -- RIGHT side (s β‰₯ T): f_next = g (Β·βˆ’T) = composed pushforward; symmetric - -- to `h_left`. The flow is the COMPOSED phase-space flow - -- `Ξ¦_s z = (charX_g (sβˆ’T) (charX_prev T z, charV_prev T z), - -- charV_g (sβˆ’T) (charX_prev T z, charV_prev T z))`, and the - -- position part `Z_s z = charX_g (sβˆ’T) (charX_prev T z, charV_prev T z)` - -- is what the force-term convolution sees. Pushforward, AEMeasurability, - -- and seam continuity are copied/adapted from the PROVEN - -- `h_cont_f_right` (composed-pushforward machinery); the growth bound is - -- the composed Piece A (g over [0,T_0] ∘ prev at T); the force-term seam - -- continuity uses the `Ici` sibling kernel `flowConv_continuousWithinAt_Ici_seam`. - have h_right : ContinuousWithinAt - (fun s => ∫ z, (@inner ℝ (PhysSpace d) _ z.2 (gradXΟ† z) - - @inner ℝ (PhysSpace d) _ - (convolveFunctionMeasure gradW (spatialMarginal (f_next s)) z.1) - (gradVΟ† z)) βˆ‚(f_next s)) (Set.Ici T) T := - vlasovGlue_seam_contRight gradW L hL fβ‚€ hfβ‚€_int hT_pos hT_0_pos - f_prev h_prev_init h_prev_mom hM_prev charX_prev charV_prev - h_prev_push h_prev_aemeas h_prev_boundary h_prev_ic - g charX_g charV_g hg_init hg_mom hg_mom_unif hg_push_ex - hg_aemeas_ex hg_boundary hg_init_cond f_next - (ite_eq_left (le_refl T)) (fun s hs => ite_eq_right (not_le.mpr hs)) - Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† - have h_union := h_left.union h_right - rw [Set.Iic_union_Ici] at h_union - exact h_union.continuousAt Filter.univ_mem - -- Step 4: Apply the localized helper. - rw [h_t_eq] - exact hasDerivAt_of_hasDerivAt_of_ne_in_nhds h_diff_ne_ev h_cont_f h_cont_g - exact h_vlasov_glue - Β· -- IsCharacteristicFlowOn for the glued flow - -- Sub-sorry: flow initial condition + HasDerivAt for piecewise flow - have h_flow_glue : IsCharacteristicFlowOn gradW - (fun t => spatialMarginal (f_next t)) charX_next charV_next - (Set.Ioo 0 (T + T_0)) Set.univ := by - refine ⟨?_, ?_, ?_⟩ - Β· -- Initial condition: charX_next 0 z = z.1 ∧ charV_next 0 z = z.2 - intro z _ - simp only [charX_next, charV_next, ite_eq_left hT_pos.le] - exact h_prev_flow.1 z (Set.mem_univ z) - Β· -- HasDerivAt charX_next at t for t ∈ Ioo 0 (T + T_0) (hoisted helper) - intro t ht z _ - simp only [charX_next, charV_next] - exact vlasovGlue_flowX_hasDerivAt charX_prev charV_prev charX_g charV_g - hT_pos hT_0_pos - (fun t' ht' z' => h_prev_flow.2.1 t' ht' z' (Set.mem_univ z')) - (fun z' t' ht' => (h_prev_boundary z' t' ht').1) - (fun z' t' ht' => (hg_boundary z' t' ht').1) - hg_init_cond t ht z - Β· -- HasDerivAt charV_next at t for t ∈ Ioo 0 (T + T_0) (hoisted helper) - intro t ht z _ - simp only [charX_next, charV_next] - exact vlasovGlue_flowV_hasDerivAt gradW f_prev g charX_prev charV_prev - charX_g charV_g hT_pos hT_0_pos - (fun t' ht' z' => h_prev_flow.2.2 t' ht' z' (Set.mem_univ z')) - (fun z' t' ht' => (h_prev_boundary z' t' ht').2) - (fun z' t' ht' => (hg_boundary z' t' ht').2) - hg_init hg_init_cond f_next (fun s hs => ite_eq_left hs) - (fun s hs => ite_eq_right (not_le.mpr hs)) t ht z - exact h_flow_glue - Β· -- Pushforward equation for f_next on Icc 0 (T + T_0) (hoisted helper) - intro t ht - simp only [charX_next, charV_next] - exact vlasovGlue_pushforward_eq f_prev g charX_prev charV_prev charX_g charV_g - hT_pos h_prev_push h_prev_aemeas hg_init hg_push_ex hg_aemeas_ex f_next - (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) t ht - Β· -- AEMeasurability ∧ boundary ContinuousOn on Icc 0 (T + T_0). - refine ⟨?_, ?_⟩ - Β· -- AEMeasurability of the glued flow (hoisted helper). - intro s hs - simp only [charX_next, charV_next] - exact vlasovGlue_flow_aemeasurable f_prev g charX_prev charV_prev - charX_g charV_g hT_pos h_prev_push h_prev_aemeas hg_init hg_aemeas_ex - f_next (fun s' hs' => ite_eq_left hs') s hs - Β· -- Boundary ContinuousOn on Icc 0 (T + T_0): project the boundary bundle. - intro z s hs - exact ((vlasovWellPosedness_glue_boundary gradW hT_pos hT_0_pos f_prev g f_next - charX_prev charV_prev charX_g charV_g charX_next charV_next rfl rfl rfl - h_prev_boundary hg_boundary hg_init hg_init_cond z s hs).1.continuousWithinAt.prodMk - (vlasovWellPosedness_glue_boundary gradW hT_pos hT_0_pos f_prev g f_next - charX_prev charV_prev charX_g charV_g charX_next charV_next rfl rfl rfl - h_prev_boundary hg_boundary hg_init hg_init_cond z s hs).2.continuousWithinAt) - Β· -- Conjunct (v): explicit pushforward for charX_next charV_next (hoisted helper) - intro t ht - simp only [charX_next, charV_next] - exact vlasovGlue_pushforward_eq f_prev g charX_prev charV_prev charX_g charV_g - hT_pos h_prev_push h_prev_aemeas hg_init hg_push_ex hg_aemeas_ex f_next - (fun s hs => ite_eq_left hs) (fun s hs => ite_eq_right (not_le.mpr hs)) t ht - Β· -- Conjunct (vi): AEMeasurable for charX_next charV_next (hoisted helper) - intro s hs - simp only [charX_next, charV_next] - exact vlasovGlue_flow_aemeasurable f_prev g charX_prev charV_prev - charX_g charV_g hT_pos h_prev_push h_prev_aemeas hg_init hg_aemeas_ex - f_next (fun s' hs' => ite_eq_left hs') s hs - Β· -- Conjunct (vii): boundary bundle for charX_next charV_next on Icc 0 (T + T_0) - exact vlasovWellPosedness_glue_boundary gradW hT_pos hT_0_pos f_prev g f_next - charX_prev charV_prev charX_g charV_g charX_next charV_next rfl rfl rfl - h_prev_boundary hg_boundary hg_init hg_init_cond - Β· -- Conjunct (viii): initial condition for charX_next charV_next - intro z - simp only [charX_next, charV_next, ite_eq_left hT_pos.le] - exact h_prev_ic z - -/-- For every positive Lipschitz constant there is a window length satisfying all -three per-window smallness constraints β€” the PL buffer, the contraction, and the -envelope closure. Pure threshold arithmetic: `T_0 := min(1/√L, T_0_con, T_0_env)/2` -with each threshold positive for every `L > 0` (no `L < 1` restriction). -/ -lemma exists_localSmallness_window (L : NNReal) (hL_pos : (0 : ℝ) < L) : - βˆƒ T_0 : ℝ, 0 < T_0 ∧ LocalSmallnessPLBuffer L T_0 ∧ LocalSmallnessContraction L T_0 ∧ - (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) < 1 := by - let T_0_PL : ℝ := 1 / Real.sqrt L - let T_0_con : ℝ := Real.log (max 1 (L : ℝ) / (L : ℝ) + 1) / max 1 (L : ℝ) - let T_0_env : ℝ := Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) / (1 + (L : ℝ)) - let T_0 : ℝ := min (min T_0_PL T_0_con) T_0_env / 2 - have hL_nn : (0 : ℝ) ≀ L := NNReal.coe_nonneg L - have hL_ne : (L : ℝ) β‰  0 := ne_of_gt hL_pos - have hsqrtL_pos : 0 < Real.sqrt (L : ℝ) := Real.sqrt_pos.mpr hL_pos - have hs_eq : (Real.sqrt (L : ℝ)) ^ 2 = (L : ℝ) := Real.sq_sqrt hL_nn - have hK_pos : (0 : ℝ) < max 1 (L : ℝ) := lt_of_lt_of_le one_pos (le_max_left _ _) - have hT_0_PL_pos : 0 < T_0_PL := by - change 0 < 1 / Real.sqrt (L : ℝ); positivity - have hKL_gt1 : 1 < max 1 (L : ℝ) / (L : ℝ) + 1 := by - have : 0 < max 1 (L : ℝ) / (L : ℝ) := div_pos hK_pos hL_pos - linarith - have hT_0_con_pos : 0 < T_0_con := - div_pos (Real.log_pos hKL_gt1) hK_pos - have h_1L_pos : (0 : ℝ) < 1 + (L : ℝ) := by linarith [hL_pos] - have hT_0_env_pos : 0 < T_0_env := by - change 0 < Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) / (1 + (L : ℝ)) - have h_arg_gt1 : 1 < 1 + (1 + (L : ℝ)) / (L : ℝ) := by - have : 0 < (1 + (L : ℝ)) / (L : ℝ) := by positivity - linarith - exact div_pos (Real.log_pos h_arg_gt1) h_1L_pos - have hT_0_min_pos : 0 < min (min T_0_PL T_0_con) T_0_env := - lt_min (lt_min hT_0_PL_pos hT_0_con_pos) hT_0_env_pos - have hT0_pos : 0 < T_0 := by - change 0 < min (min T_0_PL T_0_con) T_0_env / 2; linarith - have hTL_T0_PL : LocalSmallnessPLBuffer L T_0 := by - change (L : ℝ) * T_0 ^ 2 < 1 - have h_T_0_le : T_0 ≀ 1 / (2 * Real.sqrt (L : ℝ)) := by - change min (min T_0_PL T_0_con) T_0_env / 2 ≀ 1 / (2 * Real.sqrt (L : ℝ)) - have h_min_le : min (min T_0_PL T_0_con) T_0_env ≀ T_0_PL := - le_trans (min_le_left _ _) (min_le_left _ _) - have hrw : (1 : ℝ) / (2 * Real.sqrt (L : ℝ)) = (1 / Real.sqrt (L : ℝ)) / 2 := by - rw [div_div, mul_comm (2 : ℝ) (Real.sqrt (L : ℝ))] - rw [hrw] - have hTPL : T_0_PL = 1 / Real.sqrt (L : ℝ) := rfl - rw [hTPL] at h_min_le; linarith - have h_T_0_nn : 0 ≀ T_0 := le_of_lt hT0_pos - have h_sq_le : T_0 ^ 2 ≀ (1 / (2 * Real.sqrt (L : ℝ))) ^ 2 := - pow_le_pow_leftβ‚€ h_T_0_nn h_T_0_le 2 - have h_mul_le : (L : ℝ) * T_0 ^ 2 ≀ (L : ℝ) * (1 / (2 * Real.sqrt (L : ℝ))) ^ 2 := - mul_le_mul_of_nonneg_left h_sq_le hL_nn - have h_eq : (L : ℝ) * (1 / (2 * Real.sqrt (L : ℝ))) ^ 2 = 1 / 4 := by - rw [div_pow, one_pow, mul_pow, hs_eq]; field_simp; ring - rw [h_eq] at h_mul_le; linarith - have hTL_T0_con : LocalSmallnessContraction L T_0 := by - change (L : ℝ) * (Real.exp ((max 1 (L : ℝ)) * T_0) - 1) / (max 1 (L : ℝ)) < 1 - set K : ℝ := max 1 (L : ℝ) with hK_def - have h_T_0_lt : T_0 < T_0_con := by - change min (min T_0_PL T_0_con) T_0_env / 2 < T_0_con - have h_min_le : min (min T_0_PL T_0_con) T_0_env ≀ T_0_con := - le_trans (min_le_left _ _) (min_le_right _ _) - linarith - have hKL1_pos : (0 : ℝ) < K / (L : ℝ) + 1 := by - have : 0 < K / (L : ℝ) := div_pos hK_pos hL_pos - linarith - have h_KT0_lt : K * T_0 < Real.log (K / (L : ℝ) + 1) := by - have hTcon : T_0_con = Real.log (K / (L : ℝ) + 1) / K := rfl - rw [hTcon] at h_T_0_lt - have hh := (lt_div_iffβ‚€ hK_pos).mp h_T_0_lt - nlinarith [hh] - have h_exp_lt : Real.exp (K * T_0) < K / (L : ℝ) + 1 := by - have := Real.exp_lt_exp.mpr h_KT0_lt - rwa [Real.exp_log hKL1_pos] at this - have h_sub_lt : Real.exp (K * T_0) - 1 < K / (L : ℝ) := by linarith - have h_num_lt : (L : ℝ) * (Real.exp (K * T_0) - 1) < K := by - have := mul_lt_mul_of_pos_left h_sub_lt hL_pos - rwa [mul_div_cancelβ‚€ _ hL_ne] at this - rw [div_lt_one hK_pos] - exact h_num_lt - have hTL_T0_B : - (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) < 1 := by - have hL_ne : (L : ℝ) β‰  0 := ne_of_gt hL_pos - have h_1L_ne : (1 + (L : ℝ)) β‰  0 := ne_of_gt h_1L_pos - have h_ratio_pos : (0 : ℝ) < (1 + (L : ℝ)) / (L : ℝ) := div_pos h_1L_pos hL_pos - have h_arg_pos : (0 : ℝ) < 1 + (1 + (L : ℝ)) / (L : ℝ) := by linarith - have h_T_0_lt_env : T_0 < T_0_env := by - change min (min T_0_PL T_0_con) T_0_env / 2 < T_0_env - have h_min_le : min (min T_0_PL T_0_con) T_0_env ≀ T_0_env := min_le_right _ _ - linarith - have h_lin_lt : (1 + (L : ℝ)) * T_0 - < Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) := by - have h_env_eq : (1 + (L : ℝ)) * T_0_env - = Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) := by - change (1 + (L : ℝ)) * - (Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) / (1 + (L : ℝ))) - = Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) - field_simp - calc (1 + (L : ℝ)) * T_0 - < (1 + (L : ℝ)) * T_0_env := mul_lt_mul_of_pos_left h_T_0_lt_env h_1L_pos - _ = Real.log (1 + (1 + (L : ℝ)) / (L : ℝ)) := h_env_eq - have h_exp_lt : Real.exp ((1 + (L : ℝ)) * T_0) - < 1 + (1 + (L : ℝ)) / (L : ℝ) := by - calc Real.exp ((1 + (L : ℝ)) * T_0) - < Real.exp (Real.log (1 + (1 + (L : ℝ)) / (L : ℝ))) := - Real.exp_lt_exp.mpr h_lin_lt - _ = 1 + (1 + (L : ℝ)) / (L : ℝ) := Real.exp_log h_arg_pos - have h_diff_lt : Real.exp ((1 + (L : ℝ)) * T_0) - 1 < (1 + (L : ℝ)) / (L : ℝ) := by - linarith - have hcoef_pos : (0 : ℝ) < (L : ℝ) / (1 + (L : ℝ)) := div_pos hL_pos h_1L_pos - calc (L : ℝ) / (1 + (L : ℝ)) * (Real.exp ((1 + (L : ℝ)) * T_0) - 1) - < (L : ℝ) / (1 + (L : ℝ)) * ((1 + (L : ℝ)) / (L : ℝ)) := - mul_lt_mul_of_pos_left h_diff_lt hcoef_pos - _ = 1 := by field_simp - exact ⟨T_0, hT0_pos, hTL_T0_PL, hTL_T0_con, hTL_T0_B⟩ - -/-- **Forward iteration to arbitrary `T_target`.** - -Extends the local-existence theorem from its small-`T` smallness window -to any `T_target > 0`, by iterating the local theorem with shifted initial -data at a fixed step `T_0` depending only on `L` (no `L < 1` hypothesis). - -**Proof strategy**: - -1. Pick `T_0 := min(T_0_PL, T_0_con, T_0_env) / 2`, with `T_0_PL := 1/√L` - (the PL-buffer threshold for `L Β· T_0Β² < 1`), `T_0_con`/`T_0_env` the - contraction/envelope thresholds. Each is positive for every `L > 0`, so - `T_0 > 0` and all three smallness constraints hold. - -2. Pick `N := ⌈T_target / T_0βŒ‰β‚Š` so that `N Β· T_0 β‰₯ T_target`. - -3. `Nat.rec` construction: a solution holding the conjuncts at `T = nΒ·T_0`. - - Base case: apply `vlasovWellPosedness_local` directly. - - Step case (`n β†’ n+1`): apply `vlasovWellPosedness_glue` to extend. - -4. Take `f := f_N` and verify the conjuncts for `T_target ≀ N Β· T_0` via - `IsLagrangianVlasovSolutionOn`'s monotonicity in `T` (project down). -/ -theorem vlasovWellPosedness_forward - {d : β„•} [NeZero d] - (W : PhysSpace d β†’ ℝ) - (gradW : PhysSpace d β†’ PhysSpace d) - (hgradW : βˆ€ x, gradW x = gradient W x) - (L : NNReal) (hL : LipschitzWith L gradW) - (hL_pos : (0 : ℝ) < L) - (fβ‚€ : Measure (PhaseSpace d)) - (hfβ‚€ : HasFiniteFirstMoment fβ‚€) - {T_target : ℝ} (hT_target : 0 < T_target) : - βˆƒ f : ℝ β†’ Measure (PhaseSpace d), - f 0 = fβ‚€ ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) T_target, HasFiniteFirstMoment (f t)) ∧ - IsLagrangianVlasovSolutionOn gradW f T_target := by - -- T_0 must satisfy the PL-buffer, contraction, and envelope constraints β€” - -- all supplied by the pure-arithmetic `exists_localSmallness_window`. - obtain ⟨T_0, hT0_pos, hTL_T0_PL, hTL_T0_con, hTL_T0_B⟩ := - exists_localSmallness_window L hL_pos - -- Step 2: N = ⌈T_target / T_0βŒ‰β‚Š windows of size T_0 cover T_target. - let N : β„• := ⌈T_target / T_0βŒ‰β‚Š - have hN_pos : 0 < N := by - change 0 < ⌈T_target / T_0βŒ‰β‚Š - rw [Nat.ceil_pos] - exact div_pos hT_target hT0_pos - have hN_covers : T_target ≀ (N : ℝ) * T_0 := by - have hle := Nat.le_ceil (T_target / T_0) - have hT0_pos' := hT0_pos - calc T_target = T_target / T_0 * T_0 := by field_simp - _ ≀ (⌈T_target / T_0βŒ‰β‚Š : ℝ) * T_0 := - mul_le_mul_of_nonneg_right hle (le_of_lt hT0_pos) - -- Step 3: Induction on n : β„• β€” solution exists on [0, (n+1)Β·T_0]. - -- The induction carries explicit flow witnesses (charX, charV) and the full - -- 7-component bundle to enable vlasovWellPosedness_glue calls without witness-identity issues. - let T_n := fun n : β„• => ((n + 1 : β„•) : ℝ) * T_0 - have h_ind : βˆ€ n : β„•, - βˆƒ (f : ℝ β†’ Measure (PhaseSpace d)) - (charX charV : ℝ β†’ PhaseSpace d β†’ PhysSpace d), - f 0 = fβ‚€ ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) (T_n n), HasFiniteFirstMoment (f t)) ∧ - -- FLAT (window-constant) uniform first-moment bound on the spatial marginal. - (βˆƒ M : ℝ, 0 ≀ M ∧ - βˆ€ t ∈ Set.Icc (0 : ℝ) (T_n n), ∫ y, β€–yβ€– βˆ‚(spatialMarginal (f t)) ≀ M) ∧ - IsVlasovSolutionOn gradW f (T_n n) ∧ - (βˆ€ t ∈ Set.Icc (0 : ℝ) (T_n n), - f t = Measure.map (fun z : PhaseSpace d => (charX t z, charV t z)) (f 0)) ∧ - (βˆ€ s ∈ Set.Icc (0 : ℝ) (T_n n), - AEMeasurable (fun z : PhaseSpace d => (charX s z, charV s z)) (f 0)) ∧ - (βˆ€ (z : PhaseSpace d) (t : ℝ), t ∈ Set.Icc (0 : ℝ) (T_n n) β†’ - HasDerivWithinAt (fun s => charX s z) (charV t z) (Set.Icc 0 (T_n n)) t ∧ - HasDerivWithinAt (fun s => charV s z) - (-(convolveFunctionMeasure gradW (spatialMarginal (f t)) (charX t z))) - (Set.Icc 0 (T_n n)) t) ∧ - (βˆ€ z : PhaseSpace d, charX 0 z = z.1 ∧ charV 0 z = z.2) := by - intro n - induction n with - | zero => - -- Base: n = 0, need solution on [0, 1Β·T_0] = [0, T_0]. - simp only [T_n, zero_add, Nat.cast_one, one_mul] - obtain ⟨f, charX, charV, hf_init, hf_mom, hf_mom_unif, hf_lag, hf_push, hf_aemeas, - hf_boundary, hf_ic⟩ := - vlasovWellPosedness_local W gradW hgradW L hL fβ‚€ hfβ‚€ hT0_pos hTL_T0_PL hTL_T0_con hTL_T0_B - exact ⟨f, charX, charV, hf_init, hf_mom, hf_mom_unif, hf_lag.1, hf_push, hf_aemeas, - hf_boundary, hf_ic⟩ - | succ n ih => - -- Step: n+1 β†’ (n+2)Β·T_0. Use vlasovWellPosedness_glue with T = (n+1)Β·T_0 > 0. - obtain ⟨f_n, charX_n, charV_n, hfn_init, hfn_mom, hfn_mom_unif, hfn_vlasov, - hfn_push, hfn_aemeas, hfn_boundary, hfn_ic⟩ := ih - simp only [T_n] at hfn_mom hfn_mom_unif hfn_vlasov hfn_push hfn_aemeas hfn_boundary - have hT_n_pos : (0 : ℝ) < ((n + 1 : β„•) : ℝ) * T_0 := - mul_pos (by exact_mod_cast Nat.succ_pos n) hT0_pos - -- Derive IsCharacteristicFlowOn from h_prev_boundary + hasDerivAt - -- (interior points t ∈ Ioo 0 T_n have Icc 0 T_n ∈ 𝓝 t, so HasDerivWithinAt β†’ HasDerivAt) - have hfn_flow : IsCharacteristicFlowOn gradW (fun t => spatialMarginal (f_n t)) - charX_n charV_n (Set.Ioo 0 (((n + 1 : β„•) : ℝ) * T_0)) Set.univ := by - refine ⟨fun z _ => hfn_ic z, ?_, ?_⟩ - Β· intro t ht z _ - exact ((hfn_boundary z t (Set.Ioo_subset_Icc_self ht)).1).hasDerivAt - (Icc_mem_nhds ht.1 ht.2) - Β· intro t ht z _ - exact ((hfn_boundary z t (Set.Ioo_subset_Icc_self ht)).2).hasDerivAt - (Icc_mem_nhds ht.1 ht.2) - obtain ⟨f_next, charX_next, charV_next, _h_agree, h_init, h_mom, h_mom_unif, h_lag, - h_push, h_aemeas, h_boundary, h_ic⟩ := - vlasovWellPosedness_glue W gradW hgradW L hL fβ‚€ hfβ‚€ hT_n_pos - f_n hfn_init hfn_mom hfn_mom_unif - charX_n charV_n hfn_vlasov hfn_flow - hfn_push hfn_aemeas hfn_boundary hfn_ic - hT0_pos hTL_T0_PL hTL_T0_con hTL_T0_B - -- Need: T_n (n+1) = T_n n + T_0 - have h_T_eq : T_n (n + 1) = T_n n + T_0 := by - simp only [T_n]; push_cast; ring - refine ⟨f_next, charX_next, charV_next, h_init, ?_, ?_, ?_, ?_, ?_, ?_, ?_⟩ - Β· rw [h_T_eq]; exact h_mom - Β· rw [h_T_eq]; exact h_mom_unif - Β· rw [h_T_eq]; exact h_lag.1 - Β· rw [h_T_eq]; exact h_push - Β· rw [h_T_eq]; exact h_aemeas - Β· rw [h_T_eq]; exact h_boundary - Β· exact h_ic - -- Step 4: Apply h_ind at n = N - 1 (since N β‰₯ 1). - have hN_pred : N - 1 + 1 = N := Nat.succ_pred_eq_of_pos hN_pos - obtain ⟨f, charX_f, charV_f, hf_init, hf_mom, _hf_mom_unif, hf_vlasov, - hf_push, hf_aemeas, hf_boundary, hf_ic⟩ := h_ind (N - 1) - simp only [T_n] at hf_mom hf_vlasov hf_push hf_aemeas hf_boundary - rw [hN_pred] at hf_mom hf_vlasov hf_push hf_aemeas hf_boundary - -- Step 5: Restrict from [0, NΒ·T_0] down to [0, T_target]. - refine ⟨f, hf_init, ?_, ?_⟩ - Β· -- Moment bound on [0, T_target] βŠ† [0, NΒ·T_0]. - intro t ht - exact hf_mom t ⟨ht.1, le_trans ht.2 hN_covers⟩ - Β· -- IsLagrangianVlasovSolutionOn on [0, T_target] ≀ [0, NΒ·T_0]. - -- Derive IsCharacteristicFlowOn for T_target from hf_boundary (restrict to Ioo 0 T_target). - have hf_flow : IsCharacteristicFlowOn gradW (fun t => spatialMarginal (f t)) - charX_f charV_f (Set.Ioo 0 T_target) Set.univ := by - refine ⟨fun z _ => hf_ic z, ?_, ?_⟩ - Β· intro t ht z _ - have ht_lt_NT0 : t < (N : ℝ) * T_0 := lt_of_lt_of_le ht.2 hN_covers - exact ((hf_boundary z t ⟨le_of_lt ht.1, le_of_lt ht_lt_NT0⟩).1).hasDerivAt - (Icc_mem_nhds ht.1 ht_lt_NT0) - Β· intro t ht z _ - have ht_lt_NT0 : t < (N : ℝ) * T_0 := lt_of_lt_of_le ht.2 hN_covers - exact ((hf_boundary z t ⟨le_of_lt ht.1, le_of_lt ht_lt_NT0⟩).2).hasDerivAt - (Icc_mem_nhds ht.1 ht_lt_NT0) - refine ⟨?_, charX_f, charV_f, ?_, ?_, ?_⟩ - Β· -- IsVlasovSolutionOn: restrict Ioo 0 T_target βŠ† Ioo 0 (NΒ·T_0) - intro Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t ht - exact hf_vlasov Ο† hΟ†_smooth hΟ†_compact gradXΟ† gradVΟ† hgradXΟ† hgradVΟ† t - ⟨ht.1, lt_of_lt_of_le ht.2 hN_covers⟩ - Β· exact hf_flow - Β· -- pushforward eq: restrict Icc 0 T_target βŠ† Icc 0 (NΒ·T_0) - intro t ht - exact hf_push t ⟨ht.1, le_trans ht.2 hN_covers⟩ - Β· -- AEMeasurable ∧ boundary ContinuousOn, restricted to Icc 0 T_target. - refine ⟨?_, ?_⟩ - Β· intro s hs - exact hf_aemeas s ⟨hs.1, le_trans hs.2 hN_covers⟩ - Β· intro z - have h_big : ContinuousOn (fun s => (charX_f s z, charV_f s z)) - (Set.Icc 0 ((N : ℝ) * T_0)) := fun t ht => - ((hf_boundary z t ht).1.continuousWithinAt).prodMk - ((hf_boundary z t ht).2.continuousWithinAt) - exact h_big.mono (fun t ht => ⟨ht.1, le_trans ht.2 hN_covers⟩) +private alias vlasovWellPosedness_glue_boundary_seam := + _root_.Vlasov.vlasovWellPosedness_glue_boundary_seam /-! ## Uniqueness over `IsLagrangianVlasovSolutionOn` per window -/ -- Two Lagrangian solutions on `[0, T_target]` with the same initial measure