@@ -7,22 +7,28 @@ import Mathlib.Analysis.Matrix.Spectrum
77import Mathlib.LinearAlgebra.Matrix.PosDef
88
99/-!
10- # Spectrum of positive definite matrices
10+ # Spectrum of positive (semi) definite matrices
1111
1212This file proves that eigenvalues of positive (semi)definite matrices are (nonnegative) positive.
13+
14+ ## Main definitions
15+
16+ * `InnerProductSpace.ofMatrix`: the inner product on `n β π` induced by a positive definite
17+ matrix `A`, and is given by `βͺx, yβ« = xα΄΄My`.
18+
1319 -/
1420
1521open WithLp Matrix Unitary
1622open scoped ComplexOrder
1723
1824namespace Matrix
19- variable {m n π : Type *} [Fintype m] [Fintype n] [RCLike π]
25+ variable {m n π : Type *} [Fintype m] [Fintype n] [RCLike π] {A : Matrix n n π}
2026
2127/-! ### Positive semidefinite matrices -/
2228
2329/-- A Hermitian matrix is positive semi-definite if and only if its eigenvalues are non-negative. -/
24- lemma IsHermitian.posSemidef_iff_eigenvalues_nonneg [DecidableEq n] {A : Matrix n n π}
25- (hA : IsHermitian A) : PosSemidef A β 0 β€ hA.eigenvalues := by
30+ lemma IsHermitian.posSemidef_iff_eigenvalues_nonneg [DecidableEq n] (hA : IsHermitian A) :
31+ PosSemidef A β 0 β€ hA.eigenvalues := by
2632 conv_lhs => rw [hA.spectral_theorem]
2733 simp [isUnit_coe.posSemidef_star_right_conjugate_iff, posSemidef_diagonal_iff, Pi.le_def]
2834
@@ -32,17 +38,17 @@ lemma IsHermitian.posSemidef_iff_eigenvalues_nonneg [DecidableEq n] {A : Matrix
3238namespace PosSemidef
3339
3440/-- The eigenvalues of a positive semi-definite matrix are non-negative -/
35- lemma eigenvalues_nonneg [DecidableEq n] {A : Matrix n n π}
36- (hA : Matrix.PosSemidef A) (i : n) : 0 β€ hA.1 .eigenvalues i :=
41+ lemma eigenvalues_nonneg [DecidableEq n] (hA : A.PosSemidef) (i : n) : 0 β€ hA.1 .eigenvalues i :=
3742 hA.isHermitian.posSemidef_iff_eigenvalues_nonneg.mp hA _
3843
39- lemma det_nonneg [DecidableEq n] {M : Matrix n n π} (hM : M.PosSemidef) :
40- 0 β€ M.det := by
41- rw [hM.isHermitian.det_eq_prod_eigenvalues]
42- exact Finset.prod_nonneg fun i _ β¦ by simpa using hM.eigenvalues_nonneg i
44+ lemma re_dotProduct_nonneg (hA : A.PosSemidef) (x : n β π) : 0 β€ RCLike.re (star x β¬α΅₯ (A *α΅₯ x)) :=
45+ RCLike.nonneg_iff.mp (hA.2 _) |>.1
46+
47+ lemma det_nonneg [DecidableEq n] (hA : A.PosSemidef) : 0 β€ A.det := by
48+ rw [hA.isHermitian.det_eq_prod_eigenvalues]
49+ exact Finset.prod_nonneg fun i _ β¦ by simpa using hA.eigenvalues_nonneg i
4350
44- lemma trace_eq_zero_iff {A : Matrix n n π} (hA : A.PosSemidef) :
45- A.trace = 0 β A = 0 := by
51+ lemma trace_eq_zero_iff (hA : A.PosSemidef) : A.trace = 0 β A = 0 := by
4652 classical
4753 conv_lhs => rw [hA.1 .spectral_theorem, conjStarAlgAut_apply, trace_mul_cycle, coe_star_mul_self,
4854 one_mul, trace_diagonal, Finset.sum_eq_zero_iff_of_nonneg (by simp [hA.eigenvalues_nonneg])]
@@ -61,23 +67,45 @@ lemma eigenvalues_self_mul_conjTranspose_nonneg (A : Matrix m n π) [Decidable
6167/-! ### Positive definite matrices -/
6268
6369/-- A Hermitian matrix is positive-definite if and only if its eigenvalues are positive. -/
64- lemma IsHermitian.posDef_iff_eigenvalues_pos [DecidableEq n] {A : Matrix n n π}
65- (hA : A.IsHermitian) : A.PosDef β β i, 0 < hA.eigenvalues i := by
70+ lemma IsHermitian.posDef_iff_eigenvalues_pos [DecidableEq n] (hA : A.IsHermitian) :
71+ A.PosDef β β i, 0 < hA.eigenvalues i := by
6672 conv_lhs => rw [hA.spectral_theorem]
6773 simp [isUnit_coe.posDef_star_right_conjugate_iff]
6874
6975namespace PosDef
7076
77+ lemma re_dotProduct_pos (hA : A.PosDef) {x : n β π} (hx : x β 0 ) :
78+ 0 < RCLike.re (star x β¬α΅₯ (A *α΅₯ x)) := RCLike.pos_iff.mp (hA.2 _ hx) |>.1
79+
7180/-- The eigenvalues of a positive definite matrix are positive. -/
72- lemma eigenvalues_pos [DecidableEq n] {A : Matrix n n π}
73- (hA : Matrix.PosDef A) (i : n) : 0 < hA.1 .eigenvalues i :=
81+ lemma eigenvalues_pos [DecidableEq n] (hA : A.PosDef) (i : n) : 0 < hA.1 .eigenvalues i :=
7482 hA.isHermitian.posDef_iff_eigenvalues_pos.mp hA i
7583
76- lemma det_pos [DecidableEq n] {M : Matrix n n π} (hM : M .PosDef) : 0 < det M := by
77- rw [hM .isHermitian.det_eq_prod_eigenvalues]
84+ lemma det_pos [DecidableEq n] (hA : A .PosDef) : 0 < det A := by
85+ rw [hA .isHermitian.det_eq_prod_eigenvalues]
7886 apply Finset.prod_pos
7987 intro i _
80- simpa using hM .eigenvalues_pos i
88+ simpa using hA .eigenvalues_pos i
8189
8290end PosDef
91+
92+ /-- A positive definite matrix `A` induces a norm `βxβ = sqrt (re xα΄΄Mx)`. -/
93+ noncomputable abbrev NormedAddCommGroup.ofMatrix (hA : A.PosDef) : NormedAddCommGroup (n β π) :=
94+ @InnerProductSpace.Core.toNormedAddCommGroup _ _ _ _ _
95+ { inner x y := (A *α΅₯ y) β¬α΅₯ star x
96+ conj_inner_symm x y := by
97+ rw [dotProduct_comm, star_dotProduct, starRingEnd_apply, star_star,
98+ star_mulVec, dotProduct_comm (A *α΅₯ y), dotProduct_mulVec, hA.isHermitian.eq]
99+ re_inner_nonneg x := dotProduct_comm _ (star x) βΈ hA.posSemidef.re_dotProduct_nonneg x
100+ definite x (hx : _ β¬α΅₯ _ = 0 ) := by
101+ by_contra! h
102+ simpa [hx, lt_irrefl, dotProduct_comm] using hA.re_dotProduct_pos h
103+ add_left := by simp only [star_add, dotProduct_add, forall_const]
104+ smul_left _ _ _ := by rw [β smul_eq_mul, β dotProduct_smul, starRingEnd_apply, β star_smul] }
105+
106+ /-- A positive definite matrix `A` induces an inner product `βͺx, yβ« = xα΄΄My`. -/
107+ def InnerProductSpace.ofMatrix (hA : A.PosDef) :
108+ @InnerProductSpace π (n β π) _ (NormedAddCommGroup.ofMatrix hA).toSeminormedAddCommGroup :=
109+ InnerProductSpace.ofCore _
110+
83111end Matrix
0 commit comments