The logistic equation
is a model for growth rate that displays many features of nonlinear dynamics in a nice one-dimensional form. For a summary on some of these interesting properties, see here.
Why aren't values for r>4 shown in any of the graphs for the logistic equation? This is because these values head towards infinity: they are unbounded. Which values are bounded? This question is not too difficult to answer: for r values of 0 to 4, initial populations anywhere in the range
What if we iterate \eqref{eq1} but instead of
Where
Now which points remain bounded and which head towards infinity? Let's try fixing
The result looks very similar to a Julia set, is defined as the set of points bordering initial points whose subsequent iterations of
that diverge (head to infinity) and points whose subsequent interations do not diverge.
For
These maps look extremely similar, so could they actually be the same? They are indeed! The logistic map \eqref{eq1} and the quadratic map \eqref{eq3} which forms the basis of the Julia sets are conjugates of one another: they contain identical topological properties for a certain
This can be shown as follows: a linear transformation on any variable is the same as a (combination of) stretching, rotation, translation, or dilation. Each of these possibilities does not affect the underlying topology of the transformed space, which one can think of as being true because the space is not broken apart in any way.
This being the case, if it is possible to transform the logistic map \eqref{eq1} into the quadratic map \eqref{eq3} with the linear transformation
is there some linear transformation
that makes
true?
This can be expanded for clarity:
and now substituting useful values for
putting these expressions together, the conjugacy is valid whenever
Therefore the quadratic map is by a homeomorphism (in particular, a linear transformation) equivalent to the logistic map, and thus the two are topologically equivalent. Now the necessity of the seemingly arbitrary value of
All this is to say that for any
An aside: for most decreases in scale, more iterations are required in order to determine if close-together coordinates will diverge towards infinity or else remain bounded. But this is not the case for a zoom towards the origin: no more iterations are required for constant resolution even when the scale has increased by a factor of
Julia sets may be connected or disconnected. As the logistic map \eqref{eq1} is a homeomorphism of the quadratic map Julia set \eqref{eq3}, identical set topologies should be observed for the logistic map. Observing which values
from
This is analagous to observing Julia sets where
What happens if we instead fix the starting point and instead plot the points
This figure resembles a double-sided Mandelbrot set. When we zoom in, we can find many little mandelbrot sets (in reversed x-orientation). The Mandelbrot set is the map where the initial value
For
Why are the starting points different for these maps, even though the output is the same? If one iterates the logistic map from point
To make identical maps for any one starting point
Iterating either equation gives the same map of converging versus diverging iterations for various
The Mandelbrot set is well known for its fractal structure that yields interesting patterns at arbitrary scale. The logistic map boundary is the same in this respect: for example, increasing scale at the point
yields
Note the identical objects found in a Mandelbrot set zoom on the point
A programmatic aside: the previous and following zooms were made using a different method than elaborate on previously. Rather than modifying the ogrid directly, a_array
and z_array
are instead positioned (using addition and subtraction of real and imaginary amounts) and then scaled over time as follows:
def mandelbrot_set(h_range, w_range, max_iterations, t):
y, x = np.ogrid[1.4: -1.4: h_range*1j, -1.8: 1:w_range*1j] # note that the ogrid does not scale
a_array = x/(2**(t/15)) - 1.633 + y*1j / (2**(t/15)) # the array scales instead
z_array = np.zeros(a_array.shape)
iterations_till_divergence = max_iterations + np.zeros(a_array.shape)
...
This method requires far fewer iterations at a given scale for an arbitrary resolution relative to the method of scaling the ogrid directly, although more iterations are required for constant resolution as the scale decreases. The fewer iteration number necessary is presumably due to decreased round-off error: centering the array and zooming in on the origin leads to approximately constant round-off error, whereas zooming in on a point far from the origin leads to significant error that requires more iterations to resolve. I am not completely certain why a constant number of iterations are not sufficient for constant resolution using this method, however.
Also as for the Mandelbrot set, we can change the map by changing the starting point of the logistic map \eqref{eq2}. For example, moving the starting point from