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