code 33040;
procedure MODIFIED TAYLOR(T,TE,M0,M,U,SIGMA,TAUMIN,I,DERIVATIVE,K,
DATA,ALFA,NORM,AETA,RETA,ETA,RHO,OUT);
integer M0,M,I,K,NORM;
real T,TE,SIGMA,TAUMIN,ALFA,AETA,RETA,ETA,RHO;
array U,DATA;
procedure DERIVATIVE,OUT;
begin I:=0;
begin integer N,P,Q;
own real EC0,EC1,EC2,TAU0,TAU1,TAU2,TAUS,T2;
real T0,TAU,TAUI,TAUEC,ECL,BETAN,GAMMA;
real array C[M0:M],BETA,BETHA[1:DATA[-2]];
boolean START,STEP1,LAST;
procedure COEFFICIENT;
begin integer J;real IFAC;
IFAC:=1; GAMMA:=.5; N:=DATA[-2]; P:=DATA[-1];
BETAN:=DATA[0]; Q:= if P<N then P+1 else N;
for J:=1 step 1 until N do
begin BETA[J]:=DATA[J]; IFAC:=IFAC/J;
BETHA[J]:=IFAC-BETA[J]
end;
if P=N then BETHA[N]:=IFAC
real procedure NORMFUNCTION(NORM,W);
integer NORM; array W;
begin integer J; real S,X;
S:=0;
if NORM=1 then
begin for J:=M0 step 1 until M do
begin X:=ABS(W[J]); if X>S then S:=X end
end else
S:=SQRT(VECVEC(M0,M,0,W,W));
NORMFUNCTION:=S
end;
procedure LOCAL ERROR BOUND;
ETA:=AETA+RETA * NORMFUNCTION(NORM,U);
procedure LOCAL ERROR CONSTRUCTION(I);integer I;
begin if I=P then begin ECL:=0;TAUEC:=1 end;
if I>P+1 then TAUEC:=TAUEC*TAU;
ECL:=ECL+ABS(BETHA[I])*TAUEC*NORMFUNCTION(NORM,C);
if I=N then
begin EC0:=EC1;EC1:=EC2;EC2:=ECL;
RHO:=ECL*TAU**Q
end
end;
procedure STEPSIZE;
begin real TAUACC,TAUSTAB,AA,BB,CC,EC;
LOCAL ERROR BOUND;
if ETA>0 then
begin if START then
begin if K=0 then
begin integer J;
for J:=M0 step 1 until M do C[J]:=U[J];
I:=1; DERIVATIVE(I,C);
TAUACC:=ETA/NORMFUNCTION(NORM,C);
STEP1:=true
end else
if STEP1 then
begin TAUACC:=(ETA/RHO)**(1/Q)*TAU2;
if TAUACC>10*TAU2 then
TAUACC:=10*TAU2 else STEP1:=false
end else
begin BB:=(EC2-EC1)/TAU1; CC:=EC2-BB*T2;
EC:=BB*T+CC;
TAUACC:=if EC<0 then TAU2 else
(ETA/EC)**(1/Q);
START:=false
end
end else
begin AA:=((EC0-EC1)/TAU0+(EC2-EC1)/TAU1)/
(TAU1+TAU0);
BB:=(EC2-EC1)/TAU1-AA*(2*T2-TAU1);
CC:=EC2-T2*(BB+AA*T2); EC:=CC+T*(BB+T*AA);
TAUACC:=if EC<0 then TAUS
else (ETA/EC)**(1/Q);
if TAUACC>ALFA*TAUS then TAUACC:=ALFA*TAUS;
if TAUACC<GAMMA*TAUS then TAUACC:=GAMMA*TAUS;
end
end else TAUACC:=TE-T;
if TAUACC<TAUMIN then TAUACC:=TAUMIN;
TAUSTAB:=BETAN/SIGMA;
if TAUSTAB<"-12 * (T-T0) then
begin OUT;goto END OF MODIFIED TAYLOR end;
TAU:=if TAUACC>TAUSTAB then TAUSTAB else TAUACC;
TAUS:=TAU; if TAU>=TE-T then
begin TAU:=TE-T;LAST:= true end;
TAU0:=TAU1;TAU1:=TAU2;TAU2:=TAU
end;
procedure DIFFERENCE SCHEME;
begin integer J; real B;
for J:=M0 step 1 until M do C[J]:=U[J]; TAUI:=1;
NEXT TERM:
I:=I+1; DERIVATIVE(I,C); TAUI:=TAUI*TAU;
B:=BETA[I]*TAUI;
if ETA>0 and I>=P then LOCAL ERROR CONSTRUCTION(I);
for J:=M0 step 1 until M do U[J]:=U[J]+B*C[J];
if I<N then goto NEXT TERM;
T2:=T; if LAST then
begin LAST:= false; T:= TE end
else T:= T + TAU
end;
START:= K=0; T0:=T;
COEFFICIENT; LAST:= false;
NEXT LEVEL:
STEPSIZE; K:=K+1; I:=0; DIFFERENCE SCHEME; OUT;
if T ^= TE then goto NEXT LEVEL
end;
END OF MODIFIED TAYLOR:
end MODIFIED TAYLOR;
eop