Basins of Attraction
This page provides several functions related to the basins of attraction and their boundaries. It requires you to have first understood the Finding Attractors page.
Basins of attraction
Calculating basins of attraction, or their state space fractions, can be done with the functions:
Attractors.basins_fractions
— Functionbasins_fractions(
mapper::AttractorMapper,
ics::Union{StateSpaceSet, Function};
kwargs...
)
Approximate the state space fractions fs
of the basins of attraction of a dynamical stystem by mapping initial conditions to attractors using mapper
(which contains a reference to a DynamicalSystem
). The fractions are simply the ratios of how many initial conditions ended up at each attractor.
Initial conditions to use are defined by ics
. It can be:
- a
StateSpaceSet
of initial conditions, in which case all are used. - a 0-argument function
ics()
that spits out random initial conditions. ThenN
random initial conditions are chosen. Seestatespace_sampler
to generate such functions.
Return
The function will always return fractions
, which is a dictionary whose keys are the labels given to each attractor (always integers enumerating the different attractors), and whose values are the respective basins fractions. The label -1
is given to any initial condition where mapper
could not match to an attractor (this depends on the mapper
type).
If ics
is a StateSpaceSet
the function will also return labels
, which is vector, of equal length to ics
, that contains the label each initial condition was mapped to.
See AttractorMapper
for all possible mapper
types, and use extract_attractors
(after calling basins_fractions
) to extract the stored attractors from the mapper
.
Keyword arguments
N = 1000
: Number of random initial conditions to generate in caseics
is a function.show_progress = true
: Display a progress bar of the process.
basins_fractions(basins::AbstractArray) → fs::Dict
Calculate the state space fraction of the basins of attraction encoded in basins
. The elements of basins
are integers, enumerating the attractor that the entry of basins
converges to (i.e., like the output of basins_of_attraction
). Return a dictionary that maps attractor IDs to their relative fractions.
In[Menck2013] the authors use these fractions to quantify the stability of a basin of attraction, and specifically how it changes when a parameter is changed. For this, see continuation
.
Attractors.extract_attractors
— Functionextract_attractors(m::AttractorsViaRecurrences) → attractors
Return a dictionary mapping label IDs to attractors found by the mapper
. This function should be called after calling basins_fractions
with the given mapper
so that the attractors have actually been found first.
For AttractorsViaFeaturizing
, the attractors are only stored if the mapper was called with pre-defined initial conditions rather than a sampler (function returning initial conditions).
Attractors.basins_of_attraction
— Functionbasins_of_attraction(mapper::AttractorMapper, grid::Tuple) → basins, attractors
Compute the full basins of attraction as identified by the given mapper
, which includes a reference to a GeneralizedDynamicalSystem
and return them along with (perhaps approximated) found attractors.
grid
is a tuple of ranges defining the grid of initial conditions that partition the state space into boxes with size the step size of each range. For example, grid = (xg, yg)
where xg = yg = range(-5, 5; length = 100)
. The grid has to be the same dimensionality as the state space expected by the integrator/system used in mapper
. E.g., a projected_integrator
could be used for lower dimensional projections, etc. A special case here is a poincaremap
with plane
being Tuple{Int, <: Real}
. In this special scenario the grid can be one dimension smaller than the state space, in which case the partitioning happens directly on the hyperplane the Poincaré map operates on.
basins_of_attraction
function is a convenience 5-lines-of-code wrapper which uses the labels
returned by basins_fractions
and simply assings them to a full array corresponding to the state space partitioning indicated by grid
.
basins_of_attraction(mapper::AttractorsViaRecurrences; show_progress = true)
This is a special method of basins_of_attraction
that using recurrences does exactly what is described in the paper by Datseris & Wagemakers[Datseris2022]. By enforcing that the internal grid of mapper
is the same as the grid of initial conditions to map to attractors, the method can further utilize found exit and attraction basins, making the computation faster as the grid is processed more and more.
StateSpaceSets.statespace_sampler
— Functionstatespace_sampler(rng = Random.GLOBAL_RNG; kwargs...) → sampler, isinside
Convenience function that creates two functions. sampler
is a 0-argument function that generates random points inside a state space region defined by the keywords. isinside
is a 1-argument function that decides returns true
if the given state space point is inside that region.
The regions can be:
- Rectangular box, with edges
min_bounds
andmax_bounds
. The sampling of the points inside the box is decided by the keywordmethod
which can be either"uniform"
or"multgauss"
. - Sphere, of
spheredims
dimensions, radiusradius
and centered oncenter
.
statespace_sampler(grid::NTuple{N, AbstractRange} [, rng])
If given a grid
that is a tuple of ranges, the minimum and maximum of the ranges are used as the min_bounds
and max_bounds
keywords.
Final state sensitivity / fractal boundaries
Several functions are provided related with analyzing the fractality of the boundaries of the basins of attraction:
Attractors.basins_fractal_dimension
— Functionbasins_fractal_dimension(basins; kwargs...) -> V_ε, N_ε ,d
Estimate the Fractal Dimension d
of the boundary between basins of attraction using the box-counting algorithm.
The output N_ε
is a vector with the number of the balls of radius ε
(in pixels) that contain at least two initial conditions that lead to different attractors. V_ε
is a vector with the corresponding size of the balls. The ouput d
is the estimation of the box-counting dimension of the boundary by fitting a line in the log.(N_ε)
vs log.(1/V_ε)
curve. However it is recommended to analyze the curve directly for more accuracy.
Keyword arguments
range_ε = 2:maximum(size(basins))÷20
is the range of sizes of the ball to test (in pixels).
Description
It is the implementation of the popular algorithm of the estimation of the box-counting dimension. The algorithm search for a covering the boundary with N_ε
boxes of size ε
in pixels.
Attractors.basin_entropy
— Functionbasin_entropy(basins, ε = 20) -> Sb, Sbb
This algorithm computes the basin entropy Sb
of the basins of attraction. First, the input basins
is divided regularly into n-dimensional boxes of side ε
(along all dimensions). Then Sb
is simply the average of the Gibbs entropy computed over these boxes. The function returns the basin entropy Sb
as well as the boundary basin entropy Sbb
. The later is the average of the entropy only for boxes that contains at least two different basins, that is, for the boxes on the boundary.
The basin entropy is a measure of the uncertainty on the initial conditions of the basins. It is maximum at the value log(n_att)
being n_att
the number of attractors. In this case the boundary is intermingled: for a given initial condition we can find another initial condition that lead to another basin arbitriraly close. It provides also a simple criterion for fractality: if the boundary basin entropy Sbb
is above log(2)
then we have a fractal boundary. It doesn't mean that basins with values below cannot have a fractal boundary, for a more precise test see basins_fractal_test
. An important feature of the basin entropy is that it allows comparisons between different basins using the same box size ε
.
Attractors.basins_fractal_test
— Functionbasins_fractal_test(basins; ε = 20, Ntotal = 1000) -> test_res, Sbb
This is an automated test to decide if the boundary of the basins has fractal structures. The bottom line is to look at the basins with a magnifier of size ε
at random in basins
. If what we see in the magnifier looks like a smooth boundary (in average) we decide that the boundary is smooth. If it is not smooth we can say that at the scale ε
we have structures, i.e., it is fractal.
In practice the algorithm computes the boundary basin entropy Sbb
basin_entropy
for Ntotal
random balls of radius ε
. If the computed value is equal to theoretical value of a smooth boundary (taking into account statistical errors and biases) then we decide that we have a smooth boundary. Notice that the response test_res
may depend on the chosen ball radius ε
. For larger size, we may observe structures for smooth boundary and we obtain a different answer.
The output test_res
is a symbol describing the nature of the basin and the output Sbb
is the estimated value of the boundary basin entropy with the sampling method.
[Puy2021] Andreu Puy, Alvar Daza, Alexandre Wagemakers, Miguel A. F. Sanjuán. A test for fractal boundaries based on the basin entropy. Commun Nonlinear Sci Numer Simulat, 95, 105588, 2021.
Keyword arguments
ε = 20
: size of the ball for the test of basin. The result of the test may change with the size.Ntotal = 1000
: number of balls to test in the boundary for the computation ofSbb
Attractors.uncertainty_exponent
— Functionuncertainty_exponent(basins; kwargs...) -> ε, N_ε ,α
Estimate the uncertainty exponent[Grebogi1983] of the basins of attraction. This exponent is related to the final state sensitivity of the trajectories in the phase space. An exponent close to 1
means basins with smooth boundaries whereas an exponent close to 0
represent completely fractalized basins, also called riddled basins.
The output N_ε
is a vector with the number of the balls of radius ε
(in pixels) that contain at least two initial conditions that lead to different attractors. The ouput α
is the estimation of the uncertainty exponent using the box-counting dimension of the boundary by fitting a line in the log.(N_ε)
vs log.(1/ε)
curve. However it is recommended to analyze the curve directly for more accuracy.
Keyword arguments
range_ε = 2:maximum(size(basins))÷20
is the range of sizes of the ball to test (in pixels).
Description
A phase space with a fractal boundary may cause a uncertainty on the final state of the dynamical system for a given initial condition. A measure of this final state sensitivity is the uncertainty exponent. The algorithm probes the basin of attraction with balls of size ε
at random. If there are a least two initial conditions that lead to different attractors, a ball is tagged "uncertain". f_ε
is the fraction of "uncertain balls" to the total number of tries in the basin. In analogy to the fractal dimension, there is a scaling law between, f_ε ~ ε^α
. The number that characterizes this scaling is called the uncertainty exponent α
.
Notice that the uncertainty exponent and the box counting dimension of the boundary are related. We have Δ₀ = D - α
where Δ₀
is the box counting dimension computed with basins_fractal_dimension
and D
is the dimension of the phase space. The algorithm first estimates the box counting dimension of the boundary and returns the uncertainty exponent.
An obstruction to predictability, Physics Letters A, 99, 9, 1983
Tipping points
This page discusses functionality related with tipping points in dynamical systems with known rule. If instead you are interested in identifying tipping points in measured timeseries, have a look at TransitionIndicators.jl.
Attractors.tipping_probabilities
— Functiontipping_probabilities(basins_before, basins_after) → P
Return the tipping probabilities of the computed basins before and after a change in the system parameters (or time forcing), according to the definition of[Kaszás2019].
The input basins
are integer-valued arrays, where the integers enumerate the attractor, e.g. the output of basins_of_attraction
.
Description
Let $\mathcal{B}_i(p)$ denote the basin of attraction of attractor $A_i$ at parameter(s) $p$. Kaszás et al[Kaszás2019] define the tipping probability from $A_i$ to $A_j$, given a parameter change in the system of $p_- \to p_+$, as
\[P(A_i \to A_j | p_- \to p_+) = \frac{|\mathcal{B}_j(p_+) \cap \mathcal{B}_i(p_-)|}{|\mathcal{B}_i(p_-)|}\]
where $|\cdot|$ is simply the volume of the enclosed set. The value of $P(A_i \to A_j | p_- \to p_+)$ is P[i, j]
. The equation describes something quite simple: what is the overlap of the basin of attraction of $A_i$ at $p_-$ with that of the attractor $A_j$ at $p_+$. If basins_before, basins_after
contain values of -1
, corresponding to trajectories that diverge, this is considered as the last attractor of the system in P
.
- Menck2013Menck, Heitzig, Marwan & Kurths. How basin stability complements the linear stability paradigm. Nature Physics, 9(2), 89–92
- Datseris2022G. Datseris and A. Wagemakers, Effortless estimation of basins of attraction, Chaos 32, 023104 (2022)
- Daza2016A. Daza, A. Wagemakers, B. Georgeot, D. Guéry-Odelin and M. A. F. Sanjuán, Basin entropy: a new tool to analyze uncertainty in dynamical systems, Sci. Rep., 6, 31416, 2016.
- Grebogi1983C. Grebogi, S. W. McDonald, E. Ott and J. A. Yorke, Final state sensitivity:
- Kaszás2019Kaszás, Feudel & Tél. Tipping phenomena in typical dynamical systems subjected to parameter drift. Scientific Reports, 9(1)