|
| 1 | +/- |
| 2 | +Copyright (c) 2019 Jan-David Salchow. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Jan-David Salchow, Sébastien Gouëzel, Jean Lo |
| 5 | +-/ |
| 6 | +import analysis.normed_space.basic |
| 7 | + |
| 8 | +/-! # Constructions of continuous linear maps between (semi-)normed spaces |
| 9 | +
|
| 10 | +A fundamental fact about (semi-)linear maps between normed spaces over sensible fields is that |
| 11 | +continuity and boundedness are equivalent conditions. That is, for normed spaces `E`, `F`, a |
| 12 | +`linear_map` `f : E →ₛₗ[σ] F` is the coercion of some `continuous_linear_map` `f' : E →SL[σ] F`, if |
| 13 | +and only if there exists a bound `C` such that for all `x`, `‖f x‖ ≤ C * ‖x‖`. |
| 14 | +
|
| 15 | +We prove one direction in this file: `linear_map.mk_continuous`, boundedness implies continuity. The |
| 16 | +other direction, `continuous_linear_map.bound`, is deferred to a later file, where the |
| 17 | +strong operator topology on `E →SL[σ] F` is available, because it is natural to use |
| 18 | +`continuous_linear_map.bound` to define a norm `⨆ x, ‖f x‖ / ‖x‖` on `E →SL[σ] F` and to show that |
| 19 | +this is compatible with the strong operator topology. |
| 20 | +
|
| 21 | +This file also contains several corollaries of `linear_map.mk_continuous`: other "easy" |
| 22 | +constructions of continuous linear maps between normed spaces. |
| 23 | +
|
| 24 | +This file is meant to be lightweight (it is imported by much of the analysis library); think twice |
| 25 | +before adding imports! |
| 26 | +-/ |
| 27 | + |
| 28 | +open metric continuous_linear_map |
| 29 | +open set real |
| 30 | + |
| 31 | +open_locale nnreal |
| 32 | + |
| 33 | +variables {𝕜 𝕜₂ E F G : Type*} |
| 34 | + |
| 35 | +variables [normed_field 𝕜] [normed_field 𝕜₂] |
| 36 | + |
| 37 | +/-! # General constructions -/ |
| 38 | + |
| 39 | +section seminormed |
| 40 | + |
| 41 | +variables [seminormed_add_comm_group E] [seminormed_add_comm_group F] [seminormed_add_comm_group G] |
| 42 | +variables [normed_space 𝕜 E] [normed_space 𝕜₂ F] [normed_space 𝕜 G] |
| 43 | +variables {σ : 𝕜 →+* 𝕜₂} (f : E →ₛₗ[σ] F) |
| 44 | + |
| 45 | +/-- Construct a continuous linear map from a linear map and a bound on this linear map. |
| 46 | +The fact that the norm of the continuous linear map is then controlled is given in |
| 47 | +`linear_map.mk_continuous_norm_le`. -/ |
| 48 | +def linear_map.mk_continuous (C : ℝ) (h : ∀x, ‖f x‖ ≤ C * ‖x‖) : E →SL[σ] F := |
| 49 | +⟨f, add_monoid_hom_class.continuous_of_bound f C h⟩ |
| 50 | + |
| 51 | +/-- Reinterpret a linear map `𝕜 →ₗ[𝕜] E` as a continuous linear map. This construction |
| 52 | +is generalized to the case of any finite dimensional domain |
| 53 | +in `linear_map.to_continuous_linear_map`. -/ |
| 54 | +def linear_map.to_continuous_linear_map₁ (f : 𝕜 →ₗ[𝕜] E) : 𝕜 →L[𝕜] E := |
| 55 | +f.mk_continuous (‖f 1‖) $ λ x, le_of_eq $ |
| 56 | +by { conv_lhs { rw ← mul_one x }, rw [← smul_eq_mul, f.map_smul, norm_smul, mul_comm] } |
| 57 | + |
| 58 | +/-- Construct a continuous linear map from a linear map and the existence of a bound on this linear |
| 59 | +map. If you have an explicit bound, use `linear_map.mk_continuous` instead, as a norm estimate will |
| 60 | +follow automatically in `linear_map.mk_continuous_norm_le`. -/ |
| 61 | +def linear_map.mk_continuous_of_exists_bound (h : ∃C, ∀x, ‖f x‖ ≤ C * ‖x‖) : E →SL[σ] F := |
| 62 | +⟨f, let ⟨C, hC⟩ := h in add_monoid_hom_class.continuous_of_bound f C hC⟩ |
| 63 | + |
| 64 | +lemma continuous_of_linear_of_boundₛₗ {f : E → F} (h_add : ∀ x y, f (x + y) = f x + f y) |
| 65 | + (h_smul : ∀ (c : 𝕜) x, f (c • x) = (σ c) • f x) {C : ℝ} (h_bound : ∀ x, ‖f x‖ ≤ C*‖x‖) : |
| 66 | + continuous f := |
| 67 | +let φ : E →ₛₗ[σ] F := { to_fun := f, map_add' := h_add, map_smul' := h_smul } in |
| 68 | +add_monoid_hom_class.continuous_of_bound φ C h_bound |
| 69 | + |
| 70 | +lemma continuous_of_linear_of_bound {f : E → G} (h_add : ∀ x y, f (x + y) = f x + f y) |
| 71 | + (h_smul : ∀ (c : 𝕜) x, f (c • x) = c • f x) {C : ℝ} (h_bound : ∀ x, ‖f x‖ ≤ C*‖x‖) : |
| 72 | + continuous f := |
| 73 | +let φ : E →ₗ[𝕜] G := { to_fun := f, map_add' := h_add, map_smul' := h_smul } in |
| 74 | +add_monoid_hom_class.continuous_of_bound φ C h_bound |
| 75 | + |
| 76 | +@[simp, norm_cast] lemma linear_map.mk_continuous_coe (C : ℝ) (h : ∀x, ‖f x‖ ≤ C * ‖x‖) : |
| 77 | + ((f.mk_continuous C h) : E →ₛₗ[σ] F) = f := rfl |
| 78 | + |
| 79 | +@[simp] lemma linear_map.mk_continuous_apply (C : ℝ) (h : ∀x, ‖f x‖ ≤ C * ‖x‖) (x : E) : |
| 80 | + f.mk_continuous C h x = f x := rfl |
| 81 | + |
| 82 | +@[simp, norm_cast] lemma linear_map.mk_continuous_of_exists_bound_coe |
| 83 | + (h : ∃C, ∀x, ‖f x‖ ≤ C * ‖x‖) : |
| 84 | + ((f.mk_continuous_of_exists_bound h) : E →ₛₗ[σ] F) = f := rfl |
| 85 | + |
| 86 | +@[simp] lemma linear_map.mk_continuous_of_exists_bound_apply (h : ∃C, ∀x, ‖f x‖ ≤ C * ‖x‖) (x : E) : |
| 87 | + f.mk_continuous_of_exists_bound h x = f x := rfl |
| 88 | + |
| 89 | +@[simp] lemma linear_map.to_continuous_linear_map₁_coe (f : 𝕜 →ₗ[𝕜] E) : |
| 90 | + (f.to_continuous_linear_map₁ : 𝕜 →ₗ[𝕜] E) = f := |
| 91 | +rfl |
| 92 | + |
| 93 | +@[simp] lemma linear_map.to_continuous_linear_map₁_apply (f : 𝕜 →ₗ[𝕜] E) (x) : |
| 94 | + f.to_continuous_linear_map₁ x = f x := |
| 95 | +rfl |
| 96 | + |
| 97 | +namespace continuous_linear_map |
| 98 | + |
| 99 | +theorem antilipschitz_of_bound (f : E →SL[σ] F) {K : ℝ≥0} (h : ∀ x, ‖x‖ ≤ K * ‖f x‖) : |
| 100 | + antilipschitz_with K f := |
| 101 | +add_monoid_hom_class.antilipschitz_of_bound _ h |
| 102 | + |
| 103 | +lemma bound_of_antilipschitz (f : E →SL[σ] F) {K : ℝ≥0} (h : antilipschitz_with K f) (x) : |
| 104 | + ‖x‖ ≤ K * ‖f x‖ := |
| 105 | +add_monoid_hom_class.bound_of_antilipschitz _ h x |
| 106 | + |
| 107 | +end continuous_linear_map |
| 108 | + |
| 109 | +section |
| 110 | + |
| 111 | +variables {σ₂₁ : 𝕜₂ →+* 𝕜} [ring_hom_inv_pair σ σ₂₁] [ring_hom_inv_pair σ₂₁ σ] |
| 112 | + |
| 113 | +include σ₂₁ |
| 114 | + |
| 115 | +/-- Construct a continuous linear equivalence from a linear equivalence together with |
| 116 | +bounds in both directions. -/ |
| 117 | +def linear_equiv.to_continuous_linear_equiv_of_bounds (e : E ≃ₛₗ[σ] F) (C_to C_inv : ℝ) |
| 118 | + (h_to : ∀ x, ‖e x‖ ≤ C_to * ‖x‖) (h_inv : ∀ x : F, ‖e.symm x‖ ≤ C_inv * ‖x‖) : E ≃SL[σ] F := |
| 119 | +{ to_linear_equiv := e, |
| 120 | + continuous_to_fun := add_monoid_hom_class.continuous_of_bound e C_to h_to, |
| 121 | + continuous_inv_fun := add_monoid_hom_class.continuous_of_bound e.symm C_inv h_inv } |
| 122 | + |
| 123 | +end |
| 124 | + |
| 125 | +end seminormed |
| 126 | + |
| 127 | +section normed |
| 128 | + |
| 129 | +variables [normed_add_comm_group E] [normed_add_comm_group F] [normed_space 𝕜 E] [normed_space 𝕜₂ F] |
| 130 | +variables {σ : 𝕜 →+* 𝕜₂} (f g : E →SL[σ] F) (x y z : E) |
| 131 | + |
| 132 | +theorem continuous_linear_map.uniform_embedding_of_bound {K : ℝ≥0} (hf : ∀ x, ‖x‖ ≤ K * ‖f x‖) : |
| 133 | + uniform_embedding f := |
| 134 | +(add_monoid_hom_class.antilipschitz_of_bound f hf).uniform_embedding f.uniform_continuous |
| 135 | + |
| 136 | +end normed |
| 137 | + |
| 138 | +/-! ## Homotheties -/ |
| 139 | + |
| 140 | +section seminormed |
| 141 | + |
| 142 | +variables [seminormed_add_comm_group E] [seminormed_add_comm_group F] |
| 143 | +variables [normed_space 𝕜 E] [normed_space 𝕜₂ F] |
| 144 | +variables {σ : 𝕜 →+* 𝕜₂} (f : E →ₛₗ[σ] F) |
| 145 | + |
| 146 | +/-- A (semi-)linear map which is a homothety is a continuous linear map. |
| 147 | + Since the field `𝕜` need not have `ℝ` as a subfield, this theorem is not directly deducible from |
| 148 | + the corresponding theorem about isometries plus a theorem about scalar multiplication. Likewise |
| 149 | + for the other theorems about homotheties in this file. |
| 150 | + -/ |
| 151 | +def continuous_linear_map.of_homothety (f : E →ₛₗ[σ] F) (a : ℝ) (hf : ∀x, ‖f x‖ = a * ‖x‖) : |
| 152 | + E →SL[σ] F := |
| 153 | +f.mk_continuous a (λ x, le_of_eq (hf x)) |
| 154 | + |
| 155 | +variables {σ₂₁ : 𝕜₂ →+* 𝕜} [ring_hom_inv_pair σ σ₂₁] [ring_hom_inv_pair σ₂₁ σ] |
| 156 | + |
| 157 | +include σ₂₁ |
| 158 | + |
| 159 | +lemma continuous_linear_equiv.homothety_inverse (a : ℝ) (ha : 0 < a) (f : E ≃ₛₗ[σ] F) : |
| 160 | + (∀ (x : E), ‖f x‖ = a * ‖x‖) → (∀ (y : F), ‖f.symm y‖ = a⁻¹ * ‖y‖) := |
| 161 | +begin |
| 162 | + intros hf y, |
| 163 | + calc ‖(f.symm) y‖ = a⁻¹ * (a * ‖ (f.symm) y‖) : _ |
| 164 | + ... = a⁻¹ * ‖f ((f.symm) y)‖ : by rw hf |
| 165 | + ... = a⁻¹ * ‖y‖ : by simp, |
| 166 | + rw [← mul_assoc, inv_mul_cancel (ne_of_lt ha).symm, one_mul], |
| 167 | +end |
| 168 | + |
| 169 | +/-- A linear equivalence which is a homothety is a continuous linear equivalence. -/ |
| 170 | +noncomputable def continuous_linear_equiv.of_homothety (f : E ≃ₛₗ[σ] F) (a : ℝ) (ha : 0 < a) |
| 171 | + (hf : ∀x, ‖f x‖ = a * ‖x‖) : |
| 172 | + E ≃SL[σ] F := |
| 173 | +linear_equiv.to_continuous_linear_equiv_of_bounds f a a⁻¹ |
| 174 | + (λ x, (hf x).le) (λ x, (continuous_linear_equiv.homothety_inverse a ha f hf x).le) |
| 175 | + |
| 176 | +end seminormed |
| 177 | + |
| 178 | +/- ## The span of a single vector -/ |
| 179 | + |
| 180 | +section seminormed |
| 181 | + |
| 182 | +variables [seminormed_add_comm_group E] [normed_space 𝕜 E] |
| 183 | + |
| 184 | +namespace continuous_linear_map |
| 185 | + |
| 186 | +variable (𝕜) |
| 187 | + |
| 188 | +lemma to_span_singleton_homothety (x : E) (c : 𝕜) : |
| 189 | + ‖linear_map.to_span_singleton 𝕜 E x c‖ = ‖x‖ * ‖c‖ := |
| 190 | +by {rw mul_comm, exact norm_smul _ _} |
| 191 | + |
| 192 | +/-- Given an element `x` of a normed space `E` over a field `𝕜`, the natural continuous |
| 193 | + linear map from `𝕜` to `E` by taking multiples of `x`.-/ |
| 194 | +def to_span_singleton (x : E) : 𝕜 →L[𝕜] E := |
| 195 | +of_homothety (linear_map.to_span_singleton 𝕜 E x) ‖x‖ (to_span_singleton_homothety 𝕜 x) |
| 196 | + |
| 197 | +lemma to_span_singleton_apply (x : E) (r : 𝕜) : to_span_singleton 𝕜 x r = r • x := |
| 198 | +by simp [to_span_singleton, of_homothety, linear_map.to_span_singleton] |
| 199 | + |
| 200 | +lemma to_span_singleton_add (x y : E) : |
| 201 | + to_span_singleton 𝕜 (x + y) = to_span_singleton 𝕜 x + to_span_singleton 𝕜 y := |
| 202 | +by { ext1, simp [to_span_singleton_apply], } |
| 203 | + |
| 204 | +lemma to_span_singleton_smul' (𝕜') [normed_field 𝕜'] [normed_space 𝕜' E] |
| 205 | + [smul_comm_class 𝕜 𝕜' E] (c : 𝕜') (x : E) : |
| 206 | + to_span_singleton 𝕜 (c • x) = c • to_span_singleton 𝕜 x := |
| 207 | +by { ext1, rw [to_span_singleton_apply, smul_apply, to_span_singleton_apply, smul_comm], } |
| 208 | + |
| 209 | +lemma to_span_singleton_smul (c : 𝕜) (x : E) : |
| 210 | + to_span_singleton 𝕜 (c • x) = c • to_span_singleton 𝕜 x := |
| 211 | +to_span_singleton_smul' 𝕜 𝕜 c x |
| 212 | + |
| 213 | +end continuous_linear_map |
| 214 | + |
| 215 | +section |
| 216 | + |
| 217 | +namespace continuous_linear_equiv |
| 218 | + |
| 219 | +variable (𝕜) |
| 220 | + |
| 221 | +lemma to_span_nonzero_singleton_homothety (x : E) (h : x ≠ 0) (c : 𝕜) : |
| 222 | + ‖linear_equiv.to_span_nonzero_singleton 𝕜 E x h c‖ = ‖x‖ * ‖c‖ := |
| 223 | +continuous_linear_map.to_span_singleton_homothety _ _ _ |
| 224 | + |
| 225 | +end continuous_linear_equiv |
| 226 | + |
| 227 | +end |
| 228 | + |
| 229 | +end seminormed |
| 230 | + |
| 231 | +section normed |
| 232 | + |
| 233 | +variables [normed_add_comm_group E] [normed_space 𝕜 E] |
| 234 | + |
| 235 | +namespace continuous_linear_equiv |
| 236 | +variable (𝕜) |
| 237 | + |
| 238 | +/-- Given a nonzero element `x` of a normed space `E₁` over a field `𝕜`, the natural |
| 239 | + continuous linear equivalence from `E₁` to the span of `x`.-/ |
| 240 | +noncomputable def to_span_nonzero_singleton (x : E) (h : x ≠ 0) : 𝕜 ≃L[𝕜] (𝕜 ∙ x) := |
| 241 | +of_homothety |
| 242 | + (linear_equiv.to_span_nonzero_singleton 𝕜 E x h) |
| 243 | + ‖x‖ |
| 244 | + (norm_pos_iff.mpr h) |
| 245 | + (to_span_nonzero_singleton_homothety 𝕜 x h) |
| 246 | + |
| 247 | +/-- Given a nonzero element `x` of a normed space `E₁` over a field `𝕜`, the natural continuous |
| 248 | + linear map from the span of `x` to `𝕜`.-/ |
| 249 | +noncomputable def coord (x : E) (h : x ≠ 0) : (𝕜 ∙ x) →L[𝕜] 𝕜 := |
| 250 | + (to_span_nonzero_singleton 𝕜 x h).symm |
| 251 | + |
| 252 | +@[simp] lemma coe_to_span_nonzero_singleton_symm {x : E} (h : x ≠ 0) : |
| 253 | + ⇑(to_span_nonzero_singleton 𝕜 x h).symm = coord 𝕜 x h := rfl |
| 254 | + |
| 255 | +@[simp] lemma coord_to_span_nonzero_singleton {x : E} (h : x ≠ 0) (c : 𝕜) : |
| 256 | + coord 𝕜 x h (to_span_nonzero_singleton 𝕜 x h c) = c := |
| 257 | +(to_span_nonzero_singleton 𝕜 x h).symm_apply_apply c |
| 258 | + |
| 259 | +@[simp] lemma to_span_nonzero_singleton_coord {x : E} (h : x ≠ 0) (y : 𝕜 ∙ x) : |
| 260 | + to_span_nonzero_singleton 𝕜 x h (coord 𝕜 x h y) = y := |
| 261 | +(to_span_nonzero_singleton 𝕜 x h).apply_symm_apply y |
| 262 | + |
| 263 | +@[simp] lemma coord_self (x : E) (h : x ≠ 0) : |
| 264 | + (coord 𝕜 x h) (⟨x, submodule.mem_span_singleton_self x⟩ : 𝕜 ∙ x) = 1 := |
| 265 | +linear_equiv.coord_self 𝕜 E x h |
| 266 | + |
| 267 | +end continuous_linear_equiv |
| 268 | + |
| 269 | +end normed |
0 commit comments