A few comments about the functions in Iterate! ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Function A. x=c*x+a*cos(y) y=d*y+b*sin(x+a*cos(y)) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This was a mistake. I was trying to make Function B. (If you study the two, you'll see what happened.) It turned out to be a rather fortunate mistake, though, as this function is more interesting than Function B. I used this function in my composition "Chaotic Suite for Computer and Synthesizer". Parameters ÄÄÄÄÄÄÄÄÄÄ On this function, I usually set a=b and c=d=1. You can try a=b=1, then gradually increase this value to a=b=2, a=b=2.5 and so on. You will see the function gradually break up and become more chaotic. You can also experiment with setting 'a' and 'b' to different values. This gives an interesting effect. If you change 'c' and 'd', you will probably want to keep them close to 1, i.e., c=.99, d=1. Function B. x=c*x+a*cos(y) y=d*y+b*sin(x) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Close to Function A. In both Functions A and B you'll notice that the entire plane is tiled over with repetitive figures. This is of course because of the periodic nature of the trig functions. Parameters ÄÄÄÄÄÄÄÄÄÄ Try the same sorts of parameters as Function A. Function C. x=cos(mu)*x-sin(mu)*(y-xý) y=sin(mu)*x+cos(mu)*(y-xý) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This function is due to Henon (one of the first mathematicians to put much study into the area we now call chaos theory). I found it in a fascinating book by Ekeland. Unfortunately, I had to give the book back to the library, and now I live 1000 miles away from the library, and I can't for the life of me remember the title. It is quite an interesting little book, though, if you can find it anywhere. Ekeland discussed this function and had a graph of it. I tried to duplicate the graph on my computer, and so Iterate! was born. This function is area preserving, which simply means that if you take any region and put it through the function, the resulting region has the same area as the one you started with. Symbolically, you would say the for a region R and a function F, the area of R = the area of F(R). The fact that a function is area preserving has certain ramifications for the physical interpretation of the function. For instance, imagine a planet revolving around the sun. Imagine a plane which cuts through the planet's orbit at right angles to the orbit. Imagine that each time the planet comes around the sun, you mark the spot where its center of gravity passes through the plane. (If this explanation was too complicated for you, just think of making a dot on the spot where the earth is at 12 midnight on December 31st. Make a new dot every year on December 31st.) What have we got? An iterated function, of course. You can think of the planet as being the "function", and each orbit of the planet is one iteration of the function, which produces one dot on the plane. Now if the planet is the only planet in the whole universe, and if it happens to be orbiting the sun in a perfectly circular orbit, we're going to have a pretty darn boring graph. Each time the planet comes around, it's just going to hit the very same spot again. So it is like a fixed point. It doesn't go anywhere and it's not very exciting. But let's suppose instead that there are a few other planets in our solar system, and maybe our planet has a moon or two orbiting it. Now all of a sudden our perfectly circular orbit isn't quite so circular any more. In fact, our orbit is going to have quite a few interesting little perturbations to it, and it definitely isn't going to hit the same spot on our plane each time around. It is going to make a fascinating pattern of dots on the plane-- something, as a matter of fact, like what you'll see if you run Function C. Because that's how Function C was made--imagining this kind of orbit, and how it would hit the plane, and then just figuring out the equations for the dots, so you don't have to think about all that gosh darned orbiting every time. In fact, the parameter mu in this function is some kind of orbital incidence parameter or something. Find Ekeland, ask him, and then we'll both know. At any rate, back to area preserving. It turns out that any function that is derived this way--by thinking about orbits hitting a plane and so on--has this area preserving property. And (as I recall) the opposite is true, too--if you have an area preserving function, then you can find an orbit that fits it perfectly. . . . Here's another interesting point about this function. Try this function with mu=77 degrees, and you will notice that it makes a fractal pattern (see Iterate!.txt for more details). What happens is that there is a large central circle with 5 smaller circles surrounding it. Each of the smaller circles is surrounded by 5 even smaller circles. These even smaller circles are surrounded by yet smaller circles, and so on ad infinitum. (Actually, if you try this out, you will find that it is not always 5 circles surrounding, but maybe 3,4,5,6, or whatever. But for the sake of simplicity, let's just say it's 5 each time.) Here's a little schematic of sort of what this looks like (this time with 4 "circles" surrounding each larger "circle"--but that's the limitations of ASCII):         O O O O         ÚÄ¿ ÚÄ¿ ³ ³ ³ ³ ÀÄÙ ÀÄÙ         O O O O         ÚÄÄÄÄ¿ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÙ         O O O O         ÚÄ¿ ÚÄ¿ ³ ³ ³ ³ ÀÄÙ ÀÄÙ         O O O O         Now here's the point: Let's suppose it takes 100 iterations to draw the middle (largest) circle satisfactorily. Then it takes 5 times as many iterations to draw the five surrounding circles to the same degree of detail (if you try this function, you'll soon see why--it's because one point draws the entire middle circle, and another point draws all five surrounding circles, so it's spread 5 times as thin and requires 5 times the iterations to look as good). If we go down another level to the next smaller circles, you will again have to 5 times the iterations to get the same degree of detail. So now we're to 5 x 5 x 100 iterations = 2500 iterations. Going down another level multiplies by 5 again, and we have 12,500 iterations. Going to a fifth level requires 5 x 12,500 = 62,500 iterations. For the sixth level, 5 x 62,500 = 312,500 iterations. For the seventh level, 5 x 312,500 = 1,562,500. Skipping a few levels (I assume you can multiply by 5 on your own), we find the the 20th level requires about 2,000,000,000,000,000 iterations. (That's two quadrillion, just in case your wondering. We know that this is a very, very, VERY large number, because--at this writing--it is actually larger than the amount of the national debt. Now that's amazing.) On my computer--a 386-40--it takes 7.24 seconds to do 20,000 iterations of this function. So how long would it take to to 2,000,000,000,000,000 iterations? Approximately 23,000 years. But let's forget about my clunky old computer. Let's imagine that we don't want to wait 23,000 years, and so we enlist the services of the world's fastest supercomputer. Fantasizing a bit (as computer nerds are wont to do), let's imagine that the world's fastest supercomputer is a trillion times faster than my 386. So how long is it going to take the world's fastest supercomputer to do these 2 quadrillion iterations? A bit of calculation reveals--a mere .724 seconds. So there we are. With the world's largest supercomputer, we've conquered iteration. We can look all the way down to the 20th level of our function in a flash. And surely there's no need to look on past the 20th level . . . But let's suppose we DO want to look lower than the 20th level. After all, there are hundreds--thousands--millions--of levels. This fractal pattern of circles surrounding ever smaller circles goes on forever. The 20th level barely scratches the surface. Let's suppose we want to go just a bit deeper, down to the 40th level. We set our spiffy supercomputer to calculating, step out for a little snack while it does its stuff, step back in the room and discover that . . . there are a mere 2,000,000 YEARS left before the calculation is complete. And that's just for one point. We'll need a good 30 or 40 points to make a decent looking picture. Might as well settle down for the long haul . . . On the other hand, it's fascinating to think that, by understanding the fractal structure of the graph, in a few moments the human mind can grasp the essential idea of the function down to the 20th, the 40th, or even the 4,000,000th level. HUMANS SUPERCOMPUTERS ÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 1 0 (Cannon blast; Marching band blares the HUMANS' School Song, stage right; SUPERCOMPUTERS, stage left, overheard muttering "$385f:a348 af 3e 42 2d") This isn't an isolated phenomenon, by the way. You'll notice it all the time when you work with Iterate!. The further you zoom in on a graph, the more iterations it takes to make it look good. The more iterations you do, the longer it takes. No matter how fast your computer is, you soon find yourself with graphs that would take an hour, a day, or even longer to complete. Parameters ÄÄÄÄÄÄÄÄÄÄ The only parameter for this function is 'mu', which is an angle and is measured in degrees. If you set mu=77 you will see the five circles described above. It is fascinating to explore this function as 'mu' changes from 10 degrees (where the function makes sort of an egg shape) all the way through 360 degrees and back to 10 degrees. Function D. x=a-b*y-xý y=x (the Henon Map) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This is the famous Henon Map. It has been studied intensely by chaotic mathematicians (and I'm not kidding). This simple map displays an astounding variety of behaviors--most of the behaviors, in fact, that have been discovered in the study of chaos theory. One interesting fact about the Henon Map is that in a certain region, with certain parameters, the Henon map contains a duplicate of the Horseshoe Map (Function L). (A topological duplicate, that is--meaning that the two share all essential qualities, although things may be deformed so that superficially they don't look all that similar.) Many books on chaos theory spend a good deal of time exploring this function (so if you want to find out more about it, just look one of them up). Parameters ÄÄÄÄÄÄÄÄÄÄ This function is a good one to use the command, rather than just . A lot of graphs that don't look to interesting when you use suddenly become quite interesting when you trace the orbits with . One interesting thing to do with this function is to leave one parameter constant while you gradually change the other. For instance, leave a=1 as you gradually change 'b' from 1 to -1. You will find many bifurcation points--attracting fixed points will split into a period three attracting point, and so on. Here are some interesting spots: Parameters What you'll see ÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ a=1 b=.9 An attracting fixed point surrounded by a period three attracting point. In between the fixed point and the period three point is a period three repelling point. Use the command to find an attracting point. Then as you're holding , try moving the mouse to "perturb" the point. When you do this, does the cursor stay near your original attracting point, or does it move towards the other one? You will find that one of the attracting points here is much more stable than the other. a=1 b=-0.45 Somewhere in this area is where you'll see the duplicate of the a=1 b=-0.55 horseshoe map. It is fascinating to try out small changes near these parameters (b=-0.46, b=-0.44 etc.) to see how this changes the graph. At certain parameters, there will no longer be be any periodic attracting points, but there will instead be a "Strange Attractor" (an entire fractal-shaped area that attracts all nearby points). Function E. z=zý+c, c=a+b*i (on the complex plane) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This is the function that generates the Mandelbrot Set and also the classic Julia Sets. This function is a function on the complex plane. 'Z' is a complex variable (representing a point on the plane), as is 'c'. That is to say, 'c' is not our usual parameter 'c' for which you can enter a value on the parameter screen. Actually, c=a+bi, where i=sqrt(-1), and 'a' and 'b' are our usual parameters. Iterate! is a powerful tool for exploring the behavior of Julia Sets and the relationship between the Mandelbrot Set and Julia Sets. If you have only seen static pictures of Julia Sets before, you will be amazed at the dynamics that underlie the graphs (as though the static pictures weren't amazing enough already!). One of the most fascinating things you can do with Function E is to draw the Julia Set for the function, and then explore the different areas of the Julia Set using the and commands. Here is how to do this: 1. Choose Function E using the command. Enter the parameters you want as 'a' and 'b'. 2. Draw the Julia Set using the command. (The command uses Function F to draw the Julia Set; see the notes below to see how it does it.) 3. Use the command to hide the graphics help line (this makes the command work much better). 4. Move the cursor to various places in the Julia Set and use the command to trace the iterates. You can also use to iterate in the usual way, but the command usually gives you a better idea of what's going on. One good technique is to first use to get a quick preview, and then (without moving the cursor) repeatedly press to get a detailed look at what happened. If you explore the Julia Set in this way, you will soon discover that the large and small pools of the Julia Set correspond to certain behaviors in Iterate!. Here is a schematic of a possible Julia Set: ÚÄÄÂÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³G ³ ³ ³ ³ ÀÄÄ´ E ³ ³ ³ ÀÄÄÄÄ´ ³ ³ ³ C ³ ³ ³ ³ ³ ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄ´ A ÃÄÄÄÄÄÄÄÄÄ¿ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ B ÃÄÄÄÄ¿ ³ ³ ³ ÃÄÄ¿ ³ ³ ³ D ³F ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÁÄÄÄÄÁÄÄÙ In this Julia Set, any point in Pool F immediately jumps to Pool E. A point in Pool E jumps to Pool B. A point in Pool B jumps to Pool A. In the middle of Pool A is an attracting fixed point. All the points in Pool A spiral inwards to this attracting fixed point. A point starting in Pool G has this sequence of Pools: G  D  C  A Once the point lands in Pool A, it of course spirals inward to the attracting fixed point. So every point in the Julia Set ends up in Pool A, spiralling towards the attracting fixed point. However, before the point gets to Pool A, it may travel a rather tortuous and circituous route. In a real Julia Set, it will be even more tortuous and circituous than what I've described here, because a real Julia Set has many more (many more, that is if you consider infinity to be many more than seven) pools than our schematic. Each of of our pools above would be surrounded in fractal fashion by pools upon pools upon pools. Each of these pools, no matter how small, will send its points to a certain larger pool, and this larger pool will in turn send it to a larger pool, until finally it arrives in Pool A. It is possible to find points that hit a hundred, a thousand, or a million smaller pools before finally landing in Pool A. This, by the way, is only the least complicated type of organization you will find in Julia Sets. Most Julia Sets have pools with attracting or repelling periodic points of order two or higher, as well as other complicated dynamics. Parameters ÄÄÄÄÄÄÄÄÄÄ Here are a few parameters you can try. Function Parameters What you'll see ÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ E a=-0.1 Attracting fixed point b= 0 E a=-0.982 Two repelling fixed points b= 0.2838 E a=-.7627837 Three spirals b= .1498945 E a=-.487182 An attracting point of period 5, b= .532951 surrounding a repelling fixed point E a=-1.1369 An attracting point of period 6 b= 0.23925 E a=-0.712515 An attracting point of period 13 b= 0.237683 E a=-.996592 Attracting point of order 16 b= .284015 E a=-.9964357 Attracting point of order 32 surrounding repelling b=.28822655 points of period 16, 4, 2, and 1 E a=-1.170081 A period 105 (?) point, surrounding repelling b= .2441261 points of various periods E a= 0.60478 An attracting point of period 125, surrounding b= 0.60189 a repelling point of period 25, surrounding another repelling point of period 5, surrounding a repelling fixed point E a=-.6033155 A totally disconnected Julia Set--that is, no b=-.8685983 point of the set is touching another point of the set E a= .5 Ditto b= .2 Another fun thing to do if you have the Mandelbrot-Julia Generator is to draw a Julia Set there, then run Iterate! and import the Julia Set using the command. Then investigate the behavior of the various parts of the Julia Set using and . This is similar to what I described above with the command. The difference is that the Mandelbrot-Julia Generator will usually draw a much more detailed Julia Set than the command. * * * It is rather frustrating to try and find good parameters for Function E by entering them by hand. Luckily, there is an easier way. The basis of this method is the fact that there is a correlation between points on the Mandelbrot Set and the parameters of a Julia Set. This is one of the facts that Benoit Mandelbrot discovered about the Mandelbrot Set (which is of course named after him), and it has been rather thoroughly investigated by later mathematicians. Check some of the references in "Iterate!.txt" if you want to know more. --On second thought, strike that. Using Iterate!, you can easily re-discover what these mathematicians discovered, and it might be more fun that way. Here's how you do it: 1. Use the command to choose Function E. 2. Use the command to load "Mandelbr.gph". 3. Move the cursor to any spot in or near the Mandelbrot Set. 4. Press to load these coordinates as the parameters. 5. Press to draw the Julia Set associated with these parameters. 6. Use and to investigate the properties of Function E with these parameters. (Note that you won't be able to load "Mandelbr.gph" unless you have an EGA or VGA adaptor and are running in EGA mode or VGA1 mode. If you don't have EGA or VGA, or if you would like to run in a different video mode, you should consider registering so that you will have my Mandelbrot-Julia generator that will draw the Mandelbrot Set--or any part of it--in any graphics mode.) The command is at the heart of this technic. What is does is load the (x,y) coordinates of the point in the Mandelbrot Set into parameters 'a' and 'b' of the function. (It also gives you a chance to change the other parameters, and resets the window to a good value for viewing an entire Julia Set). Here's a rough schematic of the Mandelbrot Set: D Ú¿ ÚÁÁ¿ ³ ³ ³B ³ ÚÄÄÄÁ ÁÄÄÄ¿ ³ À¿ ³ À¿ ³ ³ H ÚÄÄÄÄ´ ³ Ú¿ ÚÄÄ´ ³ ÚÙ ÄÄ´ÃÄÄ´G F A Ä´ ÀÙ ÀÄÄ´ ³ À¿ ÀÄÄÄÄ´ ³ ³ ÚÙ ³ ÚÙ ÀÄÄÄÂ ÂÄÄÄÙ ³C ³ ³ ³ ÀÂÂÙ ÀÙ E The first thing you will notice is that points inside the Mandelbrot Set correspond to Julia Sets with an inside--that is the Julia Sets are "fat"; they have thickness. Points outside the Mandelbrot Set correspond to Julia Sets that have no insides--they're just a bunch of isolated dots. (This in fact is how Benoit defined the Mandelbrot Set--if the corresponding Julia Set has an interior, then the point is in the Mandelbrot Set. If you corresponding Julia Set is just a bunch of disconnected points, then the point isn't in the Mandelbrot Set. Once Mandelbrot had defined his set, he was anxious to draw it. This would have been impossible, except for one fact about Julia Sets: If the point (0,0) goes to infinity under iteration, the Julia Set has no interior. If (0,0) doesn't go to infinity, the point has an interior. This fact provides an easy, though time consuming, way to draw the Mandelbrot Set, and is the basis of all Mandelbrot drawing programs today.) Another thing you might observe is that the Julia Set resembles the area of the Mandelbrot Set that its parameters came from. For instance, if you pick a point in the middle of Pool A--a large, open pool--the corresponding Julia Set will be a large, open pool. If you pick the point from a smaller pool, the Julia Set will consist of smaller pools. If you pick the point from an area of the Mandelbrot Set that has seven-armed spirals, then your Julia Set will have seven-armed spirals. It goes much deeper than this, though. Each of the pools--whether large or small--corresponds to definite dynamics in the Julia Set. For instance, Julia Sets selected from Pool A all have attracting fixed points. Julia Sets from Pool B have an attracting point of period 3 surrounding a repelling fixed point. Julia Sets from Pool F have an attracting point of period 2 surrounding a repelling fixed point. The dynamics of Pool C are just like those of Pool B, except that the Julia Sets are mirrors images of each other (the same is true of all pairs of points symmetrical about the x axis). The dynamics resulting from the different pools can be rather neatly catalogued (I again invite you to consult the literature on this point). If you explore the different pools and their associated Julia Sets, you will soon see why. Here is just a little hint of the sort of thing you can look for: Observe what happens when you move from one pool to its largest attached pool. For instance, points from Pool A have an attracting fixed point. Points from Pool F (the largest pool attached to Pool A) have a period 2 attracting point. In Pool B, we have a period 3 attracting point. When we move to Pool D (the largest pool attached to Pool B), we have period 6 point. This same rule holds true for all pools in the Mandelbrot Set: Whenever you move from a pool to its largest attached pool, you double the period of the attracting point. For instance: Moving From To Changes To ÄÄÄÄÄÄÄÄÄÄÄ ÄÄ ÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄ A F Period 1 Period 2 F G Period 2 Period 4 C E Period 3 Period 6 B D Period 3 Period 6 You will discover that this sort of relationship holds true for all the pools on the Mandelbrot Set. For instance, going to the third large pool on the right will always do a certain thing--multiply the period of the attracting point by 3, or 7 or 92 or something like that. This gives an way to find attracting points of various periods. For instance, going to the large Pool on the right (i.e., moving from A to B) multiplies the attracting point by three. So if we go from A to B, and then go to the large pool on the right of B (not shown on the schematic), and then go to the large pool on the right of this pool, guess what kind of an attracting point we find? An attracting point of period 1x3x3x3=27. Going again to the large pool on the right gives us an attracting point of period 1x3x3x3x3=81. And so on. (Time for another advertisement: This is a good reason to REGISTER your copy of Iterate!, because you will then receive a copy of the Mandelbrot-Julia generator, which will allow you to zoom in on these small areas of the Mandelbrot Set and read the parameters right off them. These highly magnified areas often give Julia Sets that are much more interesting than the ones you can get off the large graph of the Mandelbrot Set.) * * * An interesting area of the Mandelbrot Set to investigate is the area between the pools--the "channels" between the different "bays", so to speak. Let's think of the channel between Pool A and Pool F. What happens here? This is where our attracting fixed point changes to an attracting point of period 2. So the area around this change (the "channel") is bound to be interesting--sort of like the area around a nuclear explosion, where one element changes into another. This point of change from fixed point to period 2 point is called a "bifurcation point". And what happens at this bifurcation point is actually a little more complicated than what I just said. What really happens is that at the bifurcation point, the fixed point changes from being attracting to repelling. At the same time, a period 2 attracting point appears. Initially, the period 2 point is right on top of the fixed point, but as we slowly move into Pool F, the period 2 point slowly moves away from the fixed point. If you try drawing Julia Sets made from points on either side of the Channel between Pools A and F, you'll soon see what I mean. If we were to draw a schematic of this, it might look like: ÚÄÄÄÄÄÄÄÄattracting period 2 point ÚÙ attracting ÚÙ fixed point ÚÙ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*ÄÄÄÄÄÄÄÄÄÄÄrepelling fixed point À¿ À¿ À¿ ÀÄÄÄÄÄÄÄÄattracting period 2 point * represents the bifurcation point (This represents the graph we would draw if we plotted the coordinates of the fixed point, then changed the parameters a little, plotted the fixed point again, changed the parameters again, plotted the fixed point again, and so on. It is called--amazingly enough--a bifurcation diagram.) You'll notice that there is some symmetry here--some "conservation laws", so to speak. For instance, there is balance between attracting and repelling. The fixed point must become repelling, so that the period 2 points can be attracting. There is symmetry in the fact that the period 2 points appear balanced on opposite sides of the fixed point. There is in fact a strong correlation here between this "conservation" and the conservation laws that hold in the physics of subatomic particles. For instance, when an electron decays into a photon and some other particles (sorry about being so vague, but I haven't really been keeping up with my subatomic physics lately), there are certain properties that must be conserved: charge, momentum, mass-energy, and so on. These conservation laws actually determine the types of subatomic reactions that can occur--and the same type of thing holds true for our bifurcation point in the Mandelbrot Set. In fact, if you look at diagrams of particle reactions, or traces of subatomic particles in a cloud chamber or bubble chamber, you will see something that looks strikingly similar to our bifurcation diagram. (BTW, there is also a fascinating correlation between the Rubik's Cube and the actions of subatomic particles. 50› to the first person who can find a correlation between the Rubik's Cube and the Mandelbrot Set. P.S. "They're both good for wasting a lot of time" is not an acceptable answer.) * * * The reason all this works the way it does has to do with what Julia Sets are and how the Mandelbrot Set is defined. Unfortunately, getting into that can of worms is beyond the scope of this little help file. I invite you to peruse some of the literature if you're curious. Function F. z=ñsqrt(z-c) c=a+b*i (inverse of Function E) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This function is the inverse of function E. This again is a fascinating function because of it's relationship to Julia Sets and the Mandelbrot set. It turns out that the border of Julia Sets (generated by Function E) is repelling under iteration. That is, points fly away from it, either towards some attracting point inside the Julia Set, or towards infinity if the point is outside the set. (This fact forms the basis of computer graphs of the Julia Set, by the way.) (In most computer drawings of Julia Sets, the inside of the Julia Set is shown as black, and the outside is colored. So the border of the Julia Set is the border between the black and the color in the computer graph.) So, if you take the inverse of this function, what happens? The border, which was repelling, suddenly becomes attracting. All points on the plane are attracted to the border, and once they're on the border, they stay there. This gives us a handy way to draw the border of the Julia Set: Just iterate a point under this inverse function. The point will bounce back and forth along the border and draw it very nicely. This is what you will see when you run Function F. Unfortunately, in real life this method of drawing Julia Sets doesn't work quite as well as we would like it to, because the point is more likely to hit some parts of the border than others. Thus some parts of the border are very dark, while others are faint. Actually, the point will hit everywhere on the border of the Julia Set (or at least very close to everywhere) sooner or later (in math lingo you would say, "The orbit of the point is everywhere dense on the border of the Julia Set"). The trouble is, for some Julia Sets, the point hits certain areas of the border very soon, and other areas much, much later. You see, we're back to the 23,000 year problem again. If you had the world's fastest supercomputer and 23,000 years to wait around, this method would work great with any Julia Set. Well, most Julia Sets, anyway. A few of them would take 23,000,000 years, a few 23,000,000,000 years, and a very few even longer. Whether it takes 23 seconds or 23,000,000,000 years to draw the Julia Set depends on the parameters you choose. For some parameters, the technique works very nicely. For some parameters, in fact, this technique works better than the usual technique for drawing Julia Sets. (The usual technique is the technique that makes the colored pictures of Julia Sets that you have likely seen if you even know what I'm talking about when I say "Julia Sets".) So to get much of a picture with this function, you need to pick the right parameters. Generally speaking, 'a' and 'b' should be small in absolute value. Say -2 < a < 1 and -1 < b < 1. To be more precise, c(=a+bi) should be in the Mandelbrot Set. (See Function E above for how to load parameters directly from the Mandelbrot Set.) Even within this range, however, certain parameters will work better. If you're not in this range, though, you haven't got a prayer (of getting a picture of a nice Julia Set, that is. Who knows but what you might discover something else interesting?) You will want to use the command to set a high number of iterations when you use Function F. 10000 iterations is a good place to start; you will need more if your Julia Set is more complicated or if you're zooming in on a small area. The Julia Sets that you draw with Function F are fractals. * * * By the way, you might be wondering why there is the 'ñ' in this function (z=ñsqrt(z-c)). It is because we are taking the inverse of zý+c (see Function E). The inverse of this includes a sqrt function (set z'=zý+c and solve for z; you'll soon see why). But actually there are TWO square roots for each number--a fact which is all too easy to forget. For instance, 10 is the square root of 100, but so is -10! So if you start with a number and take its inverse under Function E, you actually come up with TWO inverses (a positive and negative square root). If you iterate this inverse function (which is what we're interested in doing), that means that you take the inverse again. So we take the inverse of both of the two inverses. Each inverse again has two inverses, so now we have a total of four points. Doing it again, we find that each of our four points has two inverses, so now we have eight points. Doing it a fourth time, we end up with 16 points. A fifth time, and we have 32 points, and so on. As you can see, the number of points grows exponentially! If we were to try to keep track of all of these inverse points, our computer's memory would soon be full. After only 20 iterations, we would have 1,048,576 points--many more than a PC's memory will hold. After 30 iterations, we have 1,073,741,824 points--enough to fill a 3,000 megabyte hard drive. So it's simply impossible to keep track of all these inverses. What we do instead is much simpler. We just more or less randomly* pick one of the two inverses each time. That way, after 30 iterations, we only have one point to keep track of instead of 1 billion. And believe it or not, the result looks pretty much the same. So that is why there's a 'ñ' in this function--because at each step, we're picking the positive or the negative square root. * * * *Actually instead of just randomly picking an inverse, I have come up with some tricky algorithms that greatly help out in drawing a Julia Set. These algorithms are controlled by parameters 'c' and 'd'. 1. Closest Point Algorithm. This algorithm chooses the square root that is closest to the point. This is good for drawing spirals around repelling and attracting periodic points--a common feature in Julia Sets. The parameter 'c' determines how often this alogorithm will be used. Parameter 'c' ranges from 0 (never use the algorithm) to 1 (always use the algorithm). Parameter 'c' usually should not be set to 1, because this algorithm has a tendency to get stuck on an attracting point if it is used alone. Typical good values for 'c' are 0.7-0.9. 2. Point Not Plotted Algorithm. This algorithm checks both inverses to see if they've been plotted on the graphics screen. If one of the points hasn't been plotted, the algorithm is more likely to pick that point. (How much more likely is determined by parameter 'd'.) If both points have been plotted, or neither has been plotted, the algorithm picks randomly between the two. Parameter 'c' also determines how often this algorithm will be used. Whenever Alogorithm 1 isn't used, this one is used. So c= means ÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 0 Algorithm 1 never used; Algorithm 2 always used. 1 Algorithm 1 always used; Algorithm 2 never used. 0.5 Each algorithm used 50% of the time 0.75 Algorithm 1 used 75% of the time, Algorithm 2 used 25% Parameter 'd' determines how likely Algorithm 2 is to choose the point that hasn't been plotted. Parameter d=1 means always choose the point that hasn't been plotted; parameter d=0 means always choose randomly. Setting parameters 'c' and 'd' when using Function E also has this same effect, if you use the command to draw a Julia Set. Function G. x=y y=a*y*(1-b*x-(1-b)*y) (logistic delay equation) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ I found this on page 71 of a book by Lauwerier. Again, I've lost the book and the title. Oh, well. This function is closely related to the (one-dimensional) function f(x)=1-axý. This function was a seminal function in the discovery of chaos theory. For certain values of 'a', the function is totally chaotic. Mathematicians were astounded that such unpredictable results could come from such a simple function (the function is in fact an overly simplistic model for population growth). Believe it or not, today the dynamics of f(x)=1-axý have been completely categorized. That is to say, mathematicians thoroughly understand this chaotic function and all of its complicated dynamics. This function (f(x)=1-axý) is rather thoroughly covered in most books on chaos theory (just in case you're wanting to know more). Incidentally, our Function E (z=zý+c) is nothing but f(x)=1-axý translated to complex numbers. (Although an exact translation would be z=1-czý, it turns out that z=zý+c and z=1-czý both have the exact same dynamics if you make certain adjustments in the value of 'c'.) Function G is closely related to this function (f(x)=1-axý), as you can see if you examine them both closely. In fact, you could sort of think of Function G as a two-dimensional analog of f(x)=1-axý. The fact that it's a "logistic" equation means that it is in some way supposed to model population growth. Function H. x=y y=a*x+b*y+c*xý+d*x*y+mu*yý ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Function H again comes from Lauwerier, this time page 72. This is another variation on the logistic theme, closely related to Function G and f(x)=1-axý. Function I. x=a*x(1-x-y) y=b*x*y (predator-prey model) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This comes from Lauwerier page 74. This is a very simple predator-prey model. Think of the x axis representing the population of rabbits, and the y axis the population of coyotes, and you'll have the basic idea. Function I displays chaotic motion for many parameters, which raises the question of whether chaotic motion can actually be observed in natural relationships of this sort. Usually in population models like this one, 1 represents the maximum population and 0 the minimum. You can think of it ranging from 100% down to 0% or something like that. You can see a close relationship between this map and our logistic maps (Functions G and H) as well as with the Henon Map (all are in fact population models). Function J. x=a*x*exp((1-sqrt(1+y))/b) y=a*x-a*x*exp((1-sqrt(1+y))/b) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Function J is a model of parasitoid-host interaction. Think of the x axis as representing the population of the parasite, and the y axis the population of the host (or perhaps it's the other way around--I'll let you figure that one out). As you can see, the behavior of this function is strikingly different than that of Function I. This leads you to wonder how a species' relationship with its environment might affect its long term population growth (is it for instance chaotic, leading eventually to extinction, or chaotic, but within a closely prescribed area, or stable--perhaps heading towards an attracting fixed point, as this function seems to do). This model comes from Lauwerier, pages 75-76. Function K. x=y y=-x+2*a*y+4*(1-a)*yý/(1+yý) (area preserving) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This function also is area preserving. I'm not quite sure where I lifted this one from. Function L. x=a*x*(1-2*y)+y y=b*y*(1-y) (horseshoe map; try a=1/3, b=4) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This is the famous horseshoe map. As soon as you run it with the recommended parameters, you'll know how it got its name. This could also be called the "Taffy Pulling Map" for reasons that I'll let you figure out. You'll want to try a high number of iterations with this one--maybe 30,000 iterations or more. An interesting thing to do with this map is to zoom in on one side of the horseshoe. You'll see that as you get closer, the sides resolve into ever more delicate filaments. In fact, each filament appears to be razor thin-- the sides only get their thickness from the bundles of filaments that make them up. But as you zoom in on a filament, you discover that it isn't razor thin after all--it is made up of even thinner filaments, which are themselves made up of thinner filaments, and so on. There is a certain pattern to the filaments, which reminds one of the spectral lines in which are observed in spectroscopy. As you look at them closer and closer, they delicately divide and divide again, and it seems that there's no end to this dividing (in this particular case, there isn't). This pattern of infinitely dividing filaments is also reminiscent of the divisions in a Cantor Set*, as well as the bifurcation diagram for the logistic equation f(x)=1-axý. (See the literature for more info on bifurcation diagrams.) This pattern of ever-dividing filaments turns out to be a fractal. * * * *The Cantor Set is made by starting with a line segment (say the segment between 0 and 1). You remove the middle third of the segment (the part from 1/3 to 2/3). You then have two line segments. Remove the middle thirds of each of these (I won't try to get into the fractions that this entails, but you can if you want to). Now you have four line segments. Remove the middle thirds of these line segments. Now continue this pattern an infinite number of times and what you have left is the Cantor Set. Here is a representation of the first five steps: 0 1/3 2/3 1 1 --------------------------------------------------------------------------- 2 --------------------------- ---------------------------- 3 --------- --------- --------- --------- 4 --- --- --- --- --- --- --- --- 5 - - - - - - - - - - - - - - - - The Cantor Set has this amusing property: It has an infinite number of points (in fact, an uncountably infinite number of points) within a finite length, yet at the same time the set itself has NO LENGTH. You can see in the definition of the Cantor Set the same idea of iteration that is the basis of Iterate!. The Cantor Set is also a fractal. You will see some relationship between it and the earlier fractal I attempted to draw, of a circle surrounded by four circles, each surrounded by four circles, etc. By the way, the one dimensional logistic map f(x)=1-axý has a strong relationship with the Cantor Set. For certain values of 'a', the set of all points that don't go to infinity when iterated under f(x) form a Cantor Set. You can think of it this way: The points that go to infinity form the "holes" in the Cantor Set. The points that are left don't go to infinity, and they form a Cantor Set. You can find out more about this in the literature. While we're on the subject of wierd relationships, the Horseshoe Map has a strong relationship with the one-dimensional logistic map f(x)=1-axý (the same map we've just been mentioning in regard to the Cantor Set). If you take a certain cross-section of the Horseshoe Map it is the same as the logistic map (both functions with the right parameters, of course, and "the same" meaning topologically the same). We could say the Horseshoe Map "contains" the logistic map, since a small part of the Horseshoe Map (a cross-section) mimics the logistic equation. We've already mentioned that the Henon Map "contains" the Horseshoe Map in the same sort of way. So we have the logistic map contained in the Horseshoe Map and the Horseshoe Map contained in the Henon Map . . . interesting. And let us not forget that the logistic map contains a Cantor Set--so the Horseshoe Map and the Henon Map will produce Cantor Sets as well. Perhaps it's no accident that I saw Cantor Sets in those filaments . . . But don't take my word for it. Try it yourself. Function M. x=1-y+abs(x) y=x ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This map I stole from FractInt (I just read the FractInt documentation, and they admitted to lifting it from "The Science of Fractal Images" page 149, so now I feel better). They call it the Gingerbread Man. You will again notice the amazingly complex graphs coming from a very simple formula. Abs(x), by the way, means the absolute value of x. Function U. User Function ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ The U in this function stands for "you". (Is this from the Mousketeers or something? Oh, well.) The most best thing about Iterate! isn't finding out about the functions that somebody else has discovered, but trying to invent some interesting functions yourself. Good luck. (Remember to send your interesting functions in. I will distribute the most interesting ones with Iterate! in the future.) (ver 3.11, 9/93)