My question is about both ContourPlot and FindAllCrossings2D. I have been using these two commands so as to figure out where two contour plots intersect. However, it seems like FindAllCrossings2D could not find out the other intersection points or I just could not manipulate on the module of it to make it find the other points:

The following is FindAllCrossings2D:

Options[FindAllCrossings2D] =  Sort[Join[ Options[FindRoot], {MaxRecursion -> Automatic,  PerformanceGoal :> $PerformanceGoal, PlotPoints -> 200}]]; FindAllCrossings2D[{func1_, func2_}, {x_, xmin_, xmax_}, {y_, ymin_, ymax_}, opts___] := Module[{contourData, seeds, optsflt, fy = Compile[{x, y}, func2]},  optsflt[fname_] :=  Sequence @@ 
 Options@fname];  contourData =  Cases[Normal@
 ContourPlot[func1, {x, xmin, xmax}, {y, ymin, ymax}, Contours -> {0}, ContourShading -> False,  PlotRange -> {Full, Full, Automatic}, Method -> Automatic,   Evaluate[optsflt@ContourPlot]], L_Line :> L[[1]], Infinity];   seeds = Pick[Rest@#, Rest[#] Most[#] &@Sign@Apply[fy, #, 2], -1] & /@
 contourData; Select[Union@ With[{seq =    optsflt@FindRoot}, {x, y} /. 
    FindRoot[{func1 == 0, func2 == 0}, {x, #1}, {y, #2}, seq] & @@@
   Join @@ seeds], (xmin < #[[1]] < xmax &&   ymin < #[[2]] < ymax) &]];

then I have:

u = Table[ DeleteDuplicates@ FindAllCrossings2D[{Re[-2 (α + I β) -  Sqrt[2] (α + I β)  Sech[  Sqrt[2] (α + I β)]^2 -  Tanh[Sqrt[2] (α + I β)]],  y + Im[-2 (α + I β) -  Sqrt[2] (α + I β)  Sech[ Sqrt[2] (α + I β)]^2 -  Tanh[Sqrt[2] (α + I β)]]}, {α, -10, 
  10}, {β, -10, 10}, WorkingPrecision -> 20], {y, -3, 1, 1}];

I would like to show this with the following:

v = Table[ContourPlot[{Re[-2 (α + I β) - Sqrt[2] (α + I β)  Sech[Sqrt[2] (α + I β)]^2 - Tanh[Sqrt[2] (α + I β)]] == 0,  y + Im[-2 (α + I β) -  Sqrt[2] (α + I β)  Sech[ Sqrt[2] (α + I β)]^2 -  Tanh[Sqrt[2] (α + I β)]] == 0}, {α, -10,  10}, {β, -10, 10}, WorkingPrecision -> 20, Epilog -> {AbsolutePointSize[6]}, PlotPoints -> 200,  ContourStyle -> {Darker@Green, Thick}, ImageSize -> 550], {y, -3, 1, 1}];

the way that I show them together is:

Table[Show[{ListPlot[u[[i]], AxesLabel -> {"α", "β"}],   v[[i]]}], {i, 1, 5}];

when we stare at that list of plots it seems like I should have more intersection points for those two contours but I could not find a way to figure this discrepancy of FindAllCrossings2D and the contour plots.

Could you just give me an idea where this problem would origin from?


2 Answers 2


Here is what you get with your code,

  ListPlot[u[[5]], AxesLabel -> {"α", "β"}, 
   PlotStyle -> Directive[Red, PointSize[Large]]]}, 
 PlotRange -> {{-3, 3}, {-10, 10}}]

Mathematica graphics

And you are right, you clearly have missed some of the intersection points. C.E. showed why FindAllCrossings2D misses these points.

I think you can use MeshFuntions to find the points pretty easily:

f1[y_, α_, β_] := 
  Re[-2 (α + I β) - 
    Sqrt[2] (α + I β) Sech[
       Sqrt[2] (α + I β)]^2 - 
    Tanh[Sqrt[2] (α + I β)]];
f2[y_, α_, β_] := 
  y + Im[-2 (α + I β) - 
     Sqrt[2] (α + I β) Sech[
        Sqrt[2] (α + I β)]^2 - 
     Tanh[Sqrt[2] (α + I β)]];
plot = ContourPlot[{f1[1, a, b] == 0, f2[1, a, b] == 0}, {a, -3, 3}, {b, -10,
 PlotPoints -> 100,
 MeshFunctions -> { f1[1, #1, #2] - f2[1, #1, #2] & },
 ContourStyle -> {Darker@Green, Thick},
 Mesh -> {{0}},
 MeshStyle -> Directive[Red, PointSize[Large]]]

Mathematica graphics

If you need to extract the intersection points, you can do it like this

Cases[Normal@plot, Point[a_] :> a, Infinity]

To understand the syntax of MeshFunctions and why it worked so well in this case, see the excellent explanation here, which is where I learned about it.

  • $\begingroup$ I appreciate a lot for the help , I have just started reading that Mesh functions and hopefully i will be able to make more sense of how it took care of this problem, after I understand the dynamics of it. $\endgroup$
    – user92604
    Commented Aug 18, 2016 at 18:04
  • $\begingroup$ @JasonB. Nice solution! What could be the reason, that this doesn't work in Mathematica v12.2 (Windows) ? Thanks! $\endgroup$ Commented Aug 13, 2021 at 9:15

Take a closer look at the contour plot:

Mathematica graphics

FindAllCrossings2D works as follows:

  1. Make a contour plot of one of the functions. Extract the lines.
  2. Evaluate the other function along the lines and look for a change of sign.
  3. Wherever there is a sign change, use FindRoot to find the exact location of the sign change. This is the crossing.

Let's say that on the left side of this plot the sign is +, and on the right side it is -. Then on the left side inside the loop the sign is -, and on the right side inside the loop the sign is +. When the line crosses from the left side outside the loop to the right side inside the loop, or vice versa, there is no sign change and therefore the method fails.

There is not much to be done about it I believe, this is just how the method work.

  • $\begingroup$ Thanks a lot for the clarification and your time. Now, this method makes more sense.I did not know that we can accept only one answer. I suppose I will go with the other one. However, what you explained actually taught me this method. $\endgroup$
    – user92604
    Commented Aug 18, 2016 at 18:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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