@@ -57,6 +57,7 @@ push_constraint!(rn::DiffEqBase.AbstractReactionNetwork,constraint) = (push!(rn.
57
57
set_equi_poly! (rn:: DiffEqBase.AbstractReactionNetwork ,t;kwargs... ) = (rn. equilibrate_content. equilibrium_polynomial = derationalise_polys (rn. equilibrate_content. make_polynomial (rn. equilibrate_content. polyvars. u,t,rn. equilibrate_content. polyvars. p;kwargs... )))
58
58
derationalise_polys (polys) = (typeof (polys[1 ])<: Polynomial ) ? (return polys) : (return map (pol-> pol. num,polys))
59
59
add_constraints! (rn:: DiffEqBase.AbstractReactionNetwork ) = (has_equi_poly (rn) && foreach (constraint -> push! (rn. equilibrate_content. equilibrium_polynomial,constraint), rn. equilibrate_content. constraints))
60
+ number_of_constraints (rn:: DiffEqBase.AbstractReactionNetwork ) = return length (rn. equilibrate_content. constraints)
60
61
61
62
reset_equi_poly! (rn:: DiffEqBase.AbstractReactionNetwork ) = (rn. equilibrate_content. equilibrium_polynomial = nothing )
62
63
reset_hc_templates! (rn:: DiffEqBase.AbstractReactionNetwork ) = (rn. equilibrate_content. homotopy_continuation_templates = Vector{NamedTuple{(:p , :sol ),Tuple{Vector{Complex{Float64}},Vector{Vector{Complex{Float64}}}}}}())
327
328
function stability (solution:: Vector{Float64} , rn:: DiffEqBase.AbstractReactionNetwork , p:: Vector{Float64} , t= 0. :: Float64 )
328
329
jac = zeros (length (rn. syms),length (rn. syms))
329
330
rn. jac (jac,solution,p,t)
330
- return maximum (real .(eigen (jac). values))< 0.
331
+ return sort (real .(eigen (jac). values))[ end - number_of_constraints (rn)] < 0.
331
332
end
332
333
# Runs stability on an vector of steady states.
333
334
"""
@@ -453,7 +454,7 @@ function bifurcation_grid(rn::DiffEqBase.AbstractReactionNetwork, solver::Abstra
453
454
p_i= copy (p); p_i[rn. params_to_ints[param]]= range[i];
454
455
sol = steady_states (rn, solver, p_i)
455
456
jac_eigenvals = get_jac_eigenvals (map (s-> ComplexF64 .(s),sol),param,fill (range[i],length (sol)),rn,p)
456
- grid_points[i] = BifurcationPoint (sol,jac_eigenvals,stability_type .(jac_eigenvals))
457
+ grid_points[i] = BifurcationPoint (sol,jac_eigenvals,stability_type .(jac_eigenvals, number_of_constraints (rn) ))
457
458
end
458
459
return BifurcationGrid (param,range,Vector {BifurcationPoint} (grid_points),length (range))
459
460
end
@@ -487,7 +488,7 @@ function bifurcation_grid_2d(rn::DiffEqBase.AbstractReactionNetwork, solver::Abs
487
488
p_ij[rn. params_to_ints[param2]] = range2[j];
488
489
sol = steady_states (rn, solver, p_ij)
489
490
jac_eigenvals = get_jac_eigenvals (map (s-> ComplexF64 .(s),sol),param1,fill (range1[i],length (sol)),rn,p)
490
- grid_points[i,j] = BifurcationPoint (sol,jac_eigenvals,stability_type .(jac_eigenvals))
491
+ grid_points[i,j] = BifurcationPoint (sol,jac_eigenvals,stability_type .(jac_eigenvals, number_of_constraints (rn) ))
491
492
end
492
493
return BifurcationGrid2D (param1,range1,param2,range2,Matrix {BifurcationPoint} (grid_points),(length (range1),length (range2)))
493
494
end
@@ -694,7 +695,7 @@ function bifurcation_paths(paths::Vector{NamedTuple{(:p, :u),Tuple{Array{Float64
694
695
(length (path. p)== 0 ) && continue
695
696
(abs (1 - path. p[1 ]/ path. p[end ])< 0.0001 ) && continue
696
697
jac_eigenvals = get_jac_eigenvals (path. u,param,path. p,rn,p)
697
- push! (bps,BifurcationPath (path. p, path. u, jac_eigenvals, stability_type .(jac_eigenvals), length (path. p)))
698
+ push! (bps,BifurcationPath (path. p, path. u, jac_eigenvals, stability_type .(jac_eigenvals, number_of_constraints (rn) ), length (path. p)))
698
699
end
699
700
return bps
700
701
end
703
704
# ---Functions relating to the detection of stability in bifurcation diagrams -###
704
705
705
706
# Generates a number between 0 and 3 corresponing to some stability type (0=unstable, 1=stable, 2=unstable with imaginary eigenvalues, 3=stable with imaginary eigenvalues).
706
- function stability_type (eigenvalues:: Vector{Any} )
707
+ function stability_type (eigenvalues:: Vector{Any} ,nbr_of_constraints )
707
708
stab_type = Int8 (0 )
708
- (maximum (real (eigenvalues))< 1e-6 )&& (stab_type+= 1 )
709
+ (sort (real (eigenvalues))[ end - nbr_of_constraints] < 1e-6 )&& (stab_type+= 1 )
709
710
any (imag (eigenvalues).> 1e-6 )&& (stab_type+= 2 )
710
711
return stab_type
711
712
end
0 commit comments