Turing patterns and diffusion-driven instability
DefinitionDiffusion matrix of a two-species system#✓fully proved
The diffusion matrix D = diag(d_u, d_v) of a two-species reaction-diffusion system.
def diffusionMatrix (du dv : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
Matrix.diagonal ![du, dv]
DefinitionMode matrix of a linearized reaction-diffusion system#✓fully proved
The mode matrix J - k² D governing the Fourier mode of wavenumber k of the linearized
system w_t = D w_xx + J w, where J is the Jacobian of the kinetics at the steady state
(convention: J i j is the partial derivative of the i-th reaction term with respect to the
j-th species, so J = [[f_u, f_v], [g_u, g_v]]).
def modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
J - k ^ 2 • diffusionMatrix du dv
def diffusionMatrix (du dv : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
Matrix.diagonal ![du, dv]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:113
Uses 1 · Used by 10
J - k² D has an eigenvalue with positive real part · Homogeneous mode is stable for stable kinetics · Trace of the mode matrix · Diffusion-driven instability (Turing 1952)DefinitionLinearly unstable Fourier mode#✓fully proved
The Fourier mode of wavenumber k is linearly unstable: the mode matrix J - k² D has
a complex eigenvalue μ with 0 < Re μ.
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
def modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
J - k ^ 2 • diffusionMatrix du dv
MathlibExt/Biology/Dynamics/TuringPatterns.lean:120
Uses 1 · Used by 15
J - k² D has an eigenvalue with positive real part · Finite domain · Critical wavenumber is unstable under Turing's criterion · The inhibitor diffuses faster · f_u and g_v have opposite signs · Small domains admit no pattern · Homogeneous mode is stable for stable kinetics · Turing instability of the Schnakenberg kinetics · Diffusion-driven instability (Turing 1952)DefinitionComplex Fourier mode#✓fully proved
The complex Fourier mode w(t, x) = e^{μ t} cos(k x) v with growth rate μ, wavenumber k
and amplitude vector v. (The real part of a complex solution of the real linear system is a
real solution.)
noncomputable def fourierMode (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) : Fin 2 → ℂ :=
(Complex.exp (μ * t) * (Real.cos (k * x) : ℂ)) • v
DefinitionClassical solution of the linearized reaction-diffusion system#✓fully proved
w is a classical solution of the linearized reaction-diffusion system
w_t = D w_xx + J w on ℝ × ℝ: w(t, ·) is twice differentiable with first and second
derivatives wx, wxx, and w(·, x) is differentiable with the prescribed time derivative.
def IsLinearizedSolution (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ)
(w : ℝ → ℝ → Fin 2 → ℂ) : Prop :=
∃ wx wxx : ℝ → ℝ → Fin 2 → ℂ, ∀ t x,
HasDerivAt (w t) (wx t x) x ∧ HasDerivAt (wx t) (wxx t x) x ∧
HasDerivAt (fun s => w s x)
((diffusionMatrix du dv).map (↑) *ᵥ wxx t x + J.map (↑) *ᵥ w t x) t
def diffusionMatrix (du dv : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
Matrix.diagonal ![du, dv]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:113
Uses 1 · Used by 2
DefinitionDispersion polynomial#✓fully proved
The dispersion polynomial h(q) = d_u d_v q² - (d_v f_u + d_u g_v) q + det J, so that
det (J - k² D) = h(k²) (det_modeMatrix).
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
Used by 15
f_u and g_v have opposite signs · Homogeneous mode is stable for stable kinetics · Diffusion-driven instability (Turing 1952)DefinitionSquared critical wavenumber#✓fully proved
The squared critical wavenumber k_c² = (d_v f_u + d_u g_v) / (2 d_u d_v), the minimizer
of the dispersion polynomial (meaningful for d_u, d_v > 0; division by zero gives 0).
DefinitionDiscriminant of the dispersion polynomial#✓fully proved
The discriminant (d_v f_u + d_u g_v)² - 4 d_u d_v det J of the dispersion polynomial.
DefinitionLower end of the unstable wavenumber band#✓fully proved
Lower end q₋ = (S - √Δ) / (2 d_u d_v) of the unstable band of squared wavenumbers, where
S = d_v f_u + d_u g_v and Δ = bandDiscriminant (meaningful when 0 < Δ, d_u, d_v > 0).
noncomputable def bandLower (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1 - Real.sqrt (bandDiscriminant J du dv)) / (2 * du * dv)
def bandDiscriminant (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) ^ 2 - 4 * du * dv * J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:156
Uses 1 · Used by 4
DefinitionUpper end of the unstable wavenumber band#✓fully proved
Upper end q₊ = (S + √Δ) / (2 d_u d_v) of the unstable band of squared wavenumbers
(meaningful when 0 < Δ, d_u, d_v > 0).
noncomputable def bandUpper (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1 + Real.sqrt (bandDiscriminant J du dv)) / (2 * du * dv)
def bandDiscriminant (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) ^ 2 - 4 * du * dv * J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:156
Uses 1 · Used by 4
DefinitionNeumann wavenumber on an interval#✓fully proved
The Neumann wavenumber k_n = n π / L of the mode cos(n π x / L) on [0, L].
Meaningful only for 0 < L; at L = 0 the totalized division gives 0, so every
labeled Neumann mode collapses to the homogeneous mode.
noncomputable def neumannWavenumber (L : ℝ) (n : ℕ) : ℝ :=
n * Real.pi / L
The dispersion relation
TheoremTrace of the mode matrix#✓fully proved
tr (J - k² D) = tr J - k² (d_u + d_v).
theorem trace_modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) :
(modeMatrix J du dv k).trace = J.trace - k ^ 2 * (du + dv)
def modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
J - k ^ 2 • diffusionMatrix du dv
MathlibExt/Biology/Dynamics/TuringPatterns.lean:120
TheoremDeterminant of the mode matrix is the dispersion polynomial#✓fully proved
det (J - k² D) = h(k²).
theorem det_modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) :
(modeMatrix J du dv k).det = dispersionDet J du dv (k ^ 2)
def modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
J - k ^ 2 • diffusionMatrix du dv
MathlibExt/Biology/Dynamics/TuringPatterns.lean:120
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:147
Uses 2 · Used by 4
TheoremRouth–Hurwitz for 2 × 2 matrices#✓fully proved
A real 2 × 2 matrix has a complex eigenvalue with
positive real part iff its trace is positive or its determinant is negative.
theorem exists_eigenvalue_re_pos_iff (M : Matrix (Fin 2) (Fin 2) ℝ) :
(∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧ M.map (↑) *ᵥ v = μ • v) ↔
0 < M.trace ∨ M.det < 0
Used by 1
TheoremInstability criterion for a Fourier mode via trace and determinant#✓fully proved
Mode k is unstable iff 0 < tr (J - k² D) or det (J - k² D) < 0.
theorem isUnstableMode_iff {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv k : ℝ} :
IsUnstableMode J du dv k ↔
0 < (modeMatrix J du dv k).trace ∨ (modeMatrix J du dv k).det < 0
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
def modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
J - k ^ 2 • diffusionMatrix du dv
MathlibExt/Biology/Dynamics/TuringPatterns.lean:120
Uses 3 · Used by 3
TheoremDispersion relation#✓fully proved
The Fourier mode e^{μ t} cos(k x) v is a classical solution of
the linearized system w_t = D w_xx + J w iff (J - k² D) v = μ v.
theorem fourierMode_isLinearizedSolution_iff (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ)
(μ : ℂ) (v : Fin 2 → ℂ) :
IsLinearizedSolution J du dv (fourierMode μ k v) ↔
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
def IsLinearizedSolution (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ)
(w : ℝ → ℝ → Fin 2 → ℂ) : Prop :=
∃ wx wxx : ℝ → ℝ → Fin 2 → ℂ, ∀ t x,
HasDerivAt (w t) (wx t x) x ∧ HasDerivAt (wx t) (wxx t x) x ∧
HasDerivAt (fun s => w s x)
((diffusionMatrix du dv).map (↑) *ᵥ wxx t x + J.map (↑) *ᵥ w t x) t
MathlibExt/Biology/Dynamics/TuringPatterns.lean:138
noncomputable def fourierMode (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) : Fin 2 → ℂ :=
(Complex.exp (μ * t) * (Real.cos (k * x) : ℂ)) • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:132
def modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
J - k ^ 2 • diffusionMatrix du dv
MathlibExt/Biology/Dynamics/TuringPatterns.lean:120
Uses 4 · Used by 1
TheoremAmplitude of a Fourier mode#✓fully proved
The amplitude of a Fourier mode: ‖w(t, 0)‖ = e^{Re μ · t} ‖v‖.
theorem norm_fourierMode_zero (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t : ℝ) :
‖fourierMode μ k v t 0‖ = Real.exp (μ.re * t) * ‖v‖
noncomputable def fourierMode (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) : Fin 2 → ℂ :=
(Complex.exp (μ * t) * (Real.cos (k * x) : ℂ)) • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:132
Uses 1 · Used by 2
TheoremFourier mode is largest at the origin#✓fully proved
‖w(t, 0)‖ is the amplitude of the mode: ‖w(t, x)‖ ≤ ‖w(t, 0)‖ for every x.
theorem norm_fourierMode_le (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) :
‖fourierMode μ k v t x‖ ≤ ‖fourierMode μ k v t 0‖
noncomputable def fourierMode (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) : Fin 2 → ℂ :=
(Complex.exp (μ * t) * (Real.cos (k * x) : ℂ)) • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:132
Uses 2
TheoremFourier mode grows unboundedly iff its growth rate is positive#✓fully proved
A nonzero Fourier mode grows without bound iff its growth rate has positive real part.
theorem tendsto_norm_fourierMode_iff {v : Fin 2 → ℂ} (hv : v ≠ 0) (μ : ℂ) (k : ℝ) :
Tendsto (fun t => ‖fourierMode μ k v t 0‖) atTop atTop ↔ 0 < μ.re
noncomputable def fourierMode (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) : Fin 2 → ℂ :=
(Complex.exp (μ * t) * (Real.cos (k * x) : ℂ)) • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:132
Uses 2 · Used by 1
TheoremA Fourier mode grows iff J - k² D has an eigenvalue with positive real part#✓fully proved
A Fourier mode grows iff J - k² D has an eigenvalue with positive real part.
theorem isUnstableMode_iff_exists_growing {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv k : ℝ} :
IsUnstableMode J du dv k ↔ ∃ (μ : ℂ) (v : Fin 2 → ℂ), v ≠ 0 ∧
IsLinearizedSolution J du dv (fourierMode μ k v) ∧
Tendsto (fun t => ‖fourierMode μ k v t 0‖) atTop atTop
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
def IsLinearizedSolution (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ)
(w : ℝ → ℝ → Fin 2 → ℂ) : Prop :=
∃ wx wxx : ℝ → ℝ → Fin 2 → ℂ, ∀ t x,
HasDerivAt (w t) (wx t x) x ∧ HasDerivAt (wx t) (wxx t x) x ∧
HasDerivAt (fun s => w s x)
((diffusionMatrix du dv).map (↑) *ᵥ wxx t x + J.map (↑) *ᵥ w t x) t
MathlibExt/Biology/Dynamics/TuringPatterns.lean:138
noncomputable def fourierMode (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) : Fin 2 → ℂ :=
(Complex.exp (μ * t) * (Real.cos (k * x) : ℂ)) • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:132
Diffusion-driven instability
TheoremHomogeneous mode is stable for stable kinetics#✓fully proved
The homogeneous mode k = 0 is stable when the kinetics are stable (tr J < 0,
0 < det J).
theorem not_isUnstableMode_zero {J : Matrix (Fin 2) (Fin 2) ℝ} (htr : J.trace < 0)
(hdet : 0 < J.det) (du dv : ℝ) : ¬ IsUnstableMode J du dv 0
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
Uses 6 · Used by 2
TheoremMode instability iff the dispersion polynomial is negative#✓fully proved
If tr J < 0 and d_u, d_v ≥ 0, mode k is unstable iff h(k²) < 0.
theorem isUnstableMode_iff_dispersionDet_neg {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(htr : J.trace < 0) (hdu : 0 ≤ du) (hdv : 0 ≤ dv) (k : ℝ) :
IsUnstableMode J du dv k ↔ dispersionDet J du dv (k ^ 2) < 0
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:147
Uses 6 · Used by 6
TheoremDiffusion-driven instability (Turing 1952)#✓fully proved
If the steady state is stable without
diffusion (tr J < 0, 0 < det J), d_u, d_v ≥ 0, and det (J - k² D) < 0, then the
homogeneous mode is stable while mode k is unstable.
theorem turing_instability {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv k : ℝ} (htr : J.trace < 0)
(hdet : 0 < J.det) (hdu : 0 ≤ du) (hdv : 0 ≤ dv) (hk : (modeMatrix J du dv k).det < 0) :
¬ IsUnstableMode J du dv 0 ∧ IsUnstableMode J du dv k
def modeMatrix (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
J - k ^ 2 • diffusionMatrix du dv
MathlibExt/Biology/Dynamics/TuringPatterns.lean:120
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
Uses 6
TheoremMinimum value of the dispersion polynomial#✓fully proved
The value of the dispersion polynomial at its minimizer:
h(k_c²) = det J - (d_v f_u + d_u g_v)² / (4 d_u d_v).
theorem dispersionDet_criticalWavenumberSq {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(hdu : 0 < du) (hdv : 0 < dv) :
dispersionDet J du dv (criticalWavenumberSq J du dv) =
J.det - (dv * J 0 0 + du * J 1 1) ^ 2 / (4 * du * dv)
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:147
noncomputable def criticalWavenumberSq (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:152
Uses 2 · Used by 2
TheoremCritical squared wavenumber minimizes the dispersion polynomial#✓fully proved
The critical squared wavenumber minimizes the dispersion polynomial over all real q.
theorem dispersionDet_criticalWavenumberSq_le {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(hdu : 0 < du) (hdv : 0 < dv) (q : ℝ) :
dispersionDet J du dv (criticalWavenumberSq J du dv) ≤ dispersionDet J du dv q
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:147
noncomputable def criticalWavenumberSq (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:152
Uses 2
TheoremTuring condition in squared form#✓fully proved
The Turing condition in squared form: 2 √(d_u d_v det J) < S iff 0 < S and
4 d_u d_v det J < S², where S = d_v f_u + d_u g_v. This holds for all real inputs: when
d_u d_v det J < 0, Real.sqrt returns 0 and both sides reduce to 0 < S.
TheoremTuring's criterion for diffusion-driven instability#✓fully proved
For d_u, d_v > 0 and 0 < det J, the dispersion polynomial is negative at some
q ≥ 0 iff 2 √(d_u d_v det J) < d_v f_u + d_u g_v.
theorem exists_dispersionDet_neg_iff {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(hdu : 0 < du) (hdv : 0 < dv) (hdet : 0 < J.det) :
(∃ q, 0 ≤ q ∧ dispersionDet J du dv q < 0) ↔
2 * Real.sqrt (du * dv * J.det) < dv * J 0 0 + du * J 1 1
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:147
Uses 2 · Used by 1
TheoremTuring's criterion#✓fully proved
If the steady state is stable without diffusion
(tr J < 0, 0 < det J) and d_u, d_v > 0, some Fourier mode is unstable iff
d_v f_u + d_u g_v > 2 √(d_u d_v det J).
theorem exists_isUnstableMode_iff {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ} (hdu : 0 < du)
(hdv : 0 < dv) (htr : J.trace < 0) (hdet : 0 < J.det) :
(∃ k, IsUnstableMode J du dv k) ↔
2 * Real.sqrt (du * dv * J.det) < dv * J 0 0 + du * J 1 1
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
Uses 4 · Used by 2
TheoremCritical wavenumber is unstable under Turing's criterion#✓fully proved
Under Turing's criterion the critical wavenumber k_c = √(k_c²) is itself unstable (and
0 < k_c²).
theorem isUnstableMode_sqrt_criticalWavenumberSq {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(hdu : 0 < du) (hdv : 0 < dv) (htr : J.trace < 0) (_hdet : 0 < J.det)
(h : 2 * Real.sqrt (du * dv * J.det) < dv * J 0 0 + du * J 1 1) :
0 < criticalWavenumberSq J du dv ∧
IsUnstableMode J du dv (Real.sqrt (criticalWavenumberSq J du dv))
noncomputable def criticalWavenumberSq (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:152
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
TheoremCritical wavenumber at the Turing bifurcation threshold#✓fully proved
At the bifurcation threshold d_v f_u + d_u g_v = 2 √(d_u d_v det J) the critical
squared wavenumber is k_c² = √(det J / (d_u d_v)) and h(k_c²) = 0.
theorem criticalWavenumberSq_of_threshold {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(hdu : 0 < du) (hdv : 0 < dv) (hdet : 0 ≤ J.det)
(h : dv * J 0 0 + du * J 1 1 = 2 * Real.sqrt (du * dv * J.det)) :
criticalWavenumberSq J du dv = Real.sqrt (J.det / (du * dv)) ∧
dispersionDet J du dv (criticalWavenumberSq J du dv) = 0
noncomputable def criticalWavenumberSq (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:152
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:147
Uses 3
Theoremf_u and g_v have opposite signs#✓fully proved
If the steady state is stable without diffusion
and d_u, d_v ≥ 0, diffusion-driven instability forces f_u g_v < 0.
theorem mul_neg_of_exists_isUnstableMode {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(htr : J.trace < 0) (hdet : 0 < J.det) (hdu : 0 ≤ du) (hdv : 0 ≤ dv)
(h : ∃ k, IsUnstableMode J du dv k) : J 0 0 * J 1 1 < 0
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
Uses 3
TheoremThe inhibitor diffuses faster#✓fully proved
In the activator-inhibitor sign pattern (u is the
activator, 0 < f_u; then g_v < 0 follows from tr J < 0), diffusion-driven instability of a
kinetically stable state forces d_u < d_v.
theorem lt_of_exists_isUnstableMode {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(htr : J.trace < 0) (hdet : 0 < J.det) (hdu : 0 ≤ du) (hdv : 0 ≤ dv) (hfu : 0 < J 0 0)
(h : ∃ k, IsUnstableMode J du dv k) : du < dv
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
Uses 3
Unstable band and finite domains
TheoremDispersion polynomial is negative exactly on the unstable band#✓fully proved
For d_u, d_v > 0, the dispersion polynomial is negative exactly on the open band
(q₋, q₊), which is nonempty iff the discriminant is positive.
theorem dispersionDet_neg_iff {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ} (hdu : 0 < du)
(hdv : 0 < dv) (q : ℝ) :
dispersionDet J du dv q < 0 ↔
0 < bandDiscriminant J du dv ∧ bandLower J du dv < q ∧ q < bandUpper J du dv
def dispersionDet (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv q : ℝ) : ℝ :=
du * dv * q ^ 2 - (dv * J 0 0 + du * J 1 1) * q + J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:147
def bandDiscriminant (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) ^ 2 - 4 * du * dv * J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:156
noncomputable def bandLower (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1 - Real.sqrt (bandDiscriminant J du dv)) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:161
noncomputable def bandUpper (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1 + Real.sqrt (bandDiscriminant J du dv)) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:166
Uses 4 · Used by 1
TheoremNeumann modes have zero flux at the boundary#✓fully proved
The Neumann mode cos(k_n x) has zero flux at both ends of [0, L]: the x-derivative of
the Fourier mode with wavenumber k_n = n π / L vanishes at x = 0 and x = L.
theorem hasDerivAt_fourierMode_neumannWavenumber {L : ℝ} (hL : L ≠ 0) (n : ℕ) (μ : ℂ)
(v : Fin 2 → ℂ) (t : ℝ) :
HasDerivAt (fourierMode μ (neumannWavenumber L n) v t) 0 0 ∧
HasDerivAt (fourierMode μ (neumannWavenumber L n) v t) 0 L
noncomputable def fourierMode (μ : ℂ) (k : ℝ) (v : Fin 2 → ℂ) (t x : ℝ) : Fin 2 → ℂ :=
(Complex.exp (μ * t) * (Real.cos (k * x) : ℂ)) • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:132
noncomputable def neumannWavenumber (L : ℝ) (n : ℕ) : ℝ :=
n * Real.pi / L
MathlibExt/Biology/Dynamics/TuringPatterns.lean:172
Uses 2
TheoremFinite domain#✓fully proved
On [0, L] with Neumann boundary conditions, if tr J < 0 and
d_u, d_v > 0, mode n is unstable iff k_n² = (n π / L)² lies in the unstable band
(q₋, q₊) (which requires a positive discriminant).
theorem isUnstableMode_neumannWavenumber_iff {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv L : ℝ}
(hdu : 0 < du) (hdv : 0 < dv) (htr : J.trace < 0) (_hL : 0 < L) (n : ℕ) :
IsUnstableMode J du dv (neumannWavenumber L n) ↔
0 < bandDiscriminant J du dv ∧ bandLower J du dv < (n * Real.pi / L) ^ 2 ∧
(n * Real.pi / L) ^ 2 < bandUpper J du dv
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
noncomputable def neumannWavenumber (L : ℝ) (n : ℕ) : ℝ :=
n * Real.pi / L
MathlibExt/Biology/Dynamics/TuringPatterns.lean:172
def bandDiscriminant (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1) ^ 2 - 4 * du * dv * J.det
MathlibExt/Biology/Dynamics/TuringPatterns.lean:156
noncomputable def bandLower (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1 - Real.sqrt (bandDiscriminant J du dv)) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:161
noncomputable def bandUpper (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1 + Real.sqrt (bandDiscriminant J du dv)) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:166
Uses 8 · Used by 2
TheoremOnly finitely many Neumann modes are unstable#✓fully proved
Only finitely many Neumann modes are unstable on [0, L] (for d_u, d_v, L > 0, any J).
theorem finite_setOf_isUnstableMode_neumannWavenumber {J : Matrix (Fin 2) (Fin 2) ℝ}
{du dv L : ℝ} (hdu : 0 < du) (hdv : 0 < dv) (hL : 0 < L) :
{n : ℕ | IsUnstableMode J du dv (neumannWavenumber L n)}.Finite
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
noncomputable def neumannWavenumber (L : ℝ) (n : ℕ) : ℝ :=
n * Real.pi / L
MathlibExt/Biology/Dynamics/TuringPatterns.lean:172
Uses 7
TheoremSmall domains admit no pattern#✓fully proved
If the first nonhomogeneous mode already lies beyond the
band, q₊ ≤ (π / L)², then no Neumann mode is unstable on [0, L].
theorem not_isUnstableMode_neumannWavenumber_of_le {J : Matrix (Fin 2) (Fin 2) ℝ}
{du dv L : ℝ} (hdu : 0 < du) (hdv : 0 < dv) (htr : J.trace < 0) (hdet : 0 < J.det)
(hL : 0 < L) (hsmall : bandUpper J du dv ≤ (Real.pi / L) ^ 2) (n : ℕ) :
¬ IsUnstableMode J du dv (neumannWavenumber L n)
noncomputable def bandUpper (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv : ℝ) : ℝ :=
(dv * J 0 0 + du * J 1 1 + Real.sqrt (bandDiscriminant J du dv)) / (2 * du * dv)
MathlibExt/Biology/Dynamics/TuringPatterns.lean:166
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
noncomputable def neumannWavenumber (L : ℝ) (n : ℕ) : ℝ :=
n * Real.pi / L
MathlibExt/Biology/Dynamics/TuringPatterns.lean:172
TheoremLong intervals have a squared Neumann wavenumber in any given band#✓fully proved
Every long enough interval has a squared Neumann wavenumber inside a given nonempty open band
(qlo, qhi) with 0 < qhi: there is L₀ > 0 such that for all L ≥ L₀ some (n π / L)² lies
in (qlo, qhi).
theorem exists_neumann_mem_band {qlo qhi : ℝ} (hlt : qlo < qhi) (hpos : 0 < qhi) :
∃ L₀ : ℝ, 0 < L₀ ∧ ∀ L, L₀ ≤ L → ∃ n : ℕ, qlo < (n * Real.pi / L) ^ 2 ∧
(n * Real.pi / L) ^ 2 < qhi
Used by 1
TheoremLarge domains pattern#✓fully proved
Under Turing's criterion, every long enough interval [0, L] has
an unstable Neumann mode.
theorem exists_isUnstableMode_neumannWavenumber {J : Matrix (Fin 2) (Fin 2) ℝ} {du dv : ℝ}
(hdu : 0 < du) (hdv : 0 < dv) (htr : J.trace < 0) (_hdet : 0 < J.det)
(h : 2 * Real.sqrt (du * dv * J.det) < dv * J 0 0 + du * J 1 1) :
∃ L₀ : ℝ, 0 < L₀ ∧ ∀ L, L₀ ≤ L → ∃ n : ℕ, IsUnstableMode J du dv (neumannWavenumber L n)
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
noncomputable def neumannWavenumber (L : ℝ) (n : ℕ) : ℝ :=
n * Real.pi / L
MathlibExt/Biology/Dynamics/TuringPatterns.lean:172
Uses 8
Schnakenberg kinetics
DefinitionSchnakenberg reaction kinetics#✓fully proved
Schnakenberg's reaction terms (f, g) = (a - u + u² v, b - u² v) as a map on
x = (u, v) : Fin 2 → ℝ, with source rates a, b (biologically a, b > 0).
DefinitionSteady state of the Schnakenberg kinetics#✓fully proved
The homogeneous steady state (u₀, v₀) = (a + b, b / (a + b)²) of the Schnakenberg
kinetics (meaningful for a + b ≠ 0; at a + b = 0 the division gives the junk v₀ = 0).
noncomputable def schnakenbergSteadyState (a b : ℝ) : Fin 2 → ℝ :=
![a + b, b / (a + b) ^ 2]
DefinitionJacobian of the Schnakenberg kinetics at its steady state#✓fully proved
The Jacobian of the Schnakenberg kinetics at its steady state,
[[(b - a) / (a + b), (a + b)²], [-2 b / (a + b), -(a + b)²]].
TheoremSchnakenberg steady state is an equilibrium#✓fully proved
(a + b, b / (a + b)²) is a steady state of the Schnakenberg kinetics when a + b ≠ 0.
theorem schnakenberg_steadyState {a b : ℝ} (hab : a + b ≠ 0) :
schnakenberg a b (schnakenbergSteadyState a b) = 0
def schnakenberg (a b : ℝ) (x : Fin 2 → ℝ) : Fin 2 → ℝ :=
![a - x 0 + x 0 ^ 2 * x 1, b - x 0 ^ 2 * x 1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:781
noncomputable def schnakenbergSteadyState (a b : ℝ) : Fin 2 → ℝ :=
![a + b, b / (a + b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:786
Uses 2
TheoremComputation of the Schnakenberg Jacobian at the steady state#✓fully proved
The Jacobian matrix of the Schnakenberg kinetics at the steady state is
schnakenbergJacobian a b.
theorem jacobianMatrix_schnakenberg {a b : ℝ} (hab : a + b ≠ 0) :
MetaMathlibExt.jacobianMatrix (schnakenberg a b) (schnakenbergSteadyState a b) =
schnakenbergJacobian a b
noncomputable def jacobianMatrix {m n : ℕ} (f : (Fin m → ℝ) → (Fin n → ℝ))
(x : Fin m → ℝ) : Matrix (Fin n) (Fin m) ℝ :=
fun i j => deriv (fun t : ℝ => f (x + t • Pi.single j (1 : ℝ)) i) 0
MathlibExt/Analysis/Calculus/Jacobian.lean:39
def schnakenberg (a b : ℝ) (x : Fin 2 → ℝ) : Fin 2 → ℝ :=
![a - x 0 + x 0 ^ 2 * x 1, b - x 0 ^ 2 * x 1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:781
noncomputable def schnakenbergSteadyState (a b : ℝ) : Fin 2 → ℝ :=
![a + b, b / (a + b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:786
noncomputable def schnakenbergJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![(b - a) / (a + b), (a + b) ^ 2; -(2 * b) / (a + b), -(a + b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:791
TheoremDeterminant of the Schnakenberg Jacobian#✓fully proved
det J = (a + b)² for the Schnakenberg Jacobian (a + b ≠ 0).
theorem det_schnakenbergJacobian {a b : ℝ} (hab : a + b ≠ 0) :
(schnakenbergJacobian a b).det = (a + b) ^ 2
noncomputable def schnakenbergJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![(b - a) / (a + b), (a + b) ^ 2; -(2 * b) / (a + b), -(a + b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:791
Uses 1 · Used by 1
TheoremStability of the Schnakenberg steady state without diffusion#✓fully proved
The Schnakenberg steady state is stable without diffusion iff b - a < (a + b)³
(for 0 < a + b; then 0 < det J automatically).
theorem trace_schnakenbergJacobian_neg_iff {a b : ℝ} (hab : 0 < a + b) :
(schnakenbergJacobian a b).trace < 0 ↔ b - a < (a + b) ^ 3
noncomputable def schnakenbergJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![(b - a) / (a + b), (a + b) ^ 2; -(2 * b) / (a + b), -(a + b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:791
Uses 1 · Used by 1
TheoremTuring instability of the Schnakenberg kinetics#✓fully proved
Turing instability of the Schnakenberg kinetics (Murray 2003, ch. 2). With
d_u = 1, d_v = d > 0, 0 < a + b and b - a < (a + b)³ (stable without diffusion), some
Fourier mode is unstable iff 2 √d (a + b)² < d (b - a) - (a + b)³.
theorem schnakenberg_turing_iff {a b d : ℝ} (hab : 0 < a + b) (hstab : b - a < (a + b) ^ 3)
(hd : 0 < d) :
(∃ k, IsUnstableMode (schnakenbergJacobian a b) 1 d k) ↔
2 * Real.sqrt d * (a + b) ^ 2 < d * (b - a) - (a + b) ^ 3
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
noncomputable def schnakenbergJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![(b - a) / (a + b), (a + b) ^ 2; -(2 * b) / (a + b), -(a + b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:791
Gierer–Meinhardt kinetics
DefinitionGierer–Meinhardt activator-inhibitor kinetics#✓fully proved
Gierer–Meinhardt activator-inhibitor kinetics in Murray's nondimensional form
(f, g) = (a - b u + u² / v, u² - v) on x = (u, v) (biologically a, b > 0 and u, v > 0;
at v = 0 the division gives the junk u² / 0 = 0).
DefinitionSteady state of the Gierer–Meinhardt kinetics#✓fully proved
The homogeneous steady state (u₀, v₀) = ((a + 1) / b, ((a + 1) / b)²) of the
Gierer–Meinhardt kinetics (meaningful for b ≠ 0, a + 1 ≠ 0).
noncomputable def giererMeinhardtSteadyState (a b : ℝ) : Fin 2 → ℝ :=
![(a + 1) / b, ((a + 1) / b) ^ 2]
DefinitionJacobian of the Gierer–Meinhardt kinetics at its steady state#✓fully proved
The Jacobian of the Gierer–Meinhardt kinetics at its steady state,
[[b (1 - a) / (1 + a), -(b / (a + 1))²], [2 (a + 1) / b, -1]].
TheoremGierer–Meinhardt steady state is an equilibrium#✓fully proved
((a + 1) / b, ((a + 1) / b)²) is a steady state of the Gierer–Meinhardt kinetics when
a + 1 ≠ 0 and b ≠ 0.
theorem giererMeinhardt_steadyState {a b : ℝ} (ha : a + 1 ≠ 0) (hb : b ≠ 0) :
giererMeinhardt a b (giererMeinhardtSteadyState a b) = 0
noncomputable def giererMeinhardt (a b : ℝ) (x : Fin 2 → ℝ) : Fin 2 → ℝ :=
![a - b * x 0 + x 0 ^ 2 / x 1, x 0 ^ 2 - x 1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:868
noncomputable def giererMeinhardtSteadyState (a b : ℝ) : Fin 2 → ℝ :=
![(a + 1) / b, ((a + 1) / b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:873
Uses 2
TheoremComputation of the Gierer–Meinhardt Jacobian at the steady state#✓fully proved
The Jacobian matrix of the Gierer–Meinhardt kinetics at the steady state is
giererMeinhardtJacobian a b.
theorem jacobianMatrix_giererMeinhardt {a b : ℝ} (ha : a + 1 ≠ 0) (hb : b ≠ 0) :
MetaMathlibExt.jacobianMatrix (giererMeinhardt a b) (giererMeinhardtSteadyState a b) =
giererMeinhardtJacobian a b
noncomputable def jacobianMatrix {m n : ℕ} (f : (Fin m → ℝ) → (Fin n → ℝ))
(x : Fin m → ℝ) : Matrix (Fin n) (Fin m) ℝ :=
fun i j => deriv (fun t : ℝ => f (x + t • Pi.single j (1 : ℝ)) i) 0
MathlibExt/Analysis/Calculus/Jacobian.lean:39
noncomputable def giererMeinhardt (a b : ℝ) (x : Fin 2 → ℝ) : Fin 2 → ℝ :=
![a - b * x 0 + x 0 ^ 2 / x 1, x 0 ^ 2 - x 1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:868
noncomputable def giererMeinhardtSteadyState (a b : ℝ) : Fin 2 → ℝ :=
![(a + 1) / b, ((a + 1) / b) ^ 2]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:873
noncomputable def giererMeinhardtJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![b * (1 - a) / (1 + a), -(b / (a + 1)) ^ 2; 2 * (a + 1) / b, -1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:878
TheoremDeterminant of the Gierer–Meinhardt Jacobian#✓fully proved
det J = b for the Gierer–Meinhardt Jacobian (a + 1 ≠ 0, b ≠ 0).
theorem det_giererMeinhardtJacobian {a b : ℝ} (ha : a + 1 ≠ 0) (hb : b ≠ 0) :
(giererMeinhardtJacobian a b).det = b
noncomputable def giererMeinhardtJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![b * (1 - a) / (1 + a), -(b / (a + 1)) ^ 2; 2 * (a + 1) / b, -1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:878
Uses 1 · Used by 1
TheoremStability of the Gierer–Meinhardt steady state without diffusion#✓fully proved
The Gierer–Meinhardt steady state is stable without diffusion iff b (1 - a) < 1 + a
(for 0 < a + 1; then 0 < det J = b for 0 < b).
theorem trace_giererMeinhardtJacobian_neg_iff {a b : ℝ} (ha : 0 < a + 1) :
(giererMeinhardtJacobian a b).trace < 0 ↔ b * (1 - a) < 1 + a
noncomputable def giererMeinhardtJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![b * (1 - a) / (1 + a), -(b / (a + 1)) ^ 2; 2 * (a + 1) / b, -1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:878
Uses 1 · Used by 1
TheoremTuring instability of the Gierer–Meinhardt kinetics#✓fully proved
With d_u = 1, d_v = d > 0,
0 < a + 1, 0 < b and b (1 - a) < 1 + a (stable without diffusion), some Fourier mode is
unstable iff 2 √(d b) < d b (1 - a) / (1 + a) - 1.
theorem giererMeinhardt_turing_iff {a b d : ℝ} (ha : 0 < a + 1) (hb : 0 < b)
(hstab : b * (1 - a) < 1 + a) (hd : 0 < d) :
(∃ k, IsUnstableMode (giererMeinhardtJacobian a b) 1 d k) ↔
2 * Real.sqrt (d * b) < d * (b * (1 - a) / (1 + a)) - 1
def IsUnstableMode (J : Matrix (Fin 2) (Fin 2) ℝ) (du dv k : ℝ) : Prop :=
∃ μ : ℂ, 0 < μ.re ∧ ∃ v : Fin 2 → ℂ, v ≠ 0 ∧
(modeMatrix J du dv k).map (↑) *ᵥ v = μ • v
MathlibExt/Biology/Dynamics/TuringPatterns.lean:125
noncomputable def giererMeinhardtJacobian (a b : ℝ) : Matrix (Fin 2) (Fin 2) ℝ :=
!![b * (1 - a) / (1 + a), -(b / (a + 1)) ^ 2; 2 * (a + 1) / b, -1]
MathlibExt/Biology/Dynamics/TuringPatterns.lean:878
Loading dependency explorer…
The dependency explorer needs JavaScript and its graph data.