The Mandelbrot Set—Part VI: Julia Sets

The Mandelbrot Set Series:

This is the sixth part in a series on Mandelbrot set fractals. Up until now, we have looked at fractals that are generated by examining the limit behaviour of points on the complex plane when a particular function is applied over and over again. A question naturally arises: what happens if we change the function?

Function Notation

Before we start playing around with parameters, we need to work out some notation. Notation can often be confusing at first, but in the long run it helps to clarify the problem, and to remove ambiguity. The first things that we need to understand are functions.

A function is a mathematical transmogrifier. When we put a number into a function and push a button, the number is transmogrified into another number. For instance, we might have a squaring function. When we put a number into this function, it transforms the number into the square of the number. In mathematical notation, we might write this as \(f(x) = x^2\).

On the left side of the equal sign, we have named our function, and shown what kinds of things go into our function. The function is named \(f\), and it can only transform one number (which we have called \(x\)) at a time (some functions can transform many numbers all at once). When reading the left hand side of the equation, we would say “f of x.”

The right hand side of the equation tells us what \(f\) does. Specifically, when we put a number \(x\) into the function, it squares \(x\). We can pick any number we like, put it into our function, and get the square of that number. It is like using the squared button on a calculator.[1]

Suppose that I want to know what happens when I put a 3 into my function. In mathematical language, I want to know what “f of 3” is, which I would write as \(f(3)\). My function \(f\) takes whatever number is in parentheses, and squares it. So \(f(3) = 3^2 = 9\).

It is also possible to use my function over and over again, if I like. For instance, suppose I want to know what happens if I start by putting 2 into my function, then take the result and put that into my function, then take that result and put it into my function. In mathematical notation, this is \(f(f(f(2)))\). Working backwards, we have

Instead of writing \(f(f(f(2)))\), we will use exponent notation, and write \(f^3(2)\). This saves us a little bit of writing, which is always nice.

In summary, function notation is a way of writing down a procedure which transforms one number into another. The function \(f(x) = x^2\) takes a number \(x\) and squares it, and if we want to use this function several times in a row, we might write something like \(f^3(x) = f(f(f(x)))\).

Application of Function Notation to the Mandelbrot Set

When we defined the Mandelbrot set, we did so in terms of repeatedly doing the same thing to a particular number. Specifically, we squared a number and added a constant over and over again, then asked what happened when we did this an infinite number of times. In function notation, we might write this as \(M_c(z) = z^2 + c\).

On the left hand side of that equation, we have a function named \(M_c\) (\(M\) for Mandelbrot, and \(c\) for constant). That function takes a number \(z\) (which we know to be a complex number), squares it, and adds a constant. To determine if a particular point is a member of the Mandelbrot set, we define \(c\) to be the point that we start with, then look at what happens to \(M_c^n(z)\) as \(n\) gets bigger and bigger and bigger. This is exactly the same procedure discussed before—the only change is that we are now using slightly different notation. If this is really confusing, you may want to go back and reread the post on the definition of the Mandelbrot set.

Julia Sets

When we generate an image of the Mandelbrot set, the value of \(c\) is different for every point that we examine. In other words, we are applying a slightly different function to every point on the plane. A question that naturally arises is, “What would happen if we used the same function for every point?” Instead of changing our constant at every point, what happens if we fix a single constant, write a function in terms of that constant, and apply that function to every point on the complex plane?

The results are pretty stunning. Instead of getting a single Mandelbrot set, we get an infinite number of sets—one for each constant we could choose—called Julia sets.[2]

To generate an image of a Julia set, we start by picking some complex number. We will call this number \(K\). Then we define a function \(J_K(z) = z^2 + K\). Just as with the Mandelbrot set, we apply this function over and over again to every point on the complex plane, and watch to see what happens to \(J_K^n(z)\) as \(n\) gets very large. If the result gets bigger and bigger and bigger, the point we started with is not in the Julia set with constant \(K\). Otherwise, it is. Moreover, we can color our Julia sets using the same method that we used for the Mandelbrot set. Some interesting examples are shown below (they are all done in greyscale to illustrate the structure of the sets—black pixels are members of the depicted Julia set).

Figure 1: \(K=-0.8+0.156i\)

Figure 2: \(K=-0.285+0.01i\)

Figure 3: \(K=0.123+0.745i\) (Douady’s rabbit fractal)

Figure 4: \(K=-0.391-0.587i\) (Siegel disk fractal)

Figure 5: \(K=0.3-0.49i\)

And, finally, a short animation. In this animation, the value of \(K\) is varied uniformly from \(-2+0.39i\) to \(1-0.195i\). This causes the animation to briefly visit the Julia set seen in Figure 1 above, as well as cross through the origin. As an interesting aside, the Julia set for \(0+0i\) is a circle, and is one of the only known Julia sets which is not a fractal.

Notes:

[1]

In fact, when I teach students about functions, I almost always make the point that using a function is like using a button on a calculator, only we can invent any kind of button that we like, and are not limited by those included by the calculator’s manufacturer. ↩