Programming Praxis – Mandelbrot set

Fractals are one of the prettier applications of mathematics. A fractal is an infinitely detailed figure that contains copies of itself at higher magnification levels. Easily the most well-known fractal is the Mandelbrot set, named after its discoverer Benoît Mandelbrot, who also coined the term fractal.

The Mandelbrot set is defined as all the points c on the complex plane for which the absolute value of zn remains less than or equal to 2, where zn is defined as:

z0 = c
zn+1 = zn2 + c

While technically n should be allowed to run to infinity, this is obviously not very practical, so an arbitrary n is chosen, with higher values obviously being more accurate.

Your task in today’s exercise is to write a very simple visualizer for the Mandelbrot set; none of the fancy colors from more advanced implementations, just plain old ascii symbols. When you are finished, you are welcome to read a suggested solution below, or to post your own solution or discuss the exercise in the comments below (to post code, put it between [code][/code] tags).

 
 
 

Since the Mandelbrot set is defined on the complex plane, we’re going to be working with complex numbers.

import Data.Complex

Since we’re not exactly working at a very high level of detail, 50 iterations will be plenty.

mandelbrot :: Num a => a -> a
mandelbrot c = iterate (\z -> z^2 + c) c !! 50

Generating the Mandelbrot set is a simple matter of generating a series of points between the given limits using the given resolutions and testing them, assigning stars to the points in the set and spaces to those outside.

display :: Float -> Float -> Float -> Float -> Float -> Float -> String
display x1 x2 resx y1 y2 resy = unlines
    [[if magnitude (mandelbrot (x :+ y)) <= 2 then '*' else ' '
     | x <- [x1, x1 + resx .. x2]] | y <- [y2, y2 - resy .. y1]]

If we choose the correct boundaries we will see the familiar shape of the Mandelbrot set appear.

main :: IO ()
main = putStrLn $ display (-2.1) 0.5 0.025 (-1) 1 0.05
                                                                               **                        
                                                                           *********                     
                                                                           ********                      
                                                                           ********                      
                                                                    *   * **********   *                 
                                                               **     ********************               
                                                              ******************************* ***        
                                                              ***********************************        
                                                          ** ***********************************         
                                                            **************************************       
                                                        *********************************************    
                                                         ******************************************      
                                      **  ******       *********************************************     
                                      *************     ********************************************     
                                    *****************  *********************************************     
                                   ******************* ********************************************      
                              **** ***************************************************************       
     ******************************************************************************************          
                              **** ***************************************************************       
                                   ******************* ********************************************      
                                    *****************  *********************************************     
                                      *************     ********************************************     
                                      **  ******       *********************************************     
                                                         ******************************************      
                                                        *********************************************    
                                                            **************************************       
                                                          ** ***********************************         
                                                              ***********************************        
                                                              ******************************* ***        
                                                               **     ********************               
                                                                    *   * **********   *                 
                                                                           ********                      
                                                                           ********                      
                                                                           *********                     
                                                                               **                        

Sure, it’s rudimentary, but then again it’s only four lines.

About these ads

Tags: , , , , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


Follow

Get every new post delivered to your Inbox.

Join 35 other followers

%d bloggers like this: