|
| 1 | +/- |
| 2 | +Copyright (c) 2019 Sรฉbastien Gouรซzel. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Sรฉbastien Gouรซzel |
| 5 | +-/ |
| 6 | +import Mathlib.Analysis.Calculus.TangentCone.Defs |
| 7 | +import Mathlib.Analysis.SpecificLimits.Basic |
| 8 | +import Mathlib.Analysis.Normed.Module.Basic |
| 9 | + |
| 10 | +/-! |
| 11 | +# Basic properties of tangent cones and sets with unique differentiability property |
| 12 | +
|
| 13 | +In this file we prove basic lemmas about `tangentConeAt`, `UniqueDiffWithinAt`, |
| 14 | +and `UniqueDiffOn`. |
| 15 | +-/ |
| 16 | + |
| 17 | +open Filter Set Metric NormedField |
| 18 | +open scoped Topology Pointwise |
| 19 | + |
| 20 | +variable {๐ : Type*} [NontriviallyNormedField ๐] |
| 21 | +variable {E F G : Type*} |
| 22 | + |
| 23 | +section TVS |
| 24 | +variable [AddCommGroup E] [Module ๐ E] [TopologicalSpace E] |
| 25 | +variable {x y : E} {s t : Set E} |
| 26 | + |
| 27 | +theorem mem_tangentConeAt_of_pow_smul {r : ๐} (hrโ : r โ 0) (hr : โrโ < 1) |
| 28 | + (hs : โแถ n : โ in atTop, x + r ^ n โข y โ s) : y โ tangentConeAt ๐ s x := by |
| 29 | + refine โจfun n โฆ (r ^ n)โปยน, fun n โฆ r ^ n โข y, hs, ?_, ?_โฉ |
| 30 | + ยท simp only [norm_inv, norm_pow, โ inv_pow] |
| 31 | + exact tendsto_pow_atTop_atTop_of_one_lt <| (one_lt_invโ (norm_pos_iff.2 hrโ)).2 hr |
| 32 | + ยท simp only [inv_smul_smulโ (pow_ne_zero _ hrโ), tendsto_const_nhds] |
| 33 | + |
| 34 | +@[simp] |
| 35 | +theorem tangentConeAt_univ : tangentConeAt ๐ univ x = univ := |
| 36 | + let โจ_r, hrโ, hrโฉ := exists_norm_lt_one ๐ |
| 37 | + eq_univ_of_forall fun _ โฆ mem_tangentConeAt_of_pow_smul (norm_pos_iff.1 hrโ) hr <| |
| 38 | + Eventually.of_forall fun _ โฆ mem_univ _ |
| 39 | + |
| 40 | +@[deprecated (since := "2025-04-27")] alias tangentCone_univ := tangentConeAt_univ |
| 41 | + |
| 42 | +@[gcongr] |
| 43 | +theorem tangentConeAt_mono (h : s โ t) : tangentConeAt ๐ s x โ tangentConeAt ๐ t x := by |
| 44 | + rintro y โจc, d, ds, ctop, climโฉ |
| 45 | + exact โจc, d, mem_of_superset ds fun n hn => h hn, ctop, climโฉ |
| 46 | + |
| 47 | +@[deprecated (since := "2025-04-27")] alias tangentCone_mono := tangentConeAt_mono |
| 48 | + |
| 49 | +/-- |
| 50 | +Given `x โ s` and a field extension `๐ โ ๐'`, the tangent cone of `s` at `x` with |
| 51 | +respect to `๐` is contained in the tangent cone of `s` at `x` with respect to `๐'`. |
| 52 | +-/ |
| 53 | +theorem tangentConeAt_mono_field {๐' : Type*} [NontriviallyNormedField ๐'] [NormedAlgebra ๐ ๐'] |
| 54 | + [Module ๐' E] [IsScalarTower ๐ ๐' E] : tangentConeAt ๐ s x โ tangentConeAt ๐' s x := by |
| 55 | + intro ฮฑ hฮฑ |
| 56 | + simp only [tangentConeAt, eventually_atTop, ge_iff_le, tendsto_norm_atTop_iff_cobounded, |
| 57 | + mem_setOf_eq] at hฮฑ โข |
| 58 | + obtain โจc, d, โจa, hโaโฉ, hโ, hโโฉ := hฮฑ |
| 59 | + use ((algebraMap ๐ ๐') โ c), d |
| 60 | + constructor |
| 61 | + ยท use a |
| 62 | + ยท constructor |
| 63 | + ยท intro ฮฒ hฮฒ |
| 64 | + rw [mem_map, mem_atTop_sets] |
| 65 | + obtain โจn, hnโฉ := mem_atTop_sets.1 |
| 66 | + (mem_map.1 (hโ (tendsto_algebraMap_cobounded (๐ := ๐) (๐' := ๐') hฮฒ))) |
| 67 | + use n, fun _ _ โฆ by simp_all |
| 68 | + ยท simpa |
| 69 | + |
| 70 | +variable [ContinuousSMul ๐ E] |
| 71 | + |
| 72 | +/-- Auxiliary lemma ensuring that, under the assumptions defining the tangent cone, |
| 73 | +the sequence `d` tends to 0 at infinity. -/ |
| 74 | +theorem tangentConeAt.lim_zero {ฮฑ : Type*} (l : Filter ฮฑ) {c : ฮฑ โ ๐} {d : ฮฑ โ E} |
| 75 | + (hc : Tendsto (fun n => โc nโ) l atTop) (hd : Tendsto (fun n => c n โข d n) l (๐ y)) : |
| 76 | + Tendsto d l (๐ 0) := by |
| 77 | + have : โแถ n in l, (c n)โปยน โข c n โข d n = d n := |
| 78 | + (eventually_ne_of_tendsto_norm_atTop hc 0).mono fun n hn โฆ inv_smul_smulโ hn (d n) |
| 79 | + rw [tendsto_norm_atTop_iff_cobounded] at hc |
| 80 | + simpa using Tendsto.congr' this <| (tendsto_invโ_cobounded.comp hc).smul hd |
| 81 | + |
| 82 | +variable [ContinuousAdd E] |
| 83 | + |
| 84 | +theorem tangentConeAt_mono_nhds (h : ๐[s] x โค ๐[t] x) : |
| 85 | + tangentConeAt ๐ s x โ tangentConeAt ๐ t x := by |
| 86 | + rintro y โจc, d, ds, ctop, climโฉ |
| 87 | + refine โจc, d, ?_, ctop, climโฉ |
| 88 | + suffices Tendsto (fun n => x + d n) atTop (๐[t] x) from |
| 89 | + tendsto_principal.1 (tendsto_inf.1 this).2 |
| 90 | + refine (tendsto_inf.2 โจ?_, tendsto_principal.2 dsโฉ).mono_right h |
| 91 | + simpa only [add_zero] using tendsto_const_nhds.add (tangentConeAt.lim_zero atTop ctop clim) |
| 92 | + |
| 93 | +@[deprecated (since := "2025-04-27")] alias tangentCone_mono_nhds := tangentConeAt_mono_nhds |
| 94 | + |
| 95 | +/-- Tangent cone of `s` at `x` depends only on `๐[s] x`. -/ |
| 96 | +theorem tangentConeAt_congr (h : ๐[s] x = ๐[t] x) : tangentConeAt ๐ s x = tangentConeAt ๐ t x := |
| 97 | + Subset.antisymm (tangentConeAt_mono_nhds h.le) (tangentConeAt_mono_nhds h.ge) |
| 98 | + |
| 99 | +@[deprecated (since := "2025-04-27")] alias tangentCone_congr := tangentConeAt_congr |
| 100 | + |
| 101 | +/-- Intersecting with a neighborhood of the point does not change the tangent cone. -/ |
| 102 | +theorem tangentConeAt_inter_nhds (ht : t โ ๐ x) : tangentConeAt ๐ (s โฉ t) x = tangentConeAt ๐ s x := |
| 103 | + tangentConeAt_congr (nhdsWithin_restrict' _ ht).symm |
| 104 | + |
| 105 | +@[deprecated (since := "2025-04-27")] alias tangentCone_inter_nhds := tangentConeAt_inter_nhds |
| 106 | + |
| 107 | +end TVS |
| 108 | + |
| 109 | +section Normed |
| 110 | +variable [NormedAddCommGroup E] [NormedSpace ๐ E] |
| 111 | +variable [NormedAddCommGroup F] [NormedSpace ๐ F] |
| 112 | +variable {x y : E} {s t : Set E} |
| 113 | + |
| 114 | +@[simp] |
| 115 | +theorem tangentConeAt_closure : tangentConeAt ๐ (closure s) x = tangentConeAt ๐ s x := by |
| 116 | + refine Subset.antisymm ?_ (tangentConeAt_mono subset_closure) |
| 117 | + rintro y โจc, d, ds, ctop, climโฉ |
| 118 | + obtain โจu, -, u_pos, u_limโฉ : |
| 119 | + โ u, StrictAnti u โง (โ (n : โ), 0 < u n) โง Tendsto u atTop (๐ (0 : โ)) := |
| 120 | + exists_seq_strictAnti_tendsto (0 : โ) |
| 121 | + have : โแถ n in atTop, โ d', x + d' โ s โง dist (c n โข d n) (c n โข d') < u n := by |
| 122 | + filter_upwards [ctop.eventually_gt_atTop 0, ds] with n hn hns |
| 123 | + rcases Metric.mem_closure_iff.mp hns (u n / โc nโ) (div_pos (u_pos n) hn) with โจy, hys, hyโฉ |
| 124 | + refine โจy - x, by simpa, ?_โฉ |
| 125 | + rwa [dist_smulโ, โ dist_add_left x, add_sub_cancel, โ lt_div_iffโ' hn] |
| 126 | + simp only [Filter.skolem, eventually_and] at this |
| 127 | + rcases this with โจd', hd's, hd'โฉ |
| 128 | + exact โจc, d', hd's, ctop, clim.congr_dist |
| 129 | + (squeeze_zero' (.of_forall fun _ โฆ dist_nonneg) (hd'.mono fun _ โฆ le_of_lt) u_lim)โฉ |
| 130 | + |
| 131 | +/-- The tangent cone at a non-isolated point contains `0`. -/ |
| 132 | +theorem zero_mem_tangentCone {s : Set E} {x : E} (hx : x โ closure s) : |
| 133 | + 0 โ tangentConeAt ๐ s x := by |
| 134 | + /- Take a sequence `d n` tending to `0` such that `x + d n โ s`. Taking `c n` of the order |
| 135 | + of `1 / (d n) ^ (1/2)`, then `c n` tends to infinity, but `c n โข d n` tends to `0`. By definition, |
| 136 | + this shows that `0` belongs to the tangent cone. -/ |
| 137 | + obtain โจu, -, hu, u_limโฉ : |
| 138 | + โ u, StrictAnti u โง (โ (n : โ), 0 < u n โง u n < 1) โง Tendsto u atTop (๐ (0 : โ)) := |
| 139 | + exists_seq_strictAnti_tendsto' one_pos |
| 140 | + choose u_pos u_lt_one using hu |
| 141 | + choose v hvs hvu using fun n โฆ Metric.mem_closure_iff.mp hx _ (mul_pos (u_pos n) (u_pos n)) |
| 142 | + let d n := v n - x |
| 143 | + let โจr, hrโฉ := exists_one_lt_norm ๐ |
| 144 | + have A n := exists_nat_pow_near (one_le_inv_iffโ.mpr โจu_pos n, (u_lt_one n).leโฉ) hr |
| 145 | + choose m hm_le hlt_m using A |
| 146 | + set c := fun n โฆ r ^ (m n + 1) |
| 147 | + have c_lim : Tendsto (fun n โฆ โc nโ) atTop atTop := by |
| 148 | + simp only [c, norm_pow] |
| 149 | + refine tendsto_atTop_mono (fun n โฆ (hlt_m n).le) <| .inv_tendsto_nhdsGT_zero ?_ |
| 150 | + exact tendsto_nhdsWithin_iff.mpr โจu_lim, .of_forall u_posโฉ |
| 151 | + refine โจc, d, .of_forall <| by simpa [d], c_lim, ?_โฉ |
| 152 | + have Hle n : โc n โข d nโ โค โrโ * u n := by |
| 153 | + specialize u_pos n |
| 154 | + calc |
| 155 | + โc n โข d nโ โค (u n)โปยน * โrโ * (u n * u n) := by |
| 156 | + simp only [c, norm_smul, norm_pow, pow_succ, norm_mul, d, โ dist_eq_norm'] |
| 157 | + gcongr |
| 158 | + exacts [hm_le n, (hvu n).le] |
| 159 | + _ = โrโ * u n := by field |
| 160 | + refine squeeze_zero_norm Hle ?_ |
| 161 | + simpa using tendsto_const_nhds.mul u_lim |
| 162 | + |
| 163 | +/-- If `x` is not an accumulation point of `s, then the tangent cone of `s` at `x` |
| 164 | +is a subset of `{0}`. -/ |
| 165 | +theorem tangentConeAt_subset_zero (hx : ยฌAccPt x (๐ s)) : tangentConeAt ๐ s x โ 0 := by |
| 166 | + rintro y โจc, d, hds, hc, hcdโฉ |
| 167 | + suffices โแถ n in .atTop, d n = 0 from |
| 168 | + tendsto_nhds_unique hcd <| tendsto_const_nhds.congr' <| this.mono fun n hn โฆ by simp [hn] |
| 169 | + simp only [accPt_iff_frequently, not_frequently, not_and', ne_eq, not_not] at hx |
| 170 | + have : Tendsto (x + d ยท) atTop (๐ x) := by |
| 171 | + simpa using tendsto_const_nhds.add (tangentConeAt.lim_zero _ hc hcd) |
| 172 | + filter_upwards [this.eventually hx, hds] with n hโ hโ |
| 173 | + simpa using hโ hโ |
| 174 | + |
| 175 | +theorem UniqueDiffWithinAt.accPt [Nontrivial E] (h : UniqueDiffWithinAt ๐ s x) : AccPt x (๐ s) := by |
| 176 | + by_contra! h' |
| 177 | + have : Dense (Submodule.span ๐ (0 : Set E) : Set E) := |
| 178 | + h.1.mono <| by gcongr; exact tangentConeAt_subset_zero h' |
| 179 | + simp [dense_iff_closure_eq] at this |
| 180 | + |
| 181 | +end Normed |
| 182 | + |
| 183 | +section UniqueDiff |
| 184 | + |
| 185 | +/-! |
| 186 | +### Properties of `UniqueDiffWithinAt` and `UniqueDiffOn` |
| 187 | +
|
| 188 | +This section is devoted to properties of the predicates `UniqueDiffWithinAt` and `UniqueDiffOn`. -/ |
| 189 | + |
| 190 | +section Module |
| 191 | +variable [AddCommGroup E] [Module ๐ E] [TopologicalSpace E] |
| 192 | +variable {x y : E} {s t : Set E} |
| 193 | + |
| 194 | +theorem UniqueDiffOn.uniqueDiffWithinAt {s : Set E} {x} (hs : UniqueDiffOn ๐ s) (h : x โ s) : |
| 195 | + UniqueDiffWithinAt ๐ s x := |
| 196 | + hs x h |
| 197 | + |
| 198 | +@[simp] |
| 199 | +theorem uniqueDiffWithinAt_univ : UniqueDiffWithinAt ๐ univ x := by |
| 200 | + rw [uniqueDiffWithinAt_iff, tangentConeAt_univ] |
| 201 | + simp |
| 202 | + |
| 203 | +@[simp] |
| 204 | +theorem uniqueDiffOn_univ : UniqueDiffOn ๐ (univ : Set E) := |
| 205 | + fun _ _ => uniqueDiffWithinAt_univ |
| 206 | + |
| 207 | +theorem uniqueDiffOn_empty : UniqueDiffOn ๐ (โ
: Set E) := |
| 208 | + fun _ hx => hx.elim |
| 209 | + |
| 210 | +theorem UniqueDiffWithinAt.congr_pt (h : UniqueDiffWithinAt ๐ s x) (hy : x = y) : |
| 211 | + UniqueDiffWithinAt ๐ s y := hy โธ h |
| 212 | + |
| 213 | +variable {๐' : Type*} [NontriviallyNormedField ๐'] [NormedAlgebra ๐ ๐'] |
| 214 | + [Module ๐' E] [IsScalarTower ๐ ๐' E] |
| 215 | + |
| 216 | +/-- |
| 217 | +Assume that `E` is a normed vector space over normed fields `๐ โ ๐'` and that `x โ s` is a point |
| 218 | +of unique differentiability with respect to the set `s` and the smaller field `๐`, then `x` is also |
| 219 | +a point of unique differentiability with respect to the set `s` and the larger field `๐'`. |
| 220 | +-/ |
| 221 | +theorem UniqueDiffWithinAt.mono_field (hโs : UniqueDiffWithinAt ๐ s x) : |
| 222 | + UniqueDiffWithinAt ๐' s x := by |
| 223 | + simp_all only [uniqueDiffWithinAt_iff, and_true] |
| 224 | + apply Dense.mono _ hโs.1 |
| 225 | + trans โ(Submodule.span ๐ (tangentConeAt ๐' s x)) |
| 226 | + <;> simp [Submodule.span_mono tangentConeAt_mono_field] |
| 227 | + |
| 228 | +/-- |
| 229 | +Assume that `E` is a normed vector space over normed fields `๐ โ ๐'` and all points of `s` are |
| 230 | +points of unique differentiability with respect to the smaller field `๐`, then they are also points |
| 231 | +of unique differentiability with respect to the larger field `๐`. |
| 232 | +-/ |
| 233 | +theorem UniqueDiffOn.mono_field (hโs : UniqueDiffOn ๐ s) : |
| 234 | + UniqueDiffOn ๐' s := fun x hx โฆ (hโs x hx).mono_field |
| 235 | + |
| 236 | +end Module |
| 237 | + |
| 238 | +section TVS |
| 239 | +variable [AddCommGroup E] [Module ๐ E] [TopologicalSpace E] |
| 240 | +variable {x y : E} {s t : Set E} |
| 241 | +variable [ContinuousAdd E] [ContinuousSMul ๐ E] |
| 242 | + |
| 243 | +theorem UniqueDiffWithinAt.mono_nhds (h : UniqueDiffWithinAt ๐ s x) (st : ๐[s] x โค ๐[t] x) : |
| 244 | + UniqueDiffWithinAt ๐ t x := by |
| 245 | + simp only [uniqueDiffWithinAt_iff] at * |
| 246 | + rw [mem_closure_iff_nhdsWithin_neBot] at h โข |
| 247 | + exact โจh.1.mono <| Submodule.span_mono <| tangentConeAt_mono_nhds st, h.2.mono stโฉ |
| 248 | + |
| 249 | +theorem UniqueDiffWithinAt.mono (h : UniqueDiffWithinAt ๐ s x) (st : s โ t) : |
| 250 | + UniqueDiffWithinAt ๐ t x := |
| 251 | + h.mono_nhds <| nhdsWithin_mono _ st |
| 252 | + |
| 253 | +theorem uniqueDiffWithinAt_congr (st : ๐[s] x = ๐[t] x) : |
| 254 | + UniqueDiffWithinAt ๐ s x โ UniqueDiffWithinAt ๐ t x := |
| 255 | + โจfun h => h.mono_nhds <| le_of_eq st, fun h => h.mono_nhds <| le_of_eq st.symmโฉ |
| 256 | + |
| 257 | +theorem uniqueDiffWithinAt_inter (ht : t โ ๐ x) : |
| 258 | + UniqueDiffWithinAt ๐ (s โฉ t) x โ UniqueDiffWithinAt ๐ s x := |
| 259 | + uniqueDiffWithinAt_congr <| (nhdsWithin_restrict' _ ht).symm |
| 260 | + |
| 261 | +theorem UniqueDiffWithinAt.inter (hs : UniqueDiffWithinAt ๐ s x) (ht : t โ ๐ x) : |
| 262 | + UniqueDiffWithinAt ๐ (s โฉ t) x := |
| 263 | + (uniqueDiffWithinAt_inter ht).2 hs |
| 264 | + |
| 265 | +theorem uniqueDiffWithinAt_inter' (ht : t โ ๐[s] x) : |
| 266 | + UniqueDiffWithinAt ๐ (s โฉ t) x โ UniqueDiffWithinAt ๐ s x := |
| 267 | + uniqueDiffWithinAt_congr <| (nhdsWithin_restrict'' _ ht).symm |
| 268 | + |
| 269 | +theorem UniqueDiffWithinAt.inter' (hs : UniqueDiffWithinAt ๐ s x) (ht : t โ ๐[s] x) : |
| 270 | + UniqueDiffWithinAt ๐ (s โฉ t) x := |
| 271 | + (uniqueDiffWithinAt_inter' ht).2 hs |
| 272 | + |
| 273 | +theorem uniqueDiffWithinAt_of_mem_nhds (h : s โ ๐ x) : UniqueDiffWithinAt ๐ s x := by |
| 274 | + simpa only [univ_inter] using uniqueDiffWithinAt_univ.inter h |
| 275 | + |
| 276 | +theorem IsOpen.uniqueDiffWithinAt (hs : IsOpen s) (xs : x โ s) : UniqueDiffWithinAt ๐ s x := |
| 277 | + uniqueDiffWithinAt_of_mem_nhds (IsOpen.mem_nhds hs xs) |
| 278 | + |
| 279 | +theorem UniqueDiffOn.inter (hs : UniqueDiffOn ๐ s) (ht : IsOpen t) : UniqueDiffOn ๐ (s โฉ t) := |
| 280 | + fun x hx => (hs x hx.1).inter (IsOpen.mem_nhds ht hx.2) |
| 281 | + |
| 282 | +theorem IsOpen.uniqueDiffOn (hs : IsOpen s) : UniqueDiffOn ๐ s := |
| 283 | + fun _ hx => IsOpen.uniqueDiffWithinAt hs hx |
| 284 | + |
| 285 | +end TVS |
| 286 | + |
| 287 | +section Normed |
| 288 | +variable [NormedAddCommGroup E] [NormedSpace ๐ E] |
| 289 | +variable [NormedAddCommGroup F] [NormedSpace ๐ F] |
| 290 | +variable {x y : E} {s t : Set E} |
| 291 | + |
| 292 | +@[simp] |
| 293 | +theorem uniqueDiffWithinAt_closure : |
| 294 | + UniqueDiffWithinAt ๐ (closure s) x โ UniqueDiffWithinAt ๐ s x := by |
| 295 | + simp [uniqueDiffWithinAt_iff] |
| 296 | + |
| 297 | +protected alias โจUniqueDiffWithinAt.of_closure, UniqueDiffWithinAt.closureโฉ := |
| 298 | + uniqueDiffWithinAt_closure |
| 299 | + |
| 300 | +theorem UniqueDiffWithinAt.mono_closure (h : UniqueDiffWithinAt ๐ s x) (st : s โ closure t) : |
| 301 | + UniqueDiffWithinAt ๐ t x := |
| 302 | + (h.mono st).of_closure |
| 303 | + |
| 304 | +end Normed |
| 305 | + |
| 306 | +end UniqueDiff |
0 commit comments