Generalizing the Deterministic Algorithm

The algorithms described above apply only to functions of the specific form [Graphics:../Images/index_gr_85.gif] but the theory is much more broadly applicable.  We should be able to apply the same ideas to any rational function whose inverses are known.  Let's apply these ideas to plot the Julia set of [Graphics:../Images/index_gr_86.gif]

f[z_] = z^3 + z + 0.6*I; res = 200; 
inverses = z /. NSolve[f[z] == #1, z];
funcs = (Function[anInverse, N[Floor[anInverse*res]/res] & ]) /@ inverses;

A list of the inverses of [Graphics:../Images/index_gr_87.gif] is now held in funcs.  We need to turn this into invImage.

invImage[points_] := 
    Flatten[(Through[funcs[#1]] & ) /@ points, 1];
    invImage[{1}]
[Graphics:../Images/index_gr_88.gif]
invImage[%]
[Graphics:../Images/index_gr_89.gif]

Now the algorithm proceeds as before.

reducedImage[points_] := Module[{newPoints},
    newPoints = Complement[invImage[points],
        pointsSoFar];
    pointsSoFar =
        Union[newPoints, pointsSoFar]; newPoints];
pointsSoFar = Nest[invImage, {1.}, 5];
FixedPoint[reducedImage, pointsSoFar];
ListPlot[({Re[#1], Im[#1]} & ) /@ pointsSoFar,
    AspectRatio -> Automatic,
    Axes -> False,
    PlotStyle -> {AbsolutePointSize[0.4]}]

[Graphics:../Images/index_gr_90.gif]

     These commands are encapsulated in the package function Julia.  Here are two more examples.

[Graphics:../Images/index_gr_91.gif]

[Graphics:../Images/index_gr_92.gif]

     Note that the second image in the preceeding example is the Julia set of a rational function. We, actually, need to make one final adjustment to generate Julia sets of  rational functions.  Our method for pruning points depends upon the fact that the Julia set is bounded.  While this assumption is valid for polynomials, the Julia set of a rational function need not be bounded.  In this case, the function reducedImage should throw out points that are larger than some specified bound, in addition to points that have already been plotted.  Here is the modified version of reducedImage.

bound = 4; 
reducedImage[points_] := Module[{newPoints},
    newPoints =
        Complement[image[points], pointsSoFar];
    newPoints =
        Select[newPoints, N[Abs[#1]] <= bound & ];
    pointsSoFar =
        Union[newPoints, pointsSoFar];
    newPoints]

The package function Julia uses this version of reducedImage when called with a rational function.  The value of bound is controlled by the option Bound.  The default is Bound->4.  We illustrate the use of Bound by plotting the Julia set of the rational function used to find the roots of [Graphics:../Images/index_gr_93.gif] with Newton's method.

[Graphics:../Images/index_gr_94.gif]

[Graphics:../Images/index_gr_95.gif]


Converted by Mathematica      November 12, 1999