ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º º º º º Iterate! º º º º Version 3.11 º º º º º º º ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĶ º º º º º Copyright 1993 º º º º º º by º º Brent Hugh º º º º º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ INSTRUCTION MANUAL ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ CONTENTS ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Quick Start Program Distribution Files Included Legal Disclaimers How the Program Works Iteration Fractals Chaos Parameters Program Commands Graphics Screen Commands Basic Commands Special Commands for Julia/Mandelbrot Sets Dos Commands Iteration Stack Commands User Function Commands Edit Menu Commands The User Function The User Function File The Name The Defaults The Function Error Messages Video Adapters Mouse Printing Runtime Error Messages Heap Overflow Errors "Floating Point Overflow" and "Division by Zero" Errors Miscellaneous Program Info Upcoming Additions Bibliography QUICK START ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ At the DOS Prompt, type "Iterate!" to start the program. You are presented with an introductory screen with some instructions. Press any key to move on to the graphics screen. At the graphics screen you can use the mouse to move around and iterate points. Press the left mouse button to iterate a point. Press the middle mouse button to switch between the graphics screen and the command screen, which lists all available commands. (For you unlucky folks with only two mouse buttons, pressing both buttons together is the same as pressing the middle button.) If you don't have a mouse, never fear! Iterate! can accommodate you. Just use these keys to move around and iterate points: Arrows move Space iterate a point M move the cursor to the next iteration, allowing you to trace the iterations of a point Escape switch between the graphics screen and the command screen (which lists all available options) Q quit These keys change distance you move when you use the arrow keys: CapsLock switch between medium and giant steps Shift make baby steps Note: is a toggle, but must be held down as you're pushing the arrow for it to have an effect. (or middle mouse button, or left and right mouse buttons together) switches between the graphics screen and the command screen, which lists all available commands. However, all commands are available on the graphics screen (if you can just remember which button to push). shows a help screen. PROGRAM DISTRIBUTION ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ This program is SHAREWARE. Please pass it along to friends, neighbors, relatives, and fellow mathematics buffs. If you find it useful, educational, entertaining or addictive (as I have), please become a registered user by sending $15 to: Brent Hugh 986 Raymond Road Fruit Heights, UT 84037 The Many Glorious Benefits of Registering ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Becoming a registered user will help me justify work on similar products in the future--and help you feel less guilty. In addition (as though you really need anything more), registered users will receive a disk with the latest version of Iterate!, a version of Iterate! compiled for 286 and better computers (runs 10-20% faster), and several other programs that illustrate chaos and fractals--including my latest program that makes 3-D fractals. Also included on the disk will be a Mandelbrot-Julia Set generating program-- the program that generated the file "Mandelbr.gph" that is included with Iterate!. Iterate! and this Mandelbrot-Julia generator work hand-in-glove, together making a powerful tool for investigating the Mandelbrot Set and its associated Julia Sets. Using the Mandelbrot-Julia generator, you can create a graph of the Mandelbrot Set. You can then load this graph into Iterate! and enter Julia Set parameters directly from the Mandelbrot Set. You will immediately see the correlation between a point on the Mandelbrot Set and its associated Julia Set. (See "Function.txt" for more info on this subject.) If you are interested in using multiple copies of Iterate!--in a school setting, for instance--please write to me about special rates. I'm sure we can work something out that will be agreeable to us both. When you register, please include your name and address and specify 3 1/2 or 5 1/4 inch disks. Don't forget to include any good user function files you have come up with--the best ones will be distributed with future versions of Iterate!. Might I mention that this is a REAL DEAL! The shareware distributor places charge around $15 just to send you a program like this and then you're supposed to register ON TOP of that. FILES INCLUDED ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ These files are distributed with Iterate! If you share the program with someone else, please include ALL of these files. If your copy of Iterate! doesn't include all of these files, please write me for a complete copy (include a blank disk and self-addressed, stamped disk mailer if you're not registering). Iterate!.exe The program file * .frm Sample user functions. There will be several of these. Mandelbr.gph A graph of Mandelbrot Set that works with Iterate! (see Function.Txt for more details; see also Note below) KBRepeat.exe Utility to change the keyboard repeat rate WhatsNew.txt What's new in this version of Iterate! HowTo .txt How to do common things in Iterate! Function.txt A short discussion of the functions in Iterate! with some example parameters and other things you can try Jargon .txt An explanation of some of the jargon of Iteration Theory QuickCmd.txt Quick one page synopsis of Iterate!'s commands Readme .txt An overview of Iterate! Iterate!.txt This file Iterate! makes files of these sorts: *.gph *.inf *.ini If, after a while, you find a bunch of these files scattered around your disk, Iterate! is responsible. Note: "Mandelbr.gph" is drawn in VGA mode 1 (which is the same as EGA mode; this is the default startup graphics mode for Iterate! if you have a VGA or EGA adapter). If you are unable to run Iterate! in VGA1 mode or EGA mode, you won't be able to use "Mandelbr.gph". Sorry. If you become a registered user of Iterate!, you will receive a Mandelbrot-Julia Generator that will allow you to draw Mandelbrot and Julia Sets in any graphics mode you want. LEGAL DISCLAIMERS ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ This is the section of the help document where the programmer/programmers disclaim(s) any responsibility for anything and everything that may or may not happen as a result of using and/or not using his/her/their program and/or documentation for any purpose whatsoever. Please consider me so disclaimed. If you hurt, kill, or maim anything or anybody by using this program, it's not my fault--especially if you haven't paid your registration fee. You can't sell this program to anyone (you can charge small distribution/copying fees). You can't include this program with other programs that you are selling. In short, all the profits from this program--meager as they may be--belong to me, not you. (Sorry--I'm sure you'll get over it soon.) I retain all rights to this program. It is not in the public domain. You cannot alter it and then distribute the altered version. (You're welcome to alter it for your own amusement if you'd like.) (Have you ever noticed that all manuals put the boring legal stuff at the beginning so you have to plow through it all before you get to the good stuff? Well, everybody else does it, so I had to, too. Congratulations on making it this far--and now here's the good stuff . . .) HOW THE PROGRAM WORKS ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Iteration ÄÄÄÄÄÄÄÄÄ Iterate! is based on the mathematical idea of iteration. Iteration works like this: Imagine you have a calculator. Punch a number into the calculator. Then pick a function key on the calculator, like 'sin' or 'xý'. Repeatedly push this function key, and see what happens. Here are some of the things that can happen when you iterate a function on your calculator (in parentheses are the function that gives this result and the number to start with): * The number gets closer and closer to some number (cos, any number) * The number alternates between two or more numbers (1/x, any number but 1 or 0) * The number gets larger and larger (xý, any number larger than 1) * The number jumps around in a seemingly random fashion (1-2xý, most numbers between -1 and 1) Just playing with your calculator like this can provide hours of amusement, especially if you have a programmable calculator so you can do some of the more interesting functions. See the bibliography for some books that provide some interesting functions and results. This iteration process that you can do with your calculator is exactly what this program does, except in the program we use "a point on the screen" and "a function programmed into the computer" instead of "a number" and "a function key on your calculator." Here are some of the things that can happen when you iterate on the computer: * The point spirals in towards a certain point (an attracting fixed point) * The point does a certain number of points and then repeats. This is called a periodic point. The number of points before repetition can be 2, 20, 200, 2000, 20000, or anything in between. * The point traces out a pattern. The pattern can be anything from simple circles or ovals to complex fractals. * The point jumps around in a seemingly random fashion (chaos). * The point jumps around in a seemingly random fashion, but sticks within a certain area. This area can be simple or complex; often it is a fractal. If you experiment with Iterate! a little, you will soon see all of these things (and many more) happening. Of these things, fractals, chaos, and periodic points are among the more fascinating. Here is a little explanation about them. Fractals ÄÄÄÄÄÄÄÄ The study of fractals is one of the most fascinating and visually appealing areas of mathematics. Fractals are shapes that are selfsame under magnification--if you look at a small part of a fractal, it looks just like the whole thing. To put it another way, a fractal has the same shape over many different sizes. (In mathematically generated fractals, the shape is usually repeated over infinitely many different sizes. However, in the fractals found in nature, the shape is typically repeated between 5 and 20 times.) A good example of a fractal is a tree. A branch of the tree has the same shape as the whole tree. A smaller branch of the tree has the same shape as the larger branch, as well as the same shape as the whole tree. So a small part of the shape looks like the whole thing. Many fractals are found in nature. Some examples are cauliflower, broccoli, mountains, river systems, air passages in lungs, the growth pattern of certain cancer cells, cracks in rocks, clouds, and the pattern of stars in the sky. Nearly all of the functions in Iterate! will produce fractal patterns. Here is one particularly obvious one: Choose Function C with the default window and parameters. Set the number of iterations to 1000. If you trace out a few points, you will see a large circle surrounded by five small circles. If you try some points near the five small circles, you will find that each of the five small circles is surrounded by smaller circles. Zooming in on these smaller circles would reveal even smaller circles surrounding them. Further zooming reveals smaller and smaller circles, always in this same pattern of a larger circle surrounded by smaller circles. It looks sort of like this (if you can imagine circles instead of squares, and 3, 4, 5, or 6 circles surrounding, instead of just four each time):         O O O O         ÚÄ¿ ÚÄ¿ ÀÄÙ ÀÄÙ         O O O O         ÚÄÄÄÄ¿ ³ ³ ÀÄÄÄÄÙ         O O O O         ÚÄ¿ ÚÄ¿ ÀÄÙ ÀÄÙ         O O O O         Oddly enough, this same type of fractal pattern is shown by several of the functions programmed into Iterate!--even by functions that algebraically aren't at all close to each other. Chaos ÄÄÄÄÄ Chaos is--well, chaotic. In a chaotic function, the point jumps around in a completely unpredictable way. Mathematicians find chaos fascinating because these very unpredictable results come from rather simple, predictable-looking functions. Mathematicians and scientists study mathematical chaos in their search to understand chaotic behavior in nature: weather patterns, transition states of materials, the orbits of comets, mixing of materials, population growth, and many others. To see an example of chaos, choose Function I with the default window and parameters. Periodic Points ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Periodic points are the antithesis of chaos--they are regular, predictible and orderly. Periodic points are points that repeat the same path over and over. The number of iterations before the point returns to its original position is called its "period". For instance, a period 5 point takes 5 iterations to return to its original position; a period 43 point takes 43 iterations to return to its original position. A period 1 point (or fixed point) doesn't go anywhere--it just stays in its original position without ever moving. Periodic points come in two main varieties: attracting and repelling. An attracting periodic point pulls nearby points closer and closer to it. A attracting fixed point, for instance, sucks in all nearby points like a giant black hole. If you iterate a point near it, you might see a spiral, circling ever closer to the fixed point. A repelling periodic point pushes nearby points away from itself. If you iterate a point near a repelling fixed point you might see the point spiralling outwards. A point can be either strongly or slightly attracting; the same goes for repelling. Usually, the points that are only slightly attracting or repelling are most interesting visually. Believe it or not, a chaotic function has periodic points as well. However, they are all repelling periodic points. This is what makes the function chaotic. A good way to investigate periodic points is to use the command to trace out the path of a point. This makes it much easier to follow the orbit of the point. (The path of a point under iteration is called its "orbit" by the way. A mathematician would say that Iterate! plots the orbits of points under iteration.) Using Iterate!, I have found attracting periodic points of period up to 125. It is possible (with the right function and parameters) to find periodic points of any period--1000, 1000000, or even larger. Here is a good example: Choose Function E with the default windows and parameters. Choose to draw the Julia Set associated with this function. Now iterate a few points using . If you iterate a point inside the Julia Set, you will see three dark dots appear. This is a period 3 attracting point. Now press repeatedly to trace out the orbit of a point in the Julia Set. You will see that for the first few iterations, the point jumps around the set. After a while, it settles down and moves closer and closer to the three attracting points. Approximately in the middle of the three attracting points is a repelling fixed point. If you put the cursor near this repelling point and press , you will see that the point spirals outward. After it spirals out a ways, it may be attracted to the period 3 point, or it may leave the Julia Set altogether. (See "Function.Txt" for more info about Function E and Julia Sets.) Parameters ÄÄÄÄÄÄÄÄÄÄ When mathematicians study iteration, one of the main things they study is the effect of changing the parameters of the function. Let us take a simple function with a single parameter: 1-axý. In this function 'a' is the parameter. What you will discover, if you try this function with different values for 'a', is that changing the value of 'a' slightly can change the behavior of the function dramatically. Some values of 'a' make the function very nice and well-behaved (one attracting fixed point); others make it wildly chaotic (an infinite number of repelling periodic points); yet others are somewhere in between (some attracting periodic points and some some repelling periodic points). One question mathematicians ask is: "At which value of 'a' does the function change from well-behavedness to chaos?" This value is known as a "bifurcation point." Using Iterate!, you can try changing parameters and observing the results of these changes. Here is a good example: Choose Function A. First choose the default window and parameters, and iterate a few points to see what happens. Then, choose Function A again, but this time enter a=3 and b=3. (Leave the other parameters as they are. You might want to choose a larger graphics window so you can better see what's going on.) Again, iterate a few points. You will be amazed at the difference this small change makes. You can try different values for 'a' and 'b' between 0 and 3 to see how the graph gradually changes from order to disorder. If you're lucky, you might discover a "bifurcation point"--the parameter value where the large ovals split to become two smaller ovals. For more information on iteration, fractals, chaos, and bifurcation points, consult the books listed in the bibliography. PROGRAM COMMANDS ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Iterate! is designed to be pretty much self-explanatory, once you know what it is supposed to do. Just in case it isn't, though, here is a list of all the commands that are available. General Notes ÄÄÄÄÄÄÄÄÄÄÄÄÄ Upper or lower case works the same on all commands. Pressing almost anywhere will abort the command and return you to the command screen or graphics screen. shows a help screen, with a brief summary of relevant commands. Graphics Screen Commands ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ or . Iterates the point currently at the crosshairs. Note: An iteration can be interrupted by pressing any key besides or an arrow, or any mouse button besides . . Moves the cursor to the next iteration of the point. By repeatedly pressing , you can slowly trace out the successive iterations of a point. This is great for finding periodic points and for any time you want to get a more detailed idea of what a point is doing. works better if you hide the graphics screen help line (use the command). A fun thing to try with the command is to move the mouse as you're pressing and holding . This works especially well if you're near an attracting point. The mouse move is a "perturbation" of the the point; this will test how stable the attracting point is. If the mouse move drives the cursor away from the attracting point, the attracting point is quite unstable. If the mouse move drives the cursor momentarily away from the attracting point, but it soon comes back, then the attracting point is very stable. Note: works much better if the typematic rate on your keyboard is set to a fast value so that the keys on your keyboard repeat quickly. Iterate! can do this for you automatically; see the command for more details. . Shows/hides the help line at the top of the graphics screen. or . Zooms in on a certain area. Pressing while doing this zooms out instead. See the command below for more information. . The arrow keys move you around the graphics screen. . Switches between medium and large steps when you press the arrow keys. This key is a toggle--pushing it once will change to large steps, pushing again will change back to medium steps. . When pushed with an arrow key, moves the smallest step possible on your graphics screen. or . Switches between the graphics screen and the command screen. (Remember that on a two button mouse, pressing both buttons is the same as pressing the middle button.) Basic Commands ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ . Quits the program. . shows a help screen (the same thing that is in QuickCmd.txt). . dumps vital information about your current function and graphics window to the printer. This is useful if you have printed a graph (see "Printing"). . Pressing erases the graphics screen so you can start a new graph (asking you first if you really want to). If you have points on the iteration stack, will ask you if you want to delete them or keep them. . Sets the number of iterations to be performed. This number is used whether the point is iterated immediately (using ) or automatically as part of the iteration stack (using ). The maximum number of iterations allowed is 2147483647 (2^31-1, just in case you're wondering). . Sets the graphics window. This is the area that is shown on the graphics screen. 'W' works differently depending on whether you are in the graphics screen or the command screen. * On the Graphics Screen, works like this: Position the crosshair at one corner of the area you would like to view, and press . The cursor will change from a cross to a rectangle. Move the corner of the rectangle (by using the mouse or arrow keys) until it encloses the area you want to view. Press again to complete the window. If you press instead of , you will zoom out instead of zooming in. That its, in the new graphics window, the present graphics window will look like area you specified. Remember that pressing on the graphics screen is the same as pressing . Note 1: You will notice that Iterate! sometimes rotates the screen 90 degrees-- that is, the y axis becomes the horizontal axis. Iterate! automatically does this to accommodate the area you entered--depending on whether it's a short, fat rectangle, or a tall, thin one. Note 2: Iterate! always expands the windows coordinates to make them fit the entire graphics screen with the correct aspect ratio. So you may see a little more than you specified (but you will never see less). * At the Command Screen, pressing 'W' lets you specify the window coordinates manually. Iterate! will ask you for the least and greatest x coordinates, and the least and greatest y coordinates of the area you want to view. Then it will ask you if you want to make the x axis the horizontal coordinate (the usual way), or the y axis (rotated 90 degrees counter-clockwise from usual). Iterate! will then clear the graphics screen and send you on your way. If you leave all values unchanged, Iterate! will not clear the graphics screen or change anything. This provides a handy way to view the values of the current graphics window. Note: Iterate! will expand the window coordinates you enter to make them fit the entire graphics screen. . allows you to choose the function Iterate! will use, and specify the parameters for that function. The functions used by Iterate! take a point on the graphics screen to another point on the screen. In other words, a coordinate (x,y) is taken to another coordinate (x',y'). Mathematicians would say that this is a function Rý -> Rý. The point of this is that our functions must have two parts: one part to tell where the x coordinate goes to, and one part to tell where the y coordinate goes to. When you push , you will see a list of the available functions. A typical function will look like this: x -> cos(axy) + bx y -> sin(cx/y + mu) + dy (my favorite function) This means that the x coordinate goes to 'cos(axy) + bx' and the y coordinate goes to 'sin(cx/y) + dy'. The a, b, c, d, and mu are parameters; you will be able to enter values for these later. Some of the functions have little comments--"my favorite function" or whatever. If you want to find out more about the functions than these little comments tell you, then read "Functions.Txt". The last function (Function U) is a user function. This is where you can try out your own functions. See "THE USER FUNCTION" in this document for more details. After you enter the function, you enter the parameters. Iterate! will ask you if you want to use the default window and parameters for this function. If you haven't tried the function before, using the default window and parameters is a good idea. The default window and parameters will focus you on an interesting area of the plane with some good parameters. Later, you can experiment by changing these parameters slightly (or greatly). Many functions only use one or two of the parameters. In this case, it doesn't matter what you enter for the rest of the parameters. I suggest leaving them unchanged. HOWEVER, you can enter any value you want in these unused parameters. This is your big chance to enter the most obnoxious number you can think of without the slightest chance of blowing up your CPU. So go to. Be anarchic. Enjoy yourself for once. Mu is typically used as an angle parameter. If this is the case, it is entered in degrees. (Note: In the User Function, mu is figured in radians, not degrees. Sorry.) . allows you to adjust various program parameters. The parameters you can adjust are: * Aspect ratio. The aspect ratio is the horizontal size of your CRT (in inches) divided by the vertical size of your CRT (again in inches). Unless your monitor is really weird, the aspect ratio should be 1.333333. If the aspect ratio is set wrong, thing will be squashed or stretched on the screen. For instance, circles will be squashed or stretched into ellipses. The most common reason you will want to adjust the aspect ratio is to compensate for your printer--often a printed image will have a different aspect ratio than it did on the CRT. Just measure the horizontal and vertical size of a printed image, figure the aspect ratio (horizontal size divided by vertical size), and enter it here. Then your printouts will look nicer. Note: Changing the aspect ratio won't change anything until you enter a new graphics window (see ). The aspect ratio works by adjusting the boundaries of the graphics window so that they have the correct proportions. Iterate! won't make the necessary adjustments until you enter some new window coordinates. * Graphics Color. This determines the color that will be displayed on the graphics screen. As a rule, color #15 will produce white. * Text Foreground Color for menus. A number between 0 and 15. White is 7, black is 0, bright white is 15. * Text Background Color for menus. Ditto. Note: If you have a monochrome text adapter (Hercules), the text color settings will have no effect. * Default Value for "Save Graphics Screen". This determines whether a "Y" or "N" comes up whenever the program asks "Save Graphics Screen (Y/N)". If you never want to save your graphics screens, change this to "N" and save yourself a lot of headaches. If you always spend three hours making a spiffy graph and then forget to save it, change this to "Y" and save yourself a lot of headaches. * The text editor to use when editing User Function Files. This changes the text editor that you use when you press to edit the User Function. You can use your own text editor by entering its name here, or use Iterate!'s built in text editor by leaving this entry blank. You must enter the full path and filename of the text editor you want to use, for example "c:\dos\util\edit.exe". If the path is not complete, or the full filename isn't used (including the extension), Iterate! won't be able to find the file. In this case you will get an error when you use the command to edit the User Function File. You will need a pretty good chunk of memory free to use this option--about 425K plus the amount needed by your text editor. For this reason, your favorite gigantic text editor probably won't work here. For instance, "Edit.com" that comes with DOS probably won't work--it's way too huge. I use "Ted.com", a little shareware text editor, and it works great. If your text editor is too big, you can probably find a more compact one on a local BBS (or just put up with Iterate!'s built in editor). Make sure the editor you use here returns just plain old DOS text--otherwise Iterate! will get real confused. Don't try to use WordPerfect or something like that. * Set keyboard repeat rate on startup. If this option is marked "Y", Iterate! will automatically set the repeat rate to its fastest possible value at startup. This dramatically speeds up keyboard response when using the arrow keys to move or the command to trace an iteration. If this option is marked "N" then the keyboard repeat rate is left unchanged. (Note that the "KBrepeat.exe" utility included with Iterate! allows you to change to keyboard repeat rate from the DOS command line--either to recover from what Iterate! has done to you, or just to change it however you want. Unfortunately, it is impossible to detect the setting of the keyboard repeat rate, so Iterate! can't return the repeat rate to the state it was before it started. If you don't like the repeat rate Iterate! leaves you with--the fastest possible setting--you can use KBRepeat to change it the way you want.) Iterate! saves the all these parameters and defaults (as well as the default User Function Filename and the default color for drawing Julia Sets) in a file named "Iterate!.ini". "Iterate!.ini" is located in the directory that Iterate! is in. If you get the colors too goofed up (you can't read text screens or see the graphics screen, for instance), just delete "Iterate!.ini". Everything will return to its default value. Any time, in fact, the program is acting a little strange, it might be a good idea to delete the "Iterate!.ini" file. Doing this restores all these settings to their "factory pre-sets". Special Commands for Julia/Mandelbrot Sets ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ These two commands are designed to be used with Function E, the function that draws Julia Sets. Using these commands along with Iterate!'s usual commands and the file "Mandelbr.gph" gives a powerful method of investigating the properties of Julia Sets. See "Function.txt" under Function E for more details. . The command only works if Function E is selected as the current function. draws the Julia Set associated with Function E and the current parameters. Pressing is exactly the same as selecting Function F, retaining graphics window and parameters, iterating a point 10000 times, and then changing back to Function E. Using , however, is much easier than doing all that. You will want to use whenever you are working with Function E. See "Function.Txt" for more information. . Zips the coordinates of the graphics screen into the parameters. The x value of the screen coordinate becomes parameter 'a' and the y value becomes parameter 'b'. You are presented with a menu with these new values, and have the opportunity to change any of the parameters or window coordinates before accepting the new values. is designed to be used with Function E and the file "Mandelbr.gph". Here's how you should use it. 1. Use the command and choose Function E. 2. Use the command and 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. DOS Commands ÄÄÄÄÄÄÄÄÄÄÄÄ . saves the current graphics screen. A saved picture take between 16,000 bytes (CGA mode) and 170,000 bytes (VGA2 mode) of disk space. Iterate! asks for a file name WITHOUT the extension. The reason for this is that when you save your graph, Iterate! actually makes two files, one with the extension ".gph" and the other with the extension ".inf". The ".gph" file is the actual graphics screen, while the ".inf" file contains information about the graph (which function is used, parameters, graphics window, iteration stack, etc.). If you're short on disk space, you might try running the program in CGA or Hercules Graphics mode (if your graphics card is compatible with one of these), because saving a graph created in these modes takes much less disk space than one created in EGA or VGA modes. See "GRAPHICS MODES" below for more details. Iterate! saves the screen in its own proprietary graphics format (don't tell anybody, but actually it's nothing but a massive memory dump). So it isn't compatible with any other graphics file formats. Sorry. If you really want to save your beautiful screens in a graphic format such as .bmp or .gif, there are screen grabber utilities around that will do it. Or if you have a 386 or better and run Windows in advanced mode, you can run Iterate! in a window, hit to copy the window to the clipboard, and then paste the window into PaintBrush (Ctrl-V). There you can print it or save it to your heart's delight. . retrieves a graphics screen that you have previously saved. One warning: don't try to retrieve a graphics screen that you saved in a different graphics mode. Iterate! isn't able to change graphics modes in mid- stream, and take my word for it--your graph will look pretty darn funny. If you want to retrieve such a graphics screen, you will have to re-start Iterate! in the graphics mode you saved it in. (See the section below on "Graphics Modes" for more information on how to do this.) . lists the files in the directory you specify. . shells out to the operating system. Once you have shelled out, type "exit" to return to Iterate!. This command is very useful. You can leave the program for a moment to do some housekeeping--copy or erase files, for instance--and then return to Iterate! with everything still intact. Iterate! won't be able to shell to DOS if there is insufficient memory. If you have about 300K-350K free when you start Iterate!, you should be safe. Iteration Stack Commands ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Iterate! provides a stack of iteration points that can be iterated in sequence, automatically. Several commands allow you to enter points on the stack and then iterate them. The idea behind the iteration stack is this: Suppose you are investigating a function, and you are looking at a rather high magnification so that it takes 200000 iterations of each point just to get a clear picture on your screen. If you had to enter each point individually and wait for 200000 iterations, it would take forever. But, using the iteration stack, you can enter 40 points all at once, and then set them to iterating automatically. When you wake up the next morning, your spiffy picture will be all done. Also, you can interrupt the automatic iteration process (just press any key when it is iterating and it will stop). If you then press again, the automatic iteration will resume where it left off. Another advantage of the iteration stack is that you can save an interrupted iteration. Iterate! saves information about the iteration stack in the ".inf" file. So you can interrupt an automatic iteration, and save it, then later retrieve it and continue where you left off. Yet another advantage (wow! isn't this a really great feature?) is that Iterate! keeps track of the endpoint of each iteration point on the stack (i.e., where the point ended up after it was iterated). You can add the endpoints back onto the iteration stack and continue iterating them. So suppose you've iterated 40 points on the iteration stack 20000 times each. You decide this isn't enough--you need to iterate them another 20000 times. This is easy--you just add the endpoints onto the stack (using the command), and iterate them another 20000 times. Here are the iteration stack commands: . automatically adds points to the iteration stack. The points added by are in a rectangular array, evenly spaced around the current graphics window. When you press , Iterate! will ask you how many points you want in the X direction, and how many in the Y direction. If you enter the defaults of '7' and '6', this will enter 42 points, in a rectangular array on the screen.

.

allows you to individually enter points to the iteration stack.

works differently, depending on whether you're on the graphics screen or the command screen when you press it. Pressing

on the graphics screen enters the point at the crosshairs to the iteration stack. Pressing

at the command screen allows you to enter points by typing in the x and y values. This is kind of a pain (I don't recommend that you do this often), but it's useful if you want to enter a specific value (i.e., x=3.1416 y=19823.245224349546129524). . adds the endpoints of the points you specify onto the stack. This way, you can add further iterations to these points. You have three options for the endpoints you want to add: 1. Add endpoints of all points on the iteration stack. This, of course, does just what it says. 2. Add endpoints of the last batch of points iterated. The "last batch" means the points that were iterated the last time you pushed . Usually, this is the option you want. 3. Add endpoints of the points you specify by number. Iterate! numbers the points on the stack, starting naturally with 1. You can see how the points are numbered, as well as the X and Y values of the points by pressing . Using this option, you must enter the number of the first point and the number of the last point you want to continue iterating. Use this option only if for some reason you want to continue iterating only one or two specific points. . lists all points on the iteration stack: their point number, X value, and Y value, and the X and Y value of their endpoints. also gives other relevant information on the iteration stack: how many points are on the stack, how many have been iterated, and which points were iterated in the last batch. . iterates the points on the iteration stack. Each point is iterated the number of times you specified with the command. You can interrupt by pressing any key. Resume where you left off by pressing again. User Function Commands ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ . allows you to test the user function. Just enter the X and Y values you want to evaluate, and Iterate! shows the X and Y values the user function returns. (See the section on "USER FUNCTION" for more details.) . allows you to edit the current user function file. You are first presented with a menu that allows you to choose the User Function Filename. You can choose one of the pre-existing files, or type in a new name if you want to start a new User Function File. Your User Function should end with ".frm"; Iterate! changes the extension to ".frm" no matter what you try to put in. The User Function Filename you select here becomes the default User Function Filename--this file will be used as the User Function File until you press and select a different file. After you have selected the User Function File, you can edit it. Change it any way you want, and press when you're done. (See the section below on "The User Function" for more info on how to do this.) When you finish editing the file, Iterate! reads the file in as the current user function, sets the Function to U, changes the Parameters to the default parameters in the function file, and changes the Graphics Window to the default graphics window entered in the function file. In other words, after you edit the function file, Iterate! sets you up to try out your changes (why else would you have been editing it?). By default, Iterate! uses its own small built in text editor. With this editor, you are limited to a 22 lines of 75 characters each. For most User Function Files, this should be more than sufficient. However, if you want to be able to edit longer files, or if you have another (small) text editor you like better, Iterate! allows you to specify a text editor to use in editing the User Function File. Just use the command (see the command above for more details). Warning: Any file you edit with Iterate!'s built in User Function Editor will truncate the file at 22 lines of 75 characters each. If you inadvertently load a longer file into the User Function Editor, just use to back out and your file will be unharmed. See the section on "USER FUNCTION" for more details about how to make your own User Function Files. Edit Menu Commands ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Whenever you're in an edit menu, the following commands are operative: or accepts all values. or aborts and sends you back to the command screen. All values revert to their previous state. returns the current field to its default value (what it was before you started typing). deletes from the current cursor position to the end of the field. deletes from the current cursor position to the beginning of the field. All the other keys work pretty much the way you'd expect them to. THE USER FUNCTION ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ One of the spiffiest features of Iterate! (if I do say so myself) is the user function. The User Function allows you to enter your own function in a User Function File. The program then treats this function just like any other function--you can choose it, set parameters, and iterate it. Using the command and choosing Function U makes the User Function the current function. The first time you use Iterate!, the User Function File is named "Iterate!.frm". You can use the command to select different User Function File, edit the current User Function File, or make a new User Function File. Several examples of user functions are distributed along with Iterate!. These all have the extension ".frm". To try out these formulas, just choose and select the file you want to try. I suggest looking these over to see what kinds of things you can do with the User Function; this will probably tell you more about programming user functions than what I'm about to say. User Function Files are just plain old text files, so if you're not in Iterate!, you can edit them with any text editor, such as "Edit" that is distributed along with DOS. If you don't like Iterate!'s built in User Function File Editor, you can use your own text editor to edit User Function Files from within Iterate!. See the command above for more info. Iterate! pre-processes the User Function so that it is quite fast--only 60-80% slower than the built in functions. Not bad, considering that the built in functions are compiled while the User Function is interpreted. If you come up with a good function file, I am interested in hearing about it. Send me a disk or printout, or use e-mail. I will distribute the best User Function Files (with credit given where due, of course) with future versions of Iterate!. All right, now down to the nitty-gritty . . . The User Function File ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Here's an example of a typical user function file: ................................................................................ ;This is the name. It will be displayed at the command. N X= cx + cos(ay) + sin(mu x) Y= dy + sin(bx) ;These are the default values for the parameters a=1 b=.5 c=1 d=1 mu=.2 ;These are the default values for the graphics window xmin=-20 xmax=20 ymin=-20 ymax=20 ;This is the actual function x= c*x + cos(a*y) + sin(mu*y) y= sin(b*x) + d*y ................................................................................ The file consists of three parts: The name, the defaults, and the function. The three parts can be in any order. The name and the defaults are optional. Only the function is required. General Notes: All leading and trailing blanks are ignored. Comments can be entered by starting the line with a semi-colon. Anything the formula interpreter doesn't understand is simply ignored; you may or may not get an error message when the program reads in the function file. Upper and lower case can both be used; it makes no difference. >The name< The name is totally optional. If you don't enter a name, the program will automatically make a name from the function formulas you entered. Suppose, however, that you don't want your formula to have just a plain vanilla algebraic name. Suppose you want it to have a really spiffy name like 'Phred's Phantastic Phormula Phor Phabulous Zucchini Phry Bread'. Well, unless you took a very different algebra class than I did, this name really isn't going to work out as your function formula. So the name line lets you specify 'Phred's Phantastic Phormula . . .', or whatever else you might want, as the name. Begin the name line with 'N'. Everything after that is the name of the function. Spaces between the 'N' and the next character are ignored. The name can be at most 75 characters long. If the name is too long, it will cause weird things to happen to the display. >The defaults< These are the parameters and window settings that will be entered if the user wants the default parameters and windows settings. If you edit the User Function File using the command, these parameter and window settings will be automatically entered as the parameters and window when you're done editing. The lines beginning with a=, b=, c=, d=, and mu= refer to parameters. The lines beginning with xmin=, xmax=, ymin=, and ymax= refer to the graphics window. The defaults are totally optional. Some, all, or none of them may be entered. However, they are nice for the user (and even yourself), because the values can be ever after entered automatically if you set them once in the file. All 9 possible defaults are shown in the example above. Each must be on a line of its own. Spaces are allowed anywhere as "window dressing"; they will be ignored. The number you enter after the equals sign must be able to be interpreted by TurboPascal as a real number. Otherwise, it will be interpreted as '0'. A few examples: Example Remark ÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ a = 1.09 OK mu= -3.43 OK xmax=1e9 OK--this means 1*10^9 y min= 1 0 OK (But c'mon--try to learn how to type. It's not that hard) b=i89 Bad--Pascal can't interpret 'i', so sets b=0 c=x Sorry, won't work. Try a real number instead. >The function< This is the trickiest part. The 'x=' introduces the x part of the function, the 'y=' introduces the y part of the function (for the reason there are two parts to the function, read above under the command). The functions are entered in the usual algebraic notation. Spaces are allowed, but they are "just for looks" and will be ignored. Example Remark ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ y = cos(x*y) All these lines will be interpreted y=cos(x*y) the same way y= cos ( x * y ) The function must be on one line. However, this line can be up to 255 characters long. (Iterate!'s built in text editor only allows lines of 75 characters, so if you want to enter functions longer than 75 characters, you must use your own text editor to edit the User Function File. Remember that you can use the command to change the text editor Iterate! uses.) Here are the things you can enter in a function: Item Example Remark ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Variable x y The value of x or y Parameter a b c d mu The current value of this parameter Constants e pi Enters the value of these constants Numbers 5 1e3 .35 Must be able to be interpreted by TurboPascal as a number functions cos sin (etc.) Performs the operation--a complete list of recognized functions follows algebraic operators + - * / ^ Performs the operation Parentheses ( ) Iterate! can handle as many nested parentheses as you can fit on a line. (It can handle up to 500 pending operations. If anybody can figure out how to get 500 pending operations on a line with 255 characters, I'd like to hear about it!) This is a list of all operations available in the User Function. Name Remarks ÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ * Multiplication / Division + Addition - Subtraction (Note: '-' in front of a number, variable, or parameter gives the additive inverse, just as you'd expect. That is, -3--1=-2, and -x+y is the same as y-x. You'd better appreciate this, because, believe me, it was a big pain to program. Whoever invented mathematics ought to be shot for allowing one symbol to stand for two different things.) (See also Note 5.) ^ Exponentiation, i.e. 2^3=8 # Integer division, i.e. 12#5=2, 21#4=5, 100#49=2. Division by zero returns 0, i.e. 100#0=0. | Modulus, that is, a|b is the remainder of a/b. For instance 12|5=2, 21|4=1, 100|49=2. x|0=0 for all x. sqr the square of the number, i.e. sqr(10)=100. Sqr(x) should be faster than x*x sqrt the square root of the number, i.e. sqrt(100)=10. Sqrt of a negative number returns 0. sin All trig functions are calculated in radians cos tan cot sec csc arcsin Results of inverse trig functions are given in radians arccos arctan arccot arcsec arccsc sinh Hyperbolic trig functions. These functions have tendency to return cosh very large and very small numbers. Any result larger than 1e16 tanh is simply truncated to 1e16. Any result smaller than about 1e-16 coth is simply set to 0. sech csch arcsinh arccosh arctanh e enters the value of e=2.71828... pi enters the value of pi=3.141592... exp exponential of the number, i.e. exp(1)=2.71828, exp(2)=7.38905 exp10 10 to the power of the number, i.e. exp10(1)=10, exp10(2)=100 logn natural log, i.e. logn(e)=1. Logn of a negative number returns 0. log log base 10, i.e. log(10)=1. Log of a negative number returns 0. inv multiplicative inverse, i.e. inv(x)=1/x. This should be faster, however, than 1/x neg additive inverse, i.e. neg(cos(x))=-cos(x). Use 'neg' instead of '-' if you wish to restore symbolic purity to mathematics and keep programmers out of the loony bin. Just as fast as '-', might work more reliably, and it's _unambiguous_. abs absolute value, i.e. abs(3)=3, abs(-3)=3 sgn the sign of the number, i.e. sgn(10)=1, sgn(-10)=-1, sgn(0)=0 int next integer smaller in absolute value, i.e. int(1.4)=1, int(-3.5)=-3 round rounds to the nearest integer, i.e. round(2.1)=2, round(3.6)=4, round(10.7)=11. .5 rounds to the next larger integer in absolute value, i.e. round(2.5)=3, and round(-2.5)=-3 rn a random real number between 0 and 1 (more precisely, rn may equal zero, but will always be less than 1) intran a random whole number less than the argument and greater than or equal to zero, i.e. intran(10) is somewhere in the range 0..9 (Actually I have heard that there is a bug in the TurboPascal random number generator that will make rn=1 and intran(10)=10 two times or so out of every billion. If this disturbs you, I suggest that you write a nasty letter to Borland.) NOTES: 1. Normal algebraic precedence of operation is used: Function Precedence ÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ sin, cos, 1 highest precedence (P.S. also includes '-' when used as a all other unary operator--did I tell you it was unary a pain?) functions ^ 2 *,/,#,| 3 +,- 4 lowest precedence 2. The User Function Interpreter attempts to prevent overflow errors. If the absolute value of x or y is greater than 1e16, the function simply does not calculate--x and y are left unchanged. If your function is really wild, though, you could possibly generate overflow errors. If this happens, the program will stop and display a runtime error. 3. The Interpreter also attempts to prevent division by zero errors. If division by zero is attempted (or anything similar such as cot(0)), 1e16 is simply substituted as the result. 4. Some functions are undefined for negative numbers (sqrt, log, logn). If you input a negative number into these functions, they will simply return 0. This is again to prevent runtime errors that would halt the program. The problem with this, however, is it can give unexpected results--the function looks like it is doing something, when really it is in an area where the function isn't even defined. I suggest using the 'abs' function in conjunction with these functions, i.e., use sqrt(abs(x)) instead of just sqrt(x). Or just don't use points that will give a negative result. At any rate, be a little wary of results using these functions. 5. One thing the Function Interpreter will not handle is things like this: --(x+5), --x, y+--x As you can see, there is a double (unary) negative sign in each of these functions. Don't use this, as it will give unexpected results. (Don't ask me WHY you would want to do this anyway, but I'm sure there is somebody out there who is going to be bitterly disappointed that they won't be able to put a bunch of superfluous minus signs in all their functions.) The Function Interpreter WILL handle things like this: x--5, -(-(-x+-5)), neg(neg(neg(-5))), x--(-5--y) Notice that there are double minus signs here, but in every case, one of them is a binary minus sign (subtraction) and the other is unary minus sign (negative sign). Two or more unary minus signs in a row is what the Function Interpreter can't handle. Here are some examples of functions, just to give you an idea of the types of things you can do. Example Remark ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ x=x*sin(a*y/x^5) Normal algebraic precedence is observed y=y/-a*log(x*(y+b)) Nested parentheses allowed x=x + CSC (Y) Spaces are OK; upper case is OK y=(x+y)*pi x= rn * abs(x) y= y | intran(5) x= y # x y= log(e * x) x= sin(x*pi/180) y= sgn(a*x+b*cos(y))#x User Function Error Messages ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Iterate! tries to detect errors in the function file and give helpful error messages. Iterate! reads the User Function on three occasions: 1. When you start the program 2. When you return from a DOS shell 3. After you use the command to edit the User Function File So these three occasions are when you may see error messages related to the User Function File. Because of the way Iterate! processes the function file, it is difficult to point out after the fact exactly where the error occurred. So you have to take Iterate!'s error messages with a little grain of salt. If Iterate! says the error occurred at "cosx", then the error probably happened at or near "cos" or "x" in your file. If an error occurs, you will still be able use the User Function (of course it may not be working properly!). On the other hand, it is possible that Iterate! won't give you an error, but the function still won't be working properly--either because Iterate! thinks it understands something that it really doesn't, or simply because you didn't enter what you really meant. This could create problems, but the solution is really quite simple: Use the command to test your function. Calculate a couple of values by hand, and then enter these same values at the command. If you get the same answers as you did by hand, you can be pretty darn sure that the function is working right. GRAPHICS MODES ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Automatic detection ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Iterate! automatically detects CGA, EGA, VGA, and Hercules graphics and starts you in the right graphics mode. If you don't have one of these adapters, or if Iterate! can't detect which adapter you have, it will kick you into a graphics menu when you first start the program. You can manually choose your graphics adapter and mode. Just type the number of the proper graphics adapter and mode when they are requested. Because it is impossible to tell which graphics adapters might be compatible with which graphics modes, the program puts no restrictions on which adapter you may choose. If you choose an incompatible adapter, however, you might hang your computer. If this happens, try pushing to exit the program. If this doesn't work, you will just have to reset the computer. >Choosing graphics mode at the command line< If you don't like the mode Iterate! puts you in automatically, you can specify a different graphics mode from the DOS command line. These command line options are available: Command What it does ÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Iterate! CGA CGA mode 4 Iterate! EGA EGA mode 2 Iterate! Herc Hercules mode 0 Iterate! VGA VGA mode 1 Iterate! VGA0 VGA mode 0 Iterate! VGA1 VGA mode 1 Iterate! VGA2 VGA mode 2 Iterate! Man Allows you to manually choose graphics modes There should be a space (not a slash, dash or anything else) after Iterate! and before the command line option. Upper or lower case is OK. Compatibility ÄÄÄÄÄÄÄÄÄÄÄÄÄ Iterate! has been thoroughly tested with CGA, EGA, VGA, and Hercules graphics adapters, and should work fine if you have one of these. If you have anything else, it might work, but I don't guarantee anything! If you can't get the program to work any other way, you might try CGA, EGA, or VGA mode. Most graphics adapters are compatible with one of these. Memory restrictions on graphics mode ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Iterate! Saves your entire graphics screen to memory when it switches to text mode. As you can well imagine, this takes a huge chunk of memory--around 170,000 bytes for VGA2 mode (640x480, 16 colors). At startup, Iterate! reserves about 180,000 bytes for storing the graphics screen. So what's the point? If the graphics mode you choose requires more than 180,000 bytes of storage, choosing that mode will generate a run-time error (a heap overflow error, just in case you're interested). So . . . . . . don't choose a graphics mode that requires more than 180K of memory! Anything with a resolution of more than 640x480 or with more than 16 colors is likely to require more than this. You're welcome to give higher resolution/color modes a try. You won't hurt anything. If you run into problems, just choose a lower resolution mode or a mode with less colors. 256 colors won't do you any good in this program anyway! It's all 2 colors-- black and white. Anything more than that just bogs things down and makes the save files that much bigger. MOUSE ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ The mouse utilities I used in Iterate! will supposedly work with any Microsoft compatible mouse. I have tested it with GMouse (the Genius Mouse Driver) version 8.08, Logitech's Mouse Driver version 6.12, and Microsoft Mouse Driver version 8.10. If the mouse doesn't work right with Iterate!, you can try a few of things: * Get an updated mouse driver. Your older mouse driver might not be compatible with newer video modes or a later Microsoft mouse standard. You should be able to get an updated mouse driver from the manufacturer or the place you bought the mouse. Sometimes manufacturers distribute updates electronically; you may be able to find a driver that works on a local BBS. * Just use the keyboard. You can do anything with the keyboard you can do with the mouse (OK, OK, it's not as much fun, but that's the breaks, kid). * Prevent Iterate! from using the mouse by typing "Iterate! nomouse" at the command line. Then just use the keyboard. You should try this if you're unable to make the cursor move to all parts of the graphics screen; the problem in this case is the mouse driver, not Iterate!. * Report the problem to me. Especially if you're a registered user (!!) I might be able to figure something out. One little mousey bug: if you are moving the mouse when you start the program (when Iterate! is running its mouse initialization routines), Iterate! won't recognize the mouse and you won't be able to use it. This seems to be a bug in the mouse driver itself, or in the mouse utilities I am using. Sorry. PRINTING ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ For printing your creations, I suggest using "Graphics.exe" or "Graphics.com" that comes with your copy of DOS. Just type "Graphics" at the DOS prompt, before starting Iterate! (Make sure Graphics.exe or Graphics.com is in your current directory or path. Usually, it is found in the DOS subdirectory, which is in usually in your path, so just typing "Graphics" will work.) Then, when you're in Iterate!, press , and whatever you're looking at will be printed out to your printer. If this doesn't work, check your DOS documentation under "Graphics" or your printer documentation under "Printing the Graphics Screen." If you have a 386 or better computer, it is also possible to print a graphics screen using Windows. Run Windows in advanced mode, and then run Iterate! in a window. Then will copy the current window to the clipboard. You can run your favorite graphics program, paste the Clipboard into it, and print from there. RUNTIME ERROR MESSAGES ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ On some (hopefully very rare) occasions, Iterate! will terminate abnormally because of an unexpected runtime error. If this happens, Iterate! will present you with a screen telling you the type of error that happened and (if you're lucky) giving you a chance to save your graphics screen. If this happens to you, I would appreciate it if you would write and tell me what happened, what error message and error address were reported, and what you were doing at the time. It would also be helpful if you would describe your system (CPU, video card and mode, mouse driver, etc). Here are a couple of the more common errors and what might be causing them: Heap OverFlow Error ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This is most likely to happen if you choose a high resolution video mode and you don't have enough memory free (or if Iterate! automatically chooses such a video mode for you). It can also happen if you try to load a graphics file from disk, and the graphics file was made in a higher resolution video mode than you are currently using. This error happens because when you switch to a text screen, Iterate! saves the current graphics screen to conventional memory (on TurboPascal's "heap"). If there isn't enough conventional memory free to save the graphics screen, you get a heap overflow error. Solutions: * Choose a lower resolution video mode. (See "GRAPHICS MODES" for more details.) * Remove Unnecessary TSR's. * Change your config.sys and autoexec.bat files so that less TSR's are loaded at startup. * Use Himem to load DOS high. * Use EMM386 or a similar memory manager to load your TSR's high. "Floating Point Overflow Error" and "Division by Zero Error" ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ These errors and other similar errors ("Underflow" or "Overflow" Errors or any kind of "Floating Point" error) are most likely caused by the User Function. Iterate! tries to prevent these kinds of errors, but it is probably possible to cause them if you try hard enough. If this happens, I would appreciate it if you would write me with the function and the values that caused the problem. Other possible causes are the built in functions, or a corrupted .exe file. Solutions: If you think the User Function caused the problem: * Change the User Function * Don't enter very large or very small values (greater than 1e16 or less than 1e-16) Otherwise: * Write me for an uncorrupted Iterate!.exe file MISCELLANEOUS PROGRAM INFO ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Iterate! is written in TurboPascal 7.0. Believe it or not, I have been working on Iterate! off and on for about two years now. It began life on my XT compatible, in TurboPascal 3.0. Iterate! has a cousin, Itermold, which translates these iterated points into music. Unfortunately, Itermold is nowhere near public release, and probably never will be. It sounds really nice on my synthesizer, though. If you have any questions, comments, or suggestions about Iterate!, you can contact me at 986 Raymond Road Fruit Heights, UT 84037 USA voice phone: (816) 356-1740 or (801) 544-5032 Internet : bhugh@vax1.umkc.edu FidoNet : Brent Hugh 1:280/305 I might be able to add any particular features you would like (additional functions for the User Function, etc.) I would particularly like to hear about any bugs you find. UPCOMING ADDITIONS ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ I am planning to add some features to the next version of Iterate! Send your registration fee in, and I'll get them done faster! Also, registered users will receive a copy of the latest version . . . and by the time you're reading this, maybe the latest version with these spiffy new features is all finished. Coming attractions . . . * Save graphics files in a better format such as GIF or PCX * Provide built in printer support * Iterate in 3-D * Add more Mandelbrot-Julia Set type functions that can be investigated by using Iterate! and the Mandelbrot-Julia generator together * Improve User Function to use If-then statements * Add support for complex numbers to the User Function * Improve help system * Specify default number of iterations in User Function Files * Use colors to show how many times a point has been hit * Make it smaller and faster * Anything you would like and let me know about BIBLIOGRAPHY ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Most of these books should be available at your local bookstore. Others can be ordered from Math Products Plus, PO Box 64, San Carlos, CA 94070, (415) 593- 2839. Computers and the Imagination, by Clifford A. Pickover. St. Martin's Press, New York, 1991. Poses fascinating problems; a lot of interesting references. Computers, Patterns, Chaos, And Beauty, by Clifford A. Pickover. St. Martin's Press, New York, 1990. The Fractal Geometry of Nature, by Benoit Mandelbrot. Freeman, San Francisco, 1983. The seminal book on fractals; relatively non-technical. The Beauty of Fractals, by H. Peitgen and P. Richter. Springer, Berlin, 1986. Fabulous color pictures of fractals make up the bulk of this book. The Science of Fractal Images, by H. Peitgen and D. Saupe. Springer, Berlin, 1988. Chaos, by James Gleick. A popularization of chaos theory and its many real world applications. Available in many bookstores. An Introduction to Chaotic Dynamical Systems, by R.L. Devaney, Benjamin- Cummings, Menlo Park, California, 1986. A very good introduction to the more technical side of Iteration Theory. It is comprehensible by anyone who has had a couple of semesters of calculus. Turbulent Mirror--An Illustrated Guide to Chaos Theory & the Science of Wholeness, by J. Briggs and E. D. Peat. Another popularization with plenty of pictures. Fractals, by Jens Feder. Plenum, 1988. Fractals Everywhere, by Michael Barnsley. Academic Press, 1988. Various articles in Scientific American on fractals and chaos. The math and computer columns in Scientific American regularly have interesting articles. (Ver. 3.11, 9/93)