Skip to content

Commit aa511fd

Browse files
committed
WIP: do the same for continuous bundles --- need more API for operations on continuous sections first
1 parent 4513a72 commit aa511fd

1 file changed

Lines changed: 134 additions & 0 deletions

File tree

Mathlib/Geometry/Manifold/VectorBundle/GramSchmidtOrtho.lean

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,140 @@ theorem gramSchmidtOrthonormalBasis_apply_of_orthonormal [Fintype ι]
267267

268268
end VectorBundle
269269

270+
/-! The Gram-Schmidt process preserves continuity of sections -/
271+
section continuity
272+
273+
-- -- Let `V` be a smooth vector bundle with a `C^n` Riemannian structure over a `C^k` manifold `B`.
274+
-- variable
275+
-- {EB : Type*} [NormedAddCommGroup EB] [NormedSpace ℝ EB]
276+
-- {HB : Type*} [TopologicalSpace HB] {IB : ModelWithCorners ℝ EB HB} {n : WithTop ℕ∞}
277+
-- {B : Type*} [TopologicalSpace B] [ChartedSpace HB B]
278+
-- {F : Type*} [NormedAddCommGroup F] [NormedSpace ℝ F]
279+
-- {E : B → Type*} [TopologicalSpace (TotalSpace F E)] [∀ x, NormedAddCommGroup (E x)]
280+
-- [∀ x, InnerProductSpace ℝ (E x)] [FiberBundle F E] [VectorBundle ℝ F E]
281+
-- [IsManifold IB n B] [ContMDiffVectorBundle n F E IB]
282+
-- [IsContMDiffRiemannianBundle IB n F E]
283+
284+
--variable [IsContMDiffRiemannianBundle IB n F E]
285+
286+
-- section helper
287+
288+
-- variable {s t : (x : B) → E x} {u : Set B} {x : B}
289+
290+
-- -- TODO: give a much better name!
291+
-- lemma contMDiffWithinAt_aux
292+
-- (hs : CMDiffAt[u] n (T% s) x) (ht : CMDiffAt[u] n (T% t) x) (hs' : s x ≠ 0) :
293+
-- CMDiffAt[u] n (fun x ↦ ⟪s x, t x⟫ / (‖s x‖ ^ 2)) x := by
294+
-- have := (hs.inner_bundle ht).smul ((hs.inner_bundle hs).inv₀ (inner_self_ne_zero.mpr hs'))
295+
-- apply this.congr
296+
-- · intro y hy
297+
-- congr
298+
-- simp [inner_self_eq_norm_sq_to_K]
299+
-- · congr
300+
-- rw [← real_inner_self_eq_norm_sq]
301+
302+
-- lemma contMDiffAt_aux (hs : CMDiffAt n (T% s) x) (ht : CMDiffAt n (T% t) x) (hs' : s x ≠ 0) :
303+
-- CMDiffAt n (fun x ↦ ⟪s x, t x⟫ / (‖s x‖ ^ 2)) x := by
304+
-- rw [← contMDiffWithinAt_univ] at hs ht ⊢
305+
-- exact contMDiffWithinAt_aux hs ht hs'
306+
307+
-- def ContMDiffWithinAt.orthogonalProjection
308+
-- (hs : CMDiffAt[u] n (T% s) x) (ht : CMDiffAt[u] n (T% t) x) (hs' : s x ≠ 0) :
309+
-- -- TODO: leaving out the type ascription yields a horrible error message, add test and fix!
310+
-- letI S : (x : B) → E x := fun x ↦ (Submodule.span ℝ {s x}).orthogonalProjection (t x);
311+
-- CMDiffAt[u] n (T% S) x := by
312+
-- simp_rw [Submodule.orthogonalProjection_singleton]
313+
-- exact (contMDiffWithinAt_aux hs ht hs').smul_section hs
314+
315+
-- lemma contMDiffWithinAt_inner (hs : CMDiffAt[u] n (T% s) x) (hs' : s x ≠ 0) :
316+
-- CMDiffAt[u] n (‖s ·‖) x := by
317+
-- let F (x) := ⟪s x, s x⟫
318+
-- have aux : CMDiffAt[u] n (Real.sqrt ∘ F) x := by
319+
-- have h1 : CMDiffAt[(F '' u)] n (Real.sqrt) (F x) := by
320+
-- apply ContMDiffAt.contMDiffWithinAt
321+
-- rw [contMDiffAt_iff_contDiffAt]
322+
-- exact Real.contDiffAt_sqrt (by simp [F, hs'])
323+
-- exact h1.comp x (hs.inner_bundle hs) (Set.mapsTo_image _ u)
324+
-- convert aux
325+
-- simp [F, ← norm_eq_sqrt_real_inner]
326+
327+
-- end helper
328+
329+
variable {s : ι → (x : B) → E x} {u : Set B} {x : B} {i : ι}
330+
331+
attribute [local instance] IsWellOrder.toHasWellFounded
332+
333+
-- TODO: need continuity analogues of ContMDiff.sub_section
334+
335+
lemma gramSchmidt_continuousWithinAt (hs : ∀ i, ContinuousWithinAt (T% (s i)) u x)
336+
{i : ι} (hs' : LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
337+
ContinuousWithinAt (T% (VectorBundle.gramSchmidt s i)) u x := by
338+
simp_rw [VectorBundle.gramSchmidt_def]
339+
sorry /-apply (hs i).sub_section
340+
apply ContMDiffWithinAt.sum_section
341+
intro i' hi'
342+
let aux : { x // x ∈ Set.Iic i' } → { x // x ∈ Set.Iic i } :=
343+
fun ⟨x, hx⟩ ↦ ⟨x, hx.trans (Finset.mem_Iio.mp hi').le⟩
344+
have : LinearIndependent ℝ ((fun x_1 ↦ s x_1 x) ∘ @Subtype.val ι fun x ↦ x ∈ Set.Iic i') := by
345+
apply hs'.comp aux
346+
intro ⟨x, hx⟩ ⟨x', hx'⟩ h
347+
simp_all only [Subtype.mk.injEq, aux]
348+
apply ContMDiffWithinAt.orthogonalProjection (gramSchmidt_contMDiffWithinAt hs this) (hs i)
349+
apply VectorBundle.gramSchmidt_ne_zero_coe _ this -/
350+
-- termination_by i
351+
-- decreasing_by exact (LocallyFiniteOrderBot.finset_mem_Iio i i').mp hi'
352+
353+
lemma gramSchmidt_continuousAt (hs : ∀ i, ContinuousAt (T% (s i)) x)
354+
(hs' : LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
355+
ContinuousAt (T% (VectorBundle.gramSchmidt s i)) x := by
356+
simp_rw [← continuousWithinAt_univ] at hs ⊢
357+
exact gramSchmidt_continuousWithinAt (fun i ↦ hs i) hs'
358+
359+
lemma gramSchmidt_contMDiffOn (hs : ∀ i, ContinuousOn (T% (s i)) u)
360+
(hs' : ∀ x ∈ u, LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
361+
ContinuousOn (T% (VectorBundle.gramSchmidt s i)) u :=
362+
fun x hx ↦ gramSchmidt_continuousWithinAt (fun i ↦ hs i x hx) (hs' _ hx)
363+
364+
lemma gramSchmidt_continuous (hs : ∀ i, Continuous (T% (s i)))
365+
(hs' : ∀ x, LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
366+
Continuous (T% (VectorBundle.gramSchmidt s i)) := by
367+
simp_rw [continuous_iff_continuousAt] at hs ⊢
368+
exact fun x ↦ gramSchmidt_continuousAt (fun i ↦ hs i x) (hs' x)
369+
370+
lemma gramSchmidtNormed_continuousWithinAt (hs : ∀ i, ContinuousWithinAt (T% (s i)) u x)
371+
(hs' : LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
372+
ContinuousWithinAt (T% (VectorBundle.gramSchmidtNormed s i)) u x := by
373+
have : ContinuousWithinAt (T%
374+
(fun x ↦ ‖VectorBundle.gramSchmidt s i x‖⁻¹ • VectorBundle.gramSchmidt s i x)) u x := by
375+
sorry
376+
-- refine ContMDiffWithinAt.smul_section ?_ (gramSchmidt_contMDiffWithinAt hs hs')
377+
-- refine ContMDiffWithinAt.inv₀ ?_ ?_
378+
-- · refine contMDiffWithinAt_inner (gramSchmidt_contMDiffWithinAt hs hs') ?_
379+
-- simpa using InnerProductSpace.gramSchmidt_ne_zero_coe i hs'
380+
-- · simpa using InnerProductSpace.gramSchmidt_ne_zero_coe i hs'
381+
exact this.congr (fun y hy ↦ by congr) (by congr)
382+
383+
lemma gramSchmidtNormed_continuousAt (hs : ∀ i, ContinuousAt (T% (s i)) x)
384+
(hs' : LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
385+
ContinuousAt (T% (VectorBundle.gramSchmidtNormed s i)) x := by
386+
simp_rw [← continuousWithinAt_univ] at hs ⊢
387+
exact gramSchmidtNormed_continuousWithinAt (fun i ↦ hs i) hs'
388+
389+
lemma gramSchmidtNormed_continuousOn (hs : ∀ i, ContinuousOn (T% (s i)) u)
390+
(hs' : ∀ x ∈ u, LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
391+
ContinuousOn (T% (VectorBundle.gramSchmidtNormed s i)) u :=
392+
fun x hx ↦ gramSchmidtNormed_continuousWithinAt (fun i ↦ hs i x hx) (hs' _ hx)
393+
394+
lemma gramSchmidtNormed_continuous (hs : ∀ i, Continuous (T% (s i)))
395+
(hs' : ∀ x, LinearIndependent ℝ ((s · x) ∘ ((↑) : Set.Iic i → ι))) :
396+
Continuous (T% (VectorBundle.gramSchmidtNormed s i)) := by
397+
simp_rw [continuous_iff_continuousAt] at hs ⊢
398+
exact fun x ↦ gramSchmidtNormed_continuousAt (fun i ↦ hs i x) (hs' x)
399+
400+
end continuity
401+
402+
#exit
403+
270404
/-! The Gram-Schmidt process preserves smoothness of sections -/
271405
section smoothness
272406

0 commit comments

Comments
 (0)