code 35184;
procedure BESS ZEROS(A,N,Z,D); value A,N,D; real A;array Z;
integer N,D;
comment COMPUTES Z[1],...Z[N],THE FIRST N ZEROS OF A BESSEL FUNCTION.
THE CHOICE OF D DETERMINES THE TYPE OF THE BESSEL FUNCTION :
IF D=1 THEN JA ELSE
IF D=2 THEN YA ELSE
IF D=3 THEN JA-PRIME ELSE
IF D=4 THEN YA-PRIME.
A IS THE ORDER OF THE BESSEL FUNCTION, IT MUST BE NON-NEGATIVE.;
begin real AA,A2,B,BB,C,CHI,CO,MU,MU2,MU3,MU4,P,PI,PA,PA1,P0,P1,PP1,
Q,QA,QA1,Q1,QQ1,RO,SI,T,TT,U,V,W,X,XX,X4,Y; integer J,S;
real procedure FI(Y); value Y; real Y;
comment COMPUTES FI FROM THE EQUATION
TAN(FI)-FI=Y , WHERE Y>=0.
THE RELATIVE ACCURACY IS AT LEAST 5 DIGITS;
if Y=0 then FI:=0 else
if Y>"5 then FI:=1.570796 else
begin real R,P,PP;
if Y<1 then
begin P:=(3*Y)**(1/3); PP:=P*P;
P:=P*(1+PP*(-210+PP*(27-2*PP))/1575)
end else
begin P:=1/(Y+1.570796); PP:=P*P;
P:= 1.570796-P*(1+PP*(2310+PP*(3003+PP*(4818+PP*
(8591+PP*16328))))/3465)
end;
PP:=(Y+P)*(Y+P); R:=(P-ARCTAN(P+Y))/PP;
FI:=P-(1+PP)*R*(1+R/(P+Y))
end FI;
real procedure R;
begin BESS PQA01(A,X,PA,QA,PA1,QA1);
CHI:=X-PI*(A/2+0.25);
SI :=SIN(CHI); CO:=COS(CHI);
R:= if D=1 then (PA*CO-QA*SI)/(PA1*SI+QA1*CO) else
if D=2 then (PA*SI+QA*CO)/(QA1*SI-PA1*CO) else
if D=3 then A/X-(PA1*SI+QA1*CO)/(PA*CO-QA*SI) else
A/X-(QA1*SI-PA1*CO)/(PA*SI+QA*CO)
end R;
PI:=4*ARCTAN(1); AA:=A*A; MU:=4*AA; MU2:=MU*MU;
MU3:=MU*MU2; MU4:=MU2*MU2;
if D<3 then
begin P:=7*MU-31; P0:=MU-1;
P1:=4*(253*MU2-3722*MU+17869)/15/P*P0;
Q1:=8*( 83*MU2- 982*MU+ 3779)/ 5/P
end else
begin P:=7*MU2+82*MU-9; P0:=MU+3;
P1:=(4048*MU4+131264*MU3-221984*MU2-417600*MU+1012176)/60/P;
Q1:=1.6*(83*MU3+2075*MU2-3039*MU+3537)/P
end;
T:=if D=1or D=4 then 0.25 else 0.75; TT:=4*T;
if D<3 then
begin PP1:= 5/48; QQ1:= -5/36 end else
begin PP1:=-7/48; QQ1:= 35/288 end;
Y:= 3*PI/8; BB:= if A>=3 then A **(-2/3) else 0.0 ;
for S:=1 step 1 until N do
begin if A=0and S=1and D=3 then
begin X:=0; J:=0 end else
begin if S >= 3*A -8 then
begin B:=(S+A/2-T)*PI; C:=1/B/B/64;
X:=B-1/B/8*(P0-P1*C)/(1-Q1*C)
end else
begin if S=1 then
begin X:= if D=1 then -2.33811 else
if D=2 then -1.17371 else
if D=3 then -1.01879 else -2.29444
end else
begin X:= Y*(4*S-TT); V:= 1/X/X;
X:= -X**(2/3)*(1+V*(PP1+QQ1*V))
end;
U:=X*BB; V:=FI(2/3*(-U)**1.5);
W:=1/COS(V); XX:=1-W*W; C:=SQRT(U/XX);
X:=W*(A+C/A/U*
(if D<3 then -5/48/U-C*(-5/24/XX+1/8)
else 7/48/U+C*(-7/24/XX+3/8)))
end; J:=0;
L1: XX:=X*X; X4:=XX*XX; A2:=AA-XX; RO:=R; J:=J+1;
if D<3 then
begin U:=RO; P:=(1-4*A2)/6/X/(2*A+1);
Q:=(2*(XX-MU)-1-6*A)/3/X/(2*A+1)
end else
begin U:=-XX*RO/A2; V:=2*X*A2/(AA+XX)/3;
W:=A2*A2*A2;
Q:=V*(1+( MU2+32*MU*XX+48*X4)/32/W);
P:=V*(1+(-MU2+40*MU*XX+48*X4)/64/W)
end;
W:=U*(1+P*RO)/(1+Q*RO); X:=X+W;
if ABS(W/X)>"-13 and J<5 then goto L1
end; Z[S]:=X
end
end BESS ZEROS
eop