Wednesday, October 8, 2014

Making the Mandelbrot

I've taught students to draw fractals like the Koch Snowflake in Logo and Python. The Sierpinski triangle and the Dragon Curve aren't hard to figure out, either. But the Mandelbrot Set always seemed like a different animal altogether. Sure, every math textbook has pictures of the famous pear-shaped fractal, but none teach you how to create it. Students and teachers get the feeling it must be something unapproachable, requiring years of training, but, predictably enough, a computer makes it easy.

It boils down to taking a point in the complex plane and iterating it using the formula:


c is a complex number of the form a + bi, where i is the square root of -1. Z is set to 0 initially, then you square it and add c. The result becomes the new Z. Square it and add c. Repeat a bunch of times. I think it's a great exercise for Precalculus students to write a program to do this.

As Paul Lutus explained visually, most points will get really large, and fly off out of the "control radius":


the ones that stay within the control radius are in the Mandelbrot Set.



So at first the set of points that don't fly off is big:



But iteration by iteration more and more points fly off ("diverge") and the blob starts to take the shape we know and love:




The challenge is how to take points (especially ones with a real part and an imaginary part) and put the coordinates into a function over and over. Many online examples require the use of numpy and other (very useful) Python add-ons, but I wanted to do it with only "stock" Python tools.

First I had to define a function to square the complex number a bunch of times. Every programming language has a way to handle lists, and Python's way is pretty easy. I made a 2-item list of numbers: the first item is the real part of the complex number and the second item is the imaginary part. Here's how to represent the complex number 2 + 3i:


Anybody familiar with multiplying polynomials can get their noggin around this:


The only thing separating this Precalculus exercise from an Algebra one is imaginary numbers, which I've mentioned before. When the imaginary part is squared it becomes real but negative. Now squaring complex numbers is easy:


This means the square of 2 + 3i is -5 + 12i and the square of 1 - i is -2i (the real part of the last list is zero).

Now it's just a matter of calling the squareZ function then adding c back in. This next function just tells you whether the squaring-adding is making the numbers get really big. If so, the original c is not in the Mandelbrot set.


If after all your iterating the point hasn't gotten more than 2 units away from the origin it's in the Mandelbrot set. So in the above blobs that point would be colored black. That was the tricky part. What's the best way to display the results? Will the easiest way look the best?

The original output in 1978 was text, and Paul Lutas' page contains the code needed to generate it. Here's my version, which didn't all fit on the screen at once:


It's exciting just to get that far! But I knew my students would probably want something more professional looking.

In his excellent book Python for Kids, Jason Briggs showed how to use Tkinter, the default graphics module in Python, to draw shapes and create a video game. So in my program the loops go through the rows and columns of the screen, iterating each point and coloring those in the Mandelbrot Set black. In an 800 x 800 screen that means it has 640,000 points to iterate!

To set up the screen, you have to import tkinter and put this code at the top of the program:


Finally, the main loop of the program looks like this:


The program starts at (xlow, ylow) and checks the point. If it stays within the control radius after 20 iterations it creates a one-pixel black square, otherwise it doesn't do anything and moves on to the next point. Here's how it looks:



