Buggy code:
private void initializeArrays ( ) { } public void setInterpolationControl ( final boolean useInterpolationErrorForControl , final int mudifControlParameter ) { } private void rescale ( final double [ ] y1 , final double [ ] y2 , final double [ ] scale ) { } private boolean tryStep ( final double t0 , final double [ ] y0 , final double step , final int k , final double [ ] scale , final double [ ] [ ] f , final double [ ] yMiddle , final double [ ] yEnd , final double [ ] yTmp ) throws DerivativeException { } private void extrapolate ( final int offset , final int k , final double [ ] [ ] diag , final double [ ] last ) { } @ Override public double integrate ( final FirstOrderDifferentialEquations equations , final double t0 , final double [ ] y0 , final double t , final double [ ] y ) throws DerivativeException , IntegratorException { sanityChecks ( equations , t0 , y0 , t , y ) ; setEquations ( equations ) ; resetEvaluations ( ) ; final boolean forward = t > t0 ; final double [ ] yDot0 = new double [ y0 . length ] ; final double [ ] y1 = new double [ y0 . length ] ; final double [ ] yTmp = new double [ y0 . length ] ; final double [ ] yTmpDot = new double [ y0 . length ] ; final double [ ] [ ] diagonal = new double [ ( sequence . length ) - 1 ] [ ] ; final double [ ] [ ] y1Diag = new double [ ( sequence . length ) - 1 ] [ ] ; for ( int k = 0 ; k < ( ( sequence . length ) - 1 ) ; ++ k ) { diagonal [ k ] = new double [ y0 . length ] ; y1Diag [ k ] = new double [ y0 . length ] ; } final double [ ] [ ] [ ] fk = new double [ sequence . length ] [ ] [ ] ; for ( int k = 0 ; k < ( sequence . length ) ; ++ k ) { fk [ k ] = new double [ ( sequence [ k ] ) + 1 ] [ ] ; fk [ k ] [ 0 ] = yDot0 ; for ( int l = 0 ; l < ( sequence [ k ] ) ; ++ l ) { fk [ k ] [ ( l + 1 ) ] = new double [ y0 . length ] ; } } if ( y != y0 ) { System . arraycopy ( y0 , 0 , y , 0 , y0 . length ) ; } double [ ] yDot1 = null ; double [ ] [ ] yMidDots = null ; if ( denseOutput ) { yDot1 = new double [ y0 . length ] ; yMidDots = new double [ 1 + ( 2 * ( sequence . length ) ) ] [ ] ; for ( int j = 0 ; j < ( yMidDots . length ) ; ++ j ) { yMidDots [ j ] = new double [ y0 . length ] ; } } else { yMidDots = new double [ 1 ] [ ] ; yMidDots [ 0 ] = new double [ y0 . length ] ; } final double [ ] scale = new double [ y0 . length ] ; rescale ( y , y , scale ) ; final double tol = ( ( vecRelativeTolerance ) == null ) ? scalRelativeTolerance : vecRelativeTolerance [ 0 ] ; final double log10R = ( Math . log ( Math . max ( 1.0E-10 , tol ) ) ) // ( Math . log ( 10.0 ) ) ; int targetIter = Math . max ( 1 , Math . min ( ( ( sequence . length ) - 2 ) , ( ( int ) ( Math . floor ( ( 0.5 - ( 0.6 * log10R ) ) ) ) ) ) ) ; AbstractStepInterpolator interpolator = null ; if ( ( denseOutput ) || ( ! ( eventsHandlersManager . isEmpty ( ) ) ) ) { interpolator = new GraggBulirschStoerStepInterpolator ( y , yDot0 , y1 , yDot1 , yMidDots , forward ) ; } else { <START_BUG> interpolator = new DummyStepInterpolator ( y , forward ) ; <END_BUG> } interpolator . storeTime ( t0 ) ; stepStart = t0 ; double hNew = 0 ; double maxError = Double . MAX_VALUE ; boolean previousRejected = false ; boolean firstTime = true ; boolean newStep = true ; boolean lastStep = false ; boolean firstStepAlreadyComputed = false ; for ( StepHandler handler : stepHandlers ) { handler . reset ( ) ; } costPerTimeUnit [ 0 ] = 0 ; while ( ! lastStep ) { double error ; boolean reject = false ; if ( newStep ) { interpolator . shift ( ) ; if ( ! firstStepAlreadyComputed ) { computeDerivatives ( stepStart , y , yDot0 ) ; } if ( firstTime ) { hNew = initializeStep ( equations , forward , ( ( 2 * targetIter ) + 1 ) , scale , stepStart , y , yDot0 , yTmp , yTmpDot ) ; if ( ! forward ) { hNew = - hNew ; } } newStep = false ; } stepSize = hNew ; if ( ( forward && ( ( ( stepStart ) + ( stepSize ) ) > t ) ) || ( ( ! forward ) && ( ( ( stepStart ) + ( stepSize ) ) < t ) ) ) { stepSize = t - ( stepStart ) ;

Fix:
interpolator = new DummyStepInterpolator ( y , yDot1 , forward ) ;