Skip to content

Commit 435a821

Browse files
committed
feat(TangentCone): add tangentConeAt_closure (#24272)
Also add `gcongr` to `tangentCone_mono`.
1 parent 942869b commit 435a821

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

Mathlib/Analysis/Calculus/TangentCone.lean

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ theorem tangentCone_univ : tangentConeAt 𝕜 univ x = univ :=
9494
eq_univ_of_forall fun _ ↦ mem_tangentConeAt_of_pow_smul (norm_pos_iff.1 hr₀) hr <|
9595
Eventually.of_forall fun _ ↦ mem_univ _
9696

97+
@[gcongr]
9798
theorem tangentCone_mono (h : s ⊆ t) : tangentConeAt 𝕜 s x ⊆ tangentConeAt 𝕜 t x := by
9899
rintro y ⟨c, d, ds, ctop, clim⟩
99100
exact ⟨c, d, mem_of_superset ds fun n hn => h hn, ctop, clim⟩
@@ -106,6 +107,23 @@ variable [NormedAddCommGroup F] [NormedSpace 𝕜 F]
106107
variable [NormedAddCommGroup G] [NormedSpace ℝ G]
107108
variable {x y : E} {s t : Set E}
108109

110+
@[simp]
111+
theorem tangentConeAt_closure : tangentConeAt 𝕜 (closure s) x = tangentConeAt 𝕜 s x := by
112+
refine Subset.antisymm ?_ (tangentCone_mono subset_closure)
113+
rintro y ⟨c, d, ds, ctop, clim⟩
114+
obtain ⟨u, -, u_pos, u_lim⟩ :
115+
∃ u, StrictAnti u ∧ (∀ (n : ℕ), 0 < u n) ∧ Tendsto u atTop (𝓝 (0 : ℝ)) :=
116+
exists_seq_strictAnti_tendsto (0 : ℝ)
117+
have : ∀ᶠ n in atTop, ∃ d', x + d' ∈ s ∧ dist (c n • d n) (c n • d') < u n := by
118+
filter_upwards [ctop.eventually_gt_atTop 0, ds] with n hn hns
119+
rcases Metric.mem_closure_iff.mp hns (u n / ‖c n‖) (div_pos (u_pos n) hn) with ⟨y, hys, hy⟩
120+
refine ⟨y - x, by simpa, ?_⟩
121+
rwa [dist_smul₀, ← dist_add_left x, add_sub_cancel, ← lt_div_iff₀' hn]
122+
simp only [Filter.skolem, eventually_and] at this
123+
rcases this with ⟨d', hd's, hd'⟩
124+
exact ⟨c, d', hd's, ctop, clim.congr_dist
125+
(squeeze_zero' (.of_forall fun _ ↦ dist_nonneg) (hd'.mono fun _ ↦ le_of_lt) u_lim)⟩
126+
109127
/-- Auxiliary lemma ensuring that, under the assumptions defining the tangent cone,
110128
the sequence `d` tends to 0 at infinity. -/
111129
theorem tangentConeAt.lim_zero {α : Type*} (l : Filter α) {c : α → 𝕜} {d : α → E}
@@ -386,6 +404,14 @@ variable [NormedAddCommGroup E] [NormedSpace 𝕜 E]
386404
variable [NormedAddCommGroup F] [NormedSpace 𝕜 F]
387405
variable {x y : E} {s t : Set E}
388406

407+
@[simp]
408+
theorem uniqueDiffWithinAt_closure :
409+
UniqueDiffWithinAt 𝕜 (closure s) x ↔ UniqueDiffWithinAt 𝕜 s x := by
410+
simp [uniqueDiffWithinAt_iff]
411+
412+
protected alias ⟨UniqueDiffWithinAt.of_closure, UniqueDiffWithinAt.closure⟩ :=
413+
uniqueDiffWithinAt_closure
414+
389415
theorem UniqueDiffWithinAt.mono_nhds (h : UniqueDiffWithinAt 𝕜 s x) (st : 𝓝[s] x ≤ 𝓝[t] x) :
390416
UniqueDiffWithinAt 𝕜 t x := by
391417
simp only [uniqueDiffWithinAt_iff] at *
@@ -396,6 +422,10 @@ theorem UniqueDiffWithinAt.mono (h : UniqueDiffWithinAt 𝕜 s x) (st : s ⊆ t)
396422
UniqueDiffWithinAt 𝕜 t x :=
397423
h.mono_nhds <| nhdsWithin_mono _ st
398424

425+
theorem UniqueDiffWithinAt.mono_closure (h : UniqueDiffWithinAt 𝕜 s x) (st : s ⊆ closure t) :
426+
UniqueDiffWithinAt 𝕜 t x :=
427+
(h.mono st).of_closure
428+
399429
theorem uniqueDiffWithinAt_congr (st : 𝓝[s] x = 𝓝[t] x) :
400430
UniqueDiffWithinAt 𝕜 s x ↔ UniqueDiffWithinAt 𝕜 t x :=
401431
fun h => h.mono_nhds <| le_of_eq st, fun h => h.mono_nhds <| le_of_eq st.symm⟩

0 commit comments

Comments
 (0)