|
| 1 | +/- |
| 2 | +Copyright (c) 2026 Moritz Doll. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Moritz Doll, Anatole Dedecker |
| 5 | +-/ |
| 6 | +module |
| 7 | + |
| 8 | +public import Mathlib.Analysis.Distribution.TemperedDistribution |
| 9 | + |
| 10 | +/-! # Support of distributions |
| 11 | +
|
| 12 | +We define the support of a distribution, `dsupport u`, as the intersection of all closed sets for |
| 13 | +which `u` vanishes on the complement. |
| 14 | +For this we also define a predicate `IsVanishingOn` that asserts that a map `f : F → V` vanishes on |
| 15 | +`s : Set α` if for all `u : F` with `tsupport u ⊆ s` it follows that `f u = 0`. |
| 16 | +
|
| 17 | +These definitions work independently of a specific class of distributions (classical, tempered, or |
| 18 | +compactly supported) and all basic properties are proved in an abstract setting using `FunLike`. |
| 19 | +
|
| 20 | +## Main definitions |
| 21 | +* `IsVanishingOn`: A distribution vanishes on a set if it acts trivially on all test functions |
| 22 | + supported in that subset. |
| 23 | +* `dsupport`: The support of a distribution is the intersection of all closed sets for which that |
| 24 | + distribution vanishes on the complement of the set. |
| 25 | +
|
| 26 | +## Main statements |
| 27 | +* `TemperedDistribution.dsupport_delta`: The support of the delta distribution is a single point. |
| 28 | +
|
| 29 | +-/ |
| 30 | + |
| 31 | +@[expose] public noncomputable section |
| 32 | + |
| 33 | +variable {ι α β 𝕜 E F F₁ F₂ R V : Type*} |
| 34 | + |
| 35 | +open scoped Topology |
| 36 | + |
| 37 | +namespace Distribution |
| 38 | + |
| 39 | +section IsVanishingOn |
| 40 | + |
| 41 | +variable [FunLike F α β] [TopologicalSpace α] [Zero β] |
| 42 | + |
| 43 | +variable {f g : F → V} {s s₁ s₂ : Set α} |
| 44 | + |
| 45 | +/-! ### Vanishing of distributions -/ |
| 46 | + |
| 47 | +section Zero |
| 48 | + |
| 49 | +variable [Zero V] |
| 50 | + |
| 51 | +/-- A distribution `f` vanishes on a set `s` if it vanishes for all test functions `u` with |
| 52 | +`tsupport u ⊆ s`. |
| 53 | +
|
| 54 | +To make this definition work for all types of distributions, we define it for any function from |
| 55 | +a `FunLike` type to a type with zero. -/ |
| 56 | +def IsVanishingOn (f : F → V) (s : Set α) : Prop := |
| 57 | + ∀ (u : F), tsupport u ⊆ s → f u = 0 |
| 58 | + |
| 59 | +@[gcongr] |
| 60 | +theorem IsVanishingOn.mono ⦃s₁ s₂ : Set α⦄ (hs : s₂ ⊆ s₁) (hf : IsVanishingOn f s₁) : |
| 61 | + IsVanishingOn f s₂ := |
| 62 | + (hf · <| ·.trans hs) |
| 63 | + |
| 64 | +theorem not_isVanishingOn_mono ⦃s₁ s₂ : Set α⦄ (hs : s₁ ⊆ s₂) (hf : ¬ IsVanishingOn f s₁) : |
| 65 | + ¬ IsVanishingOn f s₂ := |
| 66 | + (hf <| ·.mono hs) |
| 67 | + |
| 68 | +theorem not_isVanishingOn_iff : |
| 69 | + ¬ IsVanishingOn f s ↔ ∃ u : F, tsupport u ⊆ s ∧ f u ≠ 0 := by |
| 70 | + simp [IsVanishingOn] |
| 71 | + |
| 72 | +end Zero |
| 73 | + |
| 74 | +end IsVanishingOn |
| 75 | + |
| 76 | +section dsupport |
| 77 | + |
| 78 | +/-! ### Support -/ |
| 79 | + |
| 80 | +section Zero |
| 81 | + |
| 82 | +variable [FunLike F α β] [TopologicalSpace α] [Zero β] [Zero V] |
| 83 | + |
| 84 | +variable {f g : F → V} {s s₁ s₂ : Set α} |
| 85 | + |
| 86 | +/-- The distributional support of `f` is the intersection of all closed sets `s` such that `f` |
| 87 | +vanishes on the complement of `s`. |
| 88 | +
|
| 89 | +To make this definition work for all types of distributions, we define it for any function from |
| 90 | +a `FunLike` type to a type with zero. -/ |
| 91 | +def dsupport (f : F → V) : Set α := ⋂₀ { s | IsVanishingOn f sᶜ ∧ IsClosed s} |
| 92 | + |
| 93 | +theorem mem_dsupport_iff (x : α) : |
| 94 | + x ∈ dsupport f ↔ ∀ (s : Set α), IsVanishingOn f sᶜ → IsClosed s → x ∈ s := by |
| 95 | + simp [dsupport] |
| 96 | + |
| 97 | +/-- The complement of the support is the largest open set on which `f` vanishes. -/ |
| 98 | +theorem dsupport_compl_eq : (dsupport f)ᶜ = ⋃₀ { a | IsVanishingOn f a ∧ IsOpen a } := by |
| 99 | + simp [dsupport, Set.compl_sInter, Set.compl_image_set_of] |
| 100 | + |
| 101 | +@[simp high] |
| 102 | +theorem notMem_dsupport_iff (x : α) : |
| 103 | + x ∉ (dsupport f) ↔ ∃ (s : Set α), IsVanishingOn f s ∧ IsOpen s ∧ x ∈ s := by |
| 104 | + simp [← Set.mem_compl_iff, dsupport_compl_eq, Set.mem_sUnion, and_assoc] |
| 105 | + |
| 106 | +theorem mem_dsupport_iff_not_isVanishingOn (x : α) : |
| 107 | + x ∈ dsupport f ↔ ∀ s, x ∈ s → IsOpen s → ¬ IsVanishingOn f s := by |
| 108 | + grind only [notMem_dsupport_iff] |
| 109 | + |
| 110 | +theorem mem_dsupport_iff_forall_exists_ne (x : α) : |
| 111 | + x ∈ dsupport f ↔ ∀ s, x ∈ s → IsOpen s → ∃ u : F, tsupport u ⊆ s ∧ f u ≠ 0 := by |
| 112 | + simp_rw [mem_dsupport_iff_not_isVanishingOn, not_isVanishingOn_iff] |
| 113 | + |
| 114 | +theorem mem_dsupport_iff_frequently {x : α} : |
| 115 | + x ∈ dsupport f ↔ ∃ᶠ u in (𝓝 x).smallSets, ¬ IsVanishingOn f u := by |
| 116 | + rw [nhds_basis_opens x |>.frequently_smallSets not_isVanishingOn_mono] |
| 117 | + simpa using mem_dsupport_iff_not_isVanishingOn x |
| 118 | + |
| 119 | +theorem _root_.Filter.HasBasis.mem_dsupport {ι : Sort*} {p : ι → Prop} |
| 120 | + {s : ι → Set α} {x : α} (hl : (𝓝 x).HasBasis p s) : |
| 121 | + x ∈ dsupport f ↔ ∀ (i : ι), p i → ¬ IsVanishingOn f (s i) := by |
| 122 | + rw [mem_dsupport_iff_frequently] |
| 123 | + exact hl.frequently_smallSets not_isVanishingOn_mono |
| 124 | + |
| 125 | +theorem notMem_dsupport_iff_eventually {x : α} : |
| 126 | + x ∉ dsupport f ↔ ∀ᶠ u in (𝓝 x).smallSets, IsVanishingOn f u := by |
| 127 | + simp [mem_dsupport_iff_frequently] |
| 128 | + |
| 129 | +theorem _root_.Filter.HasBasis.notMem_dsupport {ι : Sort*} {p : ι → Prop} |
| 130 | + {s : ι → Set α} {x : α} (hl : (𝓝 x).HasBasis p s) : |
| 131 | + x ∉ dsupport f ↔ ∃ i, p i ∧ IsVanishingOn f (s i) := by |
| 132 | + simp [hl.mem_dsupport] |
| 133 | + |
| 134 | +@[gcongr] |
| 135 | +theorem dsupport_subset_dsupport |
| 136 | + (h : ∀ (s : Set α) (_ : IsOpen s), IsVanishingOn g s → IsVanishingOn f s) : |
| 137 | + dsupport f ⊆ dsupport g := |
| 138 | + Set.sInter_mono fun s ⟨g_van, s_cl⟩ ↦ ⟨h sᶜ s_cl.isOpen_compl g_van, s_cl⟩ |
| 139 | + |
| 140 | +@[grind .] |
| 141 | +theorem isClosed_dsupport : IsClosed (dsupport f) := by |
| 142 | + grind [dsupport, isClosed_sInter] |
| 143 | + |
| 144 | +theorem IsVanishingOn.disjoint_dsupport (h : IsVanishingOn f s) (s_open : IsOpen s) : |
| 145 | + Disjoint s (dsupport f) := by |
| 146 | + rw [← Set.subset_compl_iff_disjoint_right, dsupport_compl_eq] |
| 147 | + exact Set.subset_sUnion_of_mem ⟨h, s_open⟩ |
| 148 | + |
| 149 | +end Zero |
| 150 | + |
| 151 | +end dsupport |
| 152 | + |
| 153 | +section normed |
| 154 | + |
| 155 | +variable [FunLike F α β] [PseudoMetricSpace α] [Zero β] [Zero V] |
| 156 | + |
| 157 | +variable {f : F → V} |
| 158 | + |
| 159 | +/-- The complement of the support is given by all *bounded* open sets on which `f` vanishes. -/ |
| 160 | +theorem compl_dsupport_eq_sUnion_isBounded : |
| 161 | + (dsupport f)ᶜ = ⋃₀ { a | IsVanishingOn f a ∧ IsOpen a ∧ Bornology.IsBounded a } := by |
| 162 | + ext x |
| 163 | + grind [(Metric.hasBasis_nhds_isOpen_isBounded x).notMem_dsupport] |
| 164 | + |
| 165 | +end normed |
| 166 | + |
| 167 | +/-! ## Tempered distributions -/ |
| 168 | + |
| 169 | +open SchwartzMap Distribution TemperedDistribution |
| 170 | + |
| 171 | +variable [NormedAddCommGroup E] [NormedAddCommGroup F] [NormedSpace ℝ E] [NormedSpace ℂ F] |
| 172 | + |
| 173 | +variable {f : 𝓢'(E, F)} {s : Set E} |
| 174 | + |
| 175 | +namespace IsVanishingOn |
| 176 | + |
| 177 | +open scoped Topology |
| 178 | + |
| 179 | +@[grind .] |
| 180 | +theorem smulLeftCLM (hf : IsVanishingOn f s) {g : E → ℂ} (hg : g.HasTemperateGrowth) : |
| 181 | + IsVanishingOn (smulLeftCLM F g f) s := by |
| 182 | + intro u hu |
| 183 | + apply hf ((SchwartzMap.smulLeftCLM ℂ g) u) |
| 184 | + rw [SchwartzMap.smulLeftCLM_apply hg] |
| 185 | + exact (tsupport_smul_subset_right g u).trans hu |
| 186 | + |
| 187 | +open LineDeriv |
| 188 | + |
| 189 | +@[grind .] |
| 190 | +theorem lineDerivOp (hf : IsVanishingOn f s) (m : E) : |
| 191 | + IsVanishingOn (∂_{m} f : 𝓢'(E, F)) s := by |
| 192 | + intro u hu |
| 193 | + simp only [lineDerivOp_apply_apply, map_neg, neg_eq_zero] |
| 194 | + exact hf (∂_{m} u) <| (tsupport_fderiv_apply_subset ℝ m).trans hu |
| 195 | + |
| 196 | +@[grind .] |
| 197 | +theorem iteratedLineDerivOp {n : ℕ} (hf : IsVanishingOn f s) (m : Fin n → E) : |
| 198 | + IsVanishingOn (∂^{m} f : 𝓢'(E, F)) s := by |
| 199 | + induction n with |
| 200 | + | zero => |
| 201 | + exact hf |
| 202 | + | succ n IH => |
| 203 | + exact (IH <| Fin.tail m).lineDerivOp (m 0) |
| 204 | + |
| 205 | +@[grind .] |
| 206 | +theorem _root_.TemperedDistribution.isVanishingOn_delta (x : E) : |
| 207 | + IsVanishingOn (TemperedDistribution.delta x) {x}ᶜ := by |
| 208 | + intro u hu |
| 209 | + rw [Set.subset_compl_singleton_iff] at hu |
| 210 | + apply image_eq_zero_of_notMem_tsupport hu |
| 211 | + |
| 212 | +end IsVanishingOn |
| 213 | + |
| 214 | +section Support |
| 215 | + |
| 216 | +theorem dsupport_smulLeftCLM_subset {g : E → ℂ} (hg : g.HasTemperateGrowth) : |
| 217 | + dsupport (smulLeftCLM F g f) ⊆ dsupport f := by |
| 218 | + gcongr; grind |
| 219 | + |
| 220 | +open LineDeriv |
| 221 | + |
| 222 | +theorem dsupport_lineDerivOp_subset (m : E) : dsupport (∂_{m} f : 𝓢'(E, F)) ⊆ dsupport f := by |
| 223 | + gcongr; grind |
| 224 | + |
| 225 | +theorem dsupport_iteratedLineDerivOp_subset {n : ℕ} (m : Fin n → E) : |
| 226 | + dsupport (∂^{m} f : 𝓢'(E, F)) ⊆ dsupport f := by |
| 227 | + gcongr; grind |
| 228 | + |
| 229 | +theorem dsupport_delta [FiniteDimensional ℝ E] (x : E) : |
| 230 | + dsupport (TemperedDistribution.delta x) = {x} := by |
| 231 | + apply subset_antisymm |
| 232 | + · intro x' hx' |
| 233 | + rw [mem_dsupport_iff] at hx' |
| 234 | + exact hx' {x} (isVanishingOn_delta x) (T1Space.t1 x) |
| 235 | + rintro x rfl |
| 236 | + rw [mem_dsupport_iff_forall_exists_ne] |
| 237 | + intro s hx hs |
| 238 | + obtain ⟨u, h₁, h₂, h₃, -, h₄⟩ := |
| 239 | + exists_contDiff_tsupport_subset (n := ⊤) ((IsOpen.mem_nhds_iff hs).mpr hx) |
| 240 | + have h₁' : tsupport (Complex.ofRealCLM ∘ u) ⊆ s := (tsupport_comp_subset rfl _).trans h₁ |
| 241 | + have h₂' : HasCompactSupport (Complex.ofRealCLM ∘ u) := h₂.comp_left rfl |
| 242 | + use h₂'.toSchwartzMap (Complex.ofRealCLM.contDiff.comp h₃) |
| 243 | + exact ⟨h₁', by simp [h₄]⟩ |
| 244 | + |
| 245 | +end Support |
| 246 | + |
| 247 | +end Distribution |
0 commit comments