code 33120;
procedure EFERK(X,XE,M,Y,SIGMA,PHI,DERIVATIVE,J,JACOBIAN,
K,L,AUT,AETA,RETA,HMIN,HMAX,LINEAR,OUTPUT);
value L; integer M,K,L;
real X,XE,SIGMA,PHI,AETA,RETA,HMIN,HMAX; array Y,J;
boolean AUT,LINEAR; procedure DERIVATIVE,JACOBIAN,OUTPUT;
begin integer M1,I;
real H,B,B0,PHI0,COSPHI,SINPHI,ETA,DISCR,FAC,PI;
boolean CHANGE,LAST;
integer array P[1:L];
real array BETA,BETHA[0:L],BETAC[0:L+3],K0,D,D1,D2[1:M],
A[1:L,1:L],AUX[1:3];
real procedure SUM(I,L,U,T); value L,U; integer I,L,U;
real T;
begin real S; S:=0;
for I:=L step 1 until U do S:=S+T;
SUM:=S
end;
procedure FORMBETA;
if L=1 then
begin BETHA[1]:=(.5-(1-(1-EXP(-B))/B)/B)/B;
BETA[1]:=(1/6-BETHA[1])/B
end else
if L=2 then
begin real E,EMIN1; E:=EXP(-B); EMIN1:=E-1;
BETHA[1]:=(1-(3+E+4*EMIN1/B)/B)/B;
BETHA[2]:=(.5-(2+E+3*EMIN1/B)/B)/B/B;
BETA[2]:=(1/6-BETHA[1])/B/B;
BETA[1]:=(1/3-(1.5-(4+E+5*EMIN1/B)/B)/B)/B
end else
begin real B0,B1,B2,A0,A1,A2,A3,C,D;
BETAC[L-1]:=C:=D:=EXP(-B)/FAC;
for I:=L-1 step -1 until 1 do
begin C:=I*B*C/(L-I); BETAC[I-1]:=D:=D*I+C end;
B2:=.5-BETAC[2];
B1:=(1-BETAC[1])*(L+1)/B;
B0:=(1-BETAC[0])*(L+2)*(L+1)*.5/B/B;
A3:=1/6-BETAC[3];
A2:=B2*(L+1)/B;
A1:=B1*(L+2)*.5/B;
A0:=B0*(L+3)/3/B;
D:=L/B;
for I:=1 step 1 until L do
begin BETA[I]:=(A3/I-A2/(I+1)+A1/(I+2)-A0/(I+3))*D+BETAC[I+3];
BETHA[I]:=(B2/I-B1/(I+1)+B0/(I+2))*D+BETAC[I+2];
D:=D*(L-I)/I/B;
end
procedure SOLUTIONOFCOMPLEXEQUATIONS;
if L=2 then
begin real COS2PHI,COSA,SINA,E,ZI;
PHI0:=PHI; COSPHI:=COS(PHI0); SINPHI:=SIN(PHI0);
E:=EXP(B*COSPHI); ZI:=B*SINPHI-3*PHI0;
SINA:=(if ABS(SINPHI)<"-6 then -E*(B+3)
else E*SIN(ZI)/SINPHI);
COS2PHI:=2*COSPHI*COSPHI-1;
BETHA[2]:=(.5+(2*COSPHI+(1+2*COS2PHI+SINA)/B)/B)/B/B;
SINA:=(if ABS(SINPHI)<"-6 then E*(B+4)
else SINA*COSPHI-E*COS(ZI));
BETHA[1]:=-(COSPHI+(1+2*COS2PHI+(4*COSPHI*COS2PHI+SINA)
/B)/B)/B;
BETA[1]:=BETHA[2]+2*COSPHI*(BETHA[1]-1/6)/B;
BETA[2]:=(1/6-BETHA[1])/B/B
end else
begin integer J,C1;
real C2,E,ZI,COSIPHI,SINIPHI,COSPHIL;
real array D[1:L];
procedure ELEMENTS OF MATRIX;
begin PHI0:=PHI;
COSPHI:=COS(PHI0); SINPHI:=SIN(PHI0);
COSIPHI:=1; SINIPHI:=0;
for I:=0 step 1 until L-1 do
begin C1:=4+I; C2:=1;
for J:=L-1 step -2 until 1 do
begin A[J,L-I]:=C2*COSIPHI;
A[J+1,L-I]:=C2*SINIPHI;
C2:=C2*C1; C1:=C1-1
end;
COSPHIL:=COSIPHI*COSPHI-SINIPHI*SINPHI;
SINIPHI:=COSIPHI*SINPHI+SINIPHI*COSPHI;
COSIPHI:=COSPHIL
end;
AUX[2]:=0; DEC(A,L,AUX,P)
end EL OF MAT;
procedure RIGHT HAND SIDE;
begin E:=EXP(B*COSPHI);
ZI:=B*SINPHI-4*PHI0;
COSIPHI:=E*COS(ZI); SINIPHI:=E*SIN(ZI);
ZI:=1/B/B/B;
for J:=L step -2 until 2 do
begin D[J]:=ZI*SINIPHI;
D[J-1]:=ZI*COSIPHI;
COSPHIL:=COSIPHI*COSPHI-SINIPHI*SINPHI;
SINIPHI:=COSIPHI*SINPHI+SINIPHI*COSPHI;
COSIPHI:=COSPHIL; ZI:=ZI*B
SINIPHI:=2*SINPHI*COSPHI;
COSIPHI:=2*COSPHI*COSPHI-1;
COSPHIL:=COSPHI*(2*COSIPHI-1);
D[L]:=D[L]+SINPHI*(1/6+(COSPHI+(1+2*COSIPHI*(1+2*COSPHI/B))
/B)/B);
D[L-1]:=D[L-1]-COSPHI/6-(.5*COSIPHI+(COSPHIL+(2*COSIPHI*
COSIPHI-1)/B)/B)/B;
D[L-2]:=D[L-2]+SINPHI*(.5+(2*COSPHI+(2*COSIPHI+1)/B)/B);
D[L-3]:=D[L-3]-.5*COSPHI-(COSIPHI+COSPHIL/B)/B;
if L<5 then goto END;
D[L-4]:=D[L-4]+SINPHI+SINIPHI/B;
D[L-5]:=D[L-5]-COSPHI-COSIPHI/B;
if L<7 then goto END;
D[L-6]:=D[L-6]+SINPHI;
D[L-7]:=D[L-7]-COSPHI;
END:
end RHS;
if PHI0^=PHI then ELEMENTS OF MATRIX;
RIGHT HAND SIDE;
SOL(A,L,P,D);
ZI:=1/B;
for I:=1 step 1 until L do
begin BETA[I]:=D[L+1-I]*ZI;
BETHA[I]:=(I+3)*BETA[I];
ZI:=ZI/B
end
end SOLOFEQCOM;
procedure COEFFICIENT;
begin B0:=B:=ABS(H*SIGMA);
if B>=.1 then
begin if PHI^=PI and L=2 or ABS(PHI-PI)>.01 then
SOLUTION OF COMPLEX EQUATIONS else FORMBETA
end else
begin for I:=1 step 1 until L do
begin BETHA[I]:=BETA[I-1];
BETA[I]:=BETA[I-1]/(I+3);
end
end
end COEFFICIENT;
procedure LOCAL ERROR BOUND;
ETA:=AETA+RETA*SQRT(VECVEC(1,M1,0,Y,Y));
procedure STEPSIZE;
begin LOCAL ERROR BOUND;
if K=0 then
begin DISCR:=SQRT(VECVEC(1,M1,0,D,D)); H:=ETA/DISCR
end else
begin DISCR:=H*SQRT(SUM(I,1,M1,(D[I]-D2[I])**2))/ETA;
H:=H*(if LINEAR then 4/(4+DISCR)+.5
else 4/(3+DISCR)+1/3)
if H<HMIN then H:=HMIN;
if H>HMAX then H:=HMAX;
B:=ABS(H*SIGMA);
CHANGE:=ABS(1-B/B0)>.05 or PHI^=PHI0;
if 1.1*H>=XE-X then
begin CHANGE:=LAST:=true; H:=XE-X end;
if not CHANGE then H:=H*B0/B
end STEPSIZE;
procedure DIFFERENCE SCHEME;
begin integer K;
real BETAI,BETHAI;
if M1<M then
begin D2[M]:=1; K0[M]:=Y[M]+2*H/3; Y[M]:=Y[M]+.25*H end;
for K:=1 step 1 until M1 do
begin K0[K]:=Y[K]+2*H/3*D[K];
Y[K]:=Y[K]+.25*H*D[K];
D1[K]:=H*MATVEC(1,M,K,J,D);
D2[K]:=D1[K]+D[K]
end;
for I:=0 step 1 until L do
begin BETAI:=4*BETA[I]/3; BETHAI:=BETHA[I];
for K:=1 step 1 until M1 do D[K]:=H*D1[K];
for K:=1 step 1 until M1 do
begin K0[K]:=K0[K]+BETAI*D[K];
D1[K]:=MATVEC(1,M1,K,J,D);
D2[K]:=D2[K]+BETHAI*D1[K]
end
end;
DERIVATIVE(K0);
for K:=1 step 1 until M do Y[K]:=Y[K]+.75*H*K0[K]
end DIFF SCHEME;
B0:=PHI0:=-1; PI:=4*ARCTAN(1);
BETAC[L]:=BETAC[L+1]:=BETAC[L+2]:=BETAC[L+3]:=0;
BETA[0]:=1/6; BETHA[0]:=.5;
FAC:=1; for I:=2 step 1 until L-1 do FAC:=I*FAC;
M1:= if AUT then M else M-1;
K:=0; LAST:=false;
NEXT LEVEL:
for I:=1 step 1 until M do D[I]:=Y[I];
DERIVATIVE(D);
if not LINEAR or K=0 then JACOBIAN(J,Y);
STEPSIZE;
if CHANGE then COEFFICIENT;
OUTPUT;
DIFFERENCE SCHEME;
K:=K+1;
X:=X+H;
if not LAST then goto NEXT LEVEL;
END OF EFERK: OUTPUT;
end EFERK;
eop