Buggy code:
public abstract class EmbeddedRungeKuttaIntegrator extends AdaptiveStepsizeIntegrator { private final boolean fsal ; private final double [ ] c ; private final double [ ] [ ] a ; private final double [ ] b ; private final RungeKuttaStepInterpolator prototype ; private final double exp ; private double safety ; private double minReduction ; private double maxGrowth ; protected EmbeddedRungeKuttaIntegrator ( final String name , final boolean fsal , final double [ ] c , final double [ ] [ ] a , final double [ ] b , final RungeKuttaStepInterpolator prototype , final double minStep , final double maxStep , final double scalAbsoluteTolerance , final double scalRelativeTolerance ) { } protected EmbeddedRungeKuttaIntegrator ( final String name , final boolean fsal , final double [ ] c , final double [ ] [ ] a , final double [ ] b , final RungeKuttaStepInterpolator prototype , final double minStep , final double maxStep , final double [ ] vecAbsoluteTolerance , final double [ ] vecRelativeTolerance ) { } public abstract int getOrder ( ) { } public double getSafety ( ) { } public void setSafety ( final double safety ) { } @ 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 int stages = ( c . length ) + 1 ; if ( y != y0 ) { System . arraycopy ( y0 , 0 , y , 0 , y0 . length ) ; } final double [ ] [ ] yDotK = new double [ stages ] [ y0 . length ] ; final double [ ] yTmp = new double [ y0 . length ] ; AbstractStepInterpolator interpolator ; if ( ( requiresDenseOutput ( ) ) || ( ! ( eventsHandlersManager . isEmpty ( ) ) ) ) { final RungeKuttaStepInterpolator rki = ( ( RungeKuttaStepInterpolator ) ( prototype . copy ( ) ) ) ; rki . reinitialize ( this , yTmp , yDotK , forward ) ; interpolator = rki ; } else { <START_BUG> interpolator = new DummyStepInterpolator ( yTmp , forward ) ; <END_BUG> } interpolator . storeTime ( t0 ) ; stepStart = t0 ; double hNew = 0 ; boolean firstTime = true ; for ( StepHandler handler : stepHandlers ) { handler . reset ( ) ; } CombinedEventsManager manager = addEndTimeChecker ( t0 , t , eventsHandlersManager ) ; boolean lastStep = false ; while ( ! lastStep ) { interpolator . shift ( ) ; double error = 0 ; for ( boolean loop = true ; loop ; ) { if ( firstTime || ( ! ( fsal ) ) ) { computeDerivatives ( stepStart , y , yDotK [ 0 ] ) ; } if ( firstTime ) { final double [ ] scale = new double [ y0 . length ] ; if ( ( vecAbsoluteTolerance ) == null ) { for ( int i = 0 ; i < ( scale . length ) ; ++ i ) { scale [ i ] = ( scalAbsoluteTolerance ) + ( ( scalRelativeTolerance ) * ( Math . abs ( y [ i ] ) ) ) ; } } else { for ( int i = 0 ; i < ( scale . length ) ; ++ i ) { scale [ i ] = ( vecAbsoluteTolerance [ i ] ) + ( ( vecRelativeTolerance [ i ] ) * ( Math . abs ( y [ i ] ) ) ) ; } } hNew = initializeStep ( equations , forward , getOrder ( ) , scale , stepStart , y , yDotK [ 0 ] , yTmp , yDotK [ 1 ] ) ; firstTime = false ; } stepSize = hNew ; for ( int k = 1 ; k < stages ; ++ k ) { for ( int j = 0 ; j < ( y0 . length ) ; ++ j ) { double sum = ( a [ ( k - 1 ) ] [ 0 ] ) * ( yDotK [ 0 ] [ j ] ) ; for ( int l = 1 ; l < k ; ++ l ) { sum += ( a [ ( k - 1 ) ] [ l ] ) * ( yDotK [ l ] [ j ] ) ; } yTmp [ j ] = ( y [ j ] ) + ( ( stepSize ) * sum ) ; } computeDerivatives ( ( ( stepStart ) + ( ( c [ ( k - 1 ) ] ) * ( stepSize ) ) ) , yTmp , yDotK [ k ] ) ; } for ( int j = 0 ; j < ( y0 . length ) ; ++ j ) { double sum = ( b [ 0 ] ) * ( yDotK [ 0 ] [ j ] ) ; for ( int l = 1 ; l < stages ; ++ l ) { sum += ( b [ l ] ) * ( yDotK [ l ] [ j ] ) ; } yTmp [ j ] = ( y [ j ] ) + ( ( stepSize ) * sum ) ; } error = estimateError ( yDotK , y , yTmp , stepSize ) ; if ( error <= 1.0 ) { interpolator . storeTime ( ( ( stepStart ) + ( stepSize ) ) ) ; if ( manager . evaluateStep ( interpolator ) ) { final double dt = ( manager . getEventTime ( ) ) - ( stepStart ) ;

Fix:
interpolator = new DummyStepInterpolator ( yTmp , yDotK [ ( stages - 1 ) ] , forward ) ;