Skip to content

Commit cc6b432

Browse files
Merge pull request #147 from JuliaDiffEq/constraints_stability_fix
Fixing stability calculations for systems with constraints
2 parents efc8bfb + e74dbed commit cc6b432

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

src/equilibrate_utils.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ push_constraint!(rn::DiffEqBase.AbstractReactionNetwork,constraint) = (push!(rn.
5757
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...)))
5858
derationalise_polys(polys) = (typeof(polys[1])<:Polynomial) ? (return polys) : (return map(pol->pol.num,polys))
5959
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)
6061

6162
reset_equi_poly!(rn::DiffEqBase.AbstractReactionNetwork) = (rn.equilibrate_content.equilibrium_polynomial = nothing)
6263
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,7 +328,7 @@ end
327328
function stability(solution::Vector{Float64}, rn::DiffEqBase.AbstractReactionNetwork, p::Vector{Float64}, t=0.::Float64)
328329
jac = zeros(length(rn.syms),length(rn.syms))
329330
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.
331332
end
332333
#Runs stability on an vector of steady states.
333334
"""
@@ -453,7 +454,7 @@ function bifurcation_grid(rn::DiffEqBase.AbstractReactionNetwork, solver::Abstra
453454
p_i=copy(p); p_i[rn.params_to_ints[param]]=range[i];
454455
sol = steady_states(rn, solver, p_i)
455456
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)))
457458
end
458459
return BifurcationGrid(param,range,Vector{BifurcationPoint}(grid_points),length(range))
459460
end
@@ -487,7 +488,7 @@ function bifurcation_grid_2d(rn::DiffEqBase.AbstractReactionNetwork, solver::Abs
487488
p_ij[rn.params_to_ints[param2]] = range2[j];
488489
sol = steady_states(rn, solver, p_ij)
489490
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)))
491492
end
492493
return BifurcationGrid2D(param1,range1,param2,range2,Matrix{BifurcationPoint}(grid_points),(length(range1),length(range2)))
493494
end
@@ -694,7 +695,7 @@ function bifurcation_paths(paths::Vector{NamedTuple{(:p, :u),Tuple{Array{Float64
694695
(length(path.p)==0) && continue
695696
(abs(1-path.p[1]/path.p[end])<0.0001) && continue
696697
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)))
698699
end
699700
return bps
700701
end
@@ -703,9 +704,9 @@ end
703704
#---Functions relating to the detection of stability in bifurcation diagrams -###
704705

705706
#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)
707708
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)
709710
any(imag(eigenvalues).>1e-6)&&(stab_type+=2)
710711
return stab_type
711712
end

0 commit comments

Comments
 (0)