Open main menu

Wikibooks β

Fractals/Iterations in the complex plane/q-iterations

< Fractals
Julia set drawn by inverse iteration of critical orbit ( in case of Siegel disc )
Periodic external rays of dynamic plane made with backward iteration

Iteration in mathematics refer to the process of iterating a function i.e. applying a function repeatedly, using the output from one iteration as the input to the next.[1] Iteration of apparently simple functions can produce complex behaviours and difficult problems.



One can make inverse ( backward iteration) :

  • of repeller for drawing Julia set ( IIM/J)[2]
  • of circle outside Jlia set (radius=ER) for drawing level curves of escape time ( which tend to Julia set)[3]
  • of circle inside Julia set (radius=AR) for drawing level curves of attract time ( which tend to Julia set)[4]
  • of critical orbit ( in Siegel disc case) for drawing Julia set ( probably only in case of Goldem Mean )
  • for drawing external ray

Repellor for forward iteration is attractor for backward iteration


  • Iteration is allways on the dynamic plane.
  • There is no dynamic on the parametr plane.
  • Mandelbrot set carries no dynamics. It is a set of parameter values.
  • There are no orbits on parameter plane, one should not draw orbits on parameter plane.
  • Orbit of critical point is on the dynamical plane

Iteration theoryEdit

It is a section from Tetration forum by Andrew Robbins 2006-02-15 by Andrew Robbins

"Iteration is fundamental to dynamics, chaos, analysis, recursive functions, and number theory. In most cases the kind of iteration required in these subjects is integer iteration, i.e. where the iteration parameter is an integer. However, in the study of dynamical systems continuous iteration is paramount to the solution of some systems.

Different kinds of iteration can be classified as follows:

  • Discrete Iteration
    • Integer Iteration
    • Fractional Iteration or Rational Iteration
      • Non-analytic Fractional Iteration
      • analytic Fractional Iteration
  • Continuous Iteration

Discrete IterationEdit

integer iterationEdit

The usual definition of iteration, where the functional equation:


is used to generate the sequence:


known as the natural iterates of f(x), which forms a monoid under composition.

For invertible functions f(x), the inverses are also considered iterates, and form the sequence:


known as the integer iterates of f(x), which forms a group under composition.

Fractional Iteration or Rational IterationEdit

Solving the functional equation: f(x) = gn(x). Once this functional equation is solved, then the rational iterates f (m/n)(x) are the integer iterates of g(x).

Non-analytic Fractional IterationEdit

By chosing a non-analytic fractional iterate, there is no uniqueness of the solutions obtained. (Iga's method)

Analytic Fractional IterationEdit

By solving for an analytic fractional iterate, there is a unique solution obtained in this way. (Dahl's method)

Continuous IterationEdit

A generalization of the usual notion of iteration, where the functional equation (FE): f n(x) = f(f n-1(x)) must be satisfied for all n in the domain (real or complex). If this is not the case, then to discuss these kinds of "iteration" (even though they are not technically "iteration" since they do not obey the FE of iteration), we will talk about them as though they were expressions for f n(x) where 0 ≤ Re(n) ≤ 1 and defined elsewhere by the FE of iteration. So even though a method is analytic, if it doesn't satisfy this fundamental FE, then by this re-definition, it is non-analytic.

Non-analytic Continuous IterationEdit

By choosing a non-analytic continuous iterate, there is no uniqueness of the solutions obtained. (Galidakis' and Woon's methods)

Analytic Continuous Iteration or just Analytic IterationEdit

By solving for an analytic continuous iterate, there is a unique solution obtained in this way.

Real-analytic IterationEdit

Complex-analytic Iteration or Holomorphic IterationEdit


  • integer
  • fractional
  • Continuous Iteration of Dynamical Maps.[5][6] This continuous iteration can be discretized by the finite element method and then solved—in parallel—on a computer.


Move during iteration in case of complex quadratic polynomial is complex. It consists of 2 moves :

  • angular move = rotation ( see doubling map)
  • radial move ( see external and internal rays, invariant curves )
    • fallin into target set and attractor ( in hyperbolic and parabolic case )




Backward iteration or inverse iteration[7]


 /* Zn*Zn=Z(n+1)-c */
                /* sqrt of complex number algorithm from Peitgen, Jurgens, Saupe: Fractals for the classroom */
                if (Zx>0)
                 else /* ZX <= 0 */
                  if (Zx<0)
                      else /* Zx=0 */
                       if (NewZx>0) NewZy=Zy/(2*NewZx);
                          else NewZy=0;    
              if (rand()<(RAND_MAX/2))
              else {Zx=-NewZx;
                  Zy=-NewZy; }


Here is example of c code of inverse iteration using code from program Mandel by Wolf Jung


 gcc i.c -lm -Wall

iPeriodChild = 1 , c = (0.250000, 0.000000); z = (-0.0000000000000000, -0.5000000000000000) 
 iPeriodChild = 2 , c = (-0.750000, 0.000000); z = (-0.0000000000000001, 0.3406250193166067) z = 0.000000000000000  -0.340625019316607 i
 iPeriodChild = 3 , c = (-0.125000, 0.649519); z = (-0.2299551351162812, -0.1413579816050057) z = -0.229955135116281  -0.141357981605006 i
 iPeriodChild = 4 , c = (0.250000, 0.500000); z = (-0.2288905993372874, -0.0151096456992674) 
 iPeriodChild = 5 , c = (0.356763, 0.328582); z = (-0.1990400075391210, 0.0415980651776321) 
 iPeriodChild = 6 , c = (0.375000, 0.216506); z = (-0.1727194378627304, 0.0675726990190151) 
 iPeriodChild = 7 , c = (0.367375, 0.147184); z = (-0.1530209385352789, 0.0799609106267383) 
 iPeriodChild = 8 , c = (0.353553, 0.103553); z = (-0.1386555899358813, 0.0860089512209437) 
 iPeriodChild = 9 , c = (0.339610, 0.075192); z = (-0.1281114080080390, 0.0889429110652104) z = -0.128111408008039  +0.088942911065210 i


#include <stdio.h>
#include <math.h> // M_PI; needs -lm also 
#include <complex.h>

/* find c in component of Mandelbrot set 
   uses code by Wolf Jung from program Mandel
   see function mndlbrot::bifurcate from mandelbrot.cpp

double complex GiveC(double InternalAngleInTurns, double InternalRadius, unsigned int Period)
  //0 <= InternalRay<= 1
  //0 <= InternalAngleInTurns <=1
  double t = InternalAngleInTurns *2*M_PI; // from turns to radians
  double R2 = InternalRadius * InternalRadius;
  double Cx, Cy; /* C = Cx+Cy*i */

  switch ( Period ) // of component 
    case 1: // main cardioid
      Cx = (cos(t)*InternalRadius)/2-(cos(2*t)*R2)/4; 
      Cy = (sin(t)*InternalRadius)/2-(sin(2*t)*R2)/4; 
    case 2: // only one component 
      Cx = InternalRadius * 0.25*cos(t) - 1.0;
      Cy = InternalRadius * 0.25*sin(t); 
      // for each iPeriodChild  there are 2^(iPeriodChild-1) roots. 
    default: // higher periods : to do, use newton method 
      Cx = 0.0;
      Cy = 0.0; 
      break; }

  return Cx + Cy*I;

/* mndyncxmics::root from mndyncxmo.cpp  by Wolf Jung (C) 2007-2014. */

// input = x,y
// output = u+v*I = sqrt(x+y*i) 
complex double GiveRoot(complex double z)
  double x = creal(z);
  double y = cimag(z);
  double u, v;
   v  = sqrt(x*x + y*y);

   if (x > 0.0)
        { u = sqrt(0.5*(v + x)); v = 0.5*y/u; return  u+v*I; }
   if (x < 0.0)
         { v = sqrt(0.5*(v - x)); if (y < 0.0) v = -v; u = 0.5*y/v; return  u+v*I; }
   if (y >= 0.0) 
       { u = sqrt(0.5*y); v = u; return  u+v*I; }

   u = sqrt(-0.5*y); 
   v = -u;
   return  u+v*I;

// from mndlbrot.cpp  by Wolf Jung (C) 2007-2014. part of Madel 5.12 
// input : c, z , mode
// c = cx+cy*i where cx and cy are global variables defined in mndynamo.h
// z = x+y*i
// output : z = x+y*i
complex double InverseIteration(complex double z, complex double c)
    double x = creal(z);
    double y = cimag(z);
    double cx = creal(c);
    double cy = cimag(c);
   // f^{-1}(z) = inverse with principal value
   if (cx*cx + cy*cy < 1e-20) 
      z = GiveRoot(x - cx + (y - cy)*I); // 2-nd inverse function = key b 
      //if (mode & 1) { x = -x; y = -y; } // 1-st inverse function = key a   
      return -z;
   //f^{-1}(z) =  inverse with argument adjusted
   double u, v;
   complex double uv ;
   double w = cx*cx + cy*cy;
   uv = GiveRoot(-cx/w -(cy/w)*I); 
   u = creal(uv);
   v = cimag(uv);
   z =  GiveRoot(w - cx*x - cy*y + (cy*x - cx*y)*I);
   x = creal(z);
   y = cimag(z);
   w = u*x - v*y; 
   y = u*y + v*x; 
   x = w;
   //if (mode & 1) // mode = -1
     //  { x = -x; y = -y; } // 1-st inverse function = key a
  return x+y*I; // key b =  2-nd inverse function


// make iPeriod inverse iteration with negative sign ( a in Wolf Jung notation )
complex double GivePrecriticalA(complex double z, complex double c, int iPeriod)
  complex double za = z;  
  int i; 
  for(i=0;i<iPeriod ;++i){
    za = InverseIteration(za,c); 
    //printf("i = %d ,  z = (%f, %f) \n ", i,  creal(z), cimag(z) );


 return za;

int main(){
 complex double c;
 complex double z;
 complex double zcr = 0.0; // critical point

 int iPeriodChild;
 int iPeriodChildMax = 10; // period of
 int iPeriodParent = 1;

 for(iPeriodChild=1;iPeriodChild<iPeriodChildMax ;++iPeriodChild) {

     c = GiveC(1.0/((double) iPeriodChild), 1.0, iPeriodParent); // root point = The unique point on the boundary of a mu-atom of period P where two external angles of denominator = (2^P-1) meet.
     z = GivePrecriticalA( zcr, c, iPeriodChild);
     printf("iPeriodChild = %d , c = (%f, %f); z = (%.16f, %.16f) \n ", iPeriodChild, creal(c), cimag(c), creal(z), cimag(z) );

return 0; 


One can iterate ad infinitum. Test tells when one can stop

  • bailout test for forward iteration

Target set or trapEdit

Target set is used in test. When zn is inside target set then one can stop the iterations.


Parameter planeEdit

"Mandelbrot set carries no dynamics. It is a set of parameter values. There are no orbits on parameter plane, one should not draw orbits on parameter plane. Orbit of critical point is on the dynamical plane"

Dynamic planeEdit

  "The polynomial Pc maps each dynamical ray to another ray doubling the angle (which we measure in full turns, i.e. 0 = 1 = 2π rad = 360◦), and the dynamical rays of any polynomial “look like straight rays” near infinity. This allows us to study the
   Mandelbrot and Julia sets combinatorially, replacing the dynamical plane by the unit circle, rays by angles, and the quadratic polynomial by the doubling modulo one map." Virpi K a u k o[8]

Dynamic plane   for c=0Edit

Equipotential curves (in red) and integral curves (in blue) of a radial vector field with the potential function  

Lets take c=0, then one can call dynamical plane   plane.

Here dynamical plane can be divided into :

  • Julia set =  
  • Fatou set which consists of 2 subsets :
    • interior of Julia set = basin of attraction of finite attractor =  
    • exterior of Julia set = basin of attraction of infinity =  

Forward iterationEdit

The 10 first powers of a complex number inside the unit circle
Exponential spirals
Principle branch of arg


where :

  • r is the absolute value or modulus or magnitude of a complex number z = x + i
  •   is the argument of complex number z (in many applications referred to as the "phase") is the angle of the radius with the positive real axis. Usually principal value is used



and forward iteration :[9]


Forward iteration:

  • squares radius and doubles angle ( phase, argument)[10][11]
  • gives forward orbit = list of points {z0, z1, z2, z3... , zn} which lays on exponential spirals.[12][13]

One can check it interactively :

Chaos and the complex squaring mapEdit

The informal reason why the iteration is chaotic is that the angle doubles on every iteration and doubling grows very quickly as the angle becomes ever larger, but angles which differ by multiples of 2π radians are identical. Thus, when the angle exceeds 2π, it must wrap to the remainder on division by 2π. Therefore, the angle is transformed according to the dyadic transformation (also known as the 2x mod 1 map). As the initial value z0 has been chosen so that its argument is not a rational multiple of π, the forward orbit of zn cannot repeat itself and become periodic.

More formally, the iteration can be written as:


where   is the resulting sequence of complex numbers obtained by iterating the steps above, and   represents the initial starting number. We can solve this iteration exactly:


Starting with angle θ, we can write the initial term as   so that  . This makes the successive doubling of the angle clear. (This is equivalent to the relation  .)

Escape testEdit

If distance between:

  • point z of exterior of Julia set
  • Julia set  

is :


then point z escapes (= it's magnitude is greate then escape radius = ER):


after :

  •   steps in non-parabolic case
  •   steps in parabolic case [14]

See also:

Backward iterationEdit

Backward iteration of complex quadratic polynomial with proper chose of the preimage

Every angle α ∈ R/Z measured in turns has :

Note that difference between these 2 preimages


is half a turn = 180 degrees = Pi radians.

Images and preimages under doubling map d

On complex dynamical plane backward iteration using quadratic polynomial  


gives backward orbit = binary tree of preimages :




One can't choose good path in such tree without extra informations.

Not that preimages show rotational symmetry ( 180 degrees)

For other functions see Fractalforum[16]

Dynamic plane for  Edit

One can check it with :

Level curves of escape timeEdit

Preimages of circle under fc

Julia set by IIM/JEdit

In escape time one computes forward iteration of point z.

In IIM/J one computes:

  • repelling fixed point[17] of complex quadratic polynomial  
  • preimages of   by inverse iterations


 "We know the periodic points are dense in the Julia set, but in the case of weird ones (like the ones with Cremer points, or even some with Siegel disks where the disk itself is very 'deep' within the Julia set, as measured by the external rays), the periodic points tend to avoid certain parts of the Julia set as long as possible. This is what causes the 'inverse method' of rendering images of Julia sets to be so bad for those cases." Jacques Carette[18]

Because square root is multivalued function then each   has two preimages  . Thus inverse iteration creates binary tree.

See also :

Root of treeEdit
  • repelling fixed point[21] of complex quadratic polynomial  
  • - beta
  • other repelling periodic points ( cut points of filled Julia set ). It will be important especially in case of the parabolic Julia set.

"... preimages of the repelling fixed point beta. These form a tree like

                    beta                                            -beta
   beta                         -beta                    x                     y

So every point is computed at last twice when you start the tree with beta. If you start with -beta, you will get the same points with half the number of computations.

Something similar applies to the preimages of the critical orbit. If z is in the critical orbit, one of its two preimages will be there as well, so you should draw -z and the tree of its preimages to avoid getting the same points twice." (Wolf Jung )

Variants of IIMEdit
  • random choose one of two roots IIM ( up to chosen level max). Random walk through the tree. Simplest to code and fast, but inefficient. Start from it.
    • both roots with the same probability
    • more often one then other root
  • draw all roots ( up to chosen level max)[22]
    • using recurrence
    • using stack ( faster ?)
  • draw some rare paths in binary tree = MIIM. This is modification of drawing all roots. Stop using some rare paths.

Examples of code :

Compare it with:

See alsoEdit

  • Dynamical systems
    • Fixed points
    • Lyapunov number
  • Functional equations
    • Abel function
    • Schroeder function
    • Boettcher function
    • Julia function
  • Special matrices
    • Carleman matrix
    • Bell matrix
    • Abel-Robbins matrix