"CODE" 33135; "PROCEDURE" IMPEX (N, T0, TEND, Y0, DERIV, AVAILABLE, H0, HMAX, PRESCH, EPS, WEIGHTS, UPDATE, FAIL, CONTROL); "VALUE" N; "INTEGER" N; "REAL" T0,TEND,H0,HMAX,EPS; "BOOLEAN" PRESCH,FAIL; "ARRAY" Y0,WEIGHTS; "BOOLEAN" "PROCEDURE" AVAILABLE; "PROCEDURE" DERIV,UPDATE,CONTROL; "BEGIN" "INTEGER" I,K,ECI; "REAL" T,T1,T2,T3,TP,H,H2,HNEW,ALF,LQ; "ARRAY" Y,Z,S1,S2,S3,U1,U3,W1,W2,W3,EHR[1:N],R,RF[1:5,1:N], ERR[1:3],A1,A2[1:N,1:N]; "INTEGER" "ARRAY" PS1,PS2[1:N]; "BOOLEAN" START,TWO,HALV; "PROCEDURE" DFDY(T,Y,A); "REAL" T; "ARRAY" Y,A; "BEGIN" "INTEGER" I,J; "REAL" SL; "ARRAY" F1,F2[1:N]; DERIV(T,Y,F1,N); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" SL:="-6*Y[I]; "IF" ABS(SL)<"-6 "THEN" SL:="-6; Y[I]:=Y[I]+SL; DERIV(T,Y,F2,N); "FOR" J:=1 "STEP" 1 "UNTIL" N "DO" A[J,I]:=(F2[J]-F1[J])/SL; Y[I]:=Y[I]-SL; "END" "END" DFDY; "PROCEDURE" STARTV(Y,T); "VALUE" T; "REAL" T; "ARRAY" Y; "BEGIN" "REAL" A,B,C; A:=(T-T1)/(T1-T2); B:=(T-T2)/(T1-T3); C:=(T-T1)/(T2-T3)*B; B:=A*B; A:=1+A+B; B:=A+C-1; MULVEC(1,N,0,Y,S1,A); ELMVEC(1,N,0,Y,S2,-B); ELMVEC(1,N,0,Y,S3,C) "END" STARTV "PROCEDURE" ITERATE(Z,Y,A,H,T,WEIGHTS,FAIL,PS); "ARRAY" Z,Y,A,WEIGHTS; "REAL" H,T; "LABEL" FAIL; "INTEGER" "ARRAY" PS; "BEGIN" "INTEGER" IT,LIT; "REAL" MAX,MAX1,CONV; "ARRAY" DZ,F1[1:N]; "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" Z[I]:=(Z[I]+Y[I])/2; IT:=LIT:=1; CONV:=1; ATER: DERIV(T,Z,F1,N); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" F1[I]:=DZ[I]:=Z[I]-H*F1[I]/2-Y[I]; SOL(A,N,PS,DZ); ELMVEC(1,N,0,Z,DZ,-1); MAX:=0; "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" MAX:=MAX+(WEIGHTS[I]*DZ[I])**2; MAX:=SQRT(MAX); "IF" MAX*CONV.2 "THEN" "BEGIN" "IF" LIT=0 "THEN" "GOTO" FAIL; LIT:=0; CONV:=1; IT:=1; RECOMP(A,H,T,Z,FAIL,PS); "END"; ASS: MAX1:=MAX; "GOTO" ATER; OUT: "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" Z[I]:=2*Z[I]-Y[I]; "END" ITERATE; "PROCEDURE" RECOMP(A,H,T,Y,FAIL,PS); "REAL" H,T; "ARRAY" A,Y; "LABEL" FAIL; "INTEGER" "ARRAY" PS; "BEGIN" "REAL" SL; "ARRAY" AUX[1:3]; SL:=H/2; "IF" "NOT" AVAILABLE(T,Y,A,N) "THEN" DFDY(T,Y,A); "FOR" I:=1 "STEP" 1 "UNTIL" N "DO" "BEGIN" MULROW(1,N,I,I,A,A,-SL); A[I,I]:=1+A[I,I] "END"; AUX[2]:="-14; DEC(A,N,AUX,PS); "IF" AUX[3]1 "THEN" SN:=1; "IF" START "THEN" "BEGIN" SN:=SN**4; LR:=LR*4 "END"; EHR[I]:=B3:=SN*EHR[I]+LR; C3:=C3+B3*B3*W; "END" I; B0:=ERR[1]; ERR[1]:=B1:=SQRT(C0); ERR[2]:=SQRT(C1); ERR[3]:=SQRT(C3)+SQRT(C2)/2; LQ:=EPS/("IF" B0=80 "THEN" LQ:=10; "END"; "PROCEDURE" REJECT; "IF" START "THEN" "BEGIN" HNEW:=LQ**(1/5)*H/2; "GOTO" INIT "END" "ELSE" "BEGIN" "FOR" K:=1,2,3,4,1,2,3 "DO" ELMROW(1,N,K,K+1,R,R,-1); "FOR" K:=1,2,3,4 "DO" ELMROW(1,N,K,K+1,RF,RF,-1); T:=T-H2; HALV:="TRUE"; HNEW:=H; "GOTO" MSTP "END" "PROCEDURE" STEPSIZE; "IF" LQ<2 "THEN" "BEGIN" HALV:="TRUE"; HNEW:=H "END" "ELSE" "BEGIN" "IF" LQ>80 "THEN" HNEW:=("IF" LQ>5120 "THEN" (LQ/5)**(1/5) "ELSE" 2)*H2; "IF" HNEW>HMAX "THEN" HNEW:=HMAX; "IF" TEND>T "AND" TEND-THMAX "THEN" H:=HMAX "ELSE" H:=H0; "IF" H>(TEND-T0)/4 "THEN" H:=(TEND-T0)/4; "END"; HNEW:=H; ALF:=0; T:=TP:=T0; INIVEC(1,3,ERR,0); INIVEC(1,N,EHR,0); DUPROWVEC(1,N,1,R,Y0); INIMAT(2, 5, 1, N, R, 0.0); CONTROL(TP,T,H,HNEW,R,ERR,N); INIT: INITIALIZATION; START:="TRUE"; "FOR" ECI:=0,1,2,3 "DO" "BEGIN" ONE LARGE STEP; T:=T+H2; "IF" ECI>0 "THEN" "BEGIN" BACKWARD DIFFERENCES; UPDATE(WEIGHTS,S2,N) "END" "END"; ECI:=4; MSTP: "IF" HNEW^=H2 "THEN" "BEGIN" ECI:=1; CHANGE OF INFORMATION; ONE LARGE STEP; T:=T+H2; ECI:=2; "END"; ONE LARGE STEP; BACKWARD DIFFERENCES; UPDATE(WEIGHTS,S2,N); ERROR ESTIMATES; "IF" ECI<4 "AND" LQ>80 "THEN" LQ:=20; HALV:=TWO:="FALSE"; "IF" PRESCH "THEN" "GOTO" TRYCK; "IF" LQ<1 "THEN" REJECT "ELSE" STEPSIZE; TRYCK: "IF" TP<=T "THEN" CONTROL(TP,T,H,HNEW,R,ERR,N); "IF" START "THEN" START:="FALSE"; "IF" HNEW=H2 "THEN" T:=T+H2; ECI:=ECI+1; "IF" T1 "THEN" T:=T-H2; HALV:=TWO:="FALSE"; HNEW:=H2/2; "IF" START "THEN" "GOTO" INIT "ELSE" "GOTO" TRYCK "END"; END: "END" IMPEX; "EOP"