These are some implemented methods for building dynamics
Abstract Dynamic Definition
RigorousInvariantMeasures.endpoints
— Functionendpoints(S::Dynamic)
Endpoints of the branches, in increasing order (returned as a vector of intervals)
RigorousInvariantMeasures.max_distortion
— FunctionMaximum of
$\frac{|T''|}{(T')^2}$
over all branches
RigorousInvariantMeasures.max_inverse_derivative
— FunctionMaximum of
$|\frac{1}{T'}|$
over all branches
RigorousInvariantMeasures.plottable
— FunctionReturn a non-interval version of the map as a function. This can be used, for instance, for plot(plottable(D)).
RigorousInvariantMeasures.preim
— Functionpreim(S::Dynamic, k, y, ϵ)
Computes the preim of y in branch k of a dynamic, with accuracy ϵ
One dimensional piecewise monotone map definition
RigorousInvariantMeasures.MonotonicBranch
— TypeType used to represent a "branch" of a dynamic. The branch is represented by a map f
with domain X=(a,b)
. X[1] and X[2] are interval enclosures of a,b.
The map must be monotonic on [a,b]. Note that this is not the same thing as being monotonic on hull(X[1], X[2]): for instance, take the map x → (x-√2)^2 on [√2, 1]: the left endpoint X[1] will be prevfloat(√2)..nextfloat(√2), but then the map is not monotonic on the whole hull(X[1], X[2]) because it also contains points that lie left of √2. This is a tricky case that must be dealt with.
Enclosures Y[1], Y[2]
for f(a), f(b) and increasing
may be provided (for instance if we know that Y=(0,1)
), otherwise they are computed automatically.
RigorousInvariantMeasures.PwMap
— TypeDynamic based on a piecewise monotonic map.
The map is defined as T(x) = Ts[k](x) if $x \in [endpoints[k], endpoints[k+1])$.
y_endpoints
($k \times 2$ matrix) contains the result of applying Ts to the endpoints of each interval. These can be filled in automatically from endpoints
, but sometimes they are known to higher accuracy, for instance for x -> mod(3x, 1)
we know that it is full-branch exactly. It is assumed that the map will send its domain hull(endpoints[begin],endpoints[end]) into itself.
the array branches
is guaranteed to satisfy branches[i].X[end]==branches[i+1].X[begin]
RigorousInvariantMeasures.PwMap
— MethodFunction call, and Taylor expansion, of a PwMap. Note that this ignores discontinuities; users are free to shoot themselves in the foot and call this on a non-smooth piecewise map. No better solutions for now.
Base.reverse
— MethodBase.reverse(br:MonotonicBranch)
"Reverses" the x-axis of a branch: given $f:[a,b] -> R$, creates a branch with the function $g:[-b,-a] -> R$ defined as $g(x) = f(-x)$
RigorousInvariantMeasures.bound_branch_distortion
— Functionbound_branch_distortion(br::MonotonicBranch; tol = 0.01)
Compute a rigorous bound for the distortion of a branch on an interval I, defaults to the domain of the branch
RigorousInvariantMeasures.branch
— Methodfunction that evaluates the k-th branch of a dynamic on a point x (assuming it's in its domain, otherwise ∅)
RigorousInvariantMeasures.branch_inverse_derivative
— Functionbranch_inverse_derivative(br::MonotonicBranch; tol = 0.01)
Compute a rigorous bound for the inverse_derivative of a branch
RigorousInvariantMeasures.composedPwMap
— MethodCreate explicitly D1 ∘ D2 as a PwMap; remark that the endpoints
of D1 must be ordered with respect to the canonical order on R.
RigorousInvariantMeasures.dfly_inf_der
— Functiondfly inequality for maps with infinite derivatives.
The strategy to compute it follows a variant of Lemma 9.1 in the GMNP paper:
- we find a "problematic set" I by taking a small interval of size radius(branch domain)/2^3 around each endpoint with infinite derivative;
- we find l such that T >= l for each point in I
- we compute the dfly coefficients as in the lemma.
- we repeat the computation replacing 2^3 with 2^4, 2^5, ... 2^15 and take the best estimate among these.
RigorousInvariantMeasures.has_infinite_derivative_at_endpoints
— Methodhas_infinite_derivative_at_endpoints(b::MonotonicBranch)
Returns a pair (left::Bool, right::Bool) that tells if a branch has infinite derivative at any of its endpoints
RigorousInvariantMeasures.has_infinite_derivative_at_endpoints
— Methodhasinfinitederivativeatendpoints(D::PwMap)
Returns a single bool to tell whether the dynamic has infinite derivative at any of its endpoint
RigorousInvariantMeasures.max_distortion
— Functionmax_distortion(D::PwMap; tol=1e-3)
Compute a rigorous bound for the distortion of a PwMap
Example
julia> using RigorousInvariantMeasures;
julia> D0 = mod1_dynamic(x->2*x+0.5*x*(1-x), full_branch = true)
Piecewise-defined dynamic with 2 branches
julia> max_distortion(D0)
[0.444268, 0.444445]
RigorousInvariantMeasures.max_inverse_derivative
— Functioninverse_derivative(D::PwMap; tol=1e-3)
Compute a rigorous bound for the inverse_derivative of a PwMap
RigorousInvariantMeasures.mod1_dynamic
— Methodmod1_dynamic(f::Function, ε = 0.0; full_branch = false)
Utility constructor for dynamics Mod 1 on the torus [0,1]. We assume that f is monotonic and differentiable, for now (this is not restrictive, for our purposes)
Example
julia> using RigorousInvariantMeasures;
julia> D0 = mod1_dynamic(x->2*x+0.5*x*(1-x), full_branch = true)
Piecewise-defined dynamic with 2 branches
RigorousInvariantMeasures.preim
— FunctionDeprecated, but still used in C2Basis
RigorousInvariantMeasures.restrict
— MethodIntersect an Interval or TaylorSeries with I
Induced Liverani Saussol Vaienti
RigorousInvariantMeasures.ApproxInducedLSV
— TypeThis class introduces an ApproximatedLSV the induced map for the Liverani-Saussol-Vaienti maps on the interval I = [0.5, 1]. The interval I is then mapped to [0,1]
RigorousInvariantMeasures.ApproxInducedLSV
— MethodThis constructor builds the induced LSV map on [0.5, 1], truncated with k branches
Base.iterate
— MethodReturn (in an iterator) the pairs (i, (x, |T'(x)|)) where x is a preimage of p[i], which describe the "dual" L* evaluation(p[i])
Base.iterate
— MethodReturn (in an iterator) the pairs (i, (x, |T'(x)|)) where x is a preimage of p[i], which describe the "dual" L* evaluation(p[i])
RigorousInvariantMeasures.ShootingLSV
— FunctionShootingLSV(n, y, α, rigstep = 10; T = Float64)
This method returns the preimages of y
in the right branch domain after n-1
preimages through the left branch through the LSV map with exponent α