In these notes I will use mathematical notation similar to the syntax of Mathematica.

9. Mandelbrot travelog.

The west end cosine approximation.

We saw in Lecture 7  (specifically Theorem 7.8) that the Mandelbrot set exhibits self-similarity near a preperiodic point. The simplest example of this is the point c0 = -2, where the self-similarity ratio is 4. Recall our definitions

G[0, c_, z_] := z; G[n_, c_, z_] := G[n-1, c, z]^2 + c.

Then this self-similarity near c0 = -2 means that for small values of e, G[n, -2 + e, 0] is very close to G[n+1, -2 + e/4, 0]. This can be seen by plotting the two functions. With this in mind, define

H[n_, e_] := G[n, -2 + e/4^n, 0].

Plotting this function for various values of n reveals the following properties.

• Self-similarity. If we restrict e to a given interval, the graphs are indistiguishable for large enough values of n.
• For positive e, the curve oscillates between 2 and -2 with H[n,0] = 2 for each n > 1.
• Fix a large value of n, and let e[1], e[2], e[3], etc. be the positive values of e with H[n, e] = 0, going from left to right. Then e[i] is very close to (2i-1)^2*e[1] and the value of e[1] is roughly 15.

The function 2Cos[Sqrt[e*k]] (for any positive constant k) has the same properties. To find the appropriate value of k, we can compare the Taylor series for the functions in question. The code

Print["The linear approximation of 2Cos[Sqrt[e*k] is ",        Normal[Series[2Cos[Sqrt[e*k]],{e,0,1}]]];

Do[Print["The linear approximation of H[",n,",e] is ",        Normal[N[Series[H[n,e],{e,0,1}],12]]],{n, 6, 12}]

gives us

