feat: Add properties of rotations
This commit is contained in:
parent
dbecdcf82d
commit
ae7ec01f22
3 changed files with 101 additions and 0 deletions
|
@ -7,6 +7,9 @@ import Mathlib.LinearAlgebra.UnitaryGroup
|
|||
import Mathlib.LinearAlgebra.Matrix.GeneralLinearGroup
|
||||
import Mathlib.Data.Complex.Exponential
|
||||
import Mathlib.Geometry.Manifold.VectorBundle.Basic
|
||||
import Mathlib.LinearAlgebra.EigenSpace.Basic
|
||||
import Mathlib.Analysis.InnerProductSpace.Basic
|
||||
import Mathlib.Analysis.InnerProductSpace.Adjoint
|
||||
/-!
|
||||
# the 3d special orthogonal group
|
||||
|
||||
|
@ -154,8 +157,74 @@ lemma det_minus_id (A : SO(3)) : det (A.1 - 1) = 0 := by
|
|||
_ = - det (A.1 - 1) := by simp [pow_three]
|
||||
simpa using h1
|
||||
|
||||
@[simp]
|
||||
lemma det_id_minus (A : SO(3)) : det (1 - A.1) = 0 := by
|
||||
have h1 : det (1 - A.1) = - det (A.1 - 1) := by
|
||||
calc
|
||||
det (1 - A.1) = det (- (A.1 - 1)) := by simp
|
||||
_ = (- 1) ^ 3 * det (A.1 - 1) := by simp only [det_neg, Fintype.card_fin, neg_mul, one_mul]
|
||||
_ = - det (A.1 - 1) := by simp [pow_three]
|
||||
rw [h1, det_minus_id]
|
||||
simp only [neg_zero]
|
||||
|
||||
@[simp]
|
||||
lemma one_in_spectrum (A : SO(3)) : 1 ∈ spectrum ℝ (A.1) := by
|
||||
rw [spectrum.mem_iff]
|
||||
simp
|
||||
rw [Matrix.isUnit_iff_isUnit_det]
|
||||
simp
|
||||
|
||||
noncomputable section action
|
||||
open Module
|
||||
|
||||
@[simps!]
|
||||
def toEnd (A : SO(3)) : End ℝ (EuclideanSpace ℝ (Fin 3)) :=
|
||||
Matrix.toLin (EuclideanSpace.basisFun (Fin 3) ℝ).toBasis
|
||||
(EuclideanSpace.basisFun (Fin 3) ℝ).toBasis A.1
|
||||
|
||||
lemma one_is_eigenvalue (A : SO(3)) : A.toEnd.HasEigenvalue 1 := by
|
||||
rw [End.hasEigenvalue_iff_mem_spectrum]
|
||||
erw [AlgEquiv.spectrum_eq (Matrix.toLinAlgEquiv (EuclideanSpace.basisFun (Fin 3) ℝ).toBasis ) A.1]
|
||||
exact one_in_spectrum A
|
||||
|
||||
lemma exists_stationary_vec (A : SO(3)) :
|
||||
∃ (v : EuclideanSpace ℝ (Fin 3)),
|
||||
Orthonormal ℝ (({0} : Set (Fin 3)).restrict (fun _ => v ))
|
||||
∧ A.toEnd v = v := by
|
||||
obtain ⟨v, hv⟩ := End.HasEigenvalue.exists_hasEigenvector $ one_is_eigenvalue A
|
||||
have hvn : ‖v‖ ≠ 0 := norm_ne_zero_iff.mpr hv.2
|
||||
use (1/‖v‖) • v
|
||||
apply And.intro
|
||||
rw [@orthonormal_iff_ite]
|
||||
intro v1 v2
|
||||
have hv1 := v1.2
|
||||
have hv2 := v2.2
|
||||
simp_all only [one_div, Set.mem_singleton_iff]
|
||||
have hveq : v1 = v2 := by
|
||||
rw [@Subtype.ext_iff]
|
||||
simp_all only
|
||||
subst hveq
|
||||
simp only [Set.restrict_apply, PiLp.smul_apply, smul_eq_mul,
|
||||
_root_.map_mul, map_inv₀, conj_trivial, ↓reduceIte]
|
||||
rw [inner_smul_right, inner_smul_left, real_inner_self_eq_norm_sq v]
|
||||
field_simp
|
||||
ring
|
||||
rw [_root_.map_smul, End.mem_eigenspace_iff.mp hv.1 ]
|
||||
simp
|
||||
|
||||
lemma exists_basis_preserved (A : SO(3)) :
|
||||
∃ (b : OrthonormalBasis (Fin 3) ℝ (EuclideanSpace ℝ (Fin 3))), A.toEnd (b 0) = b 0 := by
|
||||
obtain ⟨v, hv⟩ := exists_stationary_vec A
|
||||
have h3 : FiniteDimensional.finrank ℝ (EuclideanSpace ℝ (Fin 3)) = Fintype.card (Fin 3) := by
|
||||
simp_all only [toEnd_apply, finrank_euclideanSpace, Fintype.card_fin]
|
||||
obtain ⟨b, hb⟩ := Orthonormal.exists_orthonormalBasis_extension_of_card_eq h3 hv.1
|
||||
simp at hb
|
||||
use b
|
||||
rw [hb, hv.2]
|
||||
|
||||
|
||||
|
||||
end action
|
||||
end SO3
|
||||
|
||||
|
||||
|
|
|
@ -18,7 +18,22 @@ namespace spaceTime
|
|||
namespace lorentzGroup
|
||||
open GroupTheory
|
||||
|
||||
@[simp]
|
||||
def SO3ToMatrix (A : SO(3)) : Matrix (Fin 4) (Fin 4) ℝ :=
|
||||
Matrix.reindex finSumFinEquiv finSumFinEquiv (Matrix.fromBlocks 1 0 0 A.1)
|
||||
|
||||
@[simp]
|
||||
lemma SO3ToMatrix_det (A : SO(3)) : (SO3ToMatrix A).det = 1 := by
|
||||
simp only [SO3ToMatrix, Nat.reduceAdd, Matrix.reindex_apply, Matrix.det_submatrix_equiv_self,
|
||||
Matrix.det_fromBlocks_zero₂₁, Matrix.det_unique, Fin.default_eq_zero, Fin.isValue,
|
||||
Matrix.one_apply_eq, A.2, mul_one]
|
||||
|
||||
lemma SO3ToMatrix_lorentz (A : SO(3)) : η * (SO3ToMatrix A).transpose * η * SO3ToMatrix A = 1 := by
|
||||
simp only [η_block, Nat.reduceAdd, Matrix.reindex_apply, SO3ToMatrix, Matrix.transpose_submatrix,
|
||||
Matrix.fromBlocks_transpose, Matrix.transpose_one, Matrix.transpose_zero,
|
||||
Matrix.submatrix_mul_equiv, Matrix.fromBlocks_multiply, mul_one, Matrix.mul_zero, add_zero,
|
||||
Matrix.zero_mul, Matrix.mul_one, neg_mul, one_mul, zero_add, Matrix.mul_neg, neg_zero, mul_neg,
|
||||
neg_neg, Matrix.mul_eq_one_comm.mpr A.2.2, Matrix.fromBlocks_one, Matrix.submatrix_one_equiv]
|
||||
|
||||
|
||||
end lorentzGroup
|
||||
|
|
|
@ -66,6 +66,23 @@ lemma η_sq : η * η = 1 := by
|
|||
Matrix.head_fin_const, Matrix.head_cons, Matrix.vecCons_const, Fin.mk_one, Fin.mk_one,
|
||||
vecHead, vecTail, Function.comp_apply]
|
||||
|
||||
lemma η_block : η = Matrix.reindex finSumFinEquiv finSumFinEquiv (
|
||||
Matrix.fromBlocks (1 : Matrix (Fin 1) (Fin 1) ℝ) 0 0 (-1 : Matrix (Fin 3) (Fin 3) ℝ)) := by
|
||||
apply Matrix.ext
|
||||
intro i j
|
||||
fin_cases i <;> fin_cases j
|
||||
<;> simp_all only [Fin.zero_eta, reindex_apply, submatrix_apply]
|
||||
any_goals rfl
|
||||
all_goals simp [finSumFinEquiv, Fin.addCases, η, Fin.zero_eta, Matrix.cons_val', Matrix.cons_val_fin_one, Matrix.cons_val_one,
|
||||
Matrix.cons_val_succ', Matrix.cons_val_zero, Matrix.empty_val', Matrix.head_cons,
|
||||
Matrix.head_fin_const, Matrix.head_cons, Matrix.vecCons_const, Fin.mk_one, Fin.mk_one,
|
||||
vecHead, vecTail, Function.comp_apply]
|
||||
any_goals rfl
|
||||
all_goals split
|
||||
all_goals simp
|
||||
all_goals rfl
|
||||
|
||||
|
||||
|
||||
lemma η_diag_mul_self (μ : Fin 4) : η μ μ * η μ μ = 1 := by
|
||||
fin_cases μ
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue