Mandelbrot and Julia sets

Plots the Mandelbrot and Julia sets for the map Qc(z)=z2+c in the complex plane.

The Mandelbrot set is the set of complex numbers c for which the function Qc(z)=z2+c does not diverge when iterated from z=0. This set of complex numbers can be visualized by plotting each value for c in the complex plane. The Mandelbrot set is an example of a fractal when plotted in the complex plane.

The Julia set for a given c is the set of complex numbers for which the function Qc(z)=z2+c is bounded under iteration.

AUTHORS:

  • Ben Barros
sage.dynamics.complex_dynamics.mandel_julia.external_ray(theta, **kwds)

Draws the external ray(s) of a given angle (or list of angles) by connecting a finite number of points that were approximated using Newton’s method. The algorithm used is described in a paper by Tomoki Kawahira.

REFERENCE:

[Kaw2009]

INPUT:

  • theta – double or list of doubles, angles between 0 and 1 inclusive.

kwds:

  • image – 24-bit RGB image (optional - default: None) user specified image of Mandelbrot set.
  • D – long (optional - default: 25) depth of the approximation. As D increases, the external ray gets closer to the boundary of the Mandelbrot set. If the ray doesn’t reach the boundary of the Mandelbrot set, increase D.
  • S – long (optional - default: 10) sharpness of the approximation. Adjusts the number of points used to approximate the external ray (number of points is equal to S*D). If ray looks jagged, increase S.
  • R – long (optional - default: 100) radial parameter. If R is large, the external ray reaches sufficiently close to infinity. If R is too small, Newton’s method may not converge to the correct ray.
  • prec – long (optional - default: 300) specifies the bits of precision used by the Complex Field when using Newton’s method to compute points on the external ray.
  • ray_color – RGB color (optional - default: [255, 255, 255]) color of the external ray(s).

OUTPUT:

24-bit RGB image of external ray(s) on the Mandelbrot set.

EXAMPLES:

sage: external_ray(1/3)
500x500px 24-bit RGB image
sage: external_ray(0.6, ray_color=[255, 0, 0])
500x500px 24-bit RGB image
sage: external_ray([0, 0.2, 0.4, 0.7])
500x500px 24-bit RGB image
sage: external_ray([i/5 for i in range(1,5)])
500x500px 24-bit RGB image

WARNING:

If you are passing in an image, make sure you specify which parameters to use when drawing the external ray. For example, the following is incorrect:

sage: M = mandelbrot_plot(x_center=0)  # not tested
sage: external_ray(5/7, image=M)       # not tested
500x500px 24-bit RGB image

To get the correct external ray, we adjust our parameters:

sage: M = mandelbrot_plot(x_center=0)
sage: external_ray(5/7, x_center=0, image=M)
500x500px 24-bit RGB image

Todo

The copy() function for bitmap images needs to be implemented in Sage.

sage.dynamics.complex_dynamics.mandel_julia.julia_plot(c=-1, x_center=0.0, y_center=0.0, image_width=4.0, max_iteration=500, pixel_count=500, base_color='steelblue', iteration_level=1, number_of_colors=50, point_color='yellow', interact=False, mandelbrot=True, period=None)

Plots the Julia set of a given complex c value. Users can specify whether they would like to display the Mandelbrot side by side with the Julia set.

The Julia set of a given c value is the set of complex numbers for which the function Qc(z)=z2+c is bounded under iteration. The Julia set can be visualized by plotting each point in the set in the complex plane. Julia sets are examples of fractals when plotted in the complex plane.

ALGORITHM:

Define the map Qc(z)=z2+c for some cC. For every pC, if |Qkc(p)|>2 for some k0, then Qnc(p). Let N be the maximum number of iterations. Compute the first N points on the orbit of p under Qc. If for any k<N, |Qkc(p)|>2, we stop the iteration and assign a color to the point p based on how quickly p escaped to infinity under iteration of Qc. If |Qic(p)|2 for all iN, we assume p is in the Julia set and assign the point p the color black.

INPUT:

  • c – complex (optional - default: -1), complex point c that determines the Julia set.
  • period – list (optional - default: None), returns the Julia set for a random c value with the given (formal) cycle structure.
  • mandelbrot – boolean (optional - default: True), when set to True, an image of the Mandelbrot set is appended to the right of the Julia set.
  • point_color – RGB color (optional - default: 'tomato'), color of the point c in the Mandelbrot set (any valid input for Color).
  • x_center – double (optional - default: -1.0), Real part of center point.
  • y_center – double (optional - default: 0.0), Imaginary part of center point.
  • image_width – double (optional - default: 4.0), width of image in the complex plane.
  • max_iteration – long (optional - default: 500), maximum number of iterations the map Qc(z).
  • pixel_count – long (optional - default: 500), side length of image in number of pixels.
  • base_color – RGB color (optional - default: 'steelblue'), color used to determine the coloring of set (any valid input for Color).
  • iteration_level – long (optional - default: 1), number of iterations between each color level.
  • number_of_colors – long (optional - default: 30), number of colors used to plot image.
  • interact – boolean (optional - default: False), controls whether plot will have interactive functionality.

OUTPUT:

24-bit RGB image of the Julia set in the complex plane.

EXAMPLES:

sage: julia_plot()
1001x500px 24-bit RGB image

To display only the Julia set, set mandelbrot to False:

sage: julia_plot(mandelbrot=False)
500x500px 24-bit RGB image

To display an interactive plot of the Julia set in the Notebook, set interact to True:

sage: julia_plot(interact=True)
interactive(children=(FloatSlider(value=-1.0, description=u'Real c'...

To return the Julia set of a random c value with (formal) cycle structure (2,3), set period = [2,3]:

sage: julia_plot(period=[2,3])
1001x500px 24-bit RGB image

To return all of the Julia sets of c values with (formal) cycle structure (2,3):

sage: period = [2,3] # not tested
....: R.<c> = QQ[]
....: P.<x,y> = ProjectiveSpace(R,1)
....: f = DynamicalSystem([x^2+c*y^2, y^2])
....: L = f.dynatomic_polynomial(period).subs({x:0,y:1}).roots(ring=CC)
....: c_values = [k[0] for k in L]
....: for c in c_values:
....:     julia_plot(c)
sage.dynamics.complex_dynamics.mandel_julia.mandelbrot_plot(x_center=-1.0, y_center=0.0, image_width=4.0, max_iteration=500, pixel_count=500, base_color='steelblue', iteration_level=1, number_of_colors=30, interact=False)

Interactive plot of the Mandelbrot set for the map Qc(z)=z2+c.

ALGORITHM:

Let each pixel in the image be a point cC and define the map Qc(z)=z2+c. If |Qkc(c)|>2 for some k0, it follows that Qnc(c). Let N be the maximum number of iterations. Compute the first N points on the orbit of 0 under Qc. If for any k<N, |Qkc(0)|>2, we stop the iteration and assign a color to the point c based on how quickly 0 escaped to infinity under iteration of Qc. If |Qic(0)|2 for all iN, we assume c is in the Mandelbrot set and assign the point c the color black.

REFERENCE:

[Dev2005]

INPUT:

  • x_center – double (optional - default: -1.0), Real part of center point.
  • y_center – double (optional - default: 0.0), Imaginary part of center point.
  • image_width – double (optional - default: 4.0), width of image in the complex plane.
  • max_iteration – long (optional - default: 500), maximum number of iterations the map Q_c(z).
  • pixel_count – long (optional - default: 500), side length of image in number of pixels.
  • base_color – RGB color (optional - default: 'steelblue') color used to determine the coloring of set (any valid input for Color).
  • iteration_level – long (optional - default: 1) number of iterations between each color level.
  • number_of_colors – long (optional - default: 30) number of colors used to plot image.
  • interact – boolean (optional - default: False), controls whether plot will have interactive functionality.

OUTPUT:

24-bit RGB image of the Mandelbrot set in the complex plane.

EXAMPLES:

sage: mandelbrot_plot()
500x500px 24-bit RGB image
sage: mandelbrot_plot(pixel_count=1000)
1000x1000px 24-bit RGB image
sage: mandelbrot_plot(x_center=-1.11, y_center=0.2283, image_width=1/128,
....: max_iteration=2000, number_of_colors=500, base_color=[40, 100, 100])
500x500px 24-bit RGB image

To display an interactive plot of the Mandelbrot set in the Jupyter Notebook, set interact to True:

sage: mandelbrot_plot(interact=True)
interactive(children=(FloatSlider(value=-1.0, description=u'Real center'...
sage: mandelbrot_plot(interact=True, x_center=-0.75, y_center=0.25,
....:     image_width=1/2, number_of_colors=75)
interactive(children=(FloatSlider(value=-0.75, description=u'Real center'...