The color pictures you see online are made by coloring the points that diverge every step. This requires some changes to the code (which I'll spare you) but it makes it look pretty. You'll recognize the colored shapes as the black blobs from above:



Python is a (relatively) easy way to explore ideas like iteration that would otherwise be impossible with just pencil and paper. Try it!

Sunday, December 29, 2013

Hacking Math Class with Python

I posted my Elliptical Orbits video to a math teachers' Google group and it got around to somebody in the Bay Area Python Interest Group. They invited me to LinkedIn headquarters in Mountain View, CA to talk about using technology and Python programming to help teach and learn difficult concepts in math and science.



I definitely wasn't there to teach anybody anything, but just to share my experiences combining math and computers. As you can see in the video, people were making great suggestions, so I learned a lot, too!

Sunday, December 15, 2013

Let it Snow (flake)

If you're interested at all in learning or teaching math, you either have already read or you should probably read Don Cohen's mind-blowing Calculus By and For Young People, a tiny book that packs a huge wallop. In it, "The Mathman" busts the myth that you need 11 years of school math to even approach the ideas in Calculus by showing the work his students (children as young as 7) have done on infinite series, fractals, derivatives and integrals, pi, e and of course the Fibonacci Numbers. And continued fractions. And nested square roots.

Recently Don sent me some work a student did on converting repeating decimals to fractions. It reminded me of how long I studied Chapter 1 of his book a decade ago. Every math student I taught after that got to play around with infinite series until they discovered the deceptively simple formula Cohen reveals on page 9.

The book bounces around playfully until returning to the topic with Chapter 4: The Snowflake Curve, the greatest eight pages of any math book ever written. The aforementioned formula is used to calculate the area inside the Koch Snowflake fractal. The power and simplicity of the ideas in this tiny book still make me shake my head in disbelief. Buy it and do the math.

Drawing the Koch Snowflake was one of the programming projects I did recently with the students I teach at the Summit Charter schools in the SF Bay Area.

The challenge is to start with a triangle (level 0) and add little angles to the middle of every segment. Repeat for higher levels. 



The graphics above were made using the NetLogo application of the Logo programming language. But how do you get a turtle to stop in the middle of a segment? The answer is recursion. 

All the code necessary was found in Turtle Geometry by Ableson and diSessa, another brilliant book, which I found at a not-nearby library and bought shortly thereafter. I only had to modify the code a little to work in NetLogo, and surprisingly, the program is short and simple:


The "snowflake" procedure simply draws a triangle with three sides. It's the "sideprocedure where the magic happens. I had to tell the turtle how to make the little bend in the side. But notice that the "side" procedure contains the command "side"! It's like a recipe for baking a loaf of bread including the step "bake a loaf of bread." That's recursion. We humans would stop in our tracks at such a command but I guess computers have no problem with it. Anyway, you can have fun making a computer draw a curve with an infinite perimeter and a finite area or you can sharpen your pencil and prove it yourself!

Wednesday, December 4, 2013

3D Harmonographs

Success! I looked through this guy's site and found the equations for the x-y motion of the "pen" drawing a harmonograph. He shows a Mathematica program that uses sliders to dynamically change the frequencies, phase shifts and decay constants and immediately see the finished harmonograph.

When I wrote those equations in a Python program it came out perfect. It takes my program a while to draw the image, but then so do real harmonographs.

I had other ideas, though: moving the sliders, I couldn't help but feel like the images were a 3D object being rotated. Then it hit me: I could draw harmonographs using a Visual Python program where one sphere (the "pen") goes back and forth in all 3 planes! I think it worked pretty well. Check it out:


Monday, December 2, 2013

Harmonographs

For years I've been fascinated with harmonographs, even before seeing one at the SF Exploratorium. Of course it made me want to create a virtual one on the computer, but the equations modeling the movement of the x- and y-coordinates of the drawing point were kind of confusing.

Visual Python makes it easy to draw in 3-D, but for some reason the paths, even once drawn, start to glitch.

This guy did a great harmonograph in Javascript. Maybe it's time to break out some more JS on Glowscript.org.

I'll keep you posted.


Wednesday, March 13, 2013

Math Through Technology Every Week!

Due to interest from some students of mine and their parents, I'll be holding Math Through Technology meetings at the Learning Studios in Burlingame on Thursday evenings on an ongoing, informal, drop-in basis. It'll be an introduction to computer programming in the context of learning math. Participants can come in and learn how to write some programs in Logo and Python to help visualize geometry and graphics or to aid in the complicated computations involved in higher math.

More information on my website at http://farrellpolymath.com/services/math-through-technology-every-thursday-at-7-pm/

Hope to see you there!

Visual Proofiness

Everybody knows the earth orbits the sun and not the other way around, right? Can you prove it? That's the problem Newton had. How could he prove that all that was needed to create Kepler's elliptical orbits was a force of attraction between the Earth and the Sun and for the Earth to be moving a little? Like a good mathematician he proved it algebraically. You can see a "proof" of this anywhere, but I doubt algebra is enough to convince anybody.

I don't know why Newton didn't just use Visual Python. With surprisingly little coding you can create a 3D world full of balls and boxes and arrows and make them do whatever you like. Now we can create an Earth and a Sun, code in a force of attraction and an initial velocity using vectors (and that's the reason to learn to use vectors!), set the world in motion and see what happens.

Here's how I proved it. (I ain't Vi Hart, so you don't need to hear me narrate.)