Normalized symmetries and transformed solutions
DefinitionBianchiIX_Dynamics_AxisSymmetryFor real variables , set
The shear components and wall rates are
These functions define the normalized vacuum Bianchi IX vector field .
Let with coordinates and the sup norm. Write
and let .
Write , , and . For initial data , let be the union of all open convex domains of solutions with these initial data, and let be their compatible curve. A solution has such a domain , a curve , and .
Let be the continuous linear operators on and set
For a fixed initial time , put
Write for the constraint differential.
For , define
Write for the matrix of a continuous linear operator in the standard basis. Set ,
A normalized symmetry is a continuous linear equivalence satisfying
These symmetries include the identity, composition, inverse, and the two maps
Transforming a solution replaces its curve by and keeps its time domain.
import Definitions.Def_BianchiIX_Dynamics_Normalized
import Definitions.Def_BianchiIX_Algebra_Flux
import Definitions.Def_BianchiIX_Dynamics_AxisMaps
import Definitions.Def_BianchiIX_Dynamics_MaximalFlow
import Definitions.Def_BianchiIX_Dynamics_CorrectedVolume
import Mathlib.Analysis.Calculus.Deriv.Pow
import Mathlib.Analysis.Calculus.Deriv.Mul
import Mathlib.Analysis.Calculus.Deriv.Add
import Mathlib.Analysis.Real.Sqrt
import Mathlib.Tactic.Linarith
import Mathlib.Tactic.Ring
import Mathlib.Analysis.Calculus.ContDiff.Operations
import Mathlib.Analysis.Calculus.Deriv.Prod
import Mathlib.Analysis.Calculus.MeanValue
import Mathlib.Data.Fin.VecNotation
import Mathlib.Tactic.FinCases
import Mathlib.Tactic.FunProp
import Mathlib.Analysis.Normed.Module.FiniteDimension
import Mathlib.LinearAlgebra.Determinant
import Mathlib.Analysis.SpecialFunctions.Pow.Deriv
import Mathlib.Tactic.FieldSimp
import Mathlib.Analysis.SpecialFunctions.Integrals.Basic
import Mathlib.Analysis.ODE.ExistUnique
import Mathlib.Analysis.Calculus.FDeriv.Partial
import Mathlib.Topology.Instances.Matrix
import Mathlib.LinearAlgebra.Matrix.Trace
import Mathlib.Analysis.Calculus.FDeriv.Analytic
import Mathlib.Topology.Algebra.Module.Determinant
import Mathlib.Analysis.Calculus.Deriv.Pi
import Mathlib.Data.Real.Basic
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisCycle_constraint (x : NormalizedState) : stateConstraint (axisCycle x) = stateConstraint x := by
have hs : (Real.sqrt 3) ^ 2 = 3 := Real.sq_sqrt (by norm_num)
dsimp [stateConstraint, constraint, shearSq, curvature, axisCycle]
ring_nf
norm_num [hs]
ring
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisSwap_constraint (x : NormalizedState) : stateConstraint (axisSwap x) = stateConstraint x := by
dsimp [stateConstraint, constraint, shearSq, curvature, axisSwap]
ring
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisCycle_positive (x : NormalizedState) : positiveWalls (axisCycle x) ↔ positiveWalls x := by
dsimp [positiveWalls, axisCycle]
tauto
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisSwap_positive (x : NormalizedState) : positiveWalls (axisSwap x) ↔ positiveWalls x := by
dsimp [positiveWalls, axisSwap]
tauto
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisCycle_field (x : NormalizedState) : normalizedField (axisCycle x) = axisCycle (normalizedField x) := by
have hs : (Real.sqrt 3) ^ 2 = 3 := Real.sq_sqrt (by norm_num)
ext i
fin_cases i <;> dsimp [normalizedField, axisCycle, shearPlus, shearMinus,
rateOne, rateTwo, rateThree, shearSq, curvature] <;> ring_nf <;> norm_num [hs] <;> ring
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisSwap_field (x : NormalizedState) : normalizedField (axisSwap x) = axisSwap (normalizedField x) := by
ext i
fin_cases i <;> dsimp [normalizedField, axisSwap, shearPlus, shearMinus,
rateOne, rateTwo, rateThree, shearSq, curvature] <;> ring
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisCycle_wall_product (x : NormalizedState) :
axisCycle x 2 * axisCycle x 3 * axisCycle x 4 = x 2 * x 3 * x 4 := by
dsimp [axisCycle]
ring
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisSwap_wall_product (x : NormalizedState) :
axisSwap x 2 * axisSwap x 3 * axisSwap x 4 = x 2 * x 3 * x 4 := by
dsimp [axisSwap]
ring
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisCycle_det : axisCycleEquiv.toLinearMap.det = 1 := by
have hs : (Real.sqrt 3) ^ 2 = 3 := Real.sq_sqrt (by norm_num)
rw [← LinearMap.det_toMatrix']
have hm : LinearMap.toMatrix' axisCycleEquiv.toLinearMap =
!![-1 / 2, Real.sqrt 3 / 2, 0, 0, 0; -Real.sqrt 3 / 2, -1 / 2, 0, 0, 0;
0, 0, 0, 1, 0; 0, 0, 0, 0, 1; 0, 0, 1, 0, 0] := by
ext i j
fin_cases i <;> fin_cases j <;>
norm_num [LinearMap.toMatrix'_apply, axisCycleEquiv, axisCycleLinear, axisCycle, Pi.single_apply, Fin.ext_iff]
rw [hm]
norm_num [Matrix.det_succ_row_zero, Fin.sum_univ_succ, Matrix.det_fin_two,
Matrix.cons_val_two, Matrix.cons_val_three, Matrix.cons_val_four, Matrix.vecHead, Matrix.vecTail, hs]
change (1 : ℝ) / 4 + -(Real.sqrt 3 / 2 * (-Real.sqrt 3 / 2 * 1)) = 1
nlinarith [hs]
end
end
section
noncomputable section
open BianchiIX
private theorem BianchiIX.axisSwap_det : axisSwapEquiv.toLinearMap.det = 1 := by
rw [← LinearMap.det_toMatrix']
have hm : LinearMap.toMatrix' axisSwapEquiv.toLinearMap =
!![1, 0, 0, 0, 0; 0, -1, 0, 0, 0; 0, 0, 1, 0, 0; 0, 0, 0, 0, 1; 0, 0, 0, 1, 0] := by
ext i j
fin_cases i <;> fin_cases j <;>
norm_num [LinearMap.toMatrix'_apply, axisSwapEquiv, axisSwapLinear, axisSwap, Pi.single_apply, Fin.ext_iff]
rw [hm]
norm_num [Matrix.det_succ_row_zero, Fin.sum_univ_succ, Matrix.det_fin_two,
Matrix.cons_val_two, Matrix.cons_val_three, Matrix.cons_val_four, Matrix.vecHead, Matrix.vecTail]
end
end
noncomputable section
namespace BianchiIX
open Set
/-- Linear changes of physical axes with their verified dynamical and volume identities. -/
structure NormalizedSymmetry where
map : NormalizedState ≃L[ℝ] NormalizedState
constraint : ∀ x, stateConstraint (map x) = stateConstraint x
positive : ∀ x, positiveWalls (map x) ↔ positiveWalls x
field : ∀ x, normalizedField (map x) = map (normalizedField x)
weight : ∀ x, normalizedVolumeWeight (map x) = normalizedVolumeWeight x
det : map.toLinearMap.det = 1
namespace NormalizedSymmetry
def refl : NormalizedSymmetry where
map := ContinuousLinearEquiv.refl ℝ NormalizedState
constraint _ := rfl
positive _ := Iff.rfl
field _ := rfl
weight _ := rfl
det := LinearMap.det_id
def trans (A B : NormalizedSymmetry) : NormalizedSymmetry where
map := A.map.trans B.map
constraint x := (B.constraint (A.map x)).trans (A.constraint x)
positive x := (B.positive (A.map x)).trans (A.positive x)
field x := by
change normalizedField (B.map (A.map x)) = B.map (A.map (normalizedField x))
rw [B.field, A.field]
weight x := (B.weight (A.map x)).trans (A.weight x)
det := by
change (B.map.toLinearMap.comp A.map.toLinearMap).det = 1
rw [LinearMap.det_comp, B.det, A.det, one_mul]
def symm (A : NormalizedSymmetry) : NormalizedSymmetry where
map := A.map.symm
constraint x := by simpa using (A.constraint (A.map.symm x)).symm
positive x := by simpa using (A.positive (A.map.symm x)).symm
field x := by
apply A.map.injective
rw [← A.field]
simp
weight x := by simpa using (A.weight (A.map.symm x)).symm
det := by
have H : A.map.toLinearMap.comp A.map.symm.toLinearMap = LinearMap.id := by
ext x
simp
have hd := congrArg LinearMap.det H
rw [LinearMap.det_comp, A.det, one_mul, LinearMap.det_id] at hd
exact hd
def cycle : NormalizedSymmetry where
map := axisCycleEquiv
constraint := axisCycle_constraint
positive := axisCycle_positive
field := axisCycle_field
weight x := by
change normalizedVolumeWeight (axisCycle x) = normalizedVolumeWeight x
simp only [normalizedVolumeWeight, wallAmplitude, axisCycle_wall_product]
det := axisCycle_det
def swap : NormalizedSymmetry where
map := axisSwapEquiv
constraint := axisSwap_constraint
positive := axisSwap_positive
field := axisSwap_field
weight x := by
change normalizedVolumeWeight (axisSwap x) = normalizedVolumeWeight x
simp only [normalizedVolumeWeight, wallAmplitude, axisSwap_wall_product]
det := axisSwap_det
end NormalizedSymmetry
def NormalizedSolution.transform {x : NormalizedState} {t₀ : ℝ}
(S : NormalizedSolution x t₀) (A : NormalizedSymmetry) : NormalizedSolution (A.map x) t₀ where
domain := S.domain
isOpen_domain := S.isOpen_domain
convex_domain := S.convex_domain
initial_mem := S.initial_mem
curve := fun t => A.map (S.curve t)
initial_eq := by rw [S.initial_eq]
hasDerivAt t ht := by
have H := A.map.hasFDerivAt.comp_hasDerivAt t (S.hasDerivAt t ht)
rw [A.field]
convert! H using 1
namespace NormalizedSymmetry
end NormalizedSymmetry
end BianchiIX