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