Skip to content

Commit b04f2ed

Browse files
committed
Derive steady-state existence from a nonzero reduced degree
1 parent ad0deae commit b04f2ed

4 files changed

Lines changed: 93 additions & 0 deletions

File tree

CRNT.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ import CRNT.Decision.ComputableTerminalSLC
456456
import CRNT.Decision.InjectivityMargin
457457
import CRNT.Dynamics.HopfBoundaryQ
458458
import CRNT.Multistationarity.Sard
459+
import CRNT.Multistationarity.SteadyStateDegree
459460

460461
/-!
461462
# `crnt-lean`: Chemical Reaction Network Theory in Lean 4
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import CRNT.Multistationarity.RegularValueDegree
2+
import CRNT.Multistationarity.ReducedJacobian
3+
import CRNT.Equilibria.SteadyState
4+
5+
/-!
6+
# Steady-state existence from a nonzero topological degree
7+
8+
The mass-action steady states in a stoichiometric compatibility class of `x₀` are the zeros of the
9+
**reduced field** `reducedField κ x₀ : (Fin s → ℝ) → (Fin s → ℝ)` (`s = stoichRank N`), the
10+
mass-action vector field read in the chart of the compatibility class. It is a self-map of the
11+
`s`-dimensional reduced space, so the regular-value topological degree applies: when the reduced
12+
field has a nonzero regular degree at the value `0`, its existence principle
13+
(`preimage_nonempty_of_regularDegree_ne_zero`) produces a chart point mapping to `0`, which pulls
14+
back to a positive-class mass-action steady state.
15+
16+
The bridge from "`reducedField` vanishes" to "the full field vanishes" uses that the mass-action
17+
vector field always lies in the stoichiometric subspace `S(N)`
18+
(`massActionVectorField_mem_stoichSubspace`) and that the chart inverts the projection there
19+
(`stoichChart_stoichProj`): on `S(N)` the projection `stoichProj` is injective, so a zero of its
20+
projection is a genuine zero.
21+
22+
This is the existence backbone of the `∃`-side multistationarity theory (Müller–Regensburger): the
23+
degree-theoretic counterpart of the injectivity (`∀`-side) reduction, which runs the *same* reduced
24+
field and reduced Jacobian.
25+
26+
* `massActionVectorField_mem_stoichSubspace` — the field lies in `S(N)`.
27+
* `exists_isMassActionSteadyState_of_reducedDegree_ne_zero` — nonzero reduced regular degree at `0`
28+
forces a steady state in `x₀`'s compatibility class.
29+
30+
This module is `sorry`-free.
31+
-/
32+
33+
namespace CRNT
34+
35+
namespace Network
36+
37+
open scoped BigOperators
38+
39+
variable {S : Type} [DecidableEq S] [Fintype S]
40+
41+
/-- **The mass-action vector field lies in the stoichiometric subspace.** It is a sum of reaction
42+
vectors scaled by the (nonnegative) reaction rates, and each reaction vector lies in `S(N)`. -/
43+
theorem massActionVectorField_mem_stoichSubspace (N : Network S) (κ : N.RateConstants)
44+
(x : Concentration S) : N.massActionVectorField κ x ∈ N.stoichSubspace := by
45+
have hsum : N.massActionVectorField κ x
46+
= ∑ r : N.R, (N.massActionRate κ r x) • (N.reactionVector r) := by
47+
funext s
48+
simp only [massActionVectorField_apply, Finset.sum_apply, Pi.smul_apply, smul_eq_mul]
49+
rw [hsum]
50+
exact Submodule.sum_mem _ fun r _ =>
51+
Submodule.smul_mem _ _ (N.reactionVector_mem_stoichSubspace r)
52+
53+
/-- **Steady-state existence from a nonzero degree.** If the reduced field `reducedField κ x₀` has a
54+
nonzero regular degree at `0`, then the value `0` is attained, and the attaining chart point pulls
55+
back to a mass-action steady state in `x₀`'s stoichiometric compatibility class. -/
56+
theorem exists_isMassActionSteadyState_of_reducedDegree_ne_zero
57+
(N : Network S) (κ : N.RateConstants) (x₀ : Concentration S)
58+
(hfin : ((N.reducedField κ x₀) ⁻¹' {0}).Finite)
59+
(hdeg : regularDegree (N.reducedField κ x₀) 0 hfin ≠ 0) :
60+
∃ x, N.StoichCompatible x₀ x ∧ N.IsMassActionSteadyState κ x := by
61+
obtain ⟨y, hy⟩ :=
62+
preimage_nonempty_of_regularDegree_ne_zero (N.reducedField κ x₀) 0 hfin hdeg
63+
rw [Set.mem_preimage, Set.mem_singleton_iff] at hy
64+
refine ⟨N.affineChart x₀ y, ?_, ?_⟩
65+
· show (N.affineChart x₀ y - x₀) ∈ N.stoichSubspace
66+
simp only [affineChart, add_sub_cancel_left]
67+
exact N.stoichChart_mem y
68+
· have hV : N.massActionVectorField κ (N.affineChart x₀ y) ∈ N.stoichSubspace :=
69+
N.massActionVectorField_mem_stoichSubspace κ _
70+
have hrec : N.stoichProj (N.massActionVectorField κ (N.affineChart x₀ y)) = 0 := hy
71+
have hVeq0 : N.massActionVectorField κ (N.affineChart x₀ y) = 0 := by
72+
have hcp := N.stoichChart_stoichProj hV
73+
rw [hrec, map_zero] at hcp
74+
exact hcp.symm
75+
exact fun s => congrFun hVeq0 s
76+
77+
end Network
78+
79+
end CRNT

test/AxiomAudit.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,3 +419,7 @@ The `(whitespace := lax)` mode makes the comparison insensitive to how long name
419419
/-- info: 'CRNT.dense_regularValues' depends on axioms: [propext, Classical.choice, Quot.sound] -/
420420
#guard_msgs (whitespace := lax) in
421421
#print axioms CRNT.dense_regularValues
422+
423+
/-- info: 'CRNT.Network.exists_isMassActionSteadyState_of_reducedDegree_ne_zero' depends on axioms: [propext, Classical.choice, Quot.sound] -/
424+
#guard_msgs (whitespace := lax) in
425+
#print axioms CRNT.Network.exists_isMassActionSteadyState_of_reducedDegree_ne_zero

test/Smoke.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,15 @@ example {E : Type} [NormedAddCommGroup E] [NormedSpace ℝ E] [FiniteDimensional
231231
Dense {y | ∀ x, f x = y → (fderiv ℝ f x).det ≠ 0} :=
232232
CRNT.dense_regularValues μ f hf
233233

234+
-- The ∃-side existence backbone: a nonzero regular degree of the reduced steady-state map forces a
235+
-- mass-action steady state in the compatibility class — the degree-theoretic counterpart of the
236+
-- injectivity (∀-side) reduction.
237+
example {S : Type} [DecidableEq S] [Fintype S] (N : Network S) (κ : N.RateConstants)
238+
(x₀ : Concentration S) (hfin : ((N.reducedField κ x₀) ⁻¹' {0}).Finite)
239+
(hdeg : CRNT.regularDegree (N.reducedField κ x₀) 0 hfin ≠ 0) :
240+
∃ x, N.StoichCompatible x₀ x ∧ N.IsMassActionSteadyState κ x :=
241+
N.exists_isMassActionSteadyState_of_reducedDegree_ne_zero κ x₀ hfin hdeg
242+
234243
-- The `crnt_deficiency_zero` tactic certifies deficiency zero from an explicit minor witness:
235244
-- a 1×1 minor for the reversible pair, a 2×2 minor for the irreversible chain.
236245
example : Examples.ReversiblePair.N.DeficiencyZero := by

0 commit comments

Comments
 (0)