code 34151;
comment MCA 2311;
procedure VALSYMTRI(D, BB, N, N1, N2, VAL, EM);
value N, N1, N2;
integer N, N1, N2; array D, BB, VAL, EM;
begin integer K, COUNT;
real MAX, X, Y, MACHEPS, NORM, RE, MACHTOL, UB, LB, LAMBDA;
real procedure STURM;
begin integer P, I; real F;
COUNT:= COUNT + 1;
P:= K; F:= D[1] - X;
for I:= 2 step 1 until N do
begin if F <= 0 then
begin P:= P + 1;
if P > N then goto OUT
end
else if P < I - 1 then
begin LB:= X; goto OUT end;
if ABS(F) < MACHTOL then
F:= if F <= 0 then - MACHTOL else MACHTOL;
F:= D[I] - X - BB[I - 1] / F
end;
if P = N or F <= 0 then
begin if X < UB then UB:= X end else LB:= X;
OUT: STURM:= if P = N then F else (N - P) * MAX
end STURM;
MACHEPS:= EM[0]; NORM:= EM[1]; RE:= EM[2];
MACHTOL:= NORM * MACHEPS; MAX:= NORM / MACHEPS; COUNT:= 0;
UB:= 1.1 * NORM; LB:= - UB; LAMBDA:= UB;
for K:= N1 step 1 until N2 do
begin X:= LB; Y:= UB; LB:= -1.1 * NORM;
ZEROIN(X, Y, STURM, ABS(X) * RE + MACHTOL);
VAL[K]:= LAMBDA:= if X > LAMBDA then LAMBDA else X;
if UB > X then UB:= if X > Y then X else Y
end;
EM[3]:= COUNT
end VALSYMTRI
eop