We present some of the basis already implemented in the package
Abstract basis
RigorousInvariantMeasures.AverageZero
— TypeAverageZero{B<:Basis}
Yield a basis of the space of average zero vectors
RigorousInvariantMeasures.Dual
— TypeReplacement of DualComposedWithDynamic.
RigorousInvariantMeasures.aux_normalized_projection_error
— Methodaux_normalized_projection_error(B::Basis)
Return a constant Eh (typically scales as h ~ 1/n) such that
$|||P_h f|||\leq |||f|||+ Eh * ||f||_s$
Must be rounded up correctly!
RigorousInvariantMeasures.aux_weak_bound
— Methodaux_weak_bound(B::Basis)
Return a constant $M₂$ such that for a vector $v ∈ Uₕ$
$|||v|||\leq M_2||v||$
Must be rounded up correctly!
RigorousInvariantMeasures.bound_linalg_norm_L1_from_weak
— Methodbound_linalg_norm_L1_from_weak(B::Basis)
Return a constant $A$ such that for a vector $v ∈ Uₕ$
$||v||_1\leq A||v||$
Must be rounded up correctly!
RigorousInvariantMeasures.bound_linalg_norm_L∞_from_weak
— Methodbound_linalg_norm_L∞_from_weak(B::Basis)
Return a constant $A$ such that for a vector $v ∈ Uₕ$ ||v||_\infty \leq A||v||
Must be rounded up correctly!
RigorousInvariantMeasures.bound_weak_norm_abstract
— Functionbound_weak_norm_abstract(B::Basis, D=nothing; dfly_coefficients=nothing)
Returns an a priori bound on the weak norm of the abstract operator $L$
RigorousInvariantMeasures.bound_weak_norm_from_linalg_norm
— Methodbound_weak_norm_from_linalg_norm(B::Basis)
Return constants W₁, W₂ such that for a vector $v ∈ Uₕ$
$||v||\leq W_1||v||_1+W_2||v||_{\infty}$
Must be rounded up correctly!
RigorousInvariantMeasures.evaluate
— Methodevaluate(B::Basis, i, x)
Evaluate the i-th basis element at x
RigorousInvariantMeasures.evaluate_integral
— Methodevaluate_integral(B::Basis, i; T = Float64)
Value of the integral on [0,1] of the i-th basis element
RigorousInvariantMeasures.integral
— Methodintegral(B::Basis, v; T = Float64)
Return the integral of the function with coefficients v in the basis B
RigorousInvariantMeasures.integral_covector
— Methodintegral_covector(B::Basis)
Return a covector that represents the integral in the basis B
RigorousInvariantMeasures.invariant_measure_strong_norm_bound
— Methodinvariant_measure_strong_norm_bound(B::Basis, D::Dynamic)
Bounds $||u||_s$, where $u$ is the invariant measure normalized with $i(u)=1$.
RigorousInvariantMeasures.is_integral_preserving
— Methodis_integral_preserving(B::Basis)
Integral-preserving discretizations may specialize this to "true"
RigorousInvariantMeasures.is_refinement
— Methodis_refinement(Bfine::Basis, Bcoarse::Basis)
Check if Bfine is a refinement of Bcoarse
Example
julia> using RigorousInvariantMeasures
julia> B = Ulam(1024)
Ulam{LinRange{Float64, Int64}}(LinRange{Float64}(0.0, 1.0, 1025))
julia> Bfine = Ulam(2048)
Ulam{LinRange{Float64, Int64}}(LinRange{Float64}(0.0, 1.0, 2049))
julia> is_refinement(Bfine, B)
true
julia> Bfine = Ulam(2049)
Ulam{LinRange{Float64, Int64}}(LinRange{Float64}(0.0, 1.0, 2050))
julia> is_refinement(Bfine, B)
false
RigorousInvariantMeasures.one_vector
— Methodone_vector(B::Basis)
Vector that represents the function 1 in the basis B
RigorousInvariantMeasures.strong_norm
— Methodstrong_norm(B::Basis)
Return the type of the strong norm of the basis
Example
julia> using RigorousInvariantMeasures
julia> B = Ulam(1024)
Ulam{LinRange{Float64, Int64}}(LinRange{Float64}(0.0, 1.0, 1025))
julia> strong_norm(B)
TotalVariation
RigorousInvariantMeasures.strong_weak_bound
— Methodstrong_weak_bound(B::Basis)
Return a constant $M₁n$ such that for a vector $v ∈ Uₕ$
$||v||_s\leq M1n*||v||$
Must be rounded up correctly!
RigorousInvariantMeasures.weak_by_strong_and_aux_bound
— MethodReturn constants $S₁, S₂$ such that for a vector $v ∈ Uₕ$
$||v||\leq S_1||v||_s+S_2|||v|||$
Must be rounded up correctly!
RigorousInvariantMeasures.weak_norm
— Methodweak_norm(B::Basis)
Return the type of the weak norm of the basis
Example
julia> using RigorousInvariantMeasures
julia> B = Ulam(1024)
Ulam{LinRange{Float64, Int64}}(LinRange{Float64}(0.0, 1.0, 1025))
julia> weak_norm(B)
L1
RigorousInvariantMeasures.weak_projection_error
— Methodweak_projection_error(B::Basis)
Return a constant Kh (typically scales as h ~ 1/n) such that
$||P_h f-f||\leq Kh ||f||_s$
Must be rounded up correctly! This function is not exported explictly but is used in all the estimates.
Example
julia> using RigorousInvariantMeasures;
julia> B = Ulam(1024)
Ulam{LinRange{Float64, Int64}}(LinRange{Float64}(0.0, 1.0, 1025))
julia> RigorousInvariantMeasures.weak_projection_error(B)
0.00048828125
The Ulam basis
The Ulam basis associated to a finite partition \{0 = x_0, \ldots, x_N = 1\}
, is given by the collection of characteristic functions \chi_{[x_i,x_{i+1})}
for i
in 0, \ldots, N
.
The regularity seminorm associated to this basis is the Variation seminorm, \textrm{Var}(\phi) = \sup_{\mathcal{P}} \sum |\phi(z_{i+1})-\phi(z_i)|
RigorousInvariantMeasures.Ulam
— TypeUlam
Ulam basis on [0,1] associated to the partition $p = \{x_0 = 0, x_1, \ldots, x_n=1\}$
RigorousInvariantMeasures.Ulam
— MethodUlam(n::Integer)
Equispaced Ulam basis on [0,1] of size n
Base.getindex
— MethodBase.getindex(B::Ulam, i::Int)
Returns the i-th element of the Ulam basis as a function.
Example
julia> using RigorousInvariantMeasures
julia> B = Ulam(16)
Ulam{LinRange{Float64, Int64}}(LinRange{Float64}(0.0, 1.0, 17))
julia> B[1](1/32)
1
julia> B[2](1/32)
0
Base.iterate
— Methoditerate(S::AverageZero{Ulam{T}}, state = 1) where{T}
Return the elements of the basis of average $0$ functions in the Ulam Basis
Base.iterate
— MethodGiven a preimage of an interval I_i
, this iterator returns its relative intersection with all the elements of the Ulam basis that have nonzero intersection with it
Base.length
— MethodBase.length(B::Ulam)
Returns the size of the Ulam basis (the size of the underlying vector -1)
Base.length
— MethodBase.length(S::AverageZero{Ulam})
Return the size of the Average Zero space
RigorousInvariantMeasures.nonzero_on
— Methodnonzero_on(B::Ulam, (a, b))
Returns the indices of the elements of the Ulam basis that intersect with the interval y We do not assume an order of a and b; this should not matter unless the preimages are computed with very low accuracy. We assume, though, that y comes from the (possibly inexact) numerical approximation of an interval in $[0,1]$, i.e., we restrict to $y \cap [0,1]$
RigorousInvariantMeasures.relative_measure
— Methodrelative_measure((a,b)::Tuple{<:Interval,<:Interval}, (c,d)::Tuple{<:Interval,<:Interval})
Relative measure of the intersection of (a,b) wrt the whole interval (c,d) Assumes that a,b and c,d are sorted correctly
The hat basis on $S^1$
RigorousInvariantMeasures.Hat
— TypeHat
This type represents a Hat basis on $S^1$. It contains a vector with the midpoints of the hats.
RigorousInvariantMeasures.Hat
— MethodHat(n::Integer)
This constructs a Hat basis on $S^1$ on equispaced points
RigorousInvariantMeasures.HatFunctionOnTorus
— TypeHatFunctionOnTorus
Hat function (on the torus)
This is a piecewise linear function such that: f(x) = 0 if x <= lo f(mi) = 1 f(x) = 0 if x >= ho
RigorousInvariantMeasures.HatFunctionOnTorus
— MethodEvaluate a HatFunctionOnTorus correctly on an IntervalOnTorus
Assumption: this is only called on functions defined on our partition, so either mi==0, hi==0, or the three values are in increasing order
RigorousInvariantMeasures.IntervalOnTorus
— TypeIntervalOnTorus
A separate type for intervals on the torus (mod 1) to "remind" us of the quotient
The interval is normalized in the constructor: the caller may assume that
- 0 <= i.lo < 1
- i.hi < i.lo + 1 OR i==Interval(0,1)
Base.getindex
— MethodBase.getindex(B::Hat, i::Int)
Make so that B[j] returns a HatFunctionOnTorus with the j-th basis element
Base.iterate
— MethodGiven a preimage $y$ of a point $x$, this iterator returns $\phi_j(y)/T'(y)$
Base.length
— MethodBase.length(B::Hat{T})
Return the size of the Hat basis
RigorousInvariantMeasures.nonzero_on
— Methodnonzero_on(B::Hat, dual_element)
Return the range of indices of the elements of the basis whose support intersects with the given dual element (i.e., a pair (y, absT')). The range may end with length(B)+1; this must be interpreted "mod length(B)": it means that it intersects with the hat function peaked in 0 as well (think for instance y = 0.9999).
The hat basis on $[0,1]$
RigorousInvariantMeasures.HatFunction
— TypeHat function (on the reals)
This is a piecewise linear function such that: f(x) = 0 if x <= lo f(mi) = 1 f(hi)
RigorousInvariantMeasures.HatFunction
— MethodEvaluate a HatFunction (on the real line).
Must work correctly when S is an interval.
Base.getindex
— MethodBase.getindex(B::HatNP, i::Int)
makes so that B[j] returns a HatFunction with the j-th basis element
Base.iterate
— MethodGiven a preimage y
of a point x
, this iterator returns \phi_j(y)/T'(y)
Base.length
— MethodBase.length(B::HatNP)
Return the size of the HatNP basis
RigorousInvariantMeasures.nonzero_on
— MethodReturn the range of indices of the elements of the basis whose support intersects with the given dual element (i.e., a pair (y, absT')). The range may end with length(B)+1; this must be interpreted "mod length(B)": it means that it intersects with the hat function peaked in 0 as well (think for instance y = 0.9999).
The C2 basis
RigorousInvariantMeasures.EquispacedPartitionInterval
— TypeEquispaced partition of size n of [0,1]
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
— MethodGiven a preimage y
of a point x
, this iterator returns $\phi_j(y)/T'(y)$
Base.length
— MethodReturn the size of the C2 basisBase.length(S::AverageZero) = length(S.basis)-1
RigorousInvariantMeasures.nonzero_on
— MethodReturn the range of indices of the elements of the basis whose support intersects with the given dual element (i.e., a pair (y, absT', derder)).
The Chebyshev basis
Base.getindex
— MethodBase.getindex(B::Chebyshev, i::Int)
Make so that B[j] returns a HatFunctionOnTorus with the j-th basis element
Base.length
— MethodReturn the size of the Chebyshev basis
RigorousInvariantMeasures._eval_T
— Method_eval_T
Eval the Chebyshev polynomial up to degree n on an array of points in [-1, 1].
Not satisfactory, the intervals explode
RigorousInvariantMeasures.eval_Clenshaw_BackwardFirst
— Methodeval_Clenshaw_BackwardFirst
Eval a polynomial in Chebyshev basis, ClenshawBackward, using ball arithmetic Following Viviane Ledoux, Guillaume Moroz "Evaluation of Chebyshev polynomials on intervals andapplication to root finding"
RigorousInvariantMeasures.get_norm
— MethodReturn the norm of the matrix the NormCacher is working on.
Common Fourier interface
Base.getindex
— MethodMake so that B[j] returns the basis function of coordinate j
The Fourier Adjoint basis
Base.length
— MethodReturn the size of the Fourier basis
The Fourier Analytic basis
RigorousInvariantMeasures.strong_weak_bound
— MethodReturn the weak-strong norm bound when restricted on the finite dimensional subspace We use here $\sum_{i=-K}^K (|g_i|\exp^{2\pi \eta |i|})^2 \leq \sum_{-K}^K |g_i|^2 \sum_{-K}^K \exp^{2(2\pi \eta |i|)} \leq ||g||_2 2\frac{1-\exp^{2K+2(2\pi \eta |i|)}}{1-\exp^{2(2\pi \eta |i|)}}$