Poltergeist is a package for quick, accurate and abstract approximation of statistical properties of one-dimensional chaotic dynamical systems.

It treats chaotic systems through the framework of spectral methods (i.e. transfer operator-based approaches to dynamical systems) and is numerically implemented via spectral methods (e.g. Fourier and Chebyshev). For the latter, Poltergeist relies on and closely interfaces with the adaptive function approximation package ApproxFun.

The use of highly accurate Fourier and Chebyshev approximations means spectrally fast convergence: one can calculate acims to 15 digits of accuracy in a fraction of a second.

As an example, take your favourite Markov interval map and give it digital form:

```
using Poltergeist, ApproxFun
d = 0..1.
f1 = 2x+sin(2pi*x)/6; f2(x) = 2-2x
f = MarkovMap([f1,f2],[0..0.5,0.5..1])
f(0.25), f'(0.25)
```

Similarly, take a circle map, or maps defined by modulo or inverse:

```
c = CircleMap(x->4x + sin(2pi*x)/2pi,PeriodicSegment(0,1))
lanford = modulomap(x->2x+x*(1-x)/2,0..1) # Or call lanford()
doubling = MarkovMap([x->x/2,x->(x+1)/2],[0..0.5,0.5..1],dir=Reverse) # or doubling(0..1)
```

Calling `Transfer`

on an `AbstractMarkovMap`

type automatically creates an ApproxFun `Operator`

, with which you can do (numerically) all the kinds of things one expects from linear operators on function spaces:

```
L = Transfer(f)
f0 = Fun(x->sin(3pi*x),d) #ApproxFun function
f1 = L*f0
g = ((2I-L)\f0)'
det(I-4L) # Fredholm determinant
using Plots
scatter(eigvals(L,80))
```

In particular, you can solve for many statistical properties, many of which Poltergeist has built-in commands for. Most of these commands allow you to use the `MarkovMap`

directly (bad, zero caching between uses), transfer operator (caches transfer operator entries, usually the slowest step), or the `SolutionInv`

operator (caches QR factorisation as well).

```
K = SolutionInv(L)
ρ = acim(K)
@test ρ == K\Fun(one,d)
birkhoffvar(K,Fun(x->x^2,d))
birkhoffcov(K,Fun(x->x^2,d),Fun(identity,d))
dρ = linearresponse(K,Fun(sinpi,d))
plot(ρ)
ε = 0.05
plot!(ρ + ε*dρ,title="Linear response")
plot!(acim(perturb(M,sinpi,ϵ)))
```

This package is based on academic work. If you find this package useful in your work, please kindly cite as appropriate:

- C. Wormell (2019), Spectral Galerkin methods for transfer operators in uniformly expanding dynamics, Numerische Mathematik, 142, 421-463. (arXiv preprint)

- Literature on ApproxFun.