The linear approximation of 2Cos[Sqrt[e*k] is 2 - e k

The linear approximation of H[6,e] is 2. - 0.166748046875 e

The linear approximation of H[7,e] is 2. - 0.166687011719 e

The linear approximation of H[8,e] is 2. - 0.16667175293 e

The linear approximation of H[9,e] is 2. - 0.166667938232 e

The linear approximation of H[10,e] is 2. - 0.166666984558 e

The linear approximation of H[11,e] is 2. - 0.16666674614 e

The linear approximation of H[12,e] is 2. - 0.166666686535 e

The limiting coefficient of e in these series is 1/6, so

2Cos[Sqrt[e/6]] is good approximation for G[n, -2 + e/4^n, 0] for small e    (9.1)

Here is an illustration given by the code

Plot[{H[8,e], 2Cos[Sqrt[e/6]]},{e,0,1000},

PlotStyle -> {RGBColor[0,0,0], RGBColor[1,0,0]}]

Figure 9.2. Comparison of H[8,e] in black with 2Cos[Sqrt[e/6]] in red.

Why should (9.1) be true? It follows from the definition of H[n, e] that

H[n+1, 4e] = H[n, e]^2 - 2 + e/4^n,                          (9.3)

which is approximately H[n, e]^2 - 2. On the other it follows from the double angle formula that

2Cos[Sqrt[4*e/6]] = 2Cos[2*Sqrt[e/6]]

= 2(2Cos[Sqrt[e/6]]^2 - 1)

= (2Cos[Sqrt[e/6]])^2 - 2,

which approximates the identity of (9.3).

Here is an illustration of some of the curves G[n, c, 0], showing the nth points of the critical orbits for various real values of c, given by the code

n=3;

Plot[{G[n,c,0],G[n+1,c,0],G[n+2,c,0],G[n+3,c,0] },{c,-2,-1.3}]

Figure 9.4. Plots of G[n, c, 0] for 3 <= n <= 6.

This diagram has some interesting properties.

• Each point where one of the curves crosses the horizontal axis is a periodic value of c. For example, both G[3, c, 0] and G[6, c, 0] cross it at c = -1.75488, the center of the miniature M of period 3 shown in Figure 5.12.  G[6, c, 0] also crosses it at c = -1.77289, the center of largest bud in that picture.
• Each point where two or more curves cross each other is a preperiodic value of c, and the vertical coordinate is one of the numbers in the periodic part of the orbit. For example all four curves meet at the point (-1.543689, -0.839287), and c = -1.543689 is a root of G[4, c, 0] - G[3, c, 0]. Note also that G[3, c, 0] and G[5, c, 0] meet at (-1.83929, 0.543689), and c = - -1.83929 is a root of G[5, c, 0] - G[3, c, 0], i.e., a preperiodic point with period 2. Similarly, G[4, c, 0] and G[6, c, 0] meet at (-1.83929, -1.543689), and hese two intersection points necessarily have the same horizontal coordinate. Is it a coincidence that the sum of their vertical coordinates is precisely -1?

We can use (9.1) to predict the location of periodic points near c = -2, and use FindRoot to locate them precisely. Here is some code that does this.

Do[Print ["Period = ", n];

Do[c0=-2+(3*Pi^2*(2i-1)^2)/(2*4^n);

Print["i = ", i," Expected periodic value is ",N[c0] ];

Print[" Actual periodic value is ", c/.FindRoot[G[n,c,0]==0,{c,c0}]];

Print[""], {i,1,n-2}];

Print[""], {n,3,5}]

Here is its output.

Period = 3

i = 1 Expected periodic value is -1.76868

Actual periodic value is -1.75488

Period = 4

i = 1 Expected periodic value is -1.94217

Actual periodic value is -1.9408

i = 2 Expected periodic value is -1.47953

Actual periodic value is -1.3107

Period = 5

i = 1 Expected periodic value is -1.98554

Actual periodic value is -1.98542

i = 2 Expected periodic value is -1.86988

Actual periodic value is -1.86078

i = 3 Expected periodic value is -1.63856

Actual periodic value is -1.62541

Look for a relation between the sizes of the miniature Ms at these points and the values of n and i.

Find a way to use (9.1) to predict the location of preperiodic points near c = -2.

Buds on the main cardioid.

Recall the the main cardioid of the Mandelbrot set M has (roughly) circular regions attached to it known as buds or bulbs. Each of them has a periodic point at its center. We have made some observations about these:

• The largest bud is precisely circular with radius 1/4 centered at -1, a point of period 2; see Lecture 5.
• The next largest buds are centered at points with period 3 at c = -.122561 + .744862I and its conjugate; again see Lecture 5.
• There are buds of period 4 with centers at c = 0.282271 + 0.530061 I and its conjugate; see Lecture 7. There is also a secondary bud of period 4 attached to the period 2 bud, centered at c = -1.3107.

In general the center of a period n bud is a root of the polynomial G[n, c, 0], which has degree 2^(n-1).

We will describe a formula for the point where a bud is attached to the main cardioid. Recall that the cardioid itself is the set of comlex numbers of the form u/2 - u^2/4 with |u| = 1. Such a number u always has the form

u = Cos[theta] + I*Sin[theta] = Exp[I*theta].

Now let m/n be a fraction reduced to lowest terms with 0 < m < n. Then there is a period n bud is attached to the main cardioid at the point Exp[2*Pi*I*m/n], and we will call it the m/n bud. Here are some sample attaching points.

 Fraction Attaching point 1/2 -0.75 1/3 -0.125 + 0.6495I 1/4 0.25 + 0.5 I 1/5 0.3567 + 0.3285 I 2/5 -0.4817 + 0.5317 I

We can estimate the radius of a bud by finding the distance from this attaching point to the periodic point at the center of the bud. Computer experiments indicate that it is roughly Sin[Pi*m/n]/n^2.

The following pictures were produced with the Fractint program BudViewer described below. In each case the picture has been rotated so that the main cardioid is on the left with the bud on the right, and magnified so that each bud is roughly the same size.

Figure 9.5. The primary buds for 1/3, 1/4, 1/5 and 2/5.

There is a feature of these pictures worth noting. To the right of the bud for p/q there is a juntion point where q spokes meet. The shortest of these is always p steps in a counterclockwise direction from the one that connects to the main cardioid. Here is another illustration.

Figure 9.6. The primary buds for 1/7, 2/7 and 3/7. Note the position of the shortest of the seven spokes in each.

For more online information on this topic, see Robert Devaney's The Fractal Geometry of the Mandelbrot Set I , especially Section 3, and II, especially Sections 3, 4, 5, 6 and 7. See also Devaney's recent paper (in postscript format) The Mandebrot set and the Farey tree. (For a picture of Devaney, Mandelbrot and me together, see the Yale photo.)

Seahorse valley and spiral formations.

The portion of the Mandelbrot set near c = -3/4 is known as Seahorse Valley. On its right bank are the primary buds for fractions close to 1/2. Two such buds are shown below. In each case Budviewer is used with the magnification set at .5 rather than the default .66, in order to show all of the out lying features near the bud. The color map is set to firestrm.map, and the iteration number is is set to 20000 or more for increased clarity.

Figure 9.7. The buds for 7/15 and 10/21.

Note that Budviewer rotates the picture so that the cardioid always appears on the left, even though the buds in question really have the cardioid to their right. Note also that the shape in the bottom center of each picture resembles the tail of a seahorse, hence the name. The following picture shows the largest minaiture M (which has a pronounced distortion) and the largets tail for the 10/21 bud.

Figure 9.8. Details of the bud for 10/21.

Figure 9.9. Two successive zooms into the tail of the bud for 10/21.

It is interesting to compare this with the bud for 20/21, which is near the cusp of the main cardioid.

Figure 9.10. Successive zooms of the bud for 20/21.

If we look at similar pictures of secondary buds, we find that their "tails" have spirals with multiple arms.

Figure 9.11. The 1/7 secondary buds attached to the primary buds for 1/3 and 1/4. Note the spirals with 3 and 4 arms respectively.

A project on this topic should address some or all the following questions.

• Why do the spiral formations shown above exist?
• Do similar spiral formations exist on all spokes (other than the one leading to the bud) coming from the main junction point?
• Are the centers of the spirals preperiodic? If so, what are the periods and self-similarity ratios?
• Can you explain the number of arms?
• Can you explain or measure the distortion in the largets miniature M in the picture?
• What happens with tertiary and higher order buds?

Fractint's formula mode.

Fractint has a formula mode which enables you to design your own fractals. To reach it, go to the Fractals menu, select Fractal formula, and then choose formula. Then you will see a dialog box asking you to choose a file with the extension .frm. There is likely to be just one, fractint.frm, in the default directory. With a text editor you can create one of your ownor modify an exsiting one. Once you have selected such a file, a list of fractal names (Formula selection) will appear. After choosing one, you may be given some choices of parameter values, after which you will see a fractal image of some sort.

Once an frm file has been chosen and a fractal image produced, you can return to Formula selection by typing <t>, which brings up Select a Fractal Type. The formula option will be highlighted. Confirm it by pressing <Enter>, and you will see the Formula selection list again.

An frm file consists of a collection of small programs written in simple programming language built into Fractint. It is extensively documented in An Introduction to the Fractint Formula Parser in the Fractint Home Page. We will illustrate it here with three examples of increasing complexity.

Here is a simple example, Dragon in fractint.frm.

Dragon (ORIGIN) {; Mark Peterson

z = Pixel:

z = sqr(z) + (-0.74543, 0.2),

|z| <= 4

}

It creates the Julia set J(-0.74543 + 0.2*I) in the usual way. The three lines of code above mean roughly the following.

1. Let z be the complex number correpsonding to a pixel. This is an initialization command, and there could be several of them separated by commas. The colon indicates the end of the initialization sequence.
2. Replace z by z^2 - 0.74543 + 0.2*I. Note that a complex number is indicated by a pair of coordinates, and sqr(z) is synonymous with z^2.
3. If |z| <= 4, repeat Step 2. This is an escape criterion.

Fractint automatically does this for each pixel on the screen and colors each one according to the number of iterations.

The next example, BudViewer, is taken from the file dcr95.frm, which I wrote 3 years ago. To download it, click here and save it in a directory you can reach from winfrac.

BudViewer{;Douglas C. Ravenel February 25, 1995

; This program shows the p/q bud on the main

; cardioid of the Mandelbrot set

p = p1,q = p2, Pi = 3.14159265,

u = exp(2*Pi*p*(0,1)/q), r = u/2 - u*u/4,

c0 = r + 1.5*(u - u*u)/(q*q), l = (u - u*u)/(q*q),

c = c0+l*pixel, z = 0:

z=z*z+c, |z|<4 }

This program is designed to show pictures of buds on the main cardioid of the Mandelbrot set. It uses the usual iteration algorithm, but shows only a certain region of M.

It has several features not visible in the first example.

• There are several lines of comments, each beginning with a semicolon.
• Use is made of the two user defined parameters p1 and p2, which in this case are intended to be whole numbers that specify whcih bud we are looking at.
• The line u = exp(2*Pi*p*(0,1)/q) is equivalent to the Mathematica line u = Exp(2*Pi*p*I/q). A numerical definition of Pi is included because Fractint does not know it.
• The command c = c0+l*pixel says that c is a certain linear function of the pixel coordinate. This causes the program to show the desired region of M.

Our third example is MandelJuliaZoom taken from dcr.frm, which is designed to illustrate Lei's theorem about local similarity between Julia and Mandelbrot sets. The screen is split into four regions, c, with two of them showing successive zooms of near a user defined point c0, and two showing zooms of J(c0) near c0. Here is the code:

MandelJuliaZoom{; Douglas C. Ravenel

; Shows two zooms (5x and 100x) of Mandelbrot set at c=p1,

; Julia set for c and zoom (100x)of same at c

; May have to use floating point algorithm (via x-key)!!

u = pixel, x = real(u), y = imag(u),

b11 = (-2,-1.5), b21 = (2,-1.5), b22 = (2,1.5), b12 = (-2,1.5),

c11 = 2*u+b11, c21 = 2*u+b21, c12 = 2*u+b12, c22 = 2*u+b22,

x1 = ((x/abs(x)) - ((x-2)/abs(x-2)))/2,

x2 = (((x+2)/abs(x+2)) - ((x)/abs(x)))/2,

y1 = ((y/abs(y)) - ((y-1.5)/abs(y-1.5)))/2,

y2 = (((y+1.5)/abs(y+1.5)) - ((y)/abs(y)))/2,

c = p1 + c11*x1*y1/100 + c21*x2*y1/5,

z = p1+(c11*x1*y1/100)+(c21*x2*y1/5)+(c12*x1*y2/100)+(c22-p1)*x2*y2:

z = z*z + c; |z| <= 4 }

Note that last line (the only one after the colon) gives the usual iteration algorithm, but there are complicated rules for determining the initial values of c and z for each pixel. They determined by the pixel in four different ways, depending on which quadrant of the screen the pixel is in. in order to explain how this is done, a little mathematical background is in order.

Given an interval [a, b] on the real line, its characteristic function CF[x] is defined is defined to be 1 if

a <= x <= b,

and 0 otherwise. Here is a formula for it.

((x-b)/Abs[x-b] - (x-a)/Abs[x-a])/2.

The quantities x1 and x2 in the program are the characteristic functions for the intervals [-2, 0] and [0, 2] with x as the variable, while y1 and y2 are the ones for [-1.5, 0] and [0, 1.5] with y as the variable. The product of two o these gives a function of two variables which takes the value 1 on a certain rectangle and 0 outside, in other words the characteristic function CF[x, y] for the rectangle.

We denote the pixel by u. Suppose we have four different functions F11[u], F12[u], F21[u], and F22[u]. This means that the function

x1*y1*F11[u] + x1*y2*F12[u] + x2*y1*F21[u] + x2*y2*F11[u]

will have the value F11[u] if u is in the lower left quadrant of the screen,  F12[u] if u is in the lower right quadrant,  and so on. The initial values of c and z are defined in the program in this manner. The functions c11, c12, etc. each convert a single quadrant into the rectangle usually associated to the full screen. Note that division by 5 or 100 in the program corresponds to magnification by those amounts, since a small difference in the value of z or c gets converted to a large difference in the pixel coordinate.

This page was last revised on March 19, 1998.