code 33017 ;
   procedure RK4NA(X, XA, B, FXJ, J, E, D, FI, N, L, POS);
   value FI, N, L, POS; integer J, N, L; boolean FI, POS;
   real B, FXJ; array X, XA, E, D;
   begin integer I, IV, IV0;
      boolean FIR, FIRST, REJ;
      real H, COND0, COND1, FHM, ABSH, TOL, FH, MAX, X0,
      X1, S, HMIN, HL, MU, MU1;
      array XL, DISCR, Y[0:N], K[0:5,0:N], E1[1:2];

      procedure RKSTEP(H, D); value H, D; integer D; real H;
      begin integer I;

         procedure F(T); value T; integer T;
         begin integer I;
            real P;
            for J:= 1 step 1 until N do Y[J]:= FXJ;
            P:= H / Y[IV];
            for I:= 0 step 1 until N do 
            begin if I ^= IV then K[T,I]:= Y[I] * P end 
         end F;

         if D = 2 then goto INTEGRATE; if D = 3 then 
         begin for I:= 0 step 1 until N do X[I]:= XL[I];
            F(0)
         end 
         else if D = 1 then 
         begin real P;
            P:= H / Y[IV];
            for I:= 0 step 1 until N do 
            begin if I ^= IV then K[0,I]:= P * Y[I] end 
         end 
         else 
         for I:= 0 step 1 until N do 
         begin if I ^= IV then K[0,I]:= K[0,I] * MU end;
         for I:= 0 step 1 until N do X[I]:= XL[I] + (if I
         = IV then H else K[0,I]) / 4.5; F(1);
         for I:= 0 step 1 until N do X[I]:= XL[I] + (if I
         = IV then H * 4 else (K[0,I] + K[1,I] * 3)) / 12;
         F(2);
         for I:= 0 step 1 until N do X[I]:= XL[I] + (if I
         = IV then H * .5 else (K[0,I] + K[2,I] * 3) / 8);
         for I:= 0 step 1 until N do X[I]:= XL[I] + (if I
         = IV then H * .8 else (K[0,I] * 53 - K[1,I] * 135
         + K[2,I] * 126 + K[3,I] * 56) / 125); F(4);
         if D <= 1 then 
         begin for I:= 0 step 1 until N do X[I]:= XL[I] +
            (if I = IV then H else (K[0,I] * 133 -
            K[1,I] * 378 + K[2,I] * 276 + K[3,I] * 112 +
            K[4,I] * 25) / 168); F(5);
            for I:= 0 step 1 until N do 
            begin if I ^= IV then DISCR[I]:= ABS(K[0,I] * 21
               - K[2,I] * 162 + K[3,I] * 224 - K[4,I] *
               125 + K[5,I] * 42) / 14
            end;
            goto END
         end;
      INTEGRATE: for I:= 0 step 1 until N do X[I]:= XL[I]
         + (if I = IV then H else ( - K[0,I] * 63 + K[1,I]
         * 189 - K[2,I] * 36 - K[3,I] * 112 + K[4,I] * 50)
         / 28); F(5);
         for I:= 0 step 1 until N do 
         begin if I ^= IV then X[I]:= XL[I] + (K[0,I] * 35
            + K[2,I] * 162 + K[4,I] * 125 + K[5,I] * 14) / 336
         end ;
         END ..
         end RKSTEP ;

      real procedure FZERO;
      begin if S = X0 then FZERO:= COND0 else if S = X1
         then FZERO:= COND1 else 
         begin RKSTEP(S - XL[IV], 3); FZERO:= B end 
      end FZERO;

      if FI then 
      begin for I:= 0 step 1 until N do D[I + 3]:= XA[I];
         D[0]:= D[2]:= 0
      end;
      D[1]:= 0;
      for I:= 0 step 1 until N do X[I]:= XL[I]:= D[I + 3];
      IV:= D[0]; H:= D[2]; FIRST:= FIR:= true; Y[0]:= 1;
      goto CHANGE;
   AGAIN: ABSH:= ABS(H); if ABSH < HMIN then 
      begin H:= if H > 0 then HMIN else - HMIN;
         ABSH:= ABS(H)
      end;
      RKSTEP(H, I); REJ:= false; FHM:= 0;
      for I:= 0 step 1 until N do 
      begin if I ^= IV then 
         begin TOL:= E[2 * I] * ABS(K[0,I]) + E[2 * I + 1]
            * ABSH; REJ:= TOL < DISCR[I] or REJ;
            FH:= DISCR[I] / TOL; if FH > FHM then FHM:= FH
         end 
      MU:= 1 / (1 + FHM) + .45; if REJ then 
      begin if ABSH <= HMIN then 
         begin for I:= 0 step 1 until N do 
            begin if I ^= IV then X[I]:= XL[I] + K[0,I]
               else X[I]:= XL[I] + H
            end;
            D[1]:= D[1] + 1; FIRST:= true; goto NEXT
         end;
         H:= H * MU; I:= 0; goto AGAIN
      end;
      if FIRST then 
      begin FIRST:= FIR; HL:= H; H:= MU * H; goto ACCEPT
      end;
      FH:= MU * H / HL + MU - MU1; HL:= H; H:= FH * H;
   ACCEPT: RKSTEP(HL, 2); MU1:= MU;
   NEXT: if FIR then 
      begin FIR:= false; COND0:= B;
         if not (FI or REJ) then H:= D[2]
      end 
      else 
      begin D[2]:= H; COND1:= B;
         if COND0 * COND1 <= 0 then goto ZERO;
         COND0:= COND1
      end;
      for I:= 0 step 1 until N do D[I + 3]:= XL[I]:= X[I];
   CHANGE: IV0:= IV;
      for J:= 1 step 1 until N do Y[J]:= FXJ;
      MAX:= ABS(Y[IV]);
      for I:= 0 step 1 until N do 
      begin if ABS(Y[I]) > MAX then 
         begin MAX:= ABS(Y[I]); IV:= I end 
      end;
      if IV0 ^= IV then 
      begin FIRST:= true; D[0]:= IV;
         D[2]:= H:= Y[IV] / Y[IV0] * H
      end;
      X0:= XL[IV]; if FIR then 
      begin HMIN:= E[0] + E[1];
         for I:= 1 step 1 until N do 
         begin H:= E[2 * I] + E[2 * I + 1];
            if H < HMIN then HMIN:= H
         end;
         H:= E[2 * IV] + E[2 * IV + 1];
            if (FI and (Y[L]/Y[IV]*H<0 eqv POS)) or 
            (not FI and D[2]*H<0) then H:= -H
      end;
      I:= 1; goto AGAIN;
   ZERO: E1[1]:= E[2 * N + 2]; E1[2]:= E[2 * N + 3];
      X1:=X[IV] ; S:=X0 ;
      ZEROIN(S,X1,FZERO,ABS(E1[1]*S) + ABS(E1[2])) ; X0:=S ; X1:=X[IV];
      RKSTEP(X0 - XL[IV], 3);
      for I:= 0 step 1 until N do D[I + 3]:= X[I]
   end RK4NA;
        eop