@@ -588,6 +588,10 @@ theorem orthogonalProjection_mem_subspace_eq_self (v : K) : K.orthogonalProjecti
588
588
ext
589
589
apply eq_starProjection_of_mem_of_inner_eq_zero <;> simp
590
590
591
+ @[simp]
592
+ theorem starProjection_mem_subspace_eq_self (v : K) :
593
+ K.starProjection v = v := by simp [starProjection_apply]
594
+
591
595
/-- A point equals its orthogonal projection if and only if it lies in the subspace. -/
592
596
theorem starProjection_eq_self_iff {v : E} : K.starProjection v = v ↔ v ∈ K := by
593
597
refine ⟨fun h => ?_, fun h => eq_starProjection_of_mem_of_inner_eq_zero h ?_⟩
@@ -684,22 +688,36 @@ variable (K)
684
688
theorem orthogonalProjection_norm_le : ‖K.orthogonalProjection‖ ≤ 1 :=
685
689
LinearMap.mkContinuous_norm_le _ (by norm_num) _
686
690
691
+ theorem starProjection_norm_le : ‖K.starProjection‖ ≤ 1 :=
692
+ K.orthogonalProjection_norm_le
693
+
687
694
theorem norm_orthogonalProjection_apply {v : E} (hv : v ∈ K) :
688
695
‖orthogonalProjection K v‖ = ‖v‖ :=
689
696
congr(‖$(K.starProjection_eq_self_iff.mpr hv)‖)
690
697
698
+ theorem norm_starProjection_apply {v : E} (hv : v ∈ K) :
699
+ ‖K.starProjection v‖ = ‖v‖ :=
700
+ norm_orthogonalProjection_apply _ hv
701
+
691
702
/-- The orthogonal projection onto a closed subspace is norm non-increasing. -/
692
703
theorem norm_orthogonalProjection_apply_le (v : E) :
693
704
‖orthogonalProjection K v‖ ≤ ‖v‖ := by calc
694
705
‖orthogonalProjection K v‖ ≤ ‖orthogonalProjection K‖ * ‖v‖ := K.orthogonalProjection.le_opNorm _
695
706
_ ≤ 1 * ‖v‖ := by gcongr; exact orthogonalProjection_norm_le K
696
707
_ = _ := by simp
697
708
709
+ theorem norm_starProjection_apply_le (v : E) :
710
+ ‖K.starProjection v‖ ≤ ‖v‖ := K.norm_orthogonalProjection_apply_le v
711
+
698
712
/-- The orthogonal projection onto a closed subspace is a `1`-Lipschitz map. -/
699
713
theorem lipschitzWith_orthogonalProjection :
700
714
LipschitzWith 1 (orthogonalProjection K) :=
701
715
ContinuousLinearMap.lipschitzWith_of_opNorm_le (orthogonalProjection_norm_le K)
702
716
717
+ theorem lipschitzWith_starProjection :
718
+ LipschitzWith 1 K.starProjection :=
719
+ ContinuousLinearMap.lipschitzWith_of_opNorm_le (starProjection_norm_le K)
720
+
703
721
/-- The operator norm of the orthogonal projection onto a nontrivial subspace is `1`. -/
704
722
theorem norm_orthogonalProjection (hK : K ≠ ⊥) :
705
723
‖K.orthogonalProjection‖ = 1 := by
@@ -708,6 +726,10 @@ theorem norm_orthogonalProjection (hK : K ≠ ⊥) :
708
726
simpa [K.norm_orthogonalProjection_apply hxK, norm_eq_zero, hx_ne_zero]
709
727
using K.orthogonalProjection.ratio_le_opNorm x
710
728
729
+ theorem norm_starProjection (hK : K ≠ ⊥) :
730
+ ‖K.starProjection‖ = 1 :=
731
+ K.norm_orthogonalProjection hK
732
+
711
733
variable (𝕜)
712
734
713
735
theorem smul_starProjection_singleton {v : E} (w : E) :
@@ -959,6 +981,13 @@ theorem IsOrtho.orthogonalProjection_comp_subtypeL {U V : Submodule 𝕜 E}
959
981
ContinuousLinearMap.ext fun v =>
960
982
orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero <| h.symm v.prop
961
983
984
+ theorem IsOrtho.starProjection_comp_starProjection {U V : Submodule 𝕜 E}
985
+ [U.HasOrthogonalProjection] [V.HasOrthogonalProjection] (h : U ⟂ V) :
986
+ U.starProjection ∘L V.starProjection = 0 :=
987
+ calc _ = U.subtypeL ∘L (U.orthogonalProjection ∘L V.subtypeL) ∘L V.orthogonalProjection := by
988
+ simp only [starProjection, ContinuousLinearMap.comp_assoc]
989
+ _ = 0 := by simp [h.orthogonalProjection_comp_subtypeL]
990
+
962
991
/-- The projection into `U` from `V` is the zero map if and only if `U` and `V` are orthogonal. -/
963
992
theorem orthogonalProjection_comp_subtypeL_eq_zero_iff {U V : Submodule 𝕜 E}
964
993
[U.HasOrthogonalProjection] : U.orthogonalProjection ∘L V.subtypeL = 0 ↔ U ⟂ V :=
@@ -968,6 +997,17 @@ theorem orthogonalProjection_comp_subtypeL_eq_zero_iff {U V : Submodule 𝕜 E}
968
997
rw [starProjection_apply, this, Submodule.coe_zero, sub_zero],
969
998
Submodule.IsOrtho.orthogonalProjection_comp_subtypeL⟩
970
999
1000
+ /-- `U.starProjection ∘ V.starProjection = 0` iff `U` and `V` are pairwise orthogonal. -/
1001
+ theorem starProjection_comp_starProjection_eq_zero_iff {U V : Submodule 𝕜 E}
1002
+ [U.HasOrthogonalProjection] [V.HasOrthogonalProjection] :
1003
+ U.starProjection ∘L V.starProjection = 0 ↔ U ⟂ V := by
1004
+ refine ⟨fun h => ?_, fun h => h.starProjection_comp_starProjection⟩
1005
+ rw [← orthogonalProjection_comp_subtypeL_eq_zero_iff]
1006
+ simp only [ContinuousLinearMap.ext_iff, ContinuousLinearMap.comp_apply, subtypeL_apply,
1007
+ starProjection_apply, ContinuousLinearMap.zero_apply, coe_eq_zero] at h ⊢
1008
+ intro x
1009
+ simpa using h (x : E)
1010
+
971
1011
theorem orthogonalProjection_eq_linear_proj [K.HasOrthogonalProjection] (x : E) :
972
1012
K.orthogonalProjection x =
973
1013
K.linearProjOfIsCompl _ Submodule.isCompl_orthogonal_of_completeSpace x := by
@@ -988,10 +1028,20 @@ theorem reflection_mem_subspace_orthogonalComplement_eq_neg [K.HasOrthogonalProj
988
1028
orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero hv]
989
1029
990
1030
/-- The orthogonal projection onto `Kᗮ` of an element of `K` is zero. -/
991
- theorem orthogonalProjection_mem_subspace_orthogonal_precomplement_eq_zero
1031
+ theorem orthogonalProjection_orthogonal_apply_eq_zero
992
1032
[Kᗮ.HasOrthogonalProjection] {v : E} (hv : v ∈ K) : Kᗮ.orthogonalProjection v = 0 :=
993
1033
orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero (K.le_orthogonal_orthogonal hv)
994
1034
1035
+ @[deprecated (since := "22-07-2025")] alias
1036
+ orthogonalProjection_mem_subspace_orthogonal_precomplement_eq_zero :=
1037
+ orthogonalProjection_orthogonal_apply_eq_zero
1038
+
1039
+ theorem starProjection_orthogonal_apply_eq_zero
1040
+ [Kᗮ.HasOrthogonalProjection] {v : E} (hv : v ∈ K) :
1041
+ Kᗮ.starProjection v = 0 := by
1042
+ rw [starProjection_apply, coe_eq_zero]
1043
+ exact orthogonalProjection_orthogonal_apply_eq_zero hv
1044
+
995
1045
/-- If `U ≤ V`, then projecting on `V` and then on `U` is the same as projecting on `U`. -/
996
1046
theorem orthogonalProjection_starProjection_of_le {U V : Submodule 𝕜 E}
997
1047
[U.HasOrthogonalProjection] [V.HasOrthogonalProjection] (h : U ≤ V) (x : E) :
@@ -1004,6 +1054,12 @@ theorem orthogonalProjection_starProjection_of_le {U V : Submodule 𝕜 E}
1004
1054
@[deprecated (since := "2025-07-07")] alias orthogonalProjection_orthogonalProjection_of_le :=
1005
1055
orthogonalProjection_starProjection_of_le
1006
1056
1057
+ theorem starProjection_comp_starProjection_of_le {U V : Submodule 𝕜 E}
1058
+ [U.HasOrthogonalProjection] [V.HasOrthogonalProjection] (h : U ≤ V) :
1059
+ U.starProjection ∘L V.starProjection = U.starProjection := ContinuousLinearMap.ext fun _ => by
1060
+ nth_rw 1 [starProjection]
1061
+ simp [orthogonalProjection_starProjection_of_le h]
1062
+
1007
1063
/-- Given a monotone family `U` of complete submodules of `E` and a fixed `x : E`,
1008
1064
the orthogonal projection of `x` on `U i` tends to the orthogonal projection of `x` on
1009
1065
`(⨆ i, U i).topologicalClosure` along `atTop`. -/
@@ -1116,9 +1172,14 @@ theorem reflection_mem_subspace_orthogonal_precomplement_eq_neg [K.HasOrthogonal
1116
1172
/-- The orthogonal projection onto `(𝕜 ∙ v)ᗮ` of `v` is zero. -/
1117
1173
theorem orthogonalProjection_orthogonalComplement_singleton_eq_zero (v : E) :
1118
1174
(𝕜 ∙ v)ᗮ.orthogonalProjection v = 0 :=
1119
- orthogonalProjection_mem_subspace_orthogonal_precomplement_eq_zero
1175
+ orthogonalProjection_orthogonal_apply_eq_zero
1120
1176
(Submodule.mem_span_singleton_self v)
1121
1177
1178
+ theorem starProjection_orthogonalComplement_singleton_eq_zero (v : E) :
1179
+ (𝕜 ∙ v)ᗮ.starProjection v = 0 := by
1180
+ rw [starProjection_apply, coe_eq_zero]
1181
+ exact orthogonalProjection_orthogonalComplement_singleton_eq_zero v
1182
+
1122
1183
/-- The reflection in `(𝕜 ∙ v)ᗮ` of `v` is `-v`. -/
1123
1184
theorem reflection_orthogonalComplement_singleton_eq_neg (v : E) : reflection (𝕜 ∙ v)ᗮ v = -v :=
1124
1185
reflection_mem_subspace_orthogonal_precomplement_eq_neg (Submodule.mem_span_singleton_self v)
@@ -1195,6 +1256,11 @@ theorem norm_sq_eq_add_norm_sq_projection (x : E) (S : Submodule 𝕜 E) [S.HasO
1195
1256
exact norm_add_sq_eq_norm_sq_add_norm_sq_of_inner_eq_zero _ _ <|
1196
1257
(S.mem_orthogonal _).1 (Sᗮ.orthogonalProjection x).2 _ (S.orthogonalProjection x).2
1197
1258
1259
+ theorem norm_sq_eq_add_norm_sq_starProjection (x : E) (S : Submodule 𝕜 E)
1260
+ [S.HasOrthogonalProjection] :
1261
+ ‖x‖ ^ 2 = ‖S.starProjection x‖ ^ 2 + ‖Sᗮ.starProjection x‖ ^ 2 :=
1262
+ norm_sq_eq_add_norm_sq_projection x S
1263
+
1198
1264
/-- In a complete space `E`, the projection maps onto a complete subspace `K` and its orthogonal
1199
1265
complement sum to the identity. -/
1200
1266
theorem id_eq_sum_starProjection_self_orthogonalComplement [K.HasOrthogonalProjection] :
@@ -1240,6 +1306,13 @@ theorem starProjection_isSymmetric [K.HasOrthogonalProjection] :
1240
1306
@[deprecated (since := "2025-07-07")] alias
1241
1307
orthogonalProjection_isSymmetric := starProjection_isSymmetric
1242
1308
1309
+ theorem starProjection_apply_eq_zero_iff [K.HasOrthogonalProjection] {v : E} :
1310
+ K.starProjection v = 0 ↔ v ∈ Kᗮ := by
1311
+ refine ⟨fun h w hw => ?_, fun hv => ?_⟩
1312
+ · rw [← starProjection_eq_self_iff.mpr hw, inner_starProjection_left_eq_right, h,
1313
+ inner_zero_right]
1314
+ · simp [starProjection_apply, orthogonalProjection_mem_subspace_orthogonalComplement_eq_zero hv]
1315
+
1243
1316
lemma re_inner_starProjection_eq_normSq [K.HasOrthogonalProjection] (v : E) :
1244
1317
re ⟪K.starProjection v, v⟫ = ‖K.orthogonalProjection v‖^2 := by
1245
1318
rw [starProjection_apply,
0 commit comments