Fractals - Mandelbrot and Julia Sets
Please also see the section on L-systems.
In class you may be asked to write code to produce a Mandelbrot set or a Julia Set. (Class notes pdf).
I have created a version of:
- the Mandelbrot set in a point wrangle and python in Houdini as well.
- Also Sierpinski python (recursive) and point wrangle (iterative).
Mandelbrot Set
Mandelbrot sets are named after the Polish-born French and American mathematician, Benoit Mandelbrot (1924-2010). He is recognized for coining the word "fractal" as well as developing a "theory of roughness".
Numberphile with Holly Krieger of MIT gives an excellent explanation of Mandelbrot sets and moves on to the Filled Julia Set.
The Mandelbrot Set (M) can be described by the equation:
Where c is a complex number (a + bi)
Recall a and b are real numbers and i = sqrt(-1) or i^2 = -1
In the complex plane if a + bi is plotted, a and b would be
similar to an x,y coordinate pair on a cartesian plane but
now the graph is a representation where a is the horizonal
(real numbers) and b is the vertical (imaginary) axis.
The equation above describes the Mandelbrot set (and later
the Julia set).
What happens if we plug in zero on iteration? We get c,
what if c was 1. We get 1,2,5, 26 ...
f(0) = 0 + 1
f(1) = 1 + 1
f(2) = 4 + 1
f(5) = 25 + 1 and so on
The Mandelbrot set is concerned with the size of this number
(distance from the center on the complex plane). Two things
can happen:
1. gets huge (goes to infinity) - as in the case above
2. distance is bounded < 2 (and that is the Mandelbrot
set) - for example, if c was -1
So M (Mandelbrot set) is the set of complex numbers where
the second takes place. On the boundary is where it gets
interesting as small changes to c can go either way.
There is also an excellent description of Mandelbrot sets
at http://mathworld.wolfram.com/MandelbrotSet.html
and an excellent exercise describing an algorithm for
solving the Mandelbrot set at https://introcs.cs.princeton.edu/java/assignments/mandel.html
"The Mandelbrot set is a specific set of points
on the plane with many fascinating properties. One can
determine whether or not a point (x, y) is in the Mandelbrot
set by performing the following calculation: start with r
= x and s = y, then enter into a loop which
resets r to r*r - s*s + x and s
to 2*r*s + y (using the old values of r
and s in both of these update formulae). If this
sequence remains bounded (neither r nor s goes to infinity)
then the point (x, y) is in the Mandelbrot set; otherwise,
if the sequence diverges to infinity, it is not. If you plot
the points in the Mandelbrot set black, and those not in the
set white, a strange and wondrous pattern emerges, roughly
within the 2.0-by-2.0 box centered at (-0.5, 0). For a more
dramatic picture, you will replace the white points with
color gradations, depending on the number of iterations
needed to discover that the point is not in the set. These
colors reveal the striking detail of the terrain just
outside the Mandelbrot set ... The mathematical definition
of the Mandelbrot set is precise, but is computationally
unappealing, since we would have to perform an infinite
number of iterations to determine whether a single point is
in the set! We are rescued by the following mathematical
fact: if r*r + s*s ever gets to be greater than 4,
then the sequence will surely diverge off to infinity, and
the point (x, y) is not in the set. There is no
simple test that would enable us to conclude that (x, y) is
surely in the set, but if the number of iterations
exceeds 255, the point is extremely likely to be
in the set ... The interesting part of the Mandelbrot set
occurs in a 2.0-by-2.0 box centered at (-0.5, 0.0): the data
in mand32.txt has n = 32, (xmin,
ymin) = (-1.5, -1.0), and dimension (width,
height) = (2.0, 2.0). The other data files zoom in
on different regions."*
*from http://introcs.cs.princeton.edu/java/assignments/mandel.html
"This assignment was adapted by R. Sedgewick and M.
Weiksner from the book A Turing Omnibus by A.
Dewdney. Modified slightly by Adam Finkelstein and Kevin
Wayne. Copyright � 2000 Robert
Sedgewick
There is also excellent pseudocode given on the wiki
entry:
For each pixel (Px, Py) on the screen, do:
{
x0 = scaled x coordinate of pixel (scaled to lie in the Mandelbrot X scale (-2.5, 1))
y0 = scaled y coordinate of pixel (scaled to lie in the Mandelbrot Y scale (-1, 1))
x = 0.0
y = 0.0
iteration = 0
max_iteration = 1000
while ( x*x + y*y < 2*2 AND iteration < max_iteration )
{
xtemp = x*x - y*y + x0
y = 2*x*y + y0
x = xtemp
iteration = iteration + 1
}
color = palette[iteration]
plot(Px, Py, color)
}
where relating the pseudocode this is just z = x + iy and
z^2 = x*x + i2xy - y*y and c = x0 + iy0
so the computation of x and y (just
substituting and taking the real and imaginary parts
separate creates the code expressions x = Real(z^2 + c) =
Based on the above description, I have written a simple
C++/OpenGL solution and for the color version, adapted a
similar color scheme found at
http://wojanton.ovh.org/ang/fractals/mandelbrotCpp.php (link
no longer active). Try http://warp.povusers.org/Mandelbrot/
Images here generated with 1000 iterations and threshold 4
with x min -1.5 and 2 wide and y min -1.0 and 2 wide. (Code
written in C++/OpenGL, image result screen snaps.)
References:
- http://introcs.cs.princeton.edu/java/assignments/mandel.html
- http://wojanton.ovh.org/ang/fractals/mandelbrotCpp.php (no longer active)
- http://lodev.org/cgtutor/juliamandelbrot.html#Julia_Set
- Interesting article about numbers in general and specifically complex numbers at http://acko.net/blog/how-to-fold-a-julia-fractal/
Must read NOVA
presentation!
Benoit Mandelbrot's TED talk here.
Julia Set
The values of the equation tend to be "chaotic" with small changes to c making drastic changes visually. The Julia Set was named after French mathematician Gaston Julia (1893-1978).
Here are some excellent examples of a subset using a parameteric plane of quadratic polynomials from complex c values suggested on the wiki page for Julia Set data:
Images here generated with 1000 iterations and threshold 4 with x range and y range -1.5 to 1.5 Float over image for parameters. Code written by me in C++/OpenGL as above, but modified to use specific values of c. The algorithm is very similar to the one above, but now for specific values of c.