docs: public static double sabrAlphaApproximation(double normalVolatility, double beta, double rho, double nu, double displacement, double underlying, double maturity)
  	{
  		// Apply displacement. Displaced model is just a shift on underlying and strike.
  		underlying += displacement;
  
  		// ATM case.
  		double forwardStrikeAverage = underlying;
  
  		double guess = normalVolatility/Math.pow(underlying, beta);
  		NewtonsMethod search = new NewtonsMethod(guess);
  		while(!search.isDone() && search.getAccuracy() > 1E-16 && search.getNumberOfIterations() < 100) {
  			double alpha = search.getNextPoint();
  
  			double term1 = alpha * Math.pow(underlying, beta);
  			double term2 = (1.0 + maturity * ((-beta*(2-beta)*alpha*alpha)/(24*Math.pow(forwardStrikeAverage,2.0*(1.0-beta))) + beta*alpha*rho*nu / (4*Math.pow(forwardStrikeAverage,(1.0-beta))) + (2.0 -3.0*rho*rho)*nu*nu/24));
  
  			double derivativeTerm1 = Math.pow(underlying, beta);
  			double derivativeTerm2 = maturity * (2*(-beta*(2-beta)*alpha)/(24*Math.pow(forwardStrikeAverage,2.0*(1.0-beta))) + beta*rho*nu / (4*Math.pow(forwardStrikeAverage,(1.0-beta))));
  
  			double sigma = term1 * term2;
  			double derivative = derivativeTerm1 * term2 + term1 * derivativeTerm2;
  
  			search.setValueAndDerivative(sigma-normalVolatility, derivative);
  		}
  		return search.getBestPoint();
  	}