code 33033;
   procedure RKE (X, XE, N, Y, DER, DATA, FI, OUT);
   value  FI, N; integer N; real X, XE;
   boolean FI; array Y, DATA;
   procedure DER, OUT;
   begin integer J;
      real XT, H, HMIN, INT, HL, HT, ABSH, FHM, DISCR, TOL, MU,
      MU1, FH, E1, E2;
      boolean LAST, FIRST, REJECT;
      array K0, K1, K2, K3, K4[1:N];
      if FI then 
      begin DATA[3]:= XE - X; DATA[4]:= DATA[5]:= DATA[6]:= 0 end;
      ABSH:= H:= ABS(DATA[3]);
      if XE < X then H:= - H; INT:= ABS(XE - X);
      HMIN:= INT * DATA[1] + DATA[2];
      E1:= 12 * DATA[1] / INT; E2:= 12 * DATA[2] / INT;
      FIRST:= true; REJECT:= false; if FI then 
      begin LAST:= true; goto STEP end;
   TEST: ABSH:= ABS(H); if ABSH < HMIN then 
      begin H:= SIGN (XE - X) * HMIN; ABSH:= HMIN end;
      if H >= XE - X eqv H >= 0 then 
      begin LAST:= true; H:= XE - X; ABSH:= ABS(H) end 
      else LAST:= false;
   STEP: if ^ REJECT then 
      begin for J:= 1 step 1 until N do K0[J]:= Y[J];
          DER(X, K0)
      end;
      HT:= .184262134833347 * H; XT:= X + HT;
      for J:= 1 step 1 until N do K1[J]:= K0[J] * HT + Y[J];
      DER(XT, K1);
      HT:= .690983005625053"-1 * H; XT:= 4 * HT + X;
      for J:= 1 step 1 until N do K2[J]:=
      (3 * K1[J] + K0[J]) * HT + Y[J];
      DER(XT, K2);
      XT:= .5 * H + X; HT:= .1875 * H;
      for J:= 1 step 1 until N do K3[J]:=((1.74535599249993
      * K2[J] - K1[J]) * 2.23606797749979 + K0[J]) * HT + Y[J];
      DER(XT, K3);
      XT:= .723606797749979 * H + X; HT:= .4 * H;
      for J:= 1 step 1 until N do K4[J]:= (((.517595468166681
      * K0[J] - K1[J]) * .927050983124840 + K2[J]) * 1.46352549156242
      + K3[J]) * HT + Y[J];
      DER(XT, K4);
      XT:= if LAST then XE else X + H; HT:= 2 * H;
      for J:= 1 step 1 until N do K1[J]:= ((((2 * K4[J] +
      K2[J]) * .412022659166595 + K1[J]) * 2.23606797749979 -
      K0[J]) * .375 - K3[J]) * HT + Y[J];
      DER(XT, K1);
      REJECT:= false; FHM:= 0;
      for J:= 1 step 1 until N do 
      begin DISCR:= ABS((1.6 * K3[J] - K2[J] - K4[J]) * 5 +
          K0[J] + K1[J]);
         TOL:= ABS(K0[J]) * E1 + E2;
         REJECT:= DISCR > TOL or REJECT;
         FH:= DISCR / TOL; if FH > FHM then FHM:= FH
      end;
      MU:= 1 / (1 + FHM) + .45; if REJECT then 
      begin DATA[5]:= DATA[5] + 1; if ABSH <= HMIN then 
         begin DATA[6]:= DATA[6] + 1; HL:= H; REJECT:= false;
            FIRST:= true; goto NEXT
         end;
         H:= MU * H; goto TEST
      end;
      if FIRST then 
      begin FIRST:= false; HL:= H; H:= MU * H; goto ACC
      end;
      FH:= MU * H / HL + MU - MU1; HL:= H; H:= FH * H;
   ACC: MU1:= MU; HT:= HL / 12;
      for J:= 1 step 1 until N do Y[J]:=
      ((K2[J] + K4[J]) * 5 + K0[J] + K1[J]) * HT + Y[J];
   NEXT: DATA[3]:= HL; DATA[4]:= DATA[4] + 1; X:= XT; OUT;
      if X ^= XE then goto TEST
   end RKE;
        eop