Skip to content

Commit 6a824c4

Browse files
committed
feat: isInvertible_mfderiv_extend
Generalise `isInvertible_mfderiv_extChartAt` and its preliminary lemmas to any extended chart in the maximal atlas: this will be used in #41796 to prove that immersions have immersed points. ---------- - [x] depends on: #42011
1 parent 7779d60 commit 6a824c4

1 file changed

Lines changed: 134 additions & 63 deletions

File tree

Mathlib/Geometry/Manifold/MFDeriv/Atlas.lean

Lines changed: 134 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,127 @@ end OpenPartialHomeomorph.MDifferentiable
210210

211211
/-! ### Differentiability of `extChartAt` -/
212212

213+
section
214+
215+
open IsManifold
216+
217+
variable {e : OpenPartialHomeomorph M H}
218+
219+
theorem OpenPartialHomeomorph.mdifferentiableAt_extend
220+
{x : M} (he : e ∈ maximalAtlas I 1 M) (hx : x ∈ e.source) :
221+
MDiffAt (e.extend I) x :=
222+
e.contMDiffAt_extend he hx |>.mdifferentiableAt (by simp)
223+
224+
theorem OpenPartialHomeomorph.mdifferentiableOn_extend (he : e ∈ maximalAtlas I 1 M) :
225+
MDiff[e.source] (e.extend I) :=
226+
e.contMDiffOn_extend he |>.mdifferentiableOn (by simp)
227+
228+
variable {z : E}
229+
230+
theorem mdifferentiableWithinAt_extend_symm
231+
(he : e ∈ maximalAtlas I 1 M) (h : z ∈ (e.extend I).target) :
232+
MDiffAt[range I] (e.extend I).symm z := by
233+
have Z : MDiffAt[range ↑I] I.symm z :=
234+
I.mdifferentiableWithinAt_symm (e.extend_target_subset_range h)
235+
apply MDifferentiableAt.comp_mdifferentiableWithinAt _ _ Z
236+
exact mdifferentiableAt_symm_of_mem_maximalAtlas he (by simp_all)
237+
238+
theorem mdifferentiableOn_extend_symm (he : e ∈ maximalAtlas I 1 M) :
239+
MDiff[(e.extend I).target] (e.extend I).symm := by
240+
intro y hy
241+
exact mdifferentiableWithinAt_extend_symm he hy |>.mono (e.extend_target_subset_range)
242+
243+
/-- The composition of the derivative of an extended chart `e.extend I` with the derivative of its
244+
inverse `(e.extend I).symm` gives the identity.
245+
Version where the basepoint belongs to `(e.extend I).target`. -/
246+
lemma mfderiv_extend_comp_mfderivWithin_extend_symm
247+
{y : E} (he : e ∈ maximalAtlas I 1 M) (hy : y ∈ (e.extend I).target) :
248+
(mfderiv% (e.extend I) ((e.extend I).symm y)) ∘L
249+
(mfderiv[range I] (e.extend I).symm y) = ContinuousLinearMap.id _ _ := by
250+
have U : UniqueMDiffAt[range I] y := by
251+
apply I.uniqueMDiffOn
252+
apply e.extend_target_subset_range hy
253+
have h'y : (e.extend I).symm y ∈ e.source := PartialEquiv.map_target _ (by simp_all)
254+
rw [← mfderiv_comp_mfderivWithin]; rotate_left
255+
· exact e.mdifferentiableAt_extend he h'y
256+
· exact mdifferentiableWithinAt_extend_symm he hy
257+
· exact U
258+
rw [← mfderivWithin_id U]
259+
apply Filter.EventuallyEq.mfderivWithin_eq
260+
· have : (e.extend I) ((e.extend I).symm y) = y := (e.extend I).right_inv hy
261+
filter_upwards [this ▸ e.extend_target_mem_nhdsWithin h'y (I := I)] with z hz
262+
simp_all
263+
· simp_all
264+
265+
/-- The composition of the derivative of an extended chart `e.extend I` with the derivative of its
266+
inverse `(e.extend I).symm` gives the identity.
267+
Version where the basepoint belongs to `(e.extend).source`. -/
268+
lemma mfderiv_extend_comp_mfderivWithin_extend_symm'
269+
{y : M} (he : e ∈ maximalAtlas I 1 M) (hy : y ∈ (e.extend I).source) :
270+
(mfderiv% (e.extend I) y) ∘L (mfderiv[range I] (e.extend I).symm (e.extend I y))
271+
= ContinuousLinearMap.id _ _ := by
272+
convert! mfderiv_extend_comp_mfderivWithin_extend_symm he ((e.extend I).map_source hy)
273+
rw [(e.extend I).left_inv hy]
274+
275+
/-- The composition of the derivative of the inverse of an extended chart `e.extend I` with the
276+
derivative of `e.extend I` gives the identity.
277+
Version where the basepoint belongs to `(extChartAt I x).target`. -/
278+
lemma mfderivWithin_extend_symm_comp_mfderiv_extend
279+
{y : E} (he : e ∈ maximalAtlas I 1 M) (hy : y ∈ (e.extend I).target) :
280+
(mfderiv[range I] (e.extend I).symm y) ∘L
281+
(mfderiv% (e.extend I) ((e.extend I).symm y))
282+
= ContinuousLinearMap.id _ _ := by
283+
have h'y : (e.extend I).symm y ∈ e.source := by simp_all
284+
have U' : UniqueMDiffAt[(e.extend I).source] ((e.extend I).symm y) := by
285+
rw [e.extend_source]
286+
exact e.open_source.uniqueMDiffWithinAt h'y
287+
have : mfderiv% (e.extend I) ((e.extend I).symm y)
288+
= mfderiv[(e.extend I).source] (e.extend I) ((e.extend I).symm y) := by
289+
rw [mfderivWithin_eq_mfderiv U']
290+
exact e.mdifferentiableAt_extend he h'y
291+
rw [this, ← mfderivWithin_comp_of_eq]; rotate_left
292+
· exact mdifferentiableWithinAt_extend_symm he hy
293+
· exact (e.mdifferentiableAt_extend he h'y).mdifferentiableWithinAt
294+
· intro z hz
295+
exact e.extend_target_subset_range ((e.extend I).map_source hz)
296+
· exact U'
297+
· exact (e.extend I).right_inv hy
298+
rw [← mfderivWithin_id U']
299+
apply Filter.EventuallyEq.mfderivWithin_eq
300+
· filter_upwards [e.extend_source_mem_nhdsWithin (I := I) h'y] with z hz
301+
simp only [Function.comp_def, PartialEquiv.left_inv (e.extend I) hz, id_eq]
302+
· simp only [Function.comp_def, PartialEquiv.right_inv (e.extend I) hy, id_eq]
303+
304+
/-- The composition of the derivative of the inverse of an extended chart `e.extend I` with the
305+
derivative of `e.extend I` gives the identity.
306+
Version where the basepoint belongs to `e.source`. -/
307+
lemma mfderivWithin_extend_symm_comp_mfderiv_extend'
308+
{y : M} (he : e ∈ maximalAtlas I 1 M) (hy : y ∈ e.source) :
309+
(mfderiv[range I] (e.extend I).symm (e.extend I y)) ∘L (mfderiv% (e.extend I) y)
310+
= ContinuousLinearMap.id _ _ := by
311+
have : y = (e.extend I).symm (e.extend I y) := ((e.extend I).left_inv (by simpa using hy)).symm
312+
convert! mfderivWithin_extend_symm_comp_mfderiv_extend he
313+
((e.extend I).map_source (by simpa using hy))
314+
rw [(e.extend I).left_inv (by simpa using hy)]
315+
316+
lemma isInvertible_mfderivWithin_extend_symm
317+
{y : E} (he : e ∈ maximalAtlas I 1 M) (hy : y ∈ (e.extend I).target) :
318+
(mfderiv[range I] (e.extend I).symm y).IsInvertible :=
319+
ContinuousLinearMap.IsInvertible.of_inverse
320+
(mfderivWithin_extend_symm_comp_mfderiv_extend he hy)
321+
(mfderiv_extend_comp_mfderivWithin_extend_symm he hy)
322+
323+
lemma isInvertible_mfderiv_extend {y : M} (he : e ∈ maximalAtlas I 1 M) (hy : y ∈ e.source) :
324+
(mfderiv% (e.extend I) y).IsInvertible := by
325+
have h'y : e.extend I y ∈ (e.extend I).target := (e.extend I).map_source (by simpa using hy)
326+
have Z := ContinuousLinearMap.IsInvertible.of_inverse
327+
(mfderiv_extend_comp_mfderivWithin_extend_symm he h'y)
328+
(mfderivWithin_extend_symm_comp_mfderiv_extend he h'y)
329+
have : (e.extend I).symm ((e.extend I) y) = y := (e.extend I).left_inv (by simpa using hy)
330+
rwa [this] at Z
331+
332+
end
333+
213334
section extChartAt
214335

215336
variable [IsManifold I 1 M] {s : Set M} {x y : M} {z : E}
@@ -230,42 +351,21 @@ theorem mdifferentiableOn_extChartAt : MDiff[(chartAt H x).source] (extChartAt I
230351
fun _y hy ↦ (hasMFDerivWithinAt_extChartAt hy).mdifferentiableWithinAt
231352

232353
theorem mdifferentiableWithinAt_extChartAt_symm (h : z ∈ (extChartAt I x).target) :
233-
MDiffAt[range I] (extChartAt I x).symm z := by
234-
have Z := I.mdifferentiableWithinAt_symm (extChartAt_target_subset_range x h)
235-
apply MDifferentiableAt.comp_mdifferentiableWithinAt (I' := I) _ _ Z
236-
apply mdifferentiableAt_atlas_symm (ChartedSpace.chart_mem_atlas x)
237-
simp only [extChartAt, OpenPartialHomeomorph.extend, PartialEquiv.trans_target,
238-
ModelWithCorners.target_eq, ModelWithCorners.toPartialEquiv_coe_symm, mem_inter_iff, mem_range,
239-
mem_preimage] at h
240-
exact h.2
354+
MDiffAt[range I] (extChartAt I x).symm z :=
355+
mdifferentiableWithinAt_extend_symm (IsManifold.chart_mem_maximalAtlas x) h
241356

242357
theorem mdifferentiableOn_extChartAt_symm :
243-
MDiff[(extChartAt I x).target] (extChartAt I x).symm := by
244-
intro y hy
245-
exact (mdifferentiableWithinAt_extChartAt_symm hy).mono (extChartAt_target_subset_range x)
358+
MDiff[(extChartAt I x).target] (extChartAt I x).symm :=
359+
mdifferentiableOn_extend_symm (IsManifold.chart_mem_maximalAtlas x)
246360

247361
/-- The composition of the derivative of `extChartAt` with the derivative of the inverse of
248362
`extChartAt` gives the identity.
249363
Version where the basepoint belongs to `(extChartAt I x).target`. -/
250364
lemma mfderiv_extChartAt_comp_mfderivWithin_extChartAt_symm {x : M}
251365
{y : E} (hy : y ∈ (extChartAt I x).target) :
252366
(mfderiv% (extChartAt I x) ((extChartAt I x).symm y)) ∘L
253-
(mfderiv[range I] (extChartAt I x).symm y) = ContinuousLinearMap.id _ _ := by
254-
have U : UniqueMDiffAt[range I] y := by
255-
apply I.uniqueMDiffOn
256-
exact extChartAt_target_subset_range x hy
257-
have h'y : (extChartAt I x).symm y ∈ (extChartAt I x).source := (extChartAt I x).map_target hy
258-
have h''y : (extChartAt I x).symm y ∈ (chartAt H x).source := by
259-
rwa [← extChartAt_source (I := I)]
260-
rw [← mfderiv_comp_mfderivWithin]; rotate_left
261-
· apply mdifferentiableAt_extChartAt h''y
262-
· exact mdifferentiableWithinAt_extChartAt_symm hy
263-
· exact U
264-
rw [← mfderivWithin_id U]
265-
apply Filter.EventuallyEq.mfderivWithin_eq
266-
· filter_upwards [extChartAt_target_mem_nhdsWithin_of_mem hy] with z hz
267-
simp only [Function.comp_def, PartialEquiv.right_inv (extChartAt I x) hz, id_eq]
268-
· simp only [Function.comp_def, PartialEquiv.right_inv (extChartAt I x) hy, id_eq]
367+
(mfderiv[range I] (extChartAt I x).symm y) = ContinuousLinearMap.id _ _ :=
368+
mfderiv_extend_comp_mfderivWithin_extend_symm (IsManifold.chart_mem_maximalAtlas x) hy
269369

270370
set_option backward.isDefEq.respectTransparency false in
271371
/-- The composition of the derivative of `extChartAt` with the derivative of the inverse of
@@ -274,9 +374,8 @@ Version where the basepoint belongs to `(extChartAt I x).source`. -/
274374
lemma mfderiv_extChartAt_comp_mfderivWithin_extChartAt_symm' {x : M}
275375
{y : M} (hy : y ∈ (extChartAt I x).source) :
276376
(mfderiv% (extChartAt I x) y) ∘L (mfderiv[range I] (extChartAt I x).symm (extChartAt I x y))
277-
= ContinuousLinearMap.id _ _ := by
278-
have : y = (extChartAt I x).symm (extChartAt I x y) := ((extChartAt I x).left_inv hy).symm
279-
convert! mfderiv_extChartAt_comp_mfderivWithin_extChartAt_symm ((extChartAt I x).map_source hy)
377+
= ContinuousLinearMap.id _ _ :=
378+
mfderiv_extend_comp_mfderivWithin_extend_symm' (IsManifold.chart_mem_maximalAtlas x) hy
280379

281380
/-- The composition of the derivative of the inverse of `extChartAt` with the derivative of
282381
`extChartAt` gives the identity.
@@ -285,29 +384,8 @@ lemma mfderivWithin_extChartAt_symm_comp_mfderiv_extChartAt
285384
{y : E} (hy : y ∈ (extChartAt I x).target) :
286385
(mfderiv[range I] (extChartAt I x).symm y) ∘L
287386
(mfderiv% (extChartAt I x) ((extChartAt I x).symm y))
288-
= ContinuousLinearMap.id _ _ := by
289-
have h'y : (extChartAt I x).symm y ∈ (extChartAt I x).source := (extChartAt I x).map_target hy
290-
have h''y : (extChartAt I x).symm y ∈ (chartAt H x).source := by
291-
rwa [← extChartAt_source (I := I)]
292-
have U' : UniqueMDiffAt[(extChartAt I x).source] ((extChartAt I x).symm y) :=
293-
(isOpen_extChartAt_source x).uniqueMDiffWithinAt h'y
294-
have : mfderiv% (extChartAt I x) ((extChartAt I x).symm y)
295-
= mfderiv[(extChartAt I x).source] (extChartAt I x) ((extChartAt I x).symm y) := by
296-
rw [mfderivWithin_eq_mfderiv U']
297-
exact mdifferentiableAt_extChartAt h''y
298-
rw [this, ← mfderivWithin_comp_of_eq]; rotate_left
299-
· exact mdifferentiableWithinAt_extChartAt_symm hy
300-
· exact (mdifferentiableAt_extChartAt h''y).mdifferentiableWithinAt
301-
· intro z hz
302-
apply extChartAt_target_subset_range x
303-
exact PartialEquiv.map_source (extChartAt I x) hz
304-
· exact U'
305-
· exact PartialEquiv.right_inv (extChartAt I x) hy
306-
rw [← mfderivWithin_id U']
307-
apply Filter.EventuallyEq.mfderivWithin_eq
308-
· filter_upwards [extChartAt_source_mem_nhdsWithin' h'y] with z hz
309-
simp only [Function.comp_def, PartialEquiv.left_inv (extChartAt I x) hz, id_eq]
310-
· simp only [Function.comp_def, PartialEquiv.right_inv (extChartAt I x) hy, id_eq]
387+
= ContinuousLinearMap.id _ _ :=
388+
mfderivWithin_extend_symm_comp_mfderiv_extend (IsManifold.chart_mem_maximalAtlas x) hy
311389

312390
/-- The composition of the derivative of the inverse of `extChartAt` with the derivative of
313391
`extChartAt` gives the identity.
@@ -322,18 +400,11 @@ lemma mfderivWithin_extChartAt_symm_comp_mfderiv_extChartAt'
322400

323401
lemma isInvertible_mfderivWithin_extChartAt_symm {y : E} (hy : y ∈ (extChartAt I x).target) :
324402
(mfderiv[range I] (extChartAt I x).symm y).IsInvertible :=
325-
ContinuousLinearMap.IsInvertible.of_inverse
326-
(mfderivWithin_extChartAt_symm_comp_mfderiv_extChartAt hy)
327-
(mfderiv_extChartAt_comp_mfderivWithin_extChartAt_symm hy)
403+
isInvertible_mfderivWithin_extend_symm (IsManifold.chart_mem_maximalAtlas x) hy
328404

329405
lemma isInvertible_mfderiv_extChartAt {y : M} (hy : y ∈ (extChartAt I x).source) :
330-
(mfderiv% (extChartAt I x) y).IsInvertible := by
331-
have h'y : extChartAt I x y ∈ (extChartAt I x).target := (extChartAt I x).map_source hy
332-
have Z := ContinuousLinearMap.IsInvertible.of_inverse
333-
(mfderiv_extChartAt_comp_mfderivWithin_extChartAt_symm h'y)
334-
(mfderivWithin_extChartAt_symm_comp_mfderiv_extChartAt h'y)
335-
have : (extChartAt I x).symm ((extChartAt I x) y) = y := (extChartAt I x).left_inv hy
336-
rwa [this] at Z
406+
(mfderiv% (extChartAt I x) y).IsInvertible :=
407+
isInvertible_mfderiv_extend (IsManifold.chart_mem_maximalAtlas x) (by simpa using hy)
337408

338409
set_option backward.isDefEq.respectTransparency false in
339410
/-- The trivialization of the tangent bundle at a point is the manifold derivative of the

0 commit comments

Comments
 (0)