Fractals/Iterations in the complex plane/q-iterations

< Fractals < Iterations in the complex plane

Introduction

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.


applications

One can make inverse ( backward iteration) :


Repellor for forward iteration is attractor for backward iteration

Notes

step

decomposition

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

direction

backward

Backward iteration or inverse iteration

Peitgen

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

Mandel

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

/*

 gcc i.c -lm -Wall
 ./a.out


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
   http://www.mndynamics.com/indexp.html

*/
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; 
      break;
    case 2: // only one component 
      Cx = InternalRadius * 0.25*cos(t) - 1.0;
      Cy = InternalRadius * 0.25*sin(t); 
      break;
      // 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; 
}

Test

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

Target set or trap

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

Planes

Parameter 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"

Dynamic plane for c=0

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 :

Forward iteration

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

where :




so

and forward iteration :[7]

Forward iteration gives forward orbit = list of points {z0, z1, z2, z3... , zn} which lays on exponential spirals.[8] [9]

Chaos and the complex squaring map

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 test


If distance between point z of exterior of Julia set and Julia set is :

then point escapes ( measured using bailout test and escape time )

after :

See here for the precision needed for escape test

Backward iteration

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[12]

Dynamic plane for

Level curves of escape time

Preimages of circle under fc

Julia set by IIM/J

In escape time one computes forward iteration of point z.

In IIM/J one computes:


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


See also :

Root of tree


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

                                               beta
                    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 IIM



Examples of code :

Compare it with:

References

  1. wikipedia : Iteration
  2. Inverse Iteration Algorithms for Julia Sets by Mark McClure
  3. Complex iteration by Microcomputadoras
  4. On rational maps with two critical points by John Milnor, fig. 5
  5. Continuous Iteration of Dynamical Maps R. Aldrovandi, L. P. Freitas (Sao Paulo, IFT)
  6. Continuous_iteration_of_fractals by Gerard Westendorp
  7. Real and imaginary parts of polynomial iterates by Julia A. Barnes, Clinton P. Curry and Lisbeth E. Schaubroeck. New York J. Math. 16 (2010) 749–761.
  8. Complex numbers by David E Joyce
  9. Powers of complex numbers from Suitcase of Dreams
  10. Parabolic Julia Sets are Polynomial Time Computable by Mark Braverman
  11. SYMBOLIC DYNAMICS AND SELF-SIMILAR GROUPS by VOLODYMYR NEKRASHEVYCH
  12. Query about general Julia set IFS for higher powers.
  13. wikipedia : repelling fixed point
  14. Wolfram Alpha
  15. example
  16. wikipedia : repelling fixed point
  17. Fractint documentation - Inverse Julias
  18. Image and c source code : IIMM using hit limit
  19. Exploding the Dark Heart of Chaos by Chris King
This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.