Skip to content

Commit 97e3e0d

Browse files
luigi-massacciADedeckergrunweg
committed
feat: add differentiation for ContDiffMapSupportedIn (#30201)
Add a wrapper for `iteratedFDeriv` on `ContDiffMapSupportedIn` and related API. Co-authored-by: Anatole Dedecker <anatolededecker@gmail.com> Co-authored-by: ADedecker <anatolededecker@gmail.com> Co-authored-by: Michael Rothgang <rothgang@math.uni-bonn.de>
1 parent 029db12 commit 97e3e0d

File tree

2 files changed

+180
-11
lines changed

2 files changed

+180
-11
lines changed

Mathlib/Analysis/Distribution/ContDiffMapSupportedIn.lean

Lines changed: 174 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ functions `f : E → F` (where `F` is a normed vector space) such that:
2121
- `f` vanishes outside of a compact set: `EqOn f 0 Kᶜ`.
2222
2323
The main reason this exists as a bundled type is to be endowed with its natural locally convex
24-
topology (namely, uniform convergence of `f` and its derivative up to order `n`).
24+
topology (namely, uniform convergence of `f` and its derivatives up to order `n`).
2525
Taking the locally convex inductive limit of these as `K` varies yields the natural topology on test
2626
functions, used to define distributions. While most of distribution theory cares only about `C^∞`
2727
functions, we also want to endow the space of `C^n` test functions with its natural topology.
@@ -32,9 +32,11 @@ larger space of test functions.
3232
3333
- `ContDiffMapSupportedIn E F n K`: the type of bundled `n`-times continuously differentiable
3434
functions `E → F` which vanish outside of `K`.
35-
- `ContDiffMapSupportedIn.iteratedFDerivₗ'`: wraps `iteratedFDeriv` into a `𝕜`-linear map on
36-
`ContDiffMapSupportedIn E F n K`, as a map into
37-
`ContDiffMapSupportedIn E (E [×i]→L[ℝ] F) (n-i) K`.
35+
- `ContDiffMapSupportedIn.iteratedFDerivWithOrderLM`: wrapper, as a `𝕜`-linear map, for
36+
`iteratedFDeriv` from `ContDiffMapSupportedIn E F n K` to
37+
`ContDiffMapSupportedIn E (E [×i]→L[ℝ] F) k K`.
38+
- `ContDiffMapSupportedIn.iteratedFDerivLM`: specialization of the above, giving a `𝕜`-linear map
39+
from `ContDiffMapSupportedIn E F ⊤ K` to `ContDiffMapSupportedIn E (E [×i]→L[ℝ] F) ⊤ K`.
3840
3941
## Main statements
4042
@@ -52,21 +54,28 @@ TODO:
5254
5355
## Implementation details
5456
55-
The technical choice of spelling `EqOn f 0 Kᶜ` in the definition, as opposed to `tsupport f ⊆ K`
56-
is to make rewriting `f x` to `0` easier when `x ∉ K`.
57+
* The technical choice of spelling `EqOn f 0 Kᶜ` in the definition, as opposed to `tsupport f ⊆ K`
58+
is to make rewriting `f x` to `0` easier when `x ∉ K`.
59+
* Since the most common case is by far the smooth case, we often reserve the "expected" name
60+
of a result/definition to this case, and add `WithOrder` to the declaration applying to
61+
any regularity.
62+
* In `iteratedFDerivWithOrderLM`, we define the `i`-th iterated differentiation operator as
63+
a map from `𝓓^{n}_{K}` to `𝓓^{k}_{K}` without imposing relations on `n`, `k` and `i`. Of course
64+
this is defined as `0` if `k + i > n`. This creates some verbosity as all of these variables are
65+
explicit, but it allows the most flexibility while avoiding DTT hell.
5766
5867
## Tags
5968
6069
distributions
6170
-/
6271

6372
open TopologicalSpace SeminormFamily Set Function Seminorm UniformSpace
64-
open scoped BoundedContinuousFunction Topology NNReal
73+
open scoped BoundedContinuousFunction Topology NNReal ContDiff
6574

6675
variable (𝕜 E F : Type*) [NontriviallyNormedField 𝕜]
6776
[NormedAddCommGroup E] [NormedSpace ℝ E]
6877
[NormedAddCommGroup F] [NormedSpace ℝ F] [NormedSpace 𝕜 F] [SMulCommClass ℝ 𝕜 F]
69-
{n : ℕ∞} {K : Compacts E}
78+
{n k : ℕ∞} {K : Compacts E}
7079

7180
/-- The type of bundled `n`-times continuously differentiable maps which vanish outside of a fixed
7281
compact set `K`. -/
@@ -160,8 +169,8 @@ theorem copy_eq (f : 𝓓^{n}_{K}(E, F)) (f' : E → F) (h : f' = f) : f.copy f'
160169
DFunLike.ext' h
161170

162171
@[simp]
163-
theorem toBoundedContinuousFunction_apply (f : 𝓓^{n}_{K}(E, F)) (x : E) :
164-
(f : BoundedContinuousFunction E F) x = (f x) := rfl
172+
theorem coe_toBoundedContinuousFunction (f : 𝓓^{n}_{K}(E, F)) :
173+
(f : BoundedContinuousFunction E F) = (f : E → F) := rfl
165174

166175
section AddCommGroup
167176

@@ -243,4 +252,159 @@ protected def of_support_subset {f : E → F} (hf : ContDiff ℝ n f) (hsupp : s
243252
contDiff' := hf
244253
zero_on_compl' := support_subset_iff'.mp hsupp
245254

255+
protected theorem bounded_iteratedFDeriv (f : 𝓓^{n}_{K}(E, F)) {i : ℕ} (hi : i ≤ n) :
256+
∃ C, ∀ x, ‖iteratedFDeriv ℝ i f x‖ ≤ C :=
257+
Continuous.bounded_above_of_compact_support
258+
(f.contDiff.continuous_iteratedFDeriv <| (WithTop.le_coe rfl).mpr hi)
259+
(f.hasCompactSupport.iteratedFDeriv i)
260+
261+
/-- Inclusion of `𝓓^{n}_{K}(E, F)` into the space `E →ᵇ F` of bounded continuous maps
262+
as a `𝕜`-linear map.
263+
264+
This is subsumed by `toBoundedContinuousFunctionCLM` (not yet in Mathlib), which also bundles the
265+
continuity. -/
266+
@[simps -fullyApplied]
267+
noncomputable def toBoundedContinuousFunctionLM : 𝓓^{n}_{K}(E, F) →ₗ[𝕜] E →ᵇ F where
268+
toFun f := f
269+
map_add' _ _ := rfl
270+
map_smul' _ _ := rfl
271+
272+
-- Workaround for simps' automatic name generation: manually specifying names is not supported yet.
273+
alias toBoundedContinuousFunctionLM_apply := toBoundedContinuousFunctionLM_apply_apply
274+
275+
lemma toBoundedContinuousFunctionLM_eq_of_scalars (𝕜' : Type*) [NontriviallyNormedField 𝕜']
276+
[NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
277+
(toBoundedContinuousFunctionLM 𝕜 : 𝓓^{n}_{K}(E, F) → _) = toBoundedContinuousFunctionLM 𝕜' :=
278+
rfl
279+
280+
variable (n k) in
281+
/-- `iteratedFDerivWithOrderLM 𝕜 n k i` is the `𝕜`-linear-map sending `f : 𝓓^{n}_{K}(E, F)` to
282+
its `i`-th iterated derivative as an element of `𝓓^{k}_{K}(E, E [×i]→L[ℝ] F)`.
283+
This only makes mathematical sense if `k + i ≤ n`, otherwise we define it as the zero map.
284+
285+
See `iteratedFDerivLM` for the very common case where everything is infinitely differentiable.
286+
287+
This is subsumed by `iteratedFDerivWithOrderCLM` (not yet in Mathlib), which also bundles the
288+
continuity. -/
289+
noncomputable def iteratedFDerivWithOrderLM (i : ℕ) :
290+
𝓓^{n}_{K}(E, F) →ₗ[𝕜] 𝓓^{k}_{K}(E, E [×i]→L[ℝ] F) where
291+
/-
292+
Note: it is tempting to define this as some linear map if `k + i ≤ n`,
293+
and the zero map otherwise. However, we would lose the definitional equality between
294+
`iteratedFDerivWithOrderLM 𝕜 n k i f` and `iteratedFDerivWithOrderLM ℝ n k i f`.
295+
296+
This is caused by the fact that the equality `f (if p then x else y) = if p then f x else f y`
297+
is not definitional.
298+
-/
299+
toFun f :=
300+
if hi : k + i ≤ n then
301+
.of_support_subset
302+
(f.contDiff.iteratedFDeriv_right <| by exact_mod_cast hi)
303+
((support_iteratedFDeriv_subset i).trans f.tsupport_subset)
304+
else 0
305+
map_add' f g := by
306+
split_ifs with hi
307+
· have hi' : (i : WithTop ℕ∞) ≤ n := by exact_mod_cast le_of_add_le_right hi
308+
ext
309+
simp [iteratedFDeriv_add (f.contDiff.of_le hi') (g.contDiff.of_le hi')]
310+
· simp
311+
map_smul' c f := by
312+
split_ifs with hi
313+
· have hi' : (i : WithTop ℕ∞) ≤ n := by exact_mod_cast le_of_add_le_right hi
314+
ext
315+
simp [iteratedFDeriv_const_smul_apply (f.contDiff.of_le hi').contDiffAt]
316+
· simp
317+
318+
@[simp]
319+
lemma iteratedFDerivWithOrderLM_apply {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) :
320+
iteratedFDerivWithOrderLM 𝕜 n k i f = if k + i ≤ n then iteratedFDeriv ℝ i f else 0 := by
321+
rw [ContDiffMapSupportedIn.iteratedFDerivWithOrderLM]
322+
split_ifs <;> rfl
323+
324+
lemma iteratedFDerivWithOrderLM_apply_of_le {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) (hin : k + i ≤ n) :
325+
iteratedFDerivWithOrderLM 𝕜 n k i f = iteratedFDeriv ℝ i f := by
326+
simp [hin]
327+
328+
lemma iteratedFDerivWithOrderLM_apply_of_gt {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) (hin : ¬ (k + i ≤ n)) :
329+
iteratedFDerivWithOrderLM 𝕜 n k i f = 0 := by
330+
ext : 1
331+
simp [hin]
332+
333+
lemma iteratedFDerivWithOrderLM_eq_of_scalars {i : ℕ} (𝕜' : Type*) [NontriviallyNormedField 𝕜']
334+
[NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
335+
(iteratedFDerivWithOrderLM 𝕜 n k i : 𝓓^{n}_{K}(E, F) → _)
336+
= iteratedFDerivWithOrderLM 𝕜' n k i :=
337+
rfl
338+
339+
/-- `iteratedFDerivLM 𝕜 i` is the `𝕜`-linear-map sending `f : 𝓓_{K}(E, F)` to
340+
its `i`-th iterated derivative as an element of `𝓓_{K}(E, E [×i]→L[ℝ] F)`.
341+
342+
See also `iteratedFDerivWithOrderLM` if you need more control on the regularities.
343+
344+
This is subsumed by `iteratedFDerivCLM` (not yet in Mathlib), which also bundles the
345+
continuity. -/
346+
noncomputable def iteratedFDerivLM (i : ℕ) :
347+
𝓓_{K}(E, F) →ₗ[𝕜] 𝓓_{K}(E, E [×i]→L[ℝ] F) where
348+
toFun f := .of_support_subset
349+
(f.contDiff.iteratedFDeriv_right le_rfl)
350+
((support_iteratedFDeriv_subset i).trans f.tsupport_subset)
351+
map_add' f g := by
352+
have hi : (i : WithTop ℕ∞) ≤ ∞ := by exact_mod_cast le_top
353+
ext
354+
simp [iteratedFDeriv_add (f.contDiff.of_le hi) (g.contDiff.of_le hi)]
355+
map_smul' c f := by
356+
have hi : (i : WithTop ℕ∞) ≤ ∞ := by exact_mod_cast le_top
357+
ext
358+
simp [iteratedFDeriv_const_smul_apply (f.contDiff.of_le hi).contDiffAt]
359+
360+
@[simp]
361+
lemma iteratedFDerivLM_apply {i : ℕ} (f : 𝓓_{K}(E, F)) :
362+
iteratedFDerivLM 𝕜 i f = iteratedFDeriv ℝ i f :=
363+
rfl
364+
365+
/-- Note: this turns out to be a definitional equality thanks to decidablity of the order
366+
on `ℕ∞`. This means we could have *defined* `iteratedFDerivLM` this way, but we avoid it
367+
to make sure that `if`s won't appear in the smooth case. -/
368+
lemma iteratedFDerivLM_eq_withOrder (i : ℕ) :
369+
(iteratedFDerivLM 𝕜 i : 𝓓_{K}(E, F) →ₗ[𝕜] _) = iteratedFDerivWithOrderLM 𝕜 ⊤ ⊤ i :=
370+
rfl
371+
372+
lemma iteratedFDerivLM_eq_of_scalars {i : ℕ} (𝕜' : Type*) [NontriviallyNormedField 𝕜']
373+
[NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
374+
(iteratedFDerivLM 𝕜 i : 𝓓_{K}(E, F) → _) = iteratedFDerivLM 𝕜' i :=
375+
rfl
376+
377+
variable (n) in
378+
/-- `structureMapLM 𝕜 n i` is the `𝕜`-linear-map sending `f : 𝓓^{n}_{K}(E, F)` to its
379+
`i`-th iterated derivative as an element of `E →ᵇ (E [×i]→L[ℝ] F)`. In other words, it
380+
is the composition of `toBoundedContinuousFunctionLM 𝕜` and `iteratedFDerivWithOrderLM 𝕜 n 0 i`.
381+
This only makes mathematical sense if `i ≤ n`, otherwise we define it as the zero map.
382+
383+
We call these "structure maps" because they define the topology on `𝓓^{n}_{K}(E, F)`.
384+
385+
This is subsumed by `structureMapCLM` (not yet in Mathlib), which also bundles the
386+
continuity. -/
387+
noncomputable def structureMapLM (i : ℕ) :
388+
𝓓^{n}_{K}(E, F) →ₗ[𝕜] E →ᵇ (E [×i]→L[ℝ] F) :=
389+
toBoundedContinuousFunctionLM 𝕜 ∘ₗ iteratedFDerivWithOrderLM 𝕜 n 0 i
390+
391+
lemma structureMapLM_eq {i : ℕ} :
392+
(structureMapLM 𝕜 ⊤ i : 𝓓_{K}(E, F) →ₗ[𝕜] E →ᵇ (E [×i]→L[ℝ] F)) =
393+
(toBoundedContinuousFunctionLM 𝕜 : 𝓓_{K}(E, E [×i]→L[ℝ] F) →ₗ[𝕜] E →ᵇ (E [×i]→L[ℝ] F)) ∘ₗ
394+
(iteratedFDerivLM 𝕜 i : 𝓓_{K}(E, F) →ₗ[𝕜] 𝓓_{K}(E, E [×i]→L[ℝ] F)) :=
395+
rfl
396+
397+
lemma structureMapLM_apply_withOrder {i : ℕ} (f : 𝓓^{n}_{K}(E, F)) :
398+
structureMapLM 𝕜 n i f = if i ≤ n then iteratedFDeriv ℝ i f else 0 := by
399+
simp [structureMapLM]
400+
401+
lemma structureMapLM_apply {i : ℕ} (f : 𝓓_{K}(E, F)) :
402+
structureMapLM 𝕜 ⊤ i f = iteratedFDeriv ℝ i f := by
403+
simp [structureMapLM_eq]
404+
405+
lemma structureMapLM_eq_of_scalars {i : ℕ} (𝕜' : Type*) [NontriviallyNormedField 𝕜']
406+
[NormedSpace 𝕜' F] [SMulCommClass ℝ 𝕜' F] :
407+
(structureMapLM 𝕜 n i : 𝓓^{n}_{K}(E, F) → _) = structureMapLM 𝕜' n i :=
408+
rfl
409+
246410
end ContDiffMapSupportedIn

Mathlib/Topology/ContinuousMap/Bounded/Basic.lean

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ protected theorem continuous (f : α →ᵇ β) : Continuous f :=
9494
theorem ext (h : ∀ x, f x = g x) : f = g :=
9595
DFunLike.ext _ _ h
9696

97+
@[simp]
98+
theorem coe_mk (f : α → β) (h : _) (h' : _) :
99+
BoundedContinuousFunction.mk ⟨f, h⟩ h' = f :=
100+
rfl
101+
97102
theorem isBounded_range (f : α →ᵇ β) : IsBounded (range f) :=
98103
isBounded_range_iff.2 f.bounded
99104

@@ -194,7 +199,7 @@ instance instMetricSpace {β} [MetricSpace β] : MetricSpace (α →ᵇ β) wher
194199
theorem nndist_eq : nndist f g = sInf { C | ∀ x : α, nndist (f x) (g x) ≤ C } :=
195200
Subtype.ext <| dist_eq.trans <| by
196201
rw [val_eq_coe, coe_sInf, coe_image]
197-
simp_rw [mem_setOf_eq, ← NNReal.coe_le_coe, coe_mk, exists_prop, coe_nndist]
202+
simp_rw [mem_setOf_eq, ← NNReal.coe_le_coe, NNReal.coe_mk, exists_prop, coe_nndist]
198203

199204
theorem nndist_set_exists : ∃ C, ∀ x : α, nndist (f x) (g x) ≤ C :=
200205
Subtype.exists.mpr <| dist_set_exists.imp fun _ ⟨ha, h⟩ => ⟨ha, h⟩

0 commit comments

Comments
 (0)