|
| 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 |
0 commit comments