code 33070;
procedure EFRK(T,TE,M0,M,U,SIGMA,PHI,DIAMETER,DERIVATIVE,K,STEP,R,L,
BETA,THIRDORDER,TOL,OUTPUT);
value R,L;
integer M0,M,K,R,L;
real T,TE,SIGMA,PHI,DIAMETER,STEP,TOL;
array U,BETA;
boolean THIRDORDER;
procedure DERIVATIVE,OUTPUT;
begin integer N;
real THETA0,THETANM1,H,B,B0,PHI0,PHIL,PI,COSPHI,SINPHI,EPS,BETAR;
boolean FIRST,LAST,COMPLEX,CHANGE;
integer array P[1:L];
real array MU,LABDA[0:R+L-1],PT[0:R],FAC,BETAC[0:L-1],RL[M0:M],
A[1:L,1:L],AUX[0:3];
procedure FORM CONSTANTS;
begin integer I;
FIRST:=false;
FAC[0]:=1;
for I:=1 step 1 until L-1 do FAC[I]:=I*FAC[I-1];
PT[R]:=L*FAC[L-1];
for I:=1 step 1 until R do
PT[R-I]:=PT[R-I+1]*(L+I)/I
end FORM CONSTANTS;
procedure FORM BETA;
begin integer I,J; real BB,C,D;
if FIRST then FORM CONSTANTS;
if L=1 then
begin C:=1-EXP(-B);
for J:=1 step 1 until R do C:=BETA[J]-C/B;
BETA[R+1]:=C/B
end else
if B>40 then
begin for I:=R+1 step 1 until R+L do
begin C:=0;
for J:=0 step 1 until R do
C:=BETA[J]*PT[J]/(I-J)-C/B;
BETA[I]:=C/B/FAC[L+R-I]/FAC[I-R-1]
end;
end else
begin D:=C:=EXP(-B); BETAC[L-1]:=D/FAC[L-1];
for I:=1 step 1 until L-1 do
begin C:=B*C/I; D:=D+C; BETAC[L-1-I]:=D/FAC[L-1-I] end;
BB:=1;
for I:=R+1 step 1 until R+L do
begin C:=0;
for J:=0 step 1 until R do
C:=(BETA[J]-(if J<L then BETAC[J] else 0))*
PT[J]/(I-J)-C/B;
BETA[I]:=C/B/FAC[L+R-I]/FAC[I-R-1]+
(if I<L then BB*BETAC[I] else 0);
BB:=BB*B
end
end
end FORM BETA;
procedure SOLUTION OF COMPLEX EQUATIONS;
begin integer I,J,C1,C3;
real C2,E,B1,ZI,COSIPHI,SINIPHI,COSPHIL;
real array D[1:L];
procedure ELEMENTS OF MATRIX;
begin PHIL:=PHI0;
COSPHI:=COS(PHIL); SINPHI:=SIN(PHIL);
COSIPHI:=1; SINIPHI:=0;
for I:=0 step 1 until L-1 do
begin C1:=R+1+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:=C1*C2; 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 RIGHTHANDSIDE;
begin E:=EXP(B*COSPHI);
B1:=B*SINPHI-(R+1)*PHIL;
COSIPHI:=E*COS(B1); SINIPHI:=E*SIN(B1);
B1:=1/B; ZI:=B1**R;
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
end;
COSIPHI:=ZI:=1; SINIPHI:=0;
for I:=R step -1 until 0 do
begin C1:=I; C2:=BETA[I];
C3:=if 2*I>L-2 then 2 else L-2*I;
COSPHIL :=COSIPHI*COSPHI-SINIPHI*SINPHI;
SINIPHI:=COSIPHI*SINPHI+SINIPHI*COSPHI;
COSIPHI:=COSPHIL;
for J:=L step -2 until C3 do
begin D[J]:=D[J]+ZI*C2*SINIPHI;
D[J-1]:=D[J-1]-ZI*C2*COSIPHI;
C2:=C2*C1; C1:=C1-1
end;
ZI:=ZI*B1
end
end RIGHT HAND SIDE;
if PHI0^=PHIL then ELEMENTS OF MATRIX;
RIGHTHANDSIDE;
SOL(A,L,P,D);
for I:=1 step 1 until L do BETA[R+I]:=D[L+1-I]*B1
procedure COEFFICIENT;
begin integer J,K; real C;
B0:=B; PHI0:=PHI;
if B>=1 then
begin if COMPLEX then SOLUTION OF COMPLEX EQUATIONS
else FORM BETA
end;
LABDA[0]:=MU[0]:=0;
if THIRDORDER then
begin THETA0:=.25; THETANM1:=.75;
if B<1 then
begin C:=MU[N-1]:=2/3; LABDA[N-1]:=5/12;
for J:=N-2 step -1 until 1 do
begin C:=MU[J]:=C/(C-.25)/(N-J+1);
LABDA[J]:=C-.25
end
end else
begin C:=MU[N-1]:=BETA[2]*4/3; LABDA[N-1]:=C-.25;
for J:=N-2 step -1 until 1 do
begin C:=MU[J]:=C/(C-.25)*BETA[N-J+1]/BETA[N-J]/
(if J<L then B else 1);
LABDA[J]:=C-.25
end
end
end else
begin THETA0:=0; THETANM1:=1;
if B<1 then
begin for J:=N-1 step -1 until 1 do
MU[J]:=LABDA[J]:=1/(N-J+1)
end else
begin LABDA[N-1]:=MU[N-1]:=BETA[2];
for J:=N-2 step -1 until 1 do
MU[J]:=LABDA[J]:=BETA[N-J+1]/BETA[N-J]/
(if J<L then B else 1)
end
end
procedure STEPSIZE;
begin real D,HSTAB,HSTABINT;
H:=STEP;
D:=ABS(SIGMA*SIN(PHI));
COMPLEX:=L//2*2=L and 2*D>DIAMETER;
if DIAMETER>0 then
HSTAB:=(SIGMA**2/(DIAMETER*(DIAMETER*.25+D)))**(L*.5/R)/
BETAR/SIGMA
else HSTAB:=H;
D:= if THIRDORDER then (2*TOL/EPS/BETA[R])**(1/(N-1))*
4**((L-1)/(N-1)) else (TOL/EPS)**(1/R)/BETAR;
HSTABINT:= ABS(D/SIGMA);
if H>HSTAB then H:=HSTAB;
if H>HSTABINT then H:=HSTABINT;
if T+H>TE*(1-K*EPS) then
begin LAST:=true; H:=TE-T end;
B:=H*SIGMA; D:=DIAMETER*.1*H; D:=D*D;
if H<T*EPS then goto ENDOFEFRK;
CHANGE:=B0=-1 or ((B-B0)*(B-B0)+B*B0*(PHI-PHI0)*(PHI-PHI0)>D)
end STEPSIZE;
procedure DIFFERENCESCHEME ;
begin integer I,J; real MT,LT,THT;
I:=-1;
NEXTTERM:
I:=I+1; MT:=MU[I]*H; LT:=LABDA[I]*H;
for J:=M0 step 1 until M do RL[J]:=U[J]+LT*RL[J];
DERIVATIVE(T+MT,RL);
if I=0 or I=N-1 then
begin THT:=if I=0 then THETA0*H else THETANM1*H;
ELMVEC(M0,M,0,U,RL,THT)
end;
if I<N-1 then goto NEXTTERM;
T:=T+H
end DIFFERENCE SCHEME;
N:=R+L; FIRST:=true; B0:=-1; BETAR:=BETA[R]**(1/R);
LAST:=false; EPS:=2.0**(-48); PI:=PHI0:=PHIL:=4*ARCTAN(1);
INIVEC(M0, M, RL, 0);
NEXTLEVEL:
STEPSIZE;
if CHANGE then COEFFICIENT;
K:=K+1;
DIFFERENCE SCHEME;
OUTPUT;
if not LAST then goto NEXTLEVEL;
ENDOFEFRK:
end EXPONENTIALLY FITTED RUNGE KUTTA;
eop