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

Commit eeb194d

Browse files
committed
feat(analysis/normed_space/inner_product): facts about the span of a single vector, mostly in inner product spaces (#5589)
1 parent 186ad76 commit eeb194d

File tree

3 files changed

+87
-1
lines changed

3 files changed

+87
-1
lines changed

src/analysis/normed_space/inner_product.lean

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/-
22
Copyright (c) 2019 Zhouhang Zhou. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Zhouhang Zhou, Sébastien Gouëzel, Frédéric Dupuis
4+
Authors: Zhouhang Zhou, Sébastien Gouëzel, Frédéric Dupuis, Heather Macbeth
55
-/
66

77
import linear_algebra.bilinear_form
@@ -1854,12 +1854,62 @@ end
18541854
@[simp] lemma orthogonal_projection_mem_subspace_eq_self (v : K) : orthogonal_projection K v = v :=
18551855
by { ext, apply eq_orthogonal_projection_of_mem_of_inner_eq_zero; simp }
18561856

1857+
local attribute [instance] finite_dimensional_bot
1858+
1859+
/-- The orthogonal projection onto the trivial submodule is the zero map. -/
1860+
@[simp] lemma orthogonal_projection_bot : orthogonal_projection (⊥ : submodule 𝕜 E) = 0 :=
1861+
begin
1862+
ext u,
1863+
apply eq_orthogonal_projection_of_mem_of_inner_eq_zero,
1864+
{ simp },
1865+
{ intros w hw,
1866+
simp [(submodule.mem_bot 𝕜).mp hw] }
1867+
end
1868+
18571869
variables (K)
18581870

18591871
/-- The orthogonal projection has norm `≤ 1`. -/
18601872
lemma orthogonal_projection_norm_le : ∥orthogonal_projection K∥ ≤ 1 :=
18611873
linear_map.mk_continuous_norm_le _ (by norm_num) _
18621874

1875+
variables (𝕜)
1876+
1877+
lemma smul_orthogonal_projection_singleton {v : E} (w : E) :
1878+
(∥v∥ ^ 2 : 𝕜) • (orthogonal_projection (𝕜 ∙ v) w : E) = ⟪v, w⟫ • v :=
1879+
begin
1880+
suffices : ↑(orthogonal_projection (𝕜 ∙ v) ((∥v∥ ^ 2 : 𝕜) • w)) = ⟪v, w⟫ • v,
1881+
{ simpa using this },
1882+
apply eq_orthogonal_projection_of_mem_of_inner_eq_zero,
1883+
{ rw submodule.mem_span_singleton,
1884+
use ⟪v, w⟫ },
1885+
{ intros x hx,
1886+
obtain ⟨c, rfl⟩ := submodule.mem_span_singleton.mp hx,
1887+
have hv : ↑∥v∥ ^ 2 = ⟪v, v⟫ := by { norm_cast, simp [norm_sq_eq_inner] },
1888+
simp [inner_sub_left, inner_smul_left, inner_smul_right, is_R_or_C.conj_div, mul_comm, hv,
1889+
inner_product_space.conj_sym, hv] }
1890+
end
1891+
1892+
/-- Formula for orthogonal projection onto a single vector. -/
1893+
lemma orthogonal_projection_singleton {v : E} (w : E) :
1894+
(orthogonal_projection (𝕜 ∙ v) w : E) = (⟪v, w⟫ / ∥v∥ ^ 2) • v :=
1895+
begin
1896+
by_cases hv : v = 0,
1897+
{ rw [hv, eq_orthogonal_projection_of_eq_submodule submodule.span_zero_singleton],
1898+
{ simp },
1899+
{ apply_instance } },
1900+
have hv' : ∥v∥ ≠ 0 := ne_of_gt (norm_pos_iff.mpr hv),
1901+
have key : ((∥v∥ ^ 2 : 𝕜)⁻¹ * ∥v∥ ^ 2) • ↑(orthogonal_projection (𝕜 ∙ v) w)
1902+
= ((∥v∥ ^ 2 : 𝕜)⁻¹ * ⟪v, w⟫) • v,
1903+
{ simp [mul_smul, smul_orthogonal_projection_singleton 𝕜 w] },
1904+
convert key;
1905+
field_simp [hv']
1906+
end
1907+
1908+
/-- Formula for orthogonal projection onto a single unit vector. -/
1909+
lemma orthogonal_projection_unit_singleton {v : E} (hv : ∥v∥ = 1) (w : E) :
1910+
(orthogonal_projection (𝕜 ∙ v) w : E) = ⟪v, w⟫ • v :=
1911+
by { rw ← smul_orthogonal_projection_singleton 𝕜 w, simp [hv] }
1912+
18631913
end orthogonal_projection
18641914

18651915
/-- The subspace of vectors orthogonal to a given subspace. -/
@@ -1889,6 +1939,14 @@ lemma submodule.inner_right_of_mem_orthogonal {u v : E} (hu : u ∈ K) (hv : v
18891939
lemma submodule.inner_left_of_mem_orthogonal {u v : E} (hu : u ∈ K) (hv : v ∈ Kᗮ) : ⟪v, u⟫ = 0 :=
18901940
by rw [inner_eq_zero_sym]; exact submodule.inner_right_of_mem_orthogonal hu hv
18911941

1942+
/-- A vector in `(𝕜 ∙ u)ᗮ` is orthogonal to `u`. -/
1943+
lemma inner_right_of_mem_orthogonal_singleton (u : E) {v : E} (hv : v ∈ (𝕜 ∙ u)ᗮ) : ⟪u, v⟫ = 0 :=
1944+
submodule.inner_right_of_mem_orthogonal (submodule.mem_span_singleton_self u) hv
1945+
1946+
/-- A vector in `(𝕜 ∙ u)ᗮ` is orthogonal to `u`. -/
1947+
lemma inner_left_of_mem_orthogonal_singleton (u : E) {v : E} (hv : v ∈ (𝕜 ∙ u)ᗮ) : ⟪v, u⟫ = 0 :=
1948+
submodule.inner_left_of_mem_orthogonal (submodule.mem_span_singleton_self u) hv
1949+
18921950
variables (K)
18931951

18941952
/-- `K` and `Kᗮ` have trivial intersection. -/
@@ -2073,6 +2131,12 @@ lemma orthogonal_projection_mem_subspace_orthogonal_precomplement_eq_zero
20732131
orthogonal_projection Kᗮ v = 0 :=
20742132
orthogonal_projection_mem_subspace_orthogonal_complement_eq_zero (K.le_orthogonal_orthogonal hv)
20752133

2134+
/-- The orthogonal projection onto `(𝕜 ∙ v)ᗮ` of `v` is zero. -/
2135+
lemma orthogonal_projection_orthogonal_complement_singleton_eq_zero [complete_space E] (v : E) :
2136+
orthogonal_projection (𝕜 ∙ v)ᗮ v = 0 :=
2137+
orthogonal_projection_mem_subspace_orthogonal_precomplement_eq_zero
2138+
(submodule.mem_span_singleton_self v)
2139+
20762140
variables (K)
20772141

20782142
/-- In a complete space `E`, a vector splits as the sum of its orthogonal projections onto a
@@ -2141,4 +2205,14 @@ lemma submodule.findim_add_findim_orthogonal' [finite_dimensional 𝕜 E] {K : s
21412205
findim 𝕜 Kᗮ = n :=
21422206
by { rw ← add_right_inj (findim 𝕜 K), simp [submodule.findim_add_findim_orthogonal, h_dim] }
21432207

2208+
/-- In a finite-dimensional inner product space, the dimension of the orthogonal complement of the
2209+
span of a nonzero vector is one less than the dimension of the space. -/
2210+
lemma findim_orthogonal_span_singleton [finite_dimensional 𝕜 E] {v : E} (hv : v ≠ 0) :
2211+
findim 𝕜 (𝕜 ∙ v)ᗮ = findim 𝕜 E - 1 :=
2212+
begin
2213+
haveI : nontrivial E := ⟨⟨v, 0, hv⟩⟩,
2214+
apply submodule.findim_add_findim_orthogonal',
2215+
simp only [findim_span_singleton hv, findim_euclidean_space, fintype.card_fin],
2216+
exact nat.add_sub_cancel' (nat.succ_le_iff.mpr findim_pos)
2217+
end
21442218
end orthogonal

src/linear_algebra/basic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,9 @@ lemma le_span_singleton_iff {s : submodule R M} {v₀ : M} :
919919
s ≤ (R ∙ v₀) ↔ ∀ v ∈ s, ∃ r : R, r • v₀ = v :=
920920
by simp_rw [le_def', mem_span_singleton]
921921

922+
@[simp] lemma span_zero_singleton : (R ∙ (0:M)) = ⊥ :=
923+
by { ext, simp [mem_span_singleton, eq_comm] }
924+
922925
lemma span_singleton_eq_range (y : M) : ↑(R ∙ y) = range ((• y) : R → M) :=
923926
set.ext $ λ x, mem_span_singleton
924927

src/linear_algebra/finite_dimensional.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,15 @@ lemma span_lt_top_of_card_lt_findim {s : set V} [fintype s]
955955
(card_lt : s.to_finset.card < findim K V) : span K s < ⊤ :=
956956
lt_top_of_findim_lt_findim (lt_of_le_of_lt (findim_span_le_card _) card_lt)
957957

958+
lemma findim_span_singleton {v : V} (hv : v ≠ 0) : findim K (K ∙ v) = 1 :=
959+
begin
960+
apply le_antisymm,
961+
{ exact findim_span_le_card ({v} : set V) },
962+
{ rw [nat.succ_le_iff, findim_pos_iff],
963+
use [⟨v, mem_span_singleton_self v⟩, 0],
964+
simp [hv] }
965+
end
966+
958967
end span
959968

960969
section is_basis

0 commit comments

Comments
 (0)