mathr / blog / #

Perturbation glitches

K I Martin recently popularized a perturbation technique to accelerate Mandelbrot set rendering in his SuperFractalThing program. I wrote up some of the mathematics behind it, extending Martin's description to handle interior distance estimation too. Unfortunately it's very easy to get glitchy images that are wrong in sometimes subtle ways.

The most obvious reference point is usually in a central minibrot, which means it is strictly periodic:

central minibrot

-1.760732891182472726272e+00 +
1.302137831089206469511e-02 i
4.0194366942304651e-14 @
-1.760732891182472889620498413132e+00 +R
1.302137831089204904674633295328e-02 iR

The current version of mightymandel computes an error estimate and shades worse errors redder. A better reference point for this image is in a non-central minibrot near the tip of a solid red patch:

non-central minibrot

-1.760732891182472726272e+00 +
1.302137831089206469511e-02 i
4.0194366942304651e-14 @
-1.76073289118248636633168329119453103e+00 +R
1.30213783108675495217125732772512438e-02 iR

Nearby higher period non-central minibrots tend to work even better, and their limit is a pre-periodic point - one that becomes periodic after a finite number of iterations. I explored a bit the basins of attraction of preperiodic points for a couple of embedded Julia sets (which are the features that are most often glitchy).

preperiodic basins

-1.7607328089719322109e+00 +
1.3021307542195548201e-02 i
1.5258789062500003e-05 @
1 1/2 2 1/2 3 1/3 6 4/5 35 A

The saturated dots at the tips and spirals in this period 35 embedded Julia set are the preperiodic points of interest. They have period 3 (matching the outer influencing island) and preperiods 35 (matching the inner influencing island) and 36.

Then zooming deeper to the near the period 35 island and into one of its hairs finds a doubly-embedded Julia set between the period 35 outer influencing island and a period 177 inner influencing island. Rendering the Newton Basins now needs more than double precision floating point, and my Haskell code using qd's DoubleDouble took almost 4 hours on a quad core. This time the points of interest have period 35 (matching the outer island) and preperiods 177 (matching the inner island) and 178.

deeper preperiodic basins

-1.76073288182181309054484516839 +
0.01302138541499395659022491468 i
2.2737367544323211e-13 @

Here's the same view rendered with mightymandel, first with the central minibrot as reference:

central minibrot

-1.76073288182181252065e+00 +
1.30213854149941790026e-02 i
2.2737367544323211e-13 @

Then a non-central minibrot:

non-central minibrot

-1.76073288182181252e+00 +
1.302138541499417901e-02 i
2.2737367544323211e-13 @
-1.760732881821779248788320301573183e+00 +R
1.302138541488527885806724080050218e-02 iR

And finally a limiting pre-periodic reference point:

preperiodic reference

-1.76073288182181252e+00 +
1.302138541499417901e-02 i
2.2737367544323211e-13 @
-1.7607328818218582927504155115035552 +R
1.3021385414920574393027950216090353e-2 iR

No single reference point gives a red-free image, but combining multiple reference points, each appropriate to various parts of the image, looks like it would be a promising approach - and the knowledge about where the view is in relation to outer and inner influencing islands and their (potentially echoed) embedded Julia sets could perhaps be used to calculate a few candidate reference points automatically.