1
1
/-
2
2
Copyright (c) 2019 Jan-David Salchow. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
- Authors: Jan-David Salchow
4
+ Authors: Jan-David Salchow, Sébastien Gouëzel
5
5
6
6
The space of bounded linear maps
7
7
@@ -20,8 +20,10 @@ variables {k : Type*}
20
20
variables {E : Type *} {F : Type *}
21
21
22
22
23
- -- Define the subspace of bounded linear maps, introduce the notation L(E,F) for the set of bounded linear maps .
23
+ -- Define the subspace of bounded linear maps.
24
24
section bounded_linear_maps
25
+ set_option class.instance_max_depth 50
26
+
25
27
26
28
variables [hnfk : normed_field k] [normed_space k E] [normed_space k F]
27
29
include hnfk
@@ -32,6 +34,7 @@ def bounded_linear_maps : subspace k (E → F) :=
32
34
add := assume A B, is_bounded_linear_map.add,
33
35
smul := assume c A, is_bounded_linear_map.smul c }
34
36
37
+ -- introduce the local notation L(E,F) for the set of bounded linear maps.
35
38
local notation `L (` E `,` F `)` := @bounded_linear_maps k E F _ _ _
36
39
37
40
/-- Coerce bounded linear maps to functions. -/
@@ -41,117 +44,102 @@ instance bounded_linear_maps.to_fun : has_coe_to_fun $ L(E,F) :=
41
44
@[extensionality] theorem ext {A B : L(E,F)} (H : ∀ x, A x = B x) : A = B :=
42
45
set_coe.ext $ funext H
43
46
44
- /-- Bounded linear maps are ... bounded -/
45
- lemma exists_bound (A : L(E,F)) : ∃ c, c > 0 ∧ ∀ x : E, ∥A x∥ ≤ c * ∥x∥ := A.property.bound
47
+ def to_linear_map (A : L(E, F)) : linear_map _ E F :=
48
+ {to_fun := A.val, ..A.property}
49
+
50
+ @[simp] lemma bounded_linear_maps.map_zero {A : L(E, F)} : A (0 : E) = 0 :=
51
+ (to_linear_map A).map_zero
52
+
53
+ @[simp] lemma bounded_linear_maps.coe_zero {x : E} : (0 : L(E, F)) x = 0 := rfl
54
+
55
+ @[simp] lemma bounded_linear_maps.smul_coe {A : L(E, F)} {x : E} {c : k} :
56
+ (c • A) x = c • (A x) := rfl
57
+
58
+ @[simp] lemma bounded_linear_maps.zero_smul {A : L(E, F)} : (0 : k) • A = 0 :=
59
+ by ext; simp
46
60
47
- /-- Bounded linear maps are conveniently bounded on the unit ball. -/
48
- lemma exists_bound' (A : L(E,F)) : ∃ c, c > 0 ∧ ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c :=
49
- let ⟨c, _, H⟩ := exists_bound A in
50
- exists.intro c ⟨‹c > 0 ›,
51
- assume x _,
52
- calc ∥A x∥ ≤ c * ∥x∥ : H x
53
- ... ≤ c * 1 : (mul_le_mul_left ‹c > 0 ›).mpr ‹∥x∥ ≤ 1 ›
54
- ... = c : mul_one c⟩
61
+ @[simp] lemma bounded_linear_maps.one_smul {A : L(E, F)} : (1 : k) • A = A :=
62
+ by ext; simp
63
+
64
+ /-- Bounded linear maps are ... bounded -/
65
+ lemma exists_bound (A : L(E,F)) : ∃ c, 0 < c ∧ ∀ x : E, ∥A x∥ ≤ c * ∥x∥ := A.property.bound
55
66
56
67
end bounded_linear_maps
57
68
58
69
/-
59
- Now define the operator norm. We only do this for normed spaces over ℝ, since we need a
60
- scalar multiplication with reals to prove that ∥A x∥ ≤ ∥A∥ * ∥x∥. It would be enough to
61
- have a vector space over a normed field k with a real scalar multiplication and certain
62
- compatibility conditions.
70
+ Now define the operator norm.
63
71
64
72
The main task is to show that the operator norm is definite, homogeneous, and satisfies the
65
- triangle inequality. This is done after a few preliminary lemmas necessary to deal with cSup .
73
+ triangle inequality. This is done after a few preliminary lemmas necessary to deal with csupr .
66
74
-/
67
75
section operator_norm
68
76
69
- variables [normed_space ℝ E] [normed_space ℝ F]
77
+ variables [normed_field k] [ normed_space k E] [normed_space k F]
70
78
open lattice set
71
79
72
- local notation `L (` E `,` F `)` := @bounded_linear_maps ℝ E F _ _ _
73
-
74
- noncomputable def to_linear_map (A : L(E, F)) : linear_map _ E F :=
75
- {to_fun := A.val, ..A.property}
80
+ local notation `L (` E `,` F `)` := @bounded_linear_maps k E F _ _ _
76
81
77
- /-- The operator norm of a bounded linear map A : E → F is the sup of
78
- the set ∥A x∥ with ∥x∥ ≤ 1. If E = {0} we set ∥A∥ = 0. -/
82
+ /-- The operator norm of a bounded linear map A : E → F is the sup of ∥A x∥/∥x∥. -/
79
83
noncomputable def operator_norm (A : L(E, F)) : ℝ :=
80
- Sup (image ( λ x, ∥A x∥) {x | ∥x∥ ≤ 1 } )
84
+ supr ( λ x, ∥A x∥/ ∥x∥)
81
85
82
86
noncomputable instance bounded_linear_maps.to_has_norm : has_norm L(E,F) :=
83
87
{norm := operator_norm}
84
88
85
- lemma norm_of_unit_ball_bdd_above (A : L(E,F)) : bdd_above (image (norm ∘ A) {x | ∥x∥ ≤ 1 }) :=
86
- let ⟨c, _, H⟩ := (exists_bound' A : ∃ c, c > 0 ∧ ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c) in
87
- bdd_above.mk c
88
- (assume r ⟨x, (_ : ∥x∥ ≤ 1 ), (_ : ∥A x∥ = r)⟩,
89
- show r ≤ c, from
90
- calc r = ∥A x∥ : eq.symm ‹∥A x∥ = r›
91
- ... ≤ c : H x ‹∥x∥ ≤ 1 ›)
92
-
93
- lemma zero_in_im_ball (A : L(E,F)) : (0 :ℝ) ∈ {r : ℝ | ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = r} :=
94
- have A 0 = 0 , from (to_linear_map A).map_zero,
95
- exists.intro (0 :E) $ and.intro (by rw[norm_zero]; exact zero_le_one) (by rw[‹A 0 = 0 ›]; simp)
89
+ lemma bdd_above_range_norm_image_div_norm (A : L(E,F)) : bdd_above (range (λ x, ∥A x∥/∥x∥)) :=
90
+ let ⟨c, _, H⟩ := (exists_bound A : ∃ c, 0 < c ∧ ∀ x : E, ∥A x∥ ≤ c * ∥x∥) in
91
+ bdd_above.mk c $ forall_range_iff.2 $ λx, begin
92
+ by_cases h : ∥x∥ = 0 ,
93
+ { simp [h, le_of_lt ‹0 < c›] },
94
+ { refine (div_le_iff _).2 (H x),
95
+ simpa [ne.symm h] using le_iff_eq_or_lt.1 (norm_nonneg x) }
96
+ end
96
97
97
98
lemma operator_norm_nonneg (A : L(E,F)) : 0 ≤ ∥A∥ :=
98
- have (0 :ℝ) ∈ _, from zero_in_im_ball A,
99
- show 0 ≤ Sup (image (norm ∘ A) {x | ∥x∥ ≤ 1 }), from
100
- let ⟨c, _, H⟩ := (exists_bound' A : ∃ c, c > 0 ∧ ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c) in
101
- le_cSup (norm_of_unit_ball_bdd_above A) ‹(0 :ℝ) ∈ _›
102
-
103
- lemma bounded_by_operator_norm_on_unit_vector (A : L(E, F)) {x : E} (_ : ∥x∥ = 1 ) : ∥A x∥ ≤ ∥A∥ :=
104
- show ∥A x∥ ≤ Sup (image (norm ∘ A) {x | ∥x∥ ≤ 1 }), from
105
- let ⟨c, _, _⟩ := (exists_bound A : ∃ c, c > 0 ∧ ∀ x : E, ∥ A x ∥ ≤ c * ∥ x ∥) in
106
- have ∥A x∥ ∈ (image (norm ∘ A) {x | ∥x∥ ≤ 1 }), from mem_image_of_mem _ $ le_of_eq ‹∥x∥ = 1 ›,
107
- le_cSup (norm_of_unit_ball_bdd_above A) ‹∥A x∥ ∈ _›
99
+ begin
100
+ have : (0 : ℝ) = (λ x, ∥A x∥/∥x∥) 0 , by simp,
101
+ rw this ,
102
+ exact le_csupr (bdd_above_range_norm_image_div_norm A),
103
+ end
108
104
109
105
set_option class.instance_max_depth 34
110
106
111
107
/-- This is the fundamental property of the operator norm: ∥A x∥ ≤ ∥A∥ * ∥x∥. -/
112
108
theorem bounded_by_operator_norm {A : L(E,F)} {x : E} : ∥A x∥ ≤ ∥A∥ * ∥x∥ :=
113
- have A 0 = 0 , from (to_linear_map A).map_zero,
114
- classical.by_cases
115
- (assume : x = (0 :E),
116
- show ∥A x∥ ≤ ∥A∥ * ∥x∥, by rw[‹x = 0 ›, ‹A 0 = 0 ›, norm_zero, norm_zero, mul_zero]; exact le_refl 0 )
117
- (assume : x ≠ (0 :E),
118
- have ∥x∥ ≠ 0 , from ne_of_gt $ (norm_pos_iff x).mpr ‹x ≠ 0 ›,
119
- have ∥∥x∥⁻¹∥ = ∥x∥⁻¹, from abs_of_nonneg $ inv_nonneg.mpr $ norm_nonneg x,
120
- have ∥∥x∥⁻¹•x∥ = 1 , begin rw[norm_smul, ‹∥∥x∥⁻¹∥ = ∥x∥⁻¹›], exact inv_mul_cancel ‹∥x∥ ≠ 0 › end ,
121
- calc ∥A x∥ = (∥x∥ * ∥x∥⁻¹) * ∥A x∥ : by rw[mul_inv_cancel ‹∥x∥ ≠ 0 ›]; ring
122
- ... = ∥∥x∥⁻¹∥ * ∥A x∥ * ∥x∥ : by rw[‹∥∥x∥⁻¹∥ = ∥x∥⁻¹›]; ring
123
- ... = ∥∥x∥⁻¹• A x ∥ * ∥x∥ : by rw[←normed_space.norm_smul ∥x∥⁻¹ (A x)]
124
- ... = ∥A (∥x∥⁻¹• x)∥ * ∥x∥ : by {
125
- change ∥∥x∥⁻¹ • A.val x∥ * ∥x∥ = ∥A.val (∥x∥⁻¹ • x)∥ * ∥x∥,
126
- rw A.property.smul}
127
- ... ≤ ∥A∥ * ∥x∥ : (mul_le_mul_right ((norm_pos_iff x).mpr ‹x ≠ 0 ›)).mpr
128
- (bounded_by_operator_norm_on_unit_vector A ‹∥∥x∥⁻¹•x∥ = 1 ›))
129
-
130
- lemma bounded_by_operator_norm_on_unit_ball (A : L(E, F)) {x : E} (_ : ∥x∥ ≤ 1 ) : ∥A x∥ ≤ ∥A∥ :=
131
- calc ∥A x∥ ≤ ∥A∥ * ∥x∥ : bounded_by_operator_norm
132
- ... ≤ ∥A∥ * 1 : mul_le_mul_of_nonneg_left ‹∥x∥ ≤ 1 › (operator_norm_nonneg A)
133
- ... = ∥A∥ : mul_one ∥A∥
134
-
135
- lemma operator_norm_bounded_by {A : L(E,F)} (c : nnreal) :
136
- (∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ (c:ℝ)) → ∥A∥ ≤ c :=
137
- assume H : ∀ x : E, ∥x∥ ≤ 1 → ∥A x∥ ≤ c,
138
- suffices Sup (image (norm ∘ A) {x | ∥x∥ ≤ 1 }) ≤ c, by assumption,
139
- cSup_le (set.ne_empty_of_mem $ zero_in_im_ball A)
140
- (show ∀ (r : ℝ), r ∈ (image (norm ∘ A) {x | ∥x∥ ≤ 1 }) → r ≤ c, from
141
- assume r ⟨x, _, _⟩,
142
- calc r = ∥A x∥ : eq.symm ‹_›
143
- ... ≤ c : H x ‹_›)
144
-
145
- theorem operator_norm_triangle (A : L(E,F)) (B : L(E,F)) : ∥A + B∥ ≤ ∥A∥ + ∥B∥ :=
146
- operator_norm_bounded_by (⟨∥A∥, operator_norm_nonneg A⟩ + ⟨∥B∥, operator_norm_nonneg B⟩)
147
- (assume x _, by exact
109
+ begin
110
+ classical, by_cases h : x = 0 ,
111
+ { simp [h] },
112
+ { have : ∥A x∥/∥x∥ ≤ ∥A∥, from le_csupr (bdd_above_range_norm_image_div_norm A),
113
+ rwa (div_le_iff _) at this ,
114
+ have : ∥x∥ ≠ 0 , from ne_of_gt ((norm_pos_iff x).mpr h),
115
+ have I := le_iff_eq_or_lt.1 (norm_nonneg x),
116
+ simpa [ne.symm this ] using I }
117
+ end
118
+
119
+ /-- If one controls the norm of every A x, then one controls the norm of A. -/
120
+ lemma operator_norm_bounded_by {A : L(E,F)} {c : ℝ} (hc : 0 ≤ c) (H : ∀ x, ∥A x∥ ≤ c * ∥x∥) :
121
+ ∥A∥ ≤ c :=
122
+ begin
123
+ haveI : nonempty E := ⟨0 ⟩,
124
+ refine csupr_le (λx, _),
125
+ by_cases h : ∥x∥ = 0 ,
126
+ { simp [h, hc] },
127
+ { refine (div_le_iff _).2 (H x),
128
+ simpa [ne.symm h] using le_iff_eq_or_lt.1 (norm_nonneg x) }
129
+ end
130
+
131
+ /-- The operator norm satisfies the triangle inequality. -/
132
+ theorem operator_norm_triangle (A B : L(E,F)) : ∥A + B∥ ≤ ∥A∥ + ∥B∥ :=
133
+ operator_norm_bounded_by (add_nonneg (operator_norm_nonneg A) (operator_norm_nonneg B))
134
+ (assume x,
148
135
calc ∥(A + B) x∥ = ∥A x + B x∥ : by refl
149
136
... ≤ ∥A x∥ + ∥B x∥ : by exact norm_triangle _ _
150
- ... ≤ ∥A∥ + ∥B∥ : by exact add_le_add (bounded_by_operator_norm_on_unit_ball A ‹_›)
151
- (bounded_by_operator_norm_on_unit_ball B ‹_›))
137
+ ... ≤ ∥A∥ * ∥x∥ + ∥B∥ * ∥x∥ :
138
+ add_le_add bounded_by_operator_norm bounded_by_operator_norm
139
+ ... = (∥A∥ + ∥B∥) * ∥x∥ : by ring)
152
140
141
+ /-- An operator is zero iff its norm vanishes. -/
153
142
theorem operator_norm_zero_iff (A : L(E,F)) : ∥A∥ = 0 ↔ A = 0 :=
154
- have A 0 = 0 , from (to_linear_map A).map_zero,
155
143
iff.intro
156
144
(assume : ∥A∥ = 0 ,
157
145
suffices ∀ x, A x = 0 , from ext this ,
@@ -161,62 +149,45 @@ iff.intro
161
149
... = 0 : by rw[‹∥A∥ = 0 ›]; ring,
162
150
(norm_le_zero_iff (A x)).mp this )
163
151
(assume : A = 0 ,
164
- let M := {r : ℝ | ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = r} in
165
- -- note that we have M = (image (norm ∘ A) {x | ∥x∥ ≤ 1}), from rfl
166
- suffices Sup M = 0 , by assumption,
167
- suffices M = {0 }, by rw[this ]; exact cSup_singleton 0 ,
168
- (set.ext_iff M {0 }).mpr $ assume r, iff.intro
169
- (assume : ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = r,
170
- let ⟨x, _, _⟩ := this in
171
- have h : ∥(0 :F)∥ = r, by rwa[‹A=0 ›] at *,
172
- by finish)
173
- (assume : r ∈ {0 },
174
- have r = 0 , from set.eq_of_mem_singleton this ,
175
- exists.intro (0 :E) $ ⟨by rw[norm_zero]; exact zero_le_one, by rw[this , ‹A 0 = 0 ›]; simp⟩))
176
-
177
- theorem operator_norm_homogeneous (c : ℝ) (A : L(E, F)) : ∥c • A∥ = ∥c∥ * ∥A∥ :=
178
- -- ∥c • A∥ is the supremum of the image of the map x ↦ ∥c • A x∥ on the unit ball in E
179
- -- we show that this is the same as ∥c∥ * ∥A∥ by showing 1) and 2):
180
- -- 1) ∥c∥ * ∥A∥ is an upper bound for the image of x ↦ ∥c • A x∥ on the unit ball
181
- -- 2) any w < ∥c∥ * ∥A∥ is not an upper bound (this is equivalent to showing that every upper bound is ≥ ∥c∥ * ∥A∥)
182
- suffices (∀ a ∈ _, a ≤ ∥c∥ * ∥A∥) ∧ (∀ (ub : ℝ), (∀ a ∈ _, a ≤ ub) → ∥c∥ * ∥A∥ ≤ ub), from
183
- cSup_intro' (show _ ≠ ∅, from set.ne_empty_of_mem $ zero_in_im_ball _) this.1 this.2 ,
184
- and.intro
185
- (show ∀ a ∈ image (λ x, ∥(c • A) x∥) {x : E | ∥x∥ ≤ 1 }, a ≤ ∥c∥ * ∥A∥, from
186
- assume a (hₐ : ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥(c • A) x∥ = a),
187
- let ⟨x, _, _⟩ := hₐ in
188
- calc a = ∥c • A x∥ : eq.symm ‹_›
189
- ... = ∥c∥ * ∥A x∥ : by rw[←norm_smul c (A x)]; refl
190
- ... ≤ ∥c∥ * ∥A∥ : mul_le_mul_of_nonneg_left
191
- (bounded_by_operator_norm_on_unit_ball A ‹∥x∥ ≤ 1 ›)
192
- (norm_nonneg c))
193
- (show ∀ (ub : ℝ), (∀ a ∈ image (λ (x : E), ∥(c • A) x∥) {x : E | ∥x∥ ≤ 1 }, a ≤ ub) → ∥c∥ * ∥A∥ ≤ ub, from
194
- assume u u_is_ub,
195
- classical.by_cases
196
- (assume : c = 0 ,
197
- calc ∥c∥ * ∥A∥ = 0 : by rw[‹c=0 ›, norm_zero, zero_mul]
198
- ... ≤ u : u_is_ub (0 :ℝ) $ zero_in_im_ball _)
199
- (assume : c ≠ 0 ,
200
- have ∥c∥ ≠ 0 , from ne_of_gt $ (norm_pos_iff c).mpr ‹c ≠ 0 ›,
201
- have bla : u = ∥c∥ * (∥c∥⁻¹ * u), by rw[←mul_assoc, mul_inv_cancel ‹∥c∥ ≠ 0 ›, one_mul],
202
- suffices ∥A∥ ≤ ∥c∥⁻¹ * u, from
203
- have u = ∥c∥ * (∥c∥⁻¹ * u), by rw[←mul_assoc, mul_inv_cancel ‹∥c∥ ≠ 0 ›, one_mul],
204
- by rw[this ]; exact mul_le_mul_of_nonneg_left ‹_› (norm_nonneg c),
205
- cSup_le
206
- (set.ne_empty_of_mem $ zero_in_im_ball _)
207
- (assume n (H : ∃ (x : E), ∥x∥ ≤ 1 ∧ ∥A x∥ = n),
208
- let ⟨x, _, _⟩ := H in
209
- calc n = ∥A x∥ : eq.symm ‹∥A x∥ = n›
210
- ... = ∥c∥⁻¹ * ∥c • A x∥ : by rw[norm_smul, ←mul_assoc, inv_mul_cancel ‹∥c∥ ≠ 0 ›, one_mul]
211
- ... ≤ ∥c∥⁻¹ * u : mul_le_mul_of_nonneg_left (u_is_ub ∥c • A x∥ ⟨x, ‹∥x∥ ≤ 1 ›, rfl⟩) $
212
- inv_nonneg.mpr $ norm_nonneg c)))
152
+ have ∥A∥ ≤ 0 , from operator_norm_bounded_by (le_refl 0 ) $ by rw this ; simp [le_refl],
153
+ le_antisymm this (operator_norm_nonneg A))
154
+
155
+ section instance_70
156
+ -- one needs to increase the max_depth for the following proof
157
+ set_option class.instance_max_depth 70
158
+
159
+ /-- Auxiliary lemma to prove that the operator norm is homogeneous. -/
160
+ lemma operator_norm_homogeneous_le (c : k) (A : L(E, F)) : ∥c • A∥ ≤ ∥c∥ * ∥A∥ :=
161
+ begin
162
+ apply operator_norm_bounded_by (mul_nonneg (norm_nonneg _) (operator_norm_nonneg _)) (λx, _),
163
+ erw [norm_smul _ _, mul_assoc],
164
+ exact mul_le_mul_of_nonneg_left bounded_by_operator_norm (norm_nonneg _)
165
+ end
166
+
167
+ theorem operator_norm_homogeneous (c : k) (A : L(E, F)) : ∥c • A∥ = ∥c∥ * ∥A∥ :=
168
+ begin
169
+ refine le_antisymm (operator_norm_homogeneous_le c A) _,
170
+ by_cases h : ∥c∥ = 0 ,
171
+ { have : c = 0 , from (norm_eq_zero _).1 h,
172
+ have I : ∥(0 : L(E, F))∥ = 0 , by rw operator_norm_zero_iff,
173
+ simp only [h],
174
+ simp [this , I] },
175
+ { have h' : c ≠ 0 , by simpa [norm_eq_zero] using h,
176
+ have : ∥A∥ ≤ ∥c • A∥ / ∥c∥, from calc
177
+ ∥A∥ = ∥(1 : k) • A∥ : by rw bounded_linear_maps.one_smul
178
+ ... = ∥c⁻¹ • c • A∥ : by rw [smul_smul, inv_mul_cancel h']
179
+ ... ≤ ∥c⁻¹∥ * ∥c • A∥ : operator_norm_homogeneous_le _ _
180
+ ... = ∥c • A∥ / ∥c∥ : by rw [norm_inv, div_eq_inv_mul],
181
+ rwa [le_div_iff, mul_comm] at this ,
182
+ simpa [ne.symm h] using le_iff_eq_or_lt.1 (norm_nonneg c) }
183
+ end
184
+ end instance_70
213
185
214
186
/-- Expose L(E,F) equipped with the operator norm as normed space. -/
215
- noncomputable instance bounded_linear_maps.to_normed_space : normed_space ℝ L(E,F) :=
216
- normed_space.of_core ℝ L(E,F) {
187
+ noncomputable instance bounded_linear_maps.to_normed_space : normed_space k L(E,F) :=
188
+ normed_space.of_core k L(E,F) {
217
189
norm_eq_zero_iff := operator_norm_zero_iff,
218
190
norm_smul := operator_norm_homogeneous,
219
- triangle := operator_norm_triangle
220
- }
191
+ triangle := operator_norm_triangle }
221
192
222
193
end operator_norm
0 commit comments