# Strange attractors

Here, we reproduce the outputs from this link: https://examples.pyviz.org/attractors/attractors.html

## Strange attractors¤

An attractor is a set of values to which a numerical system tends to evolve. An attractor is called a strange attractor if the resulting pattern has a fractal structure.

In order to achieve the desire output we just need the following functions.

using GLMakie, StatsBase, OnlineStats
using LinearAlgebra, Interpolations
GLMakie.activate!()


## Trajectory¤

function trajectory(fn, x0, y0, kargs; n = 1000) #  kargs = a, b, c, d
x, y = zeros(n+1), zeros(n+1)
x[1], y[1] = x0, y0
for i = 1:n
x[i+1], y[i+1] = fn(x[i], y[i], kargs...)
end
x, y
end

trajectory (generic function with 1 method)


## Aggregation¤

function aggHist(x, y; nbinsx = 400, nbinsy = 400)
xedges = range(extrema(x)..., length = nbinsx)
yedges = range(extrema(y)..., length = nbinsy)
o = fit!(HeatMap(xedges, yedges), zip(x, y))
return o
end

aggHist (generic function with 1 method)


## Equalization¤

function eq_hist(matrix; nbins = 256 * 256)
h_eq = fit(Histogram, vec(matrix), nbins = nbins)
h_eq = normalize(h_eq, mode = :density)
cdf = cumsum(h_eq.weights)
cdf = cdf / cdf[end]
edg = h_eq.edges[1]
interp_linear = LinearInterpolation(edg, [cdf..., cdf[end]])
out = reshape(interp_linear(vec(matrix)), size(matrix))
return out
end

eq_hist (generic function with 1 method)


## Clifford¤

function Clifford(x, y, a, b, c, d)
sin(a * y) + c * cos(a * x), sin(b * x) + d * cos(b * y)
end

Clifford (generic function with 1 method)


Some interesting values

cargs = [[0, 0, -1.3, -1.3, -1.8, -1.9],
[0, 0, -1.4, 1.6, 1.0, 0.7],
[0, 0, 1.7, 1.7, 0.6, 1.2],
[0, 0, 1.7, 0.7, 1.4, 2.0],
[0, 0, -1.7, 1.8, -1.9, -0.4],
[0, 0, 1.1, -1.32, -1.03, 1.54],
[0, 0, 0.77, 1.99, -1.31, -1.45],
[0, 0, -1.9, -1.9, -1.9, -1.0],
[0, 0, 0.75, 1.34, -1.93, 1.0],
[0, 0, -1.32, -1.65, 0.74, 1.81],
[0, 0, -1.6, 1.6, 0.7, -1.0],
[0, 0, -1.7, 1.5, -0.5, 0.7]
]

with_theme(theme_black()) do
fig = Figure(resolution = (1200,900))
axs = [Axis(fig[i,j], aspect=1) for i in 1:3 for j in 1:4]
for i in 1:12
x, y = trajectory(Clifford, cargs[i][1:2]..., cargs[i][3:end]; n = 100_000)
o = aggHist(x, y; nbinsx = 300, nbinsy = 300)
m = eq_hist(o.counts)
heatmap!(axs[i], o.xedges, o.yedges, m; colormap = :inferno)
axs[i].title = join(string.(cargs[1]), ", ")
end
hidedecorations!.(axs)
hidespines!.(axs)
rowgap!(fig.layout,5)
colgap!(fig.layout,1)
fig
end