3
$\begingroup$

I'm trying to find the zeros of the Hankel function (the first few will do) of the first kind $H^{(1)}_\nu(z) = J_\nu(z) + i Y_\nu(z)$ for complex argument $z$ but I'm not sure what is the best function for this in mathematica.

EDIT: Per suggestion I have tried to implement the function FindAllCrossings2D

Options[FindAllCrossings2D] = 
  Sort[Join[
    Options[FindRoot], {MaxRecursion -> Automatic, 
     PerformanceGoal :> $PerformanceGoal, PlotPoints -> Automatic}]];

FindAllCrossings2D[funcs_, {x_, xmin_, xmax_}, {y_, ymin_, ymax_}, 
  opts___] := 
 Module[{contourData, seeds, tt, 
   fy = Compile[{x, y}, Evaluate[funcs[[2]]]]}, 
  contourData = 
   Map[First, 
    Cases[Normal[
      ContourPlot[funcs[[1]], {x, xmin, xmax}, {y, ymin, ymax}, 
       Contours -> {0}, ContourShading -> False, 
       PlotRange -> {Full, Full, Automatic}, 
       Evaluate[
        Sequence @@ 
         FilterRules[Join[{opts}, Options[FindAllCrossings2D]], 
          DeleteCases[Options[ContourPlot], Method -> _]]]]], _Line, 
     Infinity]];
  seeds = 
   Flatten[Map[#[[1 + 
         Flatten[Position[
           Rest[tt = Sign[Apply[fy, #, 2]]] Most[tt], -1]]]] &, 
     contourData], 1];
  If[seeds == {}, seeds, 
   Select[Union[
     Map[{x, y} /. 
        FindRoot[{funcs[[1]] == 0, 
          funcs[[2]] == 0}, {x, #[[1]]}, {y, #[[2]]}, 
         Evaluate[
          Sequence @@ 
           FilterRules[Join[{opts}, Options[FindAllCrossings2D]], 
            Options[FindRoot]]]] &, 
      seeds]], (xmin < #[[1]] < xmax && ymin < #[[2]] < ymax) &]]]

sols = FindAllCrossings2D[{Re[HankelH1[0, x + I y]], 
   Im[HankelH1[0, x + I y]]}, {x, -2, 2}, {y, -2, 2}]

But I receive this error "FindRoot::cvmit: Failed to converge to the requested accuracy or precision within 100 iterations."

I also looked at the contour plot and we can clearly see nontrivial zeros periodically for z = $x + i y$ and $x < 0$ and $y < 0$. I also attempted the get coordinate and then FindRoot[], but this failed to converge and appeared to be going away from the root.

Contour plot of $H^{(1)}_0$ function

$\endgroup$
2
  • 1
    $\begingroup$ You might want to adapt the solution here or here. $\endgroup$ May 10, 2017 at 23:40
  • $\begingroup$ I tried this @J.M. and neither work, I will update with code I took from the first solution $\endgroup$
    – Gregory
    May 11, 2017 at 16:23

1 Answer 1

3
$\begingroup$

You can use Solve for this purpose, as long as you restrict the domain:

zeros = z /. Solve[HankelH1[0, z] == 0 && -10 < Re[z] < 10 && -10 < Im[z] < 10, z]

Solve::incs: Warning: Solve was unable to prove that the solution set found is complete.

{Root[{HankelH1[ 0, #1] &, -8.65370576584112448841350498548699240993120635923782334125675 - 0.34600819276767292735146122876446089332681742821336233794111 I}], Root[{HankelH1[ 0, #1] &, -5.519997520841832519785940731628753302839051099087900948702 - 0.345225028545679355074185641966127944569911027495087086248 I}], Root[{HankelH1[ 0, #1] &, -2.4040911771553443579757061017638843409511660145346662653424 - 0.3405021529561410696628419946032815758353900295131219830737 I}]}

Unfortunately, Solve doesn't always find the complete solution set. Let's check whether the above roots are actually zeros:

HankelH1[0, N[zeros, 100]]

{0.*10^-101 + 0.*10^-101 I, 0.*10^-98 + 0.*10^-98 I, 0.*10^-99 + 0.*10^-99 I}

$\endgroup$

Your Answer

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

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