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

Commit 1d048c5

Browse files
committed
chore(analysis/inner_product_space): move definition of self-adjointness (#15281)
The file `analysis/inner_product_space/basic` is way to large and since `is_self_adjoint` will be rephrased in terms of the adjoint, it should be in the `adjoint` file.
1 parent 2dfa69c commit 1d048c5

File tree

3 files changed

+113
-100
lines changed

3 files changed

+113
-100
lines changed

src/analysis/inner_product_space/adjoint.lean

Lines changed: 112 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,122 @@ adjoint
4040
-/
4141

4242
noncomputable theory
43-
open inner_product_space continuous_linear_map is_R_or_C
43+
open is_R_or_C
4444
open_locale complex_conjugate
4545

4646
variables {𝕜 E F G : Type*} [is_R_or_C 𝕜]
4747
variables [inner_product_space 𝕜 E] [inner_product_space 𝕜 F] [inner_product_space 𝕜 G]
4848
local notation `⟪`x`, `y`⟫` := @inner 𝕜 _ _ x y
4949

50+
namespace inner_product_space
51+
52+
/-! ### Self-adjoint operators -/
53+
54+
/-- A (not necessarily bounded) operator on an inner product space is self-adjoint, if for all
55+
`x`, `y`, we have `⟪T x, y⟫ = ⟪x, T y⟫`. -/
56+
def is_self_adjoint (T : E →ₗ[𝕜] E) : Prop := ∀ x y, ⟪T x, y⟫ = ⟪x, T y⟫
57+
58+
section real
59+
60+
variables {E' : Type*} [inner_product_space ℝ E']
61+
62+
-- Todo: Generalize this to `is_R_or_C`.
63+
/-- An operator `T` on a `ℝ`-inner product space is self-adjoint if and only if it is
64+
`bilin_form.is_self_adjoint` with respect to the bilinear form given by the inner product. -/
65+
lemma is_self_adjoint_iff_bilin_form (T : E' →ₗ[ℝ] E') :
66+
is_self_adjoint T ↔ bilin_form_of_real_inner.is_self_adjoint T :=
67+
by simp [is_self_adjoint, bilin_form.is_self_adjoint, bilin_form.is_adjoint_pair]
68+
69+
end real
70+
71+
lemma is_self_adjoint.conj_inner_sym {T : E →ₗ[𝕜] E} (hT : is_self_adjoint T) (x y : E) :
72+
conj ⟪T x, y⟫ = ⟪T y, x⟫ :=
73+
by rw [hT x y, inner_conj_sym]
74+
75+
@[simp] lemma is_self_adjoint.apply_clm {T : E →L[𝕜] E} (hT : is_self_adjoint (T : E →ₗ[𝕜] E))
76+
(x y : E) :
77+
⟪T x, y⟫ = ⟪x, T y⟫ :=
78+
hT x y
79+
80+
/-- The **Hellinger--Toeplitz theorem**: if a symmetric operator is defined everywhere, then
81+
it is automatically continuous. -/
82+
lemma is_self_adjoint.continuous [complete_space E] {T : E →ₗ[𝕜] E} (hT : is_self_adjoint T) :
83+
continuous T :=
84+
begin
85+
-- We prove it by using the closed graph theorem
86+
refine T.continuous_of_seq_closed_graph (λ u x y hu hTu, _),
87+
rw [←sub_eq_zero, ←inner_self_eq_zero],
88+
have hlhs : ∀ k : ℕ, ⟪T (u k) - T x, y - T x⟫ = ⟪u k - x, T (y - T x)⟫ :=
89+
by { intro k, rw [←T.map_sub, hT] },
90+
refine tendsto_nhds_unique ((hTu.sub_const _).inner tendsto_const_nhds) _,
91+
simp_rw hlhs,
92+
rw ←@inner_zero_left 𝕜 E _ _ (T (y - T x)),
93+
refine filter.tendsto.inner _ tendsto_const_nhds,
94+
rw ←sub_self x,
95+
exact hu.sub_const _,
96+
end
97+
98+
/-- The **Hellinger--Toeplitz theorem**: Construct a self-adjoint operator from an everywhere
99+
defined symmetric operator.-/
100+
def is_self_adjoint.clm [complete_space E] {T : E →ₗ[𝕜] E}
101+
(hT : is_self_adjoint T) : E →L[𝕜] E :=
102+
⟨T, hT.continuous⟩
103+
104+
lemma is_self_adjoint.clm_apply [complete_space E] {T : E →ₗ[𝕜] E}
105+
(hT : is_self_adjoint T) {x : E} : hT.clm x = T x := rfl
106+
107+
/-- For a self-adjoint operator `T`, the function `λ x, ⟪T x, x⟫` is real-valued. -/
108+
@[simp] lemma is_self_adjoint.coe_re_apply_inner_self_apply
109+
{T : E →L[𝕜] E} (hT : is_self_adjoint (T : E →ₗ[𝕜] E)) (x : E) :
110+
(T.re_apply_inner_self x : 𝕜) = ⟪T x, x⟫ :=
111+
begin
112+
suffices : ∃ r : ℝ, ⟪T x, x⟫ = r,
113+
{ obtain ⟨r, hr⟩ := this,
114+
simp [hr, T.re_apply_inner_self_apply] },
115+
rw ← eq_conj_iff_real,
116+
exact hT.conj_inner_sym x x
117+
end
118+
119+
/-- If a self-adjoint operator preserves a submodule, its restriction to that submodule is
120+
self-adjoint. -/
121+
lemma is_self_adjoint.restrict_invariant {T : E →ₗ[𝕜] E} (hT : is_self_adjoint T)
122+
{V : submodule 𝕜 E} (hV : ∀ v ∈ V, T v ∈ V) :
123+
is_self_adjoint (T.restrict hV) :=
124+
λ v w, hT v w
125+
126+
section complex
127+
128+
variables {V : Type*}
129+
[inner_product_space ℂ V]
130+
131+
/-- A linear operator on a complex inner product space is self-adjoint precisely when
132+
`⟪T v, v⟫_ℂ` is real for all v.-/
133+
lemma is_self_adjoint_iff_inner_map_self_real (T : V →ₗ[ℂ] V):
134+
is_self_adjoint T ↔ ∀ (v : V), conj ⟪T v, v⟫_ℂ = ⟪T v, v⟫_ℂ :=
135+
begin
136+
split,
137+
{ intros hT v,
138+
apply is_self_adjoint.conj_inner_sym hT },
139+
{ intros h x y,
140+
nth_rewrite 1 ← inner_conj_sym,
141+
nth_rewrite 1 inner_map_polarization,
142+
simp only [star_ring_end_apply, star_div', star_sub, star_add, star_mul],
143+
simp only [← star_ring_end_apply],
144+
rw [h (x + y), h (x - y), h (x + complex.I • y), h (x - complex.I • y)],
145+
simp only [complex.conj_I],
146+
rw inner_map_polarization',
147+
norm_num,
148+
ring },
149+
end
150+
151+
end complex
152+
153+
end inner_product_space
154+
155+
/-! ### Adjoint operator -/
156+
157+
open inner_product_space
158+
50159
namespace continuous_linear_map
51160

52161
variables [complete_space E] [complete_space G]
@@ -307,11 +416,11 @@ lemma is_self_adjoint_adjoint_mul_self (T : E →ₗ[𝕜] E) : is_self_adjoint
307416

308417
/-- The Gram operator T†T is a positive operator. -/
309418
lemma re_inner_adjoint_mul_self_nonneg (T : E →ₗ[𝕜] E) (x : E) :
310-
0is_R_or_C.re ⟪ x, (T.adjoint * T) x ⟫ := by {simp only [linear_map.mul_apply,
419+
0 ≤ re ⟪ x, (T.adjoint * T) x ⟫ := by {simp only [linear_map.mul_apply,
311420
linear_map.adjoint_inner_right, inner_self_eq_norm_sq_to_K], norm_cast, exact sq_nonneg _}
312421

313422
@[simp] lemma im_inner_adjoint_mul_self_eq_zero (T : E →ₗ[𝕜] E) (x : E) :
314-
is_R_or_C.im ⟪ x, linear_map.adjoint T (T x) ⟫ = 0 := by {simp only [linear_map.mul_apply,
423+
im ⟪ x, linear_map.adjoint T (T x) ⟫ = 0 := by {simp only [linear_map.mul_apply,
315424
linear_map.adjoint_inner_right, inner_self_eq_norm_sq_to_K], norm_cast}
316425

317426
end linear_map

src/analysis/inner_product_space/basic.lean

Lines changed: 0 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -2278,100 +2278,3 @@ end
22782278

22792279
end orthogonal
22802280

2281-
/-! ### Self-adjoint operators -/
2282-
2283-
namespace inner_product_space
2284-
2285-
/-- A (not necessarily bounded) operator on an inner product space is self-adjoint, if for all
2286-
`x`, `y`, we have `⟪T x, y⟫ = ⟪x, T y⟫`. -/
2287-
def is_self_adjoint (T : E →ₗ[𝕜] E) : Prop := ∀ x y, ⟪T x, y⟫ = ⟪x, T y⟫
2288-
2289-
/-- An operator `T` on a `ℝ`-inner product space is self-adjoint if and only if it is
2290-
`bilin_form.is_self_adjoint` with respect to the bilinear form given by the inner product. -/
2291-
lemma is_self_adjoint_iff_bilin_form (T : F →ₗ[ℝ] F) :
2292-
is_self_adjoint T ↔ bilin_form_of_real_inner.is_self_adjoint T :=
2293-
by simp [is_self_adjoint, bilin_form.is_self_adjoint, bilin_form.is_adjoint_pair]
2294-
2295-
lemma is_self_adjoint.conj_inner_sym {T : E →ₗ[𝕜] E} (hT : is_self_adjoint T) (x y : E) :
2296-
conj ⟪T x, y⟫ = ⟪T y, x⟫ :=
2297-
by rw [hT x y, inner_conj_sym]
2298-
2299-
@[simp] lemma is_self_adjoint.apply_clm {T : E →L[𝕜] E} (hT : is_self_adjoint (T : E →ₗ[𝕜] E))
2300-
(x y : E) :
2301-
⟪T x, y⟫ = ⟪x, T y⟫ :=
2302-
hT x y
2303-
2304-
/-- The **Hellinger--Toeplitz theorem**: if a symmetric operator is defined everywhere, then
2305-
it is automatically continuous. -/
2306-
lemma is_self_adjoint.continuous [complete_space E] {T : E →ₗ[𝕜] E} (hT : is_self_adjoint T) :
2307-
continuous T :=
2308-
begin
2309-
-- We prove it by using the closed graph theorem
2310-
refine T.continuous_of_seq_closed_graph (λ u x y hu hTu, _),
2311-
rw [←sub_eq_zero, ←inner_self_eq_zero],
2312-
have hlhs : ∀ k : ℕ, ⟪T (u k) - T x, y - T x⟫ = ⟪u k - x, T (y - T x)⟫ :=
2313-
by { intro k, rw [←T.map_sub, hT] },
2314-
refine tendsto_nhds_unique ((hTu.sub_const _).inner tendsto_const_nhds) _,
2315-
simp_rw hlhs,
2316-
rw ←@inner_zero_left 𝕜 E _ _ (T (y - T x)),
2317-
refine filter.tendsto.inner _ tendsto_const_nhds,
2318-
rw ←sub_self x,
2319-
exact hu.sub_const _,
2320-
end
2321-
2322-
/-- The **Hellinger--Toeplitz theorem**: Construct a self-adjoint operator from an everywhere
2323-
defined symmetric operator.-/
2324-
def is_self_adjoint.clm [complete_space E] {T : E →ₗ[𝕜] E}
2325-
(hT : is_self_adjoint T) : E →L[𝕜] E :=
2326-
⟨T, hT.continuous⟩
2327-
2328-
lemma is_self_adjoint.clm_apply [complete_space E] {T : E →ₗ[𝕜] E}
2329-
(hT : is_self_adjoint T) {x : E} : hT.clm x = T x := rfl
2330-
2331-
/-- For a self-adjoint operator `T`, the function `λ x, ⟪T x, x⟫` is real-valued. -/
2332-
@[simp] lemma is_self_adjoint.coe_re_apply_inner_self_apply
2333-
{T : E →L[𝕜] E} (hT : is_self_adjoint (T : E →ₗ[𝕜] E)) (x : E) :
2334-
(T.re_apply_inner_self x : 𝕜) = ⟪T x, x⟫ :=
2335-
begin
2336-
suffices : ∃ r : ℝ, ⟪T x, x⟫ = r,
2337-
{ obtain ⟨r, hr⟩ := this,
2338-
simp [hr, T.re_apply_inner_self_apply] },
2339-
rw ← eq_conj_iff_real,
2340-
exact hT.conj_inner_sym x x
2341-
end
2342-
2343-
/-- If a self-adjoint operator preserves a submodule, its restriction to that submodule is
2344-
self-adjoint. -/
2345-
lemma is_self_adjoint.restrict_invariant {T : E →ₗ[𝕜] E} (hT : is_self_adjoint T)
2346-
{V : submodule 𝕜 E} (hV : ∀ v ∈ V, T v ∈ V) :
2347-
is_self_adjoint (T.restrict hV) :=
2348-
λ v w, hT v w
2349-
2350-
section complex
2351-
2352-
variables {V : Type*}
2353-
[inner_product_space ℂ V]
2354-
2355-
/-- A linear operator on a complex inner product space is self-adjoint precisely when
2356-
`⟪T v, v⟫_ℂ` is real for all v.-/
2357-
lemma is_self_adjoint_iff_inner_map_self_real (T : V →ₗ[ℂ] V):
2358-
is_self_adjoint T ↔ ∀ (v : V), conj ⟪T v, v⟫_ℂ = ⟪T v, v⟫_ℂ :=
2359-
begin
2360-
split,
2361-
{ intros hT v,
2362-
apply is_self_adjoint.conj_inner_sym hT },
2363-
{ intros h x y,
2364-
nth_rewrite 1 ← inner_conj_sym,
2365-
nth_rewrite 1 inner_map_polarization,
2366-
simp only [star_ring_end_apply, star_div', star_sub, star_add, star_mul],
2367-
simp only [← star_ring_end_apply],
2368-
rw [h (x + y), h (x - y), h (x + complex.I • y), h (x - complex.I • y)],
2369-
simp only [complex.conj_I],
2370-
rw inner_map_polarization',
2371-
norm_num,
2372-
ring },
2373-
end
2374-
2375-
end complex
2376-
2377-
end inner_product_space

src/analysis/inner_product_space/rayleigh.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Heather Macbeth, Frédéric Dupuis
55
-/
66
import analysis.inner_product_space.calculus
77
import analysis.inner_product_space.dual
8+
import analysis.inner_product_space.adjoint
89
import analysis.calculus.lagrange_multipliers
910
import linear_algebra.eigenspace
1011

0 commit comments

Comments
 (0)