code 33131;
procedure LINIGER2(X,XE,M,Y,SIGMA1,SIGMA2,F,EVALUATE,J,
JACOBIAN,K,ITMAX,STEP,AETA,RETA,OUTPUT);
integer M,K,ITMAX;
real X,XE,SIGMA1,SIGMA2,STEP,AETA,RETA;
array Y,J;
boolean procedure EVALUATE;
real procedure F;
procedure JACOBIAN,OUTPUT;
begin integer I;
real H,HL,B1,B2,P,Q,C0,C1,C2,C3,C4;
boolean LAST;
integer array PI[1:M];
real array DY,YL,FL[1:M],A[1:M,1:M],AUX[1:3];
procedure STEPSIZE;
begin H:=STEP;
if 1.1*H>=XE-X then
begin LAST:=true; H:=XE-X; X:=XE
end else X:=X+H
end STEPSIZE;
procedure COEFFICIENT;
begin real R1,R2,EX,ZETA,ETA,SINL,COSL,SINH,COSH,D;
real procedure R(X); value X; real X;
if X>40 then R:=X/(X-2) else
begin EX:=EXP(-X); R:=X*(1-EX)/(X-2+(X+2)*EX) end;
B1:=H*SIGMA1;
B2:=H*SIGMA2;
if B1<.1 then begin P:=0; Q:=1/3; goto OUT end;
if B2<0 then goto COMPLEX;
if B1<1 or B2<.1 then goto THIRDORDER;
if ABS(B1-B2)<B1*B1*"-6 then goto DOUBLEFIT;
R1:=R(B1)*B1; R2:=R(B2)*B2;
D:=B2*R1-B1*R2;
P:=2*(R2-R1)/D;
Q:=2*(B2-B1)/D;
THIRDORDER: Q:=1/3;
P:=R(B1)/3-2/B1;
goto OUT;
DOUBLEFIT: B1:=.5*(B1+B2);
R1:=R(B1);
if B1>40 then EX:=0;
R2:=B1/(1-EX); R2:=1-EX*R2*R2;
Q:=1/(R1*R1*R2);
P:=R1*Q-2/B1;
goto OUT;
COMPLEX: ETA:=ABS(B1*SIN(SIGMA2));
ZETA:=ABS(B1*COS(SIGMA2));
if ETA<B1*B1*"-6 then
begin B1:=B2:=ZETA; goto DOUBLEFIT end;
if ZETA>40 then
begin P:=1-4*ZETA/B1/B1; Q:=4*(1-ZETA)/B1/B1+1 end else
begin EX:=EXP(ZETA);
SINL:=SIN(ETA); COSL:=COS(ETA);
SINH:=.5*(EX-1/EX); COSH:=.5*(EX+1/EX);
D:=ETA*(COSH-COSL)-.5*B1*B1*SINL;
P:=(ZETA*SINL+ETA*SINH-4*ZETA*ETA/B1/B1*(COSH-COSL))/D;
Q:=ETA*((COSH-COSL-ZETA*SINH-ETA*SINL)*4/B1/B1+COSH+COSL)/D
end;
OUT: C0:=.25*H*H*(P+Q);
C1:=.5*H*(1+P);
C2:=H-C1;
C3:=.25*H*H*(Q-P);
C4:=.5*H*P;
ELEMENTS OF MATRIX
end COEFFICIENT;
procedure ELEMENTS OF MATRIX;
begin integer K;
for I:=1 step 1 until M do
begin for K:=1 step 1 until M do
A[I,K]:=C0*MATMAT(1,M,I,K,J,J)-C1*J[I,K];
A[I,I]:=A[I,I]+1
end;
AUX[2]:=0; DEC(A,M,AUX,PI)
procedure NEWTON ITERATION;
begin integer ITNUM; real JFL,ETA,DISCR;
ITNUM:=0;
NEXT: ITNUM:=ITNUM+1;
if EVALUATE(ITNUM) then
begin JACOBIAN(J,Y); COEFFICIENT end
else if ITNUM=1 and H^=HL then COEFFICIENT;
for I:=1 step 1 until M do FL[I]:=F(I);
if ITNUM=1 then
begin for I:=1 step 1 until M do
begin JFL:=MATVEC(1,M,I,J,FL);
DY[I]:=H*(FL[I]-C4*JFL);
YL[I]:=Y[I]+C2*FL[I]+C3*JFL
end
end else
for I:=1 step 1 until M do
DY[I]:=YL[I]-Y[I]+C1*FL[I]-C0*MATVEC(1,M,I,J,FL);
SOL(A,M,PI,DY);
for I:=1 step 1 until M do Y[I]:=Y[I]+DY[I];
if ITNUM<ITMAX then
begin ETA:=SQRT(VECVEC(1,M,0,Y,Y))*RETA+AETA;
DISCR:=SQRT(VECVEC(1,M,0,DY,DY));
if ETA<DISCR then goto NEXT
end
end NEWTON;
LAST:=false; K:=0; HL:=0;
NEXT LEVEL:
K:=K+1;
STEPSIZE;
NEWTON ITERATION;
HL:=H;
OUTPUT;
if not LAST then goto NEXT LEVEL
end LINIGER2;
eop