float[] zero = new float[system.getInputDimension()];
Units[] units = new Units[system.getInputDimension()];
TimeSeries pulse = integrator.integrate(system,
new TimeSeriesImpl(new float[]{0f, pulseWidth}, new float[][]{impulse, impulse}, units));
integral = integrate(pulse);
float decayTime = -10f / (float) eigRange[1];
TimeSeries decay = integrator.integrate(system,
new TimeSeriesImpl(new float[]{0f, decayTime}, new float[][]{zero, zero}, units)); //time-invariant, so we can start at 0
float[] increment = integrate(decay);
integral = MU.sum(integral, increment);
float stepTime = -.5f / (float) eigRange[1];
do {
decay = integrator.integrate(system,
new TimeSeriesImpl(new float[]{0f, stepTime}, new float[][]{zero, zero}, units));
increment = integrate(decay);
integral = MU.sum(integral, increment);
} while (substantialChange(integral, increment, .001f * stepTime / decayTime));
return integral;