# Code for finding multiple roots only finding two

I've an issue with my code. I am basically trying to get the n-th root of a function. My code finds two roots correctly, but for others, which I think should be distinct, I get the two roots repeated in the output.

I use a simple shifting-sign algorithm to locate the zeros and then apply a search.

k = 2;
jauge = ff[k, 0.2];
n = 8(* n-th zero*);
l = 1;
x = 0.2;
eps = 1;
res = {};
While[l != n, While[ff[k, x]*jauge >= 0; x = x + eps]
jauge = ff[k, x]
AppendTo[res, y /. FindRoot[ff[k, y], {y, x - eps, x}]]; l++]

res

Output:{4.03114*10^-8, 3.99932*10^-8, 3.934*10^-8, 4.06604*10^-8, 3.80759, 3.80759, 3.80759}


Note that 3.08759 is ok and 4.03*10^-8 too .

FF is

ff[k_, x_] :=
f22[k, x]*(x^3*BesselJ[k - 3, x] + x^2*(4 - 3*k)*BesselJ[k - 2, x] +
x*k*(k*(1 + u) - 2)*BesselJ[k - 1, x] +
k^2*(1 - u)*(1 + k)*BesselJ[k, x]) +

f11[k, x]*(x^3*BesselI[k - 3, x] +
x^2*(4 - 3*k)*BesselI[k - 2, x] +
x*k*(k*(1 + u) - 2)*BesselI[k - 1, x] +
k^2*(1 - u)*(1 + k)*BesselI[k, x]);


f1 and f2 are

u = 0.33;

f11[k_, x_] := (x^2)*BesselJ[k - 2, x] +
x*(u - 2*k + 1)*BesselJ[k - 1, x] +
k*(k + 1)*(1 - u)*BesselJ[k, x];
f22[k_, x_] := (x^2)*BesselI[k - 2, x] +
x*(u - 2*k + 1)*BesselI[k - 1, x] +
k*(k + 1)*(1 - u)*BesselI[k, x] ;

• What is ff function? Jun 13, 2018 at 11:24
• I edited my post Jun 13, 2018 at 11:29

I have copied your code f11, f22, ff functions and parameters from your question.

Your While loops have some syntax issues. You need to put a semi-colon (rather than a line break) between the executable lines in your code.

I added a print statement so that I could get a handle on what was going on.

While[l != n,
While[ff[k, x]*jauge >= 0; x = x + eps];

jauge = ff[k, x];
Print[{l, x, jauge}];

AppendTo[
res,
y /. FindRoot[ff[k, y], {y, x - eps, x}]
];


The printed output appears with the values for {l, x, jauge} for each iteration.

{1,1.2,-0.384755}

{2,2.2,-19.8427}

{3,3.2,-196.479}

{4,4.2,1475.53}

{5,5.2,33600.6}

{6,6.2,206483.}

{7,7.2,290681.}


The result is:

res

(* {3.99932*10^-8, 3.934*10^-8, 4.06604*10^-8,
3.80759, 3.80759, 3.80759, 3.80759} *)


Running FindRoot with two starting values causes the Secant method to be used for the root finding procedure so that numerical derivatives are computed.

Let's plot the function over the various intervals defined by the x values computed in the While loop.

Table[Plot[ff[k, y], {y, x - 1, x}], {x, 1.2, 7.2, 1}]


A study of the figures should help to explain why the fourth and subsequent iterations compute a value of 3.80759.

If you allow l to increase to 16 you get an additional eight roots

res

(* {7.46889, 7.46889, 7.46889,
10.7422, 10.7422, 10.7422, 13.9478} *)


Plots also validate these roots

Table[Plot[ff[k, y], {y, x - 1, x}], {x, 8.2, 14.2, 1}]


• Thanks again for all of that ! Jun 26, 2018 at 14:15