I recently asked this question: Evaluating Functions on Zero Sets (of other functions), and got fantastic assistance, but realized that there seems to be an extra issue when you're trying to parameterize simply part of a complicated zero set $f(x,y)=0$. So I have an idea that I'd appreciate help with, or perhaps if I'm doing something for which there's a much simpler method:

Perhaps a good example is to take f[x,y]=(x^2+y^2-4)((x-1)^2+y^2-4) and attempt to parameterize the circle centered at the origin with parameter $t$. My idea is to take a point we know on the circle, like $(2,0)$, compute the gradient of $f$ evaluated at this point, normalize the vector, and rotate it to the left to get a normalized tangent vector to the zero set.

Dell[a_, b_] = Grad[f[a, b], {a, b}]; Tang[a_, b_] = (1/Norm[Dell[a, b]])*{-Dell[a, b][[2]], Dell[a, b][[1]]};

Then we would input a small step length, say $t=0.005$ and ask for this parameter to correspond to the closest point on the circle to vector {2,0}+t*{Tang[2,0][[1]],Tang[2,0][[2]]}. After all, this would let us take the step size very small and associate to each $t$ a point on the portion of the zero set we're interested in.

So I tried implementing this algorithm in an iterative way, using FindRoot looking for solutions to f[x,y]==0, but it was unhappy that I only had one equation with two unknowns. Of course this makes sense, but I was hoping to isolate the point closest to a known vector.

Any tips on how to correct this algorithm? Or perhaps, other methods if I'm being really naive. Again, I'm hoping to parameterize just portions of complicated, overlapping portions of zero sets in the $xy$-plane.


I am a little confused about the aim of the question. In the following I aim to show various ways of showing the zero set of $f(x,y)$ as defined in OP.

f[x_, y_] := (x^2 + y^2 - 4) ((x - 1)^2 + y^2 - 4);
p3d = Plot3D[f[x, y], {x, -3, 3}, {y, -3, 3}, MeshFunctions -> {#3 &},
    Mesh -> {{0}}, MeshStyle -> {Red, Thick}, PlotPoints -> 50];
s = y /. {ToRules@Reduce[f[x, y] == 0, {x, y}]};
col = {Red, Green, Blue , Orange};
p = Legended[Plot[s, {x, -3, 3}, Evaluated -> True, PlotStyle -> col],
    LineLegend[col, s]];
scp = SliceContourPlot3D[
   z, {z == f[x, y], z == 0}, {x, -3, 3}, {y, -3, 3}, {z, -10, 20}, 
   Contours -> {0}, ContourStyle -> Directive[Red, Thick]];
pp = ParametricPlot3D[{x, #, 0} & /@ s, {x, -3, 3}];
sh = Show[p3d, pp];
plots = {s, p, pp, p3d, sh, scp};
Grid[Partition[plots, 2], Frame -> All]

enter image description here

| improve this answer | |
  • $\begingroup$ Sorry I wasn't clear enough, and thanks for your answer. I want to consider zero sets $f(x,y)=0$ that involve quite a few disjoint curves, or possibly intersecting curves. There is precisely one special one of these few that I would like to parameterize. The answers to my original question are fabulous, but I failed to ask for a method that is able to pick out one of many components. $\endgroup$ – Benighted May 11 '16 at 16:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.