docs: public double getImpliedVolatility(double evaluationTime, AnalyticModel model, VolatilitySurface.QuotingConvention quotingConvention) {
  		double lowerBound = Double.MAX_VALUE;
  		double upperBound = -Double.MAX_VALUE;
  		for(int periodIndex=0; periodIndex<schedule.getNumberOfPeriods(); periodIndex++) {
  			double fixingDate	= schedule.getFixing(periodIndex);
  			double periodLength	= schedule.getPeriodLength(periodIndex);
  
  			if(periodLength == 0) {
  				continue;
  			}
  
  			double effektiveStrike = strike;
  			if(isStrikeMoneyness) {
  				effektiveStrike += getATMForward(model, true);
  			}
  
  			VolatilitySurface volatilitySurface	= model.getVolatilitySurface(volatiltiySufaceName);
  			double volatility = volatilitySurface.getValue(model, fixingDate, effektiveStrike, quotingConvention);
  			lowerBound = Math.min(volatility, lowerBound);
  			upperBound = Math.max(volatility, upperBound);
  		}
  
  		double value = getValueAsPrice(evaluationTime, model);
  
  		int		maxIterations	= 100;
  		double	maxAccuracy		= 0.0;
  		GoldenSectionSearch solver = new GoldenSectionSearch(lowerBound, upperBound);
  		while(solver.getAccuracy() > maxAccuracy && !solver.isDone() && solver.getNumberOfIterations() < maxIterations) {
  			double volatility = solver.getNextPoint();
  			double[] maturities		= { 1.0 };
  			double[] strikes		= { 0.0 };
  			double[] volatilities	= { volatility };
  			VolatilitySurface flatSurface = new CapletVolatilities(model.getVolatilitySurface(volatiltiySufaceName).getName(), model.getVolatilitySurface(volatiltiySufaceName).getReferenceDate(), model.getForwardCurve(forwardCurveName), maturities, strikes, volatilities, quotingConvention, model.getDiscountCurve(discountCurveName));
  			AnalyticModel flatModel = model.clone();
  			flatModel = flatModel.addVolatilitySurfaces(flatSurface);
  			double flatModelValue = this.getValueAsPrice(evaluationTime, flatModel);
  			double error = value-flatModelValue;
  			solver.setValue(error*error);
  		}
  		return solver.getBestPoint();
  	}