code: def step(self, t, w, dt):
          
  
          # Runge-Kutta Fehlberg formulas (see: Numerical Recipes)
          F = lambda t, w: self.F(t, w, *self._func_args)
  
          K = np.zeros((6,)+w.shape)
          K[0] = dt * F(t, w)
          K[1] = dt * F(t + A[1]*dt, w + B[1][0]*K[0])
          K[2] = dt * F(t + A[2]*dt, w + B[2][0]*K[0] + B[2][1]*K[1])
          K[3] = dt * F(t + A[3]*dt, w + B[3][0]*K[0] + B[3][1]*K[1] + B[3][2]*K[2])
          K[4] = dt * F(t + A[4]*dt, w + B[4][0]*K[0] + B[4][1]*K[1] + B[4][2]*K[2] + B[4][3]*K[3])
          K[5] = dt * F(t + A[5]*dt, w + B[5][0]*K[0] + B[5][1]*K[1] + B[5][2]*K[2] + B[5][3]*K[3] + B[5][4]*K[4])
  
          # shift
          dw = np.zeros_like(w)
          for i in range(6):
              dw = dw + C[i]*K[i]
  
          return w + dw
docs: Step forward the vector w by the given timestep.
  
              Parameters
              ----------
              dt : numeric
                  The timestep to move forward.