Fractals/Iterations in the complex plane/MandelbrotSetExteriorComplex potential
Complex potential on the parameter plane
The green procedure is named after the British mathematician George Green
Complex potential is a complex number, so it has 2 parts:
- a real part = real potential = absolute value
- an imaginary part = external angle
One can take also its:
- curl
- divergence
So on one image one can use more than one variable to color image.[1]
Implementations:
- Matemathica[2]
Names:
Real potential = CPM/M
editNames:
- eponimes:
- electric:
- Green function = G(c)
In Fractint :
potential = log(modulus)/2^iterations
One can use real potential to:
- smooth (continuous) coloring[7]
- discrete coloring ( level sets of potential)
- 3D view
Code:
Here is Delphi function which gives level of potential :
Function GiveLevelOfPotential(potential:extended):integer;
var r:extended;
begin
r:= log2(abs(potential));
result:=ceil(r);
end;
/******************************************************************/
// /fractint/common/calcfrac.c
/*
CALCFRAC.C contains the high level ("engine") code for calculating the
fractal images (well, SOMEBODY had to do it!).
Original author Tim Wegner, but just about ALL the authors have contributed
SOME code to this routine at one time or another, or contributed to one of
the many massive restructurings.
The following modules work very closely with CALCFRAC.C:
FRACTALS.C the fractal-specific code for escape-time fractals.
FRACSUBR.C assorted subroutines belonging mainly to calcfrac.
CALCMAND.ASM fast Mandelbrot/Julia integer implementation
Additional fractal-specific modules are also invoked from CALCFRAC:
LORENZ.C engine level and fractal specific code for attractors.
JB.C julibrot logic
PARSER.C formula fractals
and more
-------------------------------------------------------------------- */
/* Continuous potential calculation for Mandelbrot and Julia */
/* Reference: Science of Fractal Images p. 190. */
/* Special thanks to Mark Peterson for his "MtMand" program that */
/* beautifully approximates plate 25 (same reference) and spurred */
/* on the inclusion of similar capabilities in FRACTINT. */
/* */
/* The purpose of this function is to calculate a color value */
/* for a fractal that varies continuously with the screen pixels */
/* locations for better rendering in 3D. */
/* */
/* Here "magnitude" is the modulus of the orbit value at */
/* "iterations". The potparms[] are user-entered paramters */
/* controlling the level and slope of the continuous potential */
/* surface. Returns color. - Tim Wegner 6/25/89 */
/* */
/* -- Change history -- */
/* */
/* 09/12/89 - added floatflag support and fixed float underflow */
/* */
/******************************************************************/
static int _fastcall potential(double mag, long iterations)
{
float f_mag,f_tmp,pot;
double d_tmp;
int i_pot;
long l_pot;
if(iterations < maxit)
{
pot = (float)(l_pot = iterations+2);
if(l_pot <= 0 || mag <= 1.0)
pot = (float)0.0;
else /* pot = log(mag) / pow(2.0, (double)pot); */
{
if(l_pot < 120 && !floatflag) /* empirically determined limit of fShift */
{
f_mag = (float)mag;
fLog14(f_mag,f_tmp); /* this SHOULD be non-negative */
fShift(f_tmp,(char)-l_pot,pot);
}
else
{
d_tmp = log(mag)/(double)pow(2.0,(double)pot);
if(d_tmp > FLT_MIN) /* prevent float type underflow */
pot = (float)d_tmp;
else
pot = (float)0.0;
}
}
/* following transformation strictly for aesthetic reasons */
/* meaning of parameters:
potparam[0] -- zero potential level - highest color -
potparam[1] -- slope multiplier -- higher is steeper
potparam[2] -- rqlim value if changeable (bailout for modulus) */
if(pot > 0.0)
{
if(floatflag)
pot = (float)sqrt((double)pot);
else
{
fSqrt14(pot,f_tmp);
pot = f_tmp;
}
pot = (float)(potparam[0] - pot*potparam[1] - 1.0);
}
else
pot = (float)(potparam[0] - 1.0);
if(pot < 1.0)
pot = (float)1.0; /* avoid color 0 */
}
else if(inside >= 0)
pot = inside;
else /* inside < 0 implies inside=maxit, so use 1st pot param instead */
pot = (float)potparam[0];
i_pot = (int)((l_pot = (long)(pot * 256)) >> 8);
if(i_pot >= colors)
{
i_pot = colors - 1;
l_pot = 255;
}
if(pot16bit)
{
if (dotmode != 11) /* if putcolor won't be doing it for us */
writedisk(col+sxoffs,row+syoffs,i_pot);
writedisk(col+sxoffs,row+sydots+syoffs,(int)l_pot);
}
return(i_pot);
}
External angle and external ( parameter) ray
editImage[Table[If[ColorQ@#,#,Black]&@Hue[(Arg[MandelbrotSetBoettcher[x+I y]]+Pi)/(2Pi)],{y,-2,2,.005},{x,-2,2,.005}]]
conjugate ange
editConjugate angle
- angles of the wake
For the Mandelbrot set, considering strictly periodic rays with period >= 2, the other in the pair can be found in O(period^2) time using Henk Bruin and Dierk Schleicher's Symbolic Dynamics of Quadratic Polynomials : Algorithm 13.3:
Code:
- https://code.mathr.co.uk/mandelbrot-symbolics/blob/82378e281c6ef149c7280d2b10076fffd83e0a8c:/c/lib/m_q_unlinked.c
- https://code.mathr.co.uk/mandelbrot-symbolics/blob/82378e281c6ef149c7280d2b10076fffd83e0a8c:/c/lib/m_q_conjugate.c
Methods
editFirst find angle of last iteration. It is easy to compute and shows some external rays as a borders of level sets.
- binary decomposition of LSM/M
- nth-decomposition : color of exterior is proportional to quadrant in which last iteration lands. ( see below )
- exterior grid coordinates: (arg(final z),log(|final z|)/log(escaperadius)) [8]
- stripe average coloring
Then one go further.
- automatically calculate external angles from nucleus and period by Claude Heiland-Allen [9]
Methods:
- newton method
- lines perpendicular to equipotential lines [13]
- field line calculations, images and videos by Michael T Everest
- field lines by Chris M. Thomasson [14]
- using Runge-Kutta integration by [15]
Tests
editThe Wolf Jung test
editThe external parameter rays for angles (in turns)
- 321685687669320/2251799813685247 (period 51, lands on c1 = -0.088891642419446 +0.650955631292636i )
- 321685687669322/2251799813685247 ( period 51 lands on c2 = -0.090588078906990 +0.655983860334813i )
- 1/7 ( period 3, lands on c3 = -0.125000000000000 +0.649519052838329i )
Angles differ by about , but the landing points of the corresponding parameter rays are about 0.035 apart.[16] It can be computed with Maxima CAS :
(%i1) c1: -0.088891642419446 +0.650955631292636*%i; (%o1) 0.650955631292636*%i−0.088891642419446 (%i2) c2:-0.090588078906990 +0.655983860334813*%i; (%o2) 0.655983860334813*%i−0.09058807890699 (%i3) abs(c2-c1); (%o3) .005306692383854863 (%i4) c3: -0.125000000000000 +0.649519052838329*%i$ (%i5) abs(c3-c1); (%o5) .03613692356607755 (%i6) a3:1/7$ (%i7) float(abs(a3-a1)); (%o7) 4.440892098500628*10^−16
Informations from W Jung program :
The angle 1/7 or p001 has preperiod = 0 and period = 3. The conjugate angle is 2/7 or p010 . The kneading sequence is AA* and the internal address is 1-3 . The corresponding parameter rays are landing at the root of a satellite component of period 3. It is bifurcating from period 1.
The angle 321685687669320/2251799813685247 or p001001001001001001001001001001001001001001001001000 has preperiod = 0 and period = 51. The conjugate angle is 321685687669319/2251799813685247 or p001001001001001001001001001001001001001001001000111 . The kneading sequence is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB* and the internal address is 1-49-50-51 . The corresponding parameter rays are landing at the root of a primitive component of period 51.
The angle 321685687669322/2251799813685247 or p001001001001001001001001001001001001001001001001010 has preperiod = 0 and period = 51. The conjugate angle is 321685687669329/2251799813685247 or p001001001001001001001001001001001001001001001010001 . The kneading sequence is AABAABAABAABAABAABAABAABAABAABAABAABAABAABAABAABAA* and the internal address is 1-3-51 . The corresponding parameter rays are landing at the root of a satellite component of period 51. It is bifurcating from period 3.
The test by G. Pastor and Miguel Romera
editThe external parameter rays for angles (in turns)
- 6871947673/34359738367 ( period 35 )
- 9162596898/34359738367 ( period 35 )
the central babies Mandelbrot sets of the cauliflowers located at -0.153756141 + 1.030383223i
(not that 34359738367 = 2^35 - 1)
test by M. Romera,1 G. Pastor, A. B. Orue,1 A. Martin, M.-F. Danca,and F. Montoya
editG Pastor gave an example of external rays for which the resolution of the IEEE 754 is not sufficient:[17]
- ( period 3, lands on root point of period 3 component c3 = -0.125000000000000 +0.649519052838329i )
One can analyze these angles using program by Claude Heiland-Allen :
./bin/mandelbrot_describe_external_angle ".(001)"
binary: .(001)
decimal: 1/7
preperiod: 0
period: 3
./bin/mandelbrot_describe_external_angle
".(001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001010)"
binary:
.(001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001010)
decimal:
33877456965431938318210482471113262183356704085033125021829876006886584214655562/237142198758023568227473377297792835283496928595231875152809132048206089502588927
preperiod: 0
period: 267
./bin/mandelbrot_describe_external_angle
".(001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001010001)"
binary:
.(001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001010001)
decimal:
33877456965431938318210482471113262183356704085033125021829876006886584214655569/237142198758023568227473377297792835283496928595231875152809132048206089502588927
preperiod: 0
period: 267
./bin/mandelbrot_describe_external_angle
".(0010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010001)"
binary:
.(0010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010001)
decimal:
67754913930863876636420964942226524366713408170066250043659752013773168429311121/474284397516047136454946754595585670566993857190463750305618264096412179005177855
preperiod: 0
period: 268
./bin/mandelbrot_describe_external_angle
".(0010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010)"
binary:
.(0010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010010)
decimal:
67754913930863876636420964942226524366713408170066250043659752013773168429311122/474284397516047136454946754595585670566993857190463750305618264096412179005177855
preperiod: 0
period: 268
Landing points of above rays are roots with angled internal addresses ( description by Claude Heiland-Allen) :
- the upper one will be 1 -> 1/3 -> 3 -> 1/(period/3) -> period because it's the nearest bulb to the lower root cusp of 1/3 bulb and child bulbs of 1/3 bulb have periods 3 * denominator(internal angle) ie, 1 -> 1/3 -> 3 -> 1/89 -> 267
- the lower one will be 1 -> floor(period/3)/period -> period because it's the nearest bulb below the 1/3 cusp ie, 1 -> 89/268 -> 268
- the middle ray .(001) lands at the root of 1 -> 1/3 -> 3, from the cusp on the lower side (which is on the right in a standard unrotated view)
References
edit- ↑ The Mandelbrot Function by John J. G. Savard
- ↑ Reference wolfram: MandelbrotSetBoettcher
- ↑ Douady Hubbard Potential by Linas Vepstas
- ↑ i quilezles : distance fractals
- ↑ lecture10 by Professor Douglas C. Ravenel
- ↑ Distance estimation method for drawing Mandelbrot and Julia sets Dr. Lindsay Robert Wilson
- ↑ Smooth colouring is the key to the Mandelbrot set by Tony Finch
- ↑ fractalforums.org : mandelbrot-external-angles
- ↑ calculate external angles from nucleus and period by Claude Heiland-Allen
- ↑ An algorithm to draw external rays of the Mandelbrot set by Tomoki Kawahira
- ↑ Wolf Jung explanation
- ↑ Claude Heiland-Allenmandelbrot_set_newton_basins by
- ↑ A Method to Solve the Limitations in Drawing External Rays of the Mandelbrot Set M. Romera,1 G. Pastor, A. B. Orue,1 A. Martin, M.-F. Danca,and F. Montoya
- ↑ Fractal forum : Plotting field lines during iteration...
- ↑ fractalforums : smooth-external-angle-of-mandelbrot-set
- ↑ Wolf Jung's test for precision of drawing parameter rays
- ↑ A Method to Solve the Limitations in Drawing External Rays of the Mandelbrot Set M. Romera,1 G. Pastor, A. B. Orue,1 A. Martin, M.-F. Danca,and F. Montoya