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 branchesRigorousInvariantMeasures.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 α