Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 21a9355

Browse files
PatrickMassotjohoelzl
authored andcommitted
feat(analysis/continuous_linear_maps)
1 parent 49f700c commit 21a9355

File tree

1 file changed

+170
-0
lines changed

1 file changed

+170
-0
lines changed
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
import algebra.field
2+
import tactic.norm_num
3+
import analysis.normed_space
4+
5+
noncomputable theory
6+
local attribute [instance] classical.prop_decidable
7+
8+
local notation f `→_{`:50 a `}`:0 b := filter.tendsto f (nhds a) (nhds b)
9+
10+
11+
variables {k : Type*} [normed_field k]
12+
variables {E : Type*} [normed_space k E]
13+
variables {F : Type*} [normed_space k F]
14+
variables {G : Type*} [normed_space k G]
15+
16+
include k
17+
def is_bounded_linear_map (L : E → F) := (is_linear_map L) ∧ ∃ M, M > 0 ∧ ∀ x : E, ∥ L x ∥ ≤ M *∥ x ∥
18+
19+
namespace is_bounded_linear_map
20+
21+
lemma zero : is_bounded_linear_map (λ (x:E), (0:F)) :=
22+
⟨is_linear_map.map_zero, exists.intro (1:ℝ) $ by norm_num⟩
23+
24+
lemma id : is_bounded_linear_map (λ (x:E), x) :=
25+
⟨is_linear_map.id, exists.intro (1:ℝ) $ by { norm_num, finish }⟩
26+
27+
lemma smul {L : E → F} (H : is_bounded_linear_map L) (c : k) :
28+
is_bounded_linear_map (λ e, c•L e) :=
29+
begin
30+
by_cases h : c = 0,
31+
{ simp[h], exact zero },
32+
33+
rcases H with ⟨lin , M, Mpos, ineq⟩,
34+
split,
35+
{ exact is_linear_map.map_smul_right lin },
36+
{ existsi ∥c∥*M,
37+
split,
38+
{ exact mul_pos ((norm_pos_iff c).2 h) Mpos },
39+
intro x,
40+
simp,
41+
exact calc ∥c • L x∥ = ∥c∥*∥L x∥ : norm_smul c (L x)
42+
... ≤ ∥c∥ * M * ∥x∥ : by {simp[mul_assoc, mul_le_mul_of_nonneg_left (ineq x) (norm_nonneg c)]} }
43+
end
44+
45+
lemma neg {L : E → F} (H : is_bounded_linear_map L) :
46+
is_bounded_linear_map (λ e, -L e) :=
47+
begin
48+
rw [show (λ e, -L e) = (λ e, (-1)•L e), by { funext, simp }],
49+
exact smul H (-1)
50+
end
51+
52+
lemma add {L : E → F} {P : E → F} (HL : is_bounded_linear_map L) (HP :is_bounded_linear_map P) :
53+
is_bounded_linear_map (λ e, L e + P e) :=
54+
begin
55+
rcases HL with ⟨lin_L , M, Mpos, ineq_L⟩,
56+
rcases HP with ⟨lin_P , M', M'pos, ineq_P⟩,
57+
split, exact (is_linear_map.map_add lin_L lin_P),
58+
existsi (M+M'),
59+
split, exact add_pos Mpos M'pos,
60+
intro x, simp,
61+
exact calc
62+
∥L x + P x∥ ≤ ∥L x∥ + ∥P x∥ : norm_triangle _ _
63+
... ≤ M * ∥x∥ + M' * ∥x∥ : add_le_add (ineq_L x) (ineq_P x)
64+
... ≤ (M + M') * ∥x∥ : by rw ←add_mul
65+
end
66+
67+
lemma sub {L : E → F} {P : E → F} (HL : is_bounded_linear_map L) (HP :is_bounded_linear_map P) :
68+
is_bounded_linear_map (λ e, L e - P e) := add HL (neg HP)
69+
70+
lemma comp {L : E → F} {P : F → G} (HL : is_bounded_linear_map L) (HP :is_bounded_linear_map P) : is_bounded_linear_map (P ∘ L) :=
71+
begin
72+
rcases HL with ⟨lin_L , M, Mpos, ineq_L⟩,
73+
rcases HP with ⟨lin_P , M', M'pos, ineq_P⟩,
74+
split,
75+
{ exact is_linear_map.comp lin_P lin_L },
76+
{ existsi M'*M,
77+
split,
78+
{ exact mul_pos M'pos Mpos },
79+
{ intro x,
80+
exact calc
81+
∥P (L x)∥ ≤ M' * ∥L x∥ : ineq_P (L x)
82+
... ≤ M'*M*∥x∥ : by simp[mul_assoc, mul_le_mul_of_nonneg_left (ineq_L x) (le_of_lt M'pos)] } }
83+
end
84+
85+
lemma continuous {L : E → F} (H : is_bounded_linear_map L) : continuous L :=
86+
begin
87+
rcases H with ⟨lin, M, Mpos, ineq⟩,
88+
apply continuous_iff_tendsto.2,
89+
intro x,
90+
apply tendsto_iff_norm_tendsto_zero.2,
91+
replace ineq := λ e, calc ∥L e - L x∥ = ∥L (e - x)∥ : by rw [←(lin.sub e x)]
92+
... ≤ M*∥e-x∥ : ineq (e-x),
93+
have lim1 : (λ (x:E), M) →_{x} M := tendsto_const_nhds,
94+
95+
have lim2 : (λ e, e-x) →_{x} 0 :=
96+
begin
97+
have limId := continuous_iff_tendsto.1 continuous_id x,
98+
have limx : (λ (e : E), -x) →_{x} -x := tendsto_const_nhds,
99+
have := tendsto_add limId limx,
100+
simp at this,
101+
simpa using this,
102+
end,
103+
replace lim2 := filter.tendsto.comp lim2 lim_norm_zero,
104+
apply squeeze_zero,
105+
{ simp[norm_nonneg] },
106+
{ exact ineq },
107+
{ simpa using tendsto_mul lim1 lim2 }
108+
end
109+
110+
111+
lemma lim_zero_bounded_linear_map {L : E → F} (H : is_bounded_linear_map L) : (L →_{0} 0) :=
112+
by simpa [H.left.zero] using continuous_iff_tendsto.1 H.continuous 0
113+
114+
end is_bounded_linear_map
115+
116+
-- Next lemma is stated for real normed space but it would work as soon as the base field is an extension of ℝ
117+
lemma bounded_continuous_linear_map {E : Type*} [normed_space ℝ E] {F : Type*} [normed_space ℝ F] {L : E → F}
118+
(lin : is_linear_map L) (cont : continuous L ) : is_bounded_linear_map L :=
119+
begin
120+
split,
121+
exact lin,
122+
123+
replace cont := continuous_of_metric.1 cont 1 (by norm_num),
124+
swap, exact 0,
125+
rw[lin.zero] at cont,
126+
rcases cont with ⟨δ, δ_pos, H⟩,
127+
revert H,
128+
repeat { conv in (_ < _ ) { rw norm_dist } },
129+
intro H,
130+
existsi (δ/2)⁻¹,
131+
have half_δ_pos := half_pos δ_pos,
132+
split,
133+
exact (inv_pos half_δ_pos),
134+
intro x,
135+
by_cases h : x = 0,
136+
{ simp [h, lin.zero] }, -- case x = 0
137+
{ -- case x ≠ 0
138+
have norm_x_pos : ∥x∥ > 0 := (norm_pos_iff x).2 h,
139+
have norm_x : ∥x∥ ≠ 0 := mt (norm_eq_zero x).1 h,
140+
141+
let p := ∥x∥*(δ/2)⁻¹,
142+
have p_pos : p > 0 := mul_pos norm_x_pos (inv_pos $ half_δ_pos),
143+
have p0 := ne_of_gt p_pos,
144+
145+
let q := (δ/2)*∥x∥⁻¹,
146+
have q_pos : q > 0 := div_pos half_δ_pos norm_x_pos,
147+
have q0 := ne_of_gt q_pos,
148+
149+
have triv := calc
150+
p*q = ∥x∥*((δ/2)⁻¹*(δ/2))*∥x∥⁻¹ : by simp[mul_assoc]
151+
... = 1 : by simp [(inv_mul_cancel $ ne_of_gt half_δ_pos), mul_inv_cancel norm_x],
152+
153+
have norm_calc := calc ∥q•x∥ = abs(q)*∥x∥ : by {rw norm_smul, refl}
154+
... = q*∥x∥ : by rw [abs_of_nonneg $ le_of_lt q_pos]
155+
... = δ/2 : by simp [mul_assoc, inv_mul_cancel norm_x]
156+
... < δ : half_lt_self δ_pos,
157+
158+
replace H : ∀ {a : E}, ∥a∥ < δ → ∥L a∥ < 1 := by simp [dist_zero_right] at H ; assumption,
159+
160+
exact calc
161+
∥L x∥ = ∥L (1•x)∥: by simp
162+
... = ∥L ((p*q)•x) ∥ : by {rw [←triv] }
163+
... = ∥L (p•q•x) ∥ : by rw mul_smul
164+
... = ∥p•L (q•x) ∥ : by rw lin.smul
165+
... = abs(p)*∥L (q•x) ∥ : by { rw norm_smul, refl}
166+
... = p*∥L (q•x) ∥ : by rw [abs_of_nonneg $ le_of_lt $ p_pos]
167+
... ≤ p*1 : le_of_lt $ mul_lt_mul_of_pos_left (H norm_calc) p_pos
168+
... = p : by simp
169+
... = (δ/2)⁻¹*∥x∥ : by simp[mul_comm] }
170+
end

0 commit comments

Comments
 (0)