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

Commit f254c2f

Browse files
committed
refactor(analysis/normed_space/{dual, pi_Lp}): split out inner product space parts (#9388)
This is just moving code, no math changes. https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/New.20folder.20analysis.2Finner_product_space
1 parent 519ab35 commit f254c2f

File tree

7 files changed

+417
-370
lines changed

7 files changed

+417
-370
lines changed
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
/-
2+
Copyright (c) 2020 Frédéric Dupuis. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Frédéric Dupuis
5+
-/
6+
import analysis.inner_product_space.projection
7+
import analysis.normed_space.dual
8+
9+
/-!
10+
# The Fréchet-Riesz representation theorem
11+
12+
We consider inner product spaces, with base field over `ℝ` (the corresponding results for `ℂ`
13+
will require the definition of conjugate-linear maps). We define `to_dual_map`, a continuous linear
14+
map from `E` to its dual, which maps an element `x` of the space to `λ y, ⟪x, y⟫`. We check
15+
(`to_dual_map_isometry`) that this map is an isometry onto its image, and particular is injective.
16+
We also define `to_dual'` as the function taking taking a vector to its dual for a base field `𝕜`
17+
with `[is_R_or_C 𝕜]`; this is a function and not a linear map.
18+
19+
Finally, under the hypothesis of completeness (i.e., for Hilbert spaces), we prove the Fréchet-Riesz
20+
representation (`to_dual_map_eq_top`), which states the surjectivity: every element of the dual
21+
of a Hilbert space `E` has the form `λ u, ⟪x, u⟫` for some `x : E`. This permits the map
22+
`to_dual_map` to be upgraded to an (isometric) continuous linear equivalence, `to_dual`, between a
23+
Hilbert space and its dual.
24+
25+
## References
26+
27+
* [M. Einsiedler and T. Ward, *Functional Analysis, Spectral Theory, and Applications*]
28+
[EinsiedlerWard2017]
29+
30+
## Tags
31+
32+
dual, Fréchet-Riesz
33+
-/
34+
35+
noncomputable theory
36+
open_locale classical
37+
universes u v
38+
39+
namespace inner_product_space
40+
open is_R_or_C continuous_linear_map
41+
42+
section is_R_or_C
43+
44+
variables (𝕜 : Type*)
45+
variables {E : Type*} [is_R_or_C 𝕜] [inner_product_space 𝕜 E]
46+
local notation `⟪`x`, `y`⟫` := @inner 𝕜 E _ x y
47+
local postfix `†`:90 := @is_R_or_C.conj 𝕜 _
48+
49+
/--
50+
Given some `x` in an inner product space, we can define its dual as the continuous linear map
51+
`λ y, ⟪x, y⟫`. Consider using `to_dual` or `to_dual_map` instead in the real case.
52+
-/
53+
def to_dual' : E →+ normed_space.dual 𝕜 E :=
54+
{ to_fun := λ x, linear_map.mk_continuous
55+
{ to_fun := λ y, ⟪x, y⟫,
56+
map_add' := λ _ _, inner_add_right,
57+
map_smul' := λ _ _, inner_smul_right }
58+
∥x∥
59+
(λ y, by { rw [is_R_or_C.norm_eq_abs], exact abs_inner_le_norm _ _ }),
60+
map_zero' := by { ext z, simp },
61+
map_add' := λ x y, by { ext z, simp [inner_add_left] } }
62+
63+
@[simp] lemma to_dual'_apply {x y : E} : to_dual' 𝕜 x y = ⟪x, y⟫ := rfl
64+
65+
/-- In an inner product space, the norm of the dual of a vector `x` is `∥x∥` -/
66+
@[simp] lemma norm_to_dual'_apply (x : E) : ∥to_dual' 𝕜 x∥ = ∥x∥ :=
67+
begin
68+
refine le_antisymm _ _,
69+
{ exact linear_map.mk_continuous_norm_le _ (norm_nonneg _) _ },
70+
{ cases eq_or_lt_of_le (norm_nonneg x) with h h,
71+
{ have : x = 0 := norm_eq_zero.mp (eq.symm h),
72+
simp [this] },
73+
{ refine (mul_le_mul_right h).mp _,
74+
calc ∥x∥ * ∥x∥ = ∥x∥ ^ 2 : by ring
75+
... = re ⟪x, x⟫ : norm_sq_eq_inner _
76+
... ≤ abs ⟪x, x⟫ : re_le_abs _
77+
... = ∥to_dual' 𝕜 x x∥ : by simp [norm_eq_abs]
78+
... ≤ ∥to_dual' 𝕜 x∥ * ∥x∥ : le_op_norm (to_dual' 𝕜 x) x } }
79+
end
80+
81+
variables (E)
82+
83+
lemma to_dual'_isometry : isometry (@to_dual' 𝕜 E _ _) :=
84+
add_monoid_hom.isometry_of_norm _ (norm_to_dual'_apply 𝕜)
85+
86+
/--
87+
Fréchet-Riesz representation: any `ℓ` in the dual of a Hilbert space `E` is of the form
88+
`λ u, ⟪y, u⟫` for some `y : E`, i.e. `to_dual'` is surjective.
89+
-/
90+
lemma to_dual'_surjective [complete_space E] : function.surjective (@to_dual' 𝕜 E _ _) :=
91+
begin
92+
intros ℓ,
93+
set Y := ker ℓ with hY,
94+
by_cases htriv : Y = ⊤,
95+
{ have hℓ : ℓ = 0,
96+
{ have h' := linear_map.ker_eq_top.mp htriv,
97+
rw [←coe_zero] at h',
98+
apply coe_injective,
99+
exact h' },
100+
exact ⟨0, by simp [hℓ]⟩ },
101+
{ have Ycomplete := is_complete_ker ℓ,
102+
rw [← submodule.orthogonal_eq_bot_iff Ycomplete, ←hY] at htriv,
103+
change Yᗮ ≠ ⊥ at htriv,
104+
rw [submodule.ne_bot_iff] at htriv,
105+
obtain ⟨z : E, hz : z ∈ Yᗮ, z_ne_0 : z ≠ 0⟩ := htriv,
106+
refine ⟨((ℓ z)† / ⟪z, z⟫) • z, _⟩,
107+
ext x,
108+
have h₁ : (ℓ z) • x - (ℓ x) • z ∈ Y,
109+
{ rw [mem_ker, map_sub, map_smul, map_smul, algebra.id.smul_eq_mul, algebra.id.smul_eq_mul,
110+
mul_comm],
111+
exact sub_self (ℓ x * ℓ z) },
112+
have h₂ : (ℓ z) * ⟪z, x⟫ = (ℓ x) * ⟪z, z⟫,
113+
{ have h₃ := calc
114+
0 = ⟪z, (ℓ z) • x - (ℓ x) • z⟫ : by { rw [(Y.mem_orthogonal' z).mp hz], exact h₁ }
115+
... = ⟪z, (ℓ z) • x⟫ - ⟪z, (ℓ x) • z⟫ : by rw [inner_sub_right]
116+
... = (ℓ z) * ⟪z, x⟫ - (ℓ x) * ⟪z, z⟫ : by simp [inner_smul_right],
117+
exact sub_eq_zero.mp (eq.symm h₃) },
118+
have h₄ := calc
119+
⟪((ℓ z)† / ⟪z, z⟫) • z, x⟫ = (ℓ z) / ⟪z, z⟫ * ⟪z, x⟫
120+
: by simp [inner_smul_left, conj_div, conj_conj]
121+
... = (ℓ z) * ⟪z, x⟫ / ⟪z, z⟫
122+
: by rw [←div_mul_eq_mul_div]
123+
... = (ℓ x) * ⟪z, z⟫ / ⟪z, z⟫
124+
: by rw [h₂]
125+
... = ℓ x
126+
: begin
127+
have : ⟪z, z⟫ ≠ 0,
128+
{ change z = 0 → false at z_ne_0,
129+
rwa ←inner_self_eq_zero at z_ne_0 },
130+
field_simp [this]
131+
end,
132+
exact h₄ }
133+
end
134+
135+
end is_R_or_C
136+
137+
section real
138+
139+
variables {F : Type*} [inner_product_space ℝ F]
140+
141+
/-- In a real inner product space `F`, the function that takes a vector `x` in `F` to its dual
142+
`λ y, ⟪x, y⟫` is a continuous linear map. If the space is complete (i.e. is a Hilbert space),
143+
consider using `to_dual` instead. -/
144+
-- TODO extend to `is_R_or_C` (requires a definition of conjugate linear maps)
145+
def to_dual_map : F →L[ℝ] (normed_space.dual ℝ F) :=
146+
linear_map.mk_continuous
147+
{ to_fun := to_dual' ℝ,
148+
map_add' := λ x y, by { ext, simp [inner_add_left] },
149+
map_smul' := λ c x, by { ext, simp [inner_smul_left] } }
150+
1
151+
(λ x, by simp only [norm_to_dual'_apply, one_mul, linear_map.coe_mk])
152+
153+
@[simp] lemma to_dual_map_apply {x y : F} : to_dual_map x y = ⟪x, y⟫_ℝ := rfl
154+
155+
/-- In an inner product space, the norm of the dual of a vector `x` is `∥x∥` -/
156+
@[simp] lemma norm_to_dual_map_apply (x : F) : ∥to_dual_map x∥ = ∥x∥ := norm_to_dual'_apply _ _
157+
158+
lemma to_dual_map_isometry : isometry (@to_dual_map F _) :=
159+
add_monoid_hom.isometry_of_norm _ norm_to_dual_map_apply
160+
161+
lemma to_dual_map_injective : function.injective (@to_dual_map F _) :=
162+
(@to_dual_map_isometry F _).injective
163+
164+
@[simp] lemma ker_to_dual_map : (@to_dual_map F _).ker = ⊥ :=
165+
linear_map.ker_eq_bot.mpr to_dual_map_injective
166+
167+
@[simp] lemma to_dual_map_eq_iff_eq {x y : F} : to_dual_map x = to_dual_map y ↔ x = y :=
168+
((linear_map.ker_eq_bot).mp (@ker_to_dual_map F _)).eq_iff
169+
170+
variables [complete_space F]
171+
172+
/--
173+
Fréchet-Riesz representation: any `ℓ` in the dual of a real Hilbert space `F` is of the form
174+
`λ u, ⟪y, u⟫` for some `y` in `F`. See `inner_product_space.to_dual` for the continuous linear
175+
equivalence thus induced.
176+
-/
177+
-- TODO extend to `is_R_or_C` (requires a definition of conjugate linear maps)
178+
lemma range_to_dual_map : (@to_dual_map F _).range = ⊤ :=
179+
linear_map.range_eq_top.mpr (to_dual'_surjective ℝ F)
180+
181+
/--
182+
Fréchet-Riesz representation: If `F` is a Hilbert space, the function that takes a vector in `F` to
183+
its dual is a continuous linear equivalence. -/
184+
def to_dual : F ≃L[ℝ] (normed_space.dual ℝ F) :=
185+
continuous_linear_equiv.of_isometry to_dual_map.to_linear_map to_dual_map_isometry range_to_dual_map
186+
187+
/--
188+
Fréchet-Riesz representation: If `F` is a Hilbert space, the function that takes a vector in `F` to
189+
its dual is an isometry. -/
190+
def isometric.to_dual : F ≃ᵢ normed_space.dual ℝ F :=
191+
{ to_equiv := to_dual.to_linear_equiv.to_equiv,
192+
isometry_to_fun := to_dual'_isometry ℝ F}
193+
194+
@[simp] lemma to_dual_apply {x y : F} : to_dual x y = ⟪x, y⟫_ℝ := rfl
195+
196+
@[simp] lemma to_dual_eq_iff_eq {x y : F} : to_dual x = to_dual y ↔ x = y :=
197+
(@to_dual F _ _).injective.eq_iff
198+
199+
lemma to_dual_eq_iff_eq' {x x' : F} : (∀ y : F, ⟪x, y⟫_ℝ = ⟪x', y⟫_ℝ) ↔ x = x' :=
200+
begin
201+
split,
202+
{ intros h,
203+
have : to_dual x = to_dual x' → x = x' := to_dual_eq_iff_eq.mp,
204+
apply this,
205+
simp_rw [←to_dual_apply] at h,
206+
ext z,
207+
exact h z },
208+
{ rintros rfl y,
209+
refl }
210+
end
211+
212+
@[simp] lemma norm_to_dual_apply (x : F) : ∥to_dual x∥ = ∥x∥ := norm_to_dual_map_apply x
213+
214+
/-- In a Hilbert space, the norm of a vector in the dual space is the norm of its corresponding
215+
primal vector. -/
216+
lemma norm_to_dual_symm_apply (ℓ : normed_space.dual ℝ F) : ∥to_dual.symm ℓ∥ = ∥ℓ∥ :=
217+
begin
218+
have : ℓ = to_dual (to_dual.symm ℓ) := by simp only [continuous_linear_equiv.apply_symm_apply],
219+
conv_rhs { rw [this] },
220+
refine eq.symm (norm_to_dual_apply _),
221+
end
222+
223+
end real
224+
225+
end inner_product_space

src/analysis/inner_product_space/euclidean_dist.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Yury Kudryashov
55
-/
66
import analysis.inner_product_space.calculus
7-
import analysis.normed_space.pi_Lp
7+
import analysis.inner_product_space.pi_L2
88

99
/-!
1010
# Euclidean distance on a finite dimensional space

0 commit comments

Comments
 (0)