Examples
Michaelis-Menten kinetics
The Michaelis-Menten reaction scheme
\[E + S \xrightleftharpoons[k_{-1}]{k_1} C \xrightleftharpoons[k_{-2}]{k_2} E + P\]
leads to the following ODE system (using the conserved quantities $E + C$ and $S + C + P$)
\[\begin{aligned} \frac{dS}{dt} &= -k_1 e_0 S + (k_1 S + k_{-1}) C \\ \frac{dC}{dt} &= k_1 e_0 S - (k_1 S + k_{-1} + k_2) C + k_{-2} (e_0 - C) (s_0 - S - C) \end{aligned}\]
where $e_0 = E(0), s_0 = S(0)$.
The classical one-dimensional equation for the Michaelis-Menten reaction kinetics is typically derived using a quasi-steady state (QSS) assumption. Following [1], this approach can be formalized with Tikhonov-Fenichel reduction theory. Here, we see how this can be achieved using TikhonovFenichelReductions.jl. In the following, we consider the irreversible and reversible case, i.e. $k_{-2}=0$ and $k_{-2}>0$, respectively.
# Setup
using Oscar
using TikhonovFenichelReductions
# Define the system
x = ["S", "C"]
p = ["e₀", "s₀", "k₁", "k₋₁", "k₂", "k₋₂"]
function f(x, p)
S, C = x
e₀, s₀, k₁, k₋₁, k₂, k₋₂ = p
return [-k₁*e₀*S + (k₁*S + k₋₁)*C, k₁*e₀*S - (k₁*S + k₋₁ + k₂)*C + k₋₂*(e₀ - C)*(s₀ - S - C)]
endf (generic function with 1 method)The irreversible case
We start by considering the irreversible case, i.e. $k_{-2} = 0$.
# RHS for the irreversible case
f1(x,p) = f(x, p .* [1,1,1,1,1,0])
# Initialize the problem
problem = ReductionProblem(f1, x, p, 1)ReductionProblem for dimension s = 1
x = [S, C]
p = [e₀, s₀, k₁, k₋₁, k₂, k₋₂]
ODE system:
dS/dt = -e₀*k₁*S + k₁*S*C + k₋₁*C
dC/dt = e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C# Search for TFPVs (fix s₀ and k₋₂, since they are irrelevant)
tfpvs, varieties = tfpvs_and_varieties(problem; preset=(s₀ = 1, k₋₂ = 1));
print_tfpvs(problem, tfpvs)π = (e₀, s₀, k₁, k₋₁, k₂, k₋₂)
_______________________________
π₁ = ( ⋅, s₀, ⋅, ⋅, k₂, k₋₂)
π₂ = ( ⋅, s₀, ⋅, k₋₁, ⋅, k₋₂)
π₃ = ( ⋅, s₀, ⋅, k₋₁, k₂, k₋₂)
π₄ = ( ⋅, s₀, k₁, ⋅, ⋅, k₋₂)
π₅ = ( ⋅, s₀, k₁, ⋅, k₂, k₋₂)
π₆ = ( ⋅, s₀, k₁, k₋₁, ⋅, k₋₂)
π₇ = ( ⋅, s₀, k₁, k₋₁, k₂, k₋₂)
π₈ = (e₀, s₀, ⋅, ⋅, k₂, k₋₂)
π₉ = (e₀, s₀, ⋅, k₋₁, ⋅, k₋₂)
π₁₀ = (e₀, s₀, ⋅, k₋₁, k₂, k₋₂)
π₁₁ = (e₀, s₀, k₁, ⋅, ⋅, k₋₂)
π₁₂ = (e₀, s₀, k₁, k₋₁, ⋅, k₋₂)print_varieties(varieties)V₁ : [C], 1
V₂ : [C], 1
V₃ : [C], 1
V₄ : [C], 1
[S], 1
V₅ : [C], 1
V₆ : [C], 1
[k₁*S + k₋₁], 1
V₇ : [C], 1
V₈ : [C], 1
V₉ : [C], 1
V₁₀ : [C], 1
V₁₁ : [-e₀ + C], 1
[S], 1
V₁₂ : [-e₀*k₁*S + k₁*S*C + k₋₁*C], 1We can find all unique manifolds and compute the corresponding reductions.
unique_V = unique_varieties(problem, varieties)
M = [get_explicit_manifold(problem, V) for V in unique_V]5-element Vector{Tuple{Vector{AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}}, Bool}}:
([S, 0], 1)
([0, C], 1)
([-k₋₁//k₁, C], 1)
([S, e₀], 1)
([(k₋₁*C)//(e₀*k₁ - k₁*C), C], 1)@assert all([m[2] for m in M])
R, idx = compute_reductions(problem, tfpvs, varieties, unique_V, [m[1] for m in M])(Dict{Tuple{Int64, Int64}, Reduction}((3, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[0, 1, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, s₀, 0, k₋₁, k₂, k₋₂], Nemo.QQMPolyRingElem[k₋₁*C, -k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[k₁*S*C, -k₁*S*C], Nemo.QQMPolyRingElem[-e₀*k₁*S, e₀*k₁*S], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [0 k₋₁; 0 -k₋₁-k₂], Univariate polynomial ring in λ over fraction field, λ^2 + (k₋₁ + k₂)*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], [k₋₁; -k₋₁-k₂], [C], [0 1], Bool[1, 1, 1], Bool[1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(k₁*k₂*S*C)//(k₋₁ + k₂), 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, 0], Bool[1, 1]), (6, 2) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[0, 1, 1, 1, 0, 1], Nemo.QQMPolyRingElem[0, s₀, k₁, k₋₁, 0, k₋₂], Nemo.QQMPolyRingElem[k₁*S*C + k₋₁*C, -k₁*S*C - k₋₁*C], Nemo.QQMPolyRingElem[-e₀*k₁*S, e₀*k₁*S - k₂*C], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [k₁*C 0; -k₁*C 0], Univariate polynomial ring in λ over fraction field, λ^2 - k₁*C*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-k₋₁//k₁, C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-k₋₁//k₁, C], [C; -C], [k₁*S+k₋₁], [k₁ 0], Bool[1, 1, 1], Bool[0, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -k₂*C], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -k₂*C], Bool[1, 1]), (11, 2) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[1, 1, 1, 0, 0, 1], Nemo.QQMPolyRingElem[e₀, s₀, k₁, 0, 0, k₋₂], Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C, e₀*k₁*S - k₁*S*C], Nemo.QQMPolyRingElem[k₋₁*C, -k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [-e₀*k₁+k₁*C 0; e₀*k₁-k₁*C 0], Univariate polynomial ring in λ over fraction field, λ^2 + (e₀*k₁ - k₁*C)*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, C], [-e₀*k₁+k₁*C; e₀*k₁-k₁*C], [S], [1 0], Bool[1, 1, 1], Bool[0, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -k₂*C], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -k₂*C], Bool[1, 1]), (7, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[0, 1, 1, 1, 1, 1], Nemo.QQMPolyRingElem[0, s₀, k₁, k₋₁, k₂, k₋₂], Nemo.QQMPolyRingElem[k₁*S*C + k₋₁*C, -k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[-e₀*k₁*S, e₀*k₁*S], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [0 k₁*S+k₋₁; 0 -k₁*S-k₋₁-k₂], Univariate polynomial ring in λ over fraction field, λ^2 + (k₁*S + k₋₁ + k₂)*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], [k₁*S+k₋₁; -k₁*S-k₋₁-k₂], [C], [0 1], Bool[1, 1, 1], Bool[1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-e₀*k₁*k₂*S)//(k₁*S + k₋₁ + k₂), 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-e₀*k₁*k₂*S)//(k₁*S + k₋₁ + k₂), 0], Bool[1, 1]), (4, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[0, 1, 1, 0, 0, 1], Nemo.QQMPolyRingElem[0, s₀, k₁, 0, 0, k₋₂], Nemo.QQMPolyRingElem[k₁*S*C, -k₁*S*C], Nemo.QQMPolyRingElem[-e₀*k₁*S + k₋₁*C, e₀*k₁*S - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [0 k₁*S; 0 -k₁*S], Univariate polynomial ring in λ over fraction field, λ^2 + k₁*S*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], [k₁*S; -k₁*S], [C], [0 1], Bool[1, 1, 1], Bool[1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-k₂*C, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, 0], Bool[1, 1]), (2, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[0, 1, 0, 1, 0, 1], Nemo.QQMPolyRingElem[0, s₀, 0, k₋₁, 0, k₋₂], Nemo.QQMPolyRingElem[k₋₁*C, -k₋₁*C], Nemo.QQMPolyRingElem[k₁*S*C, -k₁*S*C - k₂*C], Nemo.QQMPolyRingElem[-e₀*k₁*S, e₀*k₁*S], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [0 k₋₁; 0 -k₋₁], Univariate polynomial ring in λ over fraction field, λ^2 + k₋₁*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], [k₋₁; -k₋₁], [C], [0 1], Bool[1, 1, 1], Bool[1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-k₂*C, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, 0], Bool[1, 1]), (10, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[1, 1, 0, 1, 1, 1], Nemo.QQMPolyRingElem[e₀, s₀, 0, k₋₁, k₂, k₋₂], Nemo.QQMPolyRingElem[k₋₁*C, -k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C, e₀*k₁*S - k₁*S*C], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [0 k₋₁; 0 -k₋₁-k₂], Univariate polynomial ring in λ over fraction field, λ^2 + (k₋₁ + k₂)*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], [k₋₁; -k₋₁-k₂], [C], [0 1], Bool[1, 1, 1], Bool[1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-e₀*k₁*k₂*S + k₁*k₂*S*C)//(k₋₁ + k₂), 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-e₀*k₁*k₂*S)//(k₋₁ + k₂), 0], Bool[1, 1]), (4, 2) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[0, 1, 1, 0, 0, 1], Nemo.QQMPolyRingElem[0, s₀, k₁, 0, 0, k₋₂], Nemo.QQMPolyRingElem[k₁*S*C, -k₁*S*C], Nemo.QQMPolyRingElem[-e₀*k₁*S + k₋₁*C, e₀*k₁*S - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [k₁*C 0; -k₁*C 0], Univariate polynomial ring in λ over fraction field, λ^2 - k₁*C*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, C], [k₁*C; -k₁*C], [S], [1 0], Bool[1, 1, 1], Bool[0, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -k₂*C], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -k₂*C], Bool[1, 1]), (5, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[0, 1, 1, 0, 1, 1], Nemo.QQMPolyRingElem[0, s₀, k₁, 0, k₂, k₋₂], Nemo.QQMPolyRingElem[k₁*S*C, -k₁*S*C - k₂*C], Nemo.QQMPolyRingElem[-e₀*k₁*S + k₋₁*C, e₀*k₁*S - k₋₁*C], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [0 k₁*S; 0 -k₁*S-k₂], Univariate polynomial ring in λ over fraction field, λ^2 + (k₁*S + k₂)*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[S, 0], [k₁*S; -k₁*S-k₂], [C], [0 1], Bool[1, 1, 1], Bool[1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-e₀*k₁*k₂*S + k₋₁*k₂*C)//(k₁*S + k₂), 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-e₀*k₁*k₂*S)//(k₁*S + k₂), 0], Bool[1, 1]), (12, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C - k₂*C], Nemo.QQMPolyRingElem[S, C], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, k₂, k₋₂], 1, [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], Main.f1, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 2 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*S*C - e₀*k₁*S + k₋₁*C, -k₁*S*C + e₀*k₁*S + (-k₋₁ - k₂)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[S, C]), Bool[1, 1, 1, 1, 0, 1], Nemo.QQMPolyRingElem[e₀, s₀, k₁, k₋₁, 0, k₋₂], Nemo.QQMPolyRingElem[-e₀*k₁*S + k₁*S*C + k₋₁*C, e₀*k₁*S - k₁*S*C - k₋₁*C], Nemo.QQMPolyRingElem[0, -k₂*C], Nemo.QQMPolyRingElem[0, 0], [-e₀*k₁+k₁*C k₁*S+k₋₁; e₀*k₁-k₁*C -k₁*S-k₋₁-k₂], [-e₀*k₁+k₁*C (e₀*k₋₁)//(e₀-C); e₀*k₁-k₁*C (-e₀*k₋₁)//(e₀-C)], Univariate polynomial ring in λ over fraction field, λ^2 + (e₀^2*k₁ - 2*e₀*k₁*C + e₀*k₋₁ + k₁*C^2)//(e₀ - C)*λ, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(k₋₁*C)//(e₀*k₁ - k₁*C), C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(k₋₁*C)//(e₀*k₁ - k₁*C), C], [1; -1], [-e₀*k₁*S+k₁*S*C+k₋₁*C], [-e₀*k₁+k₁*C k₁*S+k₋₁], Bool[1, 1, 1], Bool[0, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-k₁*k₂*S*C - k₋₁*k₂*C)//(e₀*k₁ + k₁*S - k₁*C + k₋₁), (-e₀*k₁*k₂*C + k₁*k₂*C^2)//(e₀*k₁ + k₁*S - k₁*C + k₋₁)], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-e₀*k₋₁*k₂*C)//(e₀^2*k₁ - 2*e₀*k₁*C + e₀*k₋₁ + k₁*C^2), (-e₀^2*k₁*k₂*C + 2*e₀*k₁*k₂*C^2 - k₁*k₂*C^3)//(e₀^2*k₁ - 2*e₀*k₁*C + e₀*k₋₁ + k₁*C^2)], Bool[1, 1])…), [[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)], [(4, 2), (11, 2)], [(6, 2)], [(11, 1)], [(12, 1)]])The ad-hoc method to reduce this system found in most textbooks relies on the assumption that (at least in the initial phase of the reaction) $\frac{dC}{dt}\in\mathcal{O}(\varepsilon)$ for $\varepsilon>0$ small. Thus, one approximates $\varepsilon=0$ and solves
\[0 = \frac{dC}{dt} = k_1 e_0 S - (k_1 S + k_{-1} + k_2) C,\]
for $C$, which yields
\[C = \frac{k_1 e_0 S}{k_1 S + k_{-1} + k_2}\]
and thus
\[\frac{dS}{dt} = -\frac{k_1 k_2 e_0 S}{k_1 S + k_{-1} + k_2}.\]
The same result can be obtained by assuming the initial enzyme concentration to be small, i.e. $e_0\in\mathcal{O}(\varepsilon)$ while all other parameters are in $\mathcal{O}(1)$.
print_reduced_system(R[(7,1)]; rewrite=false)dS/dt = (-e₀*k₁*k₂*S)//(k₁*S + k₋₁ + k₂)The difference is that with this approach the reduced system is derived as the limit $\varepsilon \to 0$ instead of just setting $\varepsilon=0$. Furthermore, with Tikhonov-Fenichel reduction theory we consider individual processes independent from the components, whereas the ad-hoc approach implies all processes constituting change in $C$ are slow even though most of these processes also govern the development of $S$, which is not considered to change slowly.
Thus, Tikhonov-Fenichel reduction theory is a mathematical sound approach to reduce ODE systems, which already yields multiple timescale separations for the given system. However, for this example, the benefits of this approach become even more apparent when we consider the reversible case.
The reversible case
In the reversible case, i.e. $k_{-2}>0$, the QSS ad-hoc approach of assuming $\frac{dC}{dt}=0$ and solving the resulting algebraic equation for $C$, yields an expression involving a square root. However, with Tikhonov-Fenichel theory, we can still obtain a reduction with rational RHS.
# Initialize the problem
problem = ReductionProblem(f, x, p, 1)ReductionProblem for dimension s = 1
x = [S, C]
p = [e₀, s₀, k₁, k₋₁, k₂, k₋₂]
ODE system:
dS/dt = -e₀*k₁*S + k₁*S*C + k₋₁*C
dC/dt = e₀*s₀*k₋₂ + e₀*k₁*S - e₀*k₋₂*S - e₀*k₋₂*C - s₀*k₋₂*C - k₁*S*C - k₋₁*C - k₂*C + k₋₂*S*C + k₋₂*C^2Assuming the small parameter is still $e_0$, we can obtain the following reduction.
tfpv = Bool[0,1,1,1,1,1]
V = get_varieties(problem, tfpv)2-element Vector{Variety}:
Variety(Ideal (C), Nemo.QQMPolyRingElem[C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[C], Nemo.QQMPolyRingElem[C], [1], 1)
Variety(Ideal (k₁*k₋₂*C - s₀*k₁*k₋₂ - k₁*k₂ - k₋₁*k₋₂, k₁*S + k₋₁), Nemo.QQMPolyRingElem[-s₀*k₁*k₋₂ - k₁*k₂ + k₁*k₋₂*C - k₋₁*k₋₂, k₁*S + k₋₁], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[k₁*k₋₂*C - s₀*k₁*k₋₂ - k₁*k₂ - k₋₁*k₋₂, k₁*S + k₋₁], Nemo.QQMPolyRingElem[-s₀*k₁*k₋₂ - k₁*k₂ + k₁*k₋₂*C - k₋₁*k₋₂, k₁*S + k₋₁], [1 0; 0 1], 0)Only the first irreducible component of $\mathcal{V}(f^{(0)})$ has dimension 1 as desired.
M, _ = get_explicit_manifold(problem, V[1])
reduction = Reduction(problem, tfpv, V[1], M)
print_reduced_system(reduction; rewrite=false)dS/dt = (e₀*s₀*k₋₁*k₋₂ - e₀*k₁*k₂*S - e₀*k₋₁*k₋₂*S)//(s₀*k₋₂ + k₁*S + k₋₁ + k₂ - k₋₂*S)As before, there are other possible choices for slow-fast separations of rates.
tfpvs, varieties = tfpvs_and_varieties(problem)
print_tfpvs(problem, tfpvs)π = (e₀, s₀, k₁, k₋₁, k₂, k₋₂)
_______________________________
π₁ = ( ⋅, ⋅, ⋅, ⋅, ⋅, k₋₂)
π₂ = ( ⋅, ⋅, ⋅, ⋅, k₂, ⋅)
π₃ = ( ⋅, ⋅, ⋅, ⋅, k₂, k₋₂)
π₄ = ( ⋅, ⋅, ⋅, k₋₁, ⋅, ⋅)
π₅ = ( ⋅, ⋅, ⋅, k₋₁, ⋅, k₋₂)
π₆ = ( ⋅, ⋅, ⋅, k₋₁, k₂, ⋅)
π₇ = ( ⋅, ⋅, ⋅, k₋₁, k₂, k₋₂)
π₈ = ( ⋅, ⋅, k₁, ⋅, ⋅, ⋅)
π₉ = ( ⋅, ⋅, k₁, ⋅, ⋅, k₋₂)
π₁₀ = ( ⋅, ⋅, k₁, ⋅, k₂, ⋅)
π₁₁ = ( ⋅, ⋅, k₁, ⋅, k₂, k₋₂)
π₁₂ = ( ⋅, ⋅, k₁, k₋₁, ⋅, ⋅)
π₁₃ = ( ⋅, ⋅, k₁, k₋₁, ⋅, k₋₂)
π₁₄ = ( ⋅, ⋅, k₁, k₋₁, k₂, ⋅)
π₁₅ = ( ⋅, ⋅, k₁, k₋₁, k₂, k₋₂)
π₁₆ = ( ⋅, s₀, ⋅, ⋅, ⋅, k₋₂)
π₁₇ = ( ⋅, s₀, ⋅, ⋅, k₂, ⋅)
π₁₈ = ( ⋅, s₀, ⋅, ⋅, k₂, k₋₂)
π₁₉ = ( ⋅, s₀, ⋅, k₋₁, ⋅, ⋅)
π₂₀ = ( ⋅, s₀, ⋅, k₋₁, ⋅, k₋₂)
π₂₁ = ( ⋅, s₀, ⋅, k₋₁, k₂, ⋅)
π₂₂ = ( ⋅, s₀, ⋅, k₋₁, k₂, k₋₂)
π₂₃ = ( ⋅, s₀, k₁, ⋅, ⋅, ⋅)
π₂₄ = ( ⋅, s₀, k₁, ⋅, ⋅, k₋₂)
π₂₅ = ( ⋅, s₀, k₁, ⋅, k₂, ⋅)
π₂₆ = ( ⋅, s₀, k₁, ⋅, k₂, k₋₂)
π₂₇ = ( ⋅, s₀, k₁, k₋₁, ⋅, ⋅)
π₂₈ = ( ⋅, s₀, k₁, k₋₁, ⋅, k₋₂)
π₂₉ = ( ⋅, s₀, k₁, k₋₁, k₂, ⋅)
π₃₀ = ( ⋅, s₀, k₁, k₋₁, k₂, k₋₂)
π₃₁ = (e₀, ⋅, ⋅, ⋅, ⋅, k₋₂)
π₃₂ = (e₀, ⋅, ⋅, ⋅, k₂, ⋅)
π₃₃ = (e₀, ⋅, ⋅, ⋅, k₂, k₋₂)
π₃₄ = (e₀, ⋅, ⋅, k₋₁, ⋅, ⋅)
π₃₅ = (e₀, ⋅, ⋅, k₋₁, k₂, ⋅)
π₃₆ = (e₀, ⋅, k₁, ⋅, ⋅, ⋅)
π₃₇ = (e₀, ⋅, k₁, ⋅, ⋅, k₋₂)
π₃₈ = (e₀, ⋅, k₁, k₋₁, ⋅, ⋅)
π₃₉ = (e₀, s₀, ⋅, ⋅, ⋅, k₋₂)
π₄₀ = (e₀, s₀, ⋅, ⋅, k₂, ⋅)
π₄₁ = (e₀, s₀, ⋅, ⋅, k₂, k₋₂)
π₄₂ = (e₀, s₀, ⋅, k₋₁, ⋅, ⋅)
π₄₃ = (e₀, s₀, ⋅, k₋₁, k₂, ⋅)
π₄₄ = (e₀, s₀, k₁, ⋅, ⋅, ⋅)
π₄₅ = (e₀, s₀, k₁, ⋅, ⋅, k₋₂)
π₄₆ = (e₀, s₀, k₁, k₋₁, ⋅, ⋅)print_varieties(varieties)V₁ : [C], 1
[S + C], 1
V₂ : [C], 1
V₃ : [C], 1
[-k₂ + k₋₂*S + k₋₂*C], 1
V₄ : [C], 1
V₅ : [C], 1
V₆ : [C], 1
V₇ : [C], 1
V₈ : [C], 1
[S], 1
V₉ : [C], 1
[C, S], 0
V₁₀ : [C], 1
V₁₁ : [C], 1
[-k₂ + k₋₂*C, S], 0
V₁₂ : [C], 1
[k₁*S + k₋₁], 1
V₁₃ : [C], 1
[k₁*C - k₋₁, k₁*S + k₋₁], 0
V₁₄ : [C], 1
V₁₅ : [C], 1
[-k₁*k₂ + k₁*k₋₂*C - k₋₁*k₋₂, k₁*S + k₋₁], 0
V₁₆ : [C], 1
[-s₀ + S + C], 1
V₁₇ : [C], 1
V₁₈ : [C], 1
[-s₀*k₋₂ - k₂ + k₋₂*S + k₋₂*C], 1
V₁₉ : [C], 1
V₂₀ : [C], 1
V₂₁ : [C], 1
V₂₂ : [C], 1
V₂₃ : [C], 1
[S], 1
V₂₄ : [C], 1
[-s₀ + C, S], 0
V₂₅ : [C], 1
V₂₆ : [C], 1
[-s₀*k₋₂ - k₂ + k₋₂*C, S], 0
V₂₇ : [C], 1
[k₁*S + k₋₁], 1
V₂₈ : [C], 1
[-s₀*k₁ + k₁*C - k₋₁, k₁*S + k₋₁], 0
V₂₉ : [C], 1
V₃₀ : [C], 1
[-s₀*k₁*k₋₂ - k₁*k₂ + k₁*k₋₂*C - k₋₁*k₋₂, k₁*S + k₋₁], 0
V₃₁ : [-e₀ + C], 1
[S + C], 1
V₃₂ : [C], 1
V₃₃ : [-e₀*k₋₂*S - e₀*k₋₂*C - k₂*C + k₋₂*S*C + k₋₂*C^2], 1
V₃₄ : [C], 1
V₃₅ : [C], 1
V₃₆ : [-e₀ + C], 1
[S], 1
V₃₇ : [-e₀ + C], 1
[C, S], 0
V₃₈ : [-e₀*k₁*S + k₁*S*C + k₋₁*C], 1
V₃₉ : [-e₀ + C], 1
[-s₀ + S + C], 1
V₄₀ : [C], 1
V₄₁ : [e₀*s₀*k₋₂ - e₀*k₋₂*S - e₀*k₋₂*C - s₀*k₋₂*C - k₂*C + k₋₂*S*C + k₋₂*C^2], 1
V₄₂ : [C], 1
V₄₃ : [C], 1
V₄₄ : [-e₀ + C], 1
[S], 1
V₄₅ : [-e₀ + C], 1
[-s₀ + C, S], 0
V₄₆ : [-e₀*k₁*S + k₁*S*C + k₋₁*C], 1And indeed the reversible case can be seen as a limit of the irreversible case with $k_{-2}$ approaching zero.
M, _ = get_explicit_manifold(problem, varieties[29][1])
reduction = Reduction(problem, tfpvs[29], varieties[29][1], M)
print_reduced_system(reduction; rewrite=false)dS/dt = (-e₀*k₁*k₂*S)//(k₁*S + k₋₁ + k₂)A thorough discussion of the differences between QSS and Tikhonov-Fenichel theory can be found in [1].
A Mutualism model
A more involved example can be found in [4], where a model for mutualism is investigated using Tikhonov-Fenichel reduction theory. The main idea is to define the two-species system for the subpopulations of a host $H$, a symbiont $S$ and their complex $C$, thereby accounting explicitly for the state of individuals (interacting or living autarkically). From this, one can then consider two-dimensional reduced systems.
using Oscar
using TikhonovFenichelReductions
# Define ODE system f
# here we substitute kᵢ := 1/Kᵢ
x = ["H","S","C"]
p = ["β₂","β₃","δ₁","δ₂","δ₃","μ₁","μ₂", "η", "k₁", "k₂", "k₃"]
function f(x, p)
H, S, C = x
β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃ = p
return [
-δ₁*H - η*S*H + μ₁*C*(1-H*k₁),
β₂*S*(1-S*k₂) - δ₂*S - η*S*H + μ₂*C*(1-S*k₂),
β₃*C*(1-C*k₃) - δ₃*C + η*S*H
]
end
# find TFPV candidates for dimension s=2 (fix carrying capacities)
problem = ReductionProblem(f, x, p, 2)ReductionProblem for dimension s = 2
x = [H, S, C]
p = [β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃]
ODE system:
dH/dt = -δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S
dS/dt = -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S
dC/dt = -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*Stfpvs, varieties = tfpvs_and_varieties(problem; preset = (k₁ = 1, k₂ = 1, k₃ = 1));
# make variables available in Main namespace
H, S, C = system_components(problem)
β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃ = system_parameters(problem)
# compute all reductions
unique_V = unique_varieties(problem, varieties)
M_auto = [get_explicit_manifold(problem, V) for V in unique_V]
@assert all([m[2] for m in M_auto])
manifolds = [m[1] for m in M_auto];
F = parent(H//S)
manifolds[7] = F.([H, S, δ₁*H//(μ₁*(1 - k₁*H))])
reductions, idx_M = compute_reductions(problem, tfpvs, varieties, unique_V, manifolds)(Dict{Tuple{Int64, Int64}, Reduction}((14, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, β₃, 0, 0, 0, 0, 0, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[0, 0, -β₃*k₃*C^2 + β₃*C], Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -δ₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [0 0 0; 0 0 0; 0 0 β₃], Univariate polynomial ring in λ over fraction field, λ^3 - β₃*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], [0; 0; -β₃*k₃*C+β₃], [C], [0 0 1], Bool[1, 1, 1], Bool[1, 1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - η*H*S, 0], Bool[1, 1]), (1, 2) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1], Nemo.QQMPolyRingElem[0, 0, 0, 0, 0, 0, 0, η, k₁, k₂, k₃], Nemo.QQMPolyRingElem[-η*H*S, -η*H*S, η*H*S], Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C, -β₃*k₃*C^2 + β₃*C - δ₃*C], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [-η*S 0 0; -η*S 0 0; η*S 0 0], Univariate polynomial ring in λ over fraction field, λ^3 + η*S*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, S, C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, S, C], [-η*S; -η*S; η*S], [H], [1 0 0], Bool[1, 1, 1], Bool[0, 1, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -β₂*k₂*S^2 + β₂*S + δ₁*H - δ₂*S + μ₁*k₁*H*C - μ₁*C - μ₂*k₂*S*C + μ₂*C, -β₃*k₃*C^2 + β₃*C - δ₁*H - δ₃*C - μ₁*k₁*H*C + μ₁*C], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₁*C - μ₂*k₂*S*C + μ₂*C, -β₃*k₃*C^2 + β₃*C - δ₃*C + μ₁*C], Bool[1, 1]), (3, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, 0, 0, 0, 0, μ₁, 0, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[-μ₁*k₁*H*C + μ₁*C, 0, 0], Nemo.QQMPolyRingElem[-δ₁*H - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [-μ₁*k₁*C 0 0; 0 0 0; 0 0 0], Univariate polynomial ring in λ over fraction field, λ^3 + μ₁*k₁*C*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[1//k₁, S, C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[1//k₁, S, C], [-μ₁*C; 0; 0], [k₁*H-1], [k₁ 0 0], Bool[1, 1, 1], Bool[0, 1, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, (-β₂*k₁*k₂*S^2 + β₂*k₁*S - δ₂*k₁*S - μ₂*k₁*k₂*S*C + μ₂*k₁*C - η*S)//k₁, (-β₃*k₁*k₃*C^2 + β₃*k₁*C - δ₃*k₁*C + η*S)//k₁], Bool[1, 1]), (22, 2) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], Nemo.QQMPolyRingElem[β₂, 0, 0, 0, 0, 0, 0, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[0, -β₂*k₂*S^2 + β₂*S, 0], Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [0 0 0; 0 -β₂ 0; 0 0 0], Univariate polynomial ring in λ over fraction field, λ^3 + β₂*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, 1//k₂, C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, 1//k₂, C], [0; -β₂*S; 0], [k₂*S-1], [0 k₂ 0], Bool[1, 1, 1], Bool[1, 0, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, 0, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-δ₁*k₂*H - μ₁*k₁*k₂*H*C + μ₁*k₂*C - η*H)//k₂, 0, (-β₃*k₂*k₃*C^2 + β₃*k₂*C - δ₃*k₂*C + η*H)//k₂], Bool[1, 1]), (7, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, 0, 0, 0, δ₃, μ₁, μ₂, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[-μ₁*k₁*H*C + μ₁*C, -μ₂*k₂*S*C + μ₂*C, -δ₃*C], Nemo.QQMPolyRingElem[-δ₁*H - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - η*H*S, -β₃*k₃*C^2 + β₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [0 0 -μ₁*k₁*H+μ₁; 0 0 -μ₂*k₂*S+μ₂; 0 0 -δ₃], Univariate polynomial ring in λ over fraction field, λ^3 + δ₃*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], [-μ₁*k₁*H+μ₁; -μ₂*k₂*S+μ₂; -δ₃], [C], [0 0 1], Bool[1, 1, 1], Bool[1, 1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(β₃*μ₁*k₁*k₃*H*C^2 - β₃*μ₁*k₁*H*C - β₃*μ₁*k₃*C^2 + β₃*μ₁*C - δ₁*δ₃*H - δ₃*η*H*S - μ₁*η*k₁*H^2*S + μ₁*η*H*S)//δ₃, (-β₂*δ₃*k₂*S^2 + β₂*δ₃*S + β₃*μ₂*k₂*k₃*S*C^2 - β₃*μ₂*k₂*S*C - β₃*μ₂*k₃*C^2 + β₃*μ₂*C - δ₂*δ₃*S - δ₃*η*H*S - μ₂*η*k₂*H*S^2 + μ₂*η*H*S)//δ₃, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-δ₁*δ₃*H - δ₃*η*H*S - μ₁*η*k₁*H^2*S + μ₁*η*H*S)//δ₃, (-β₂*δ₃*k₂*S^2 + β₂*δ₃*S - δ₂*δ₃*S - δ₃*η*H*S - μ₂*η*k₂*H*S^2 + μ₂*η*H*S)//δ₃, 0], Bool[1, 1]), (25, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1], Nemo.QQMPolyRingElem[β₂, 0, 0, δ₂, 0, 0, 0, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[0, -β₂*k₂*S^2 + β₂*S - δ₂*S, 0], Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [0 0 0; 0 β₂-δ₂ 0; 0 0 0], Univariate polynomial ring in λ over fraction field, λ^3 + (-β₂ + δ₂)*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, 0, C], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, 0, C], [0; -β₂*k₂*S+β₂-δ₂; 0], [S], [0 1 0], Bool[1, 1, 1], Bool[1, 0, 1], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, 0, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - μ₁*k₁*H*C + μ₁*C, 0, -β₃*k₃*C^2 + β₃*C - δ₃*C], Bool[1, 1]), (14, 2) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, β₃, 0, 0, 0, 0, 0, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[0, 0, -β₃*k₃*C^2 + β₃*C], Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -δ₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [0 0 0; 0 0 0; 0 0 -β₃], Univariate polynomial ring in λ over fraction field, λ^3 + β₃*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 1//k₃], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 1//k₃], [0; 0; -β₃*C], [k₃*C-1], [0 0 k₃], Bool[1, 1, 1], Bool[1, 1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[(-δ₁*k₃*H - μ₁*k₁*H + μ₁ - η*k₃*H*S)//k₃, (-β₂*k₂*k₃*S^2 + β₂*k₃*S - δ₂*k₃*S - μ₂*k₂*S + μ₂ - η*k₃*H*S)//k₃, 0], Bool[1, 1]), (3, 2) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, 0, 0, 0, 0, μ₁, 0, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[-μ₁*k₁*H*C + μ₁*C, 0, 0], Nemo.QQMPolyRingElem[-δ₁*H - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Univariate polynomial ring in λ over fraction field, 0, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], true, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, 0, 0], [-μ₁*k₁*H+μ₁; 0; 0], [C], [0 0 1], Bool[1, 0, 1], Bool[1, 1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, 0, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[0, 0, 0], Bool[0, 0]), (4, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, 0, 0, 0, δ₃, 0, 0, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[0, 0, -δ₃*C], Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [0 0 0; 0 0 0; 0 0 -δ₃], Univariate polynomial ring in λ over fraction field, λ^3 + δ₃*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], [0; 0; -δ₃], [C], [0 0 1], Bool[1, 1, 1], Bool[1, 1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - η*H*S, 0], Bool[1, 1]), (15, 1) => Reduction(ReductionProblem(Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C - η*H*S, -β₃*k₃*C^2 + β₃*C - δ₃*C + η*H*S], Nemo.QQMPolyRingElem[H, S, C], Nemo.QQMPolyRingElem[β₂, β₃, δ₁, δ₂, δ₃, μ₁, μ₂, η, k₁, k₂, k₃], 2, [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], Main.f, Fraction field of multivariate polynomial ring, Rational function field over QQ, Multivariate polynomial ring in 3 variables over rational function field, AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[-η*H*S - μ₁*k₁*H*C - δ₁*H + μ₁*C, -η*H*S - β₂*k₂*S^2 - μ₂*k₂*S*C + (β₂ - δ₂)*S + μ₂*C, η*H*S - β₃*k₃*C^2 + (β₃ - δ₃)*C], AbstractAlgebra.Generic.MPoly{AbstractAlgebra.Generic.RationalFunctionFieldElem{Nemo.QQFieldElem, Nemo.QQMPolyRingElem}}[H, S, C]), Bool[0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1], Nemo.QQMPolyRingElem[0, β₃, 0, 0, 0, 0, μ₂, 0, k₁, k₂, k₃], Nemo.QQMPolyRingElem[0, -μ₂*k₂*S*C + μ₂*C, -β₃*k₃*C^2 + β₃*C], Nemo.QQMPolyRingElem[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, -β₂*k₂*S^2 + β₂*S - δ₂*S - η*H*S, -δ₃*C + η*H*S], Nemo.QQMPolyRingElem[0, 0, 0], [-δ₁-μ₁*k₁*C-η*S -η*H -μ₁*k₁*H+μ₁; -η*S -2*β₂*k₂*S+β₂-δ₂-μ₂*k₂*C-η*H -μ₂*k₂*S+μ₂; η*S η*H -2*β₃*k₃*C+β₃-δ₃], [0 0 0; 0 0 -μ₂*k₂*S+μ₂; 0 0 β₃], Univariate polynomial ring in λ over fraction field, λ^3 - β₃*λ^2, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], false, AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[H, S, 0], [0; -μ₂*k₂*S+μ₂; -β₃*k₃*C+β₃], [C], [0 0 1], Bool[1, 1, 1], Bool[1, 1, 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - μ₁*k₁*H*C + μ₁*C - η*H*S, (-β₂*β₃*k₂*k₃*S^2*C + β₂*β₃*k₂*S^2 + β₂*β₃*k₃*S*C - β₂*β₃*S - β₃*δ₂*k₃*S*C + β₃*δ₂*S - β₃*η*k₃*H*S*C + β₃*η*H*S + δ₃*μ₂*k₂*S*C - δ₃*μ₂*C - μ₂*η*k₂*H*S^2 + μ₂*η*H*S)//(β₃*k₃*C - β₃), 0], AbstractAlgebra.Generic.FracFieldElem{Nemo.QQMPolyRingElem}[-δ₁*H - η*H*S, (-β₂*β₃*k₂*S^2 + β₂*β₃*S - β₃*δ₂*S - β₃*η*H*S + μ₂*η*k₂*H*S^2 - μ₂*η*H*S)//β₃, 0], Bool[1, 1])…), [[(1, 1), (8, 1), (9, 1), (22, 1), (23, 1), (25, 1), (26, 1)], [(1, 2), (11, 1), (12, 1)], [(2, 1), (22, 2), (24, 1)], [(2, 2), (3, 2), (4, 1), (5, 1), (6, 1), (7, 1), (14, 1), (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1)], [(3, 1)], [(10, 1)], [(13, 1)], [(14, 2)], [(18, 2)], [(24, 2)], [(25, 2)], [(27, 1)]])The system given in Eq. 12 in [4] is for instance
reductions[(12,1)]Reduction for dimension s = 2 with
slow: β₂, β₃, δ₂, δ₃, μ₁, μ₂
fast: δ₁, η, k₁, k₂, k₃
M = [0, S, C]
P = [-δ₁-η*S; -η*S; η*S]
Ψ = [H]
x₀ = [0, S, C]
Df(x₀) = [-δ₁-η*S 0 0; -η*S 0 0; η*S 0 0]
Reduced system:
dS/dt = -β₂*k₂*S^2 + β₂*S - δ₂*S - μ₂*k₂*S*C + μ₂*C + (-μ₁*η*S*C)//(δ₁ + η*S)
dC/dt = -β₃*k₃*C^2 + β₃*C - δ₃*C + (μ₁*η*S*C)//(δ₁ + η*S)By reducing the original ODE system to the plane, we are able to investigate the behaviour of the system analytically. In particular, this allows to get a better understanding of conditions for which the mutualistic relation may collapse.