/* *ExponentialCoreNorm .java * * Created on October 5, 2002, 1:41 PM */ package hep.aida.ref.function; import org.apache.commons.math.special.Erf; /** * * @author serbo */ /** * Not normalised Gaussian (G) distribution in the form: * f = (1/N)*exp(-(x-mean)^2/(2*sigma^2)) has 2 parameters * Normalization Amplitude is calculated by the "normalizationAmplitude" method */ public class GaussianCoreNorm extends FunctionCore { protected boolean providesNormalization; protected final double r2 = Math.sqrt(2); public GaussianCoreNorm(String str) { super(1, 2, new double[] {0., 1.}); setTitle("GaussianCoreNorm::"+str); providesNormalization = true; String[] names = new String[] { "mean", "sigma" }; setParameterNames(names); } public GaussianCoreNorm(String str, double[] pVal) { super(1, 2, pVal); setTitle("GaussianCoreNorm::"+str); providesNormalization = true; String[] names = new String[] { "mean", "sigma" }; setParameterNames(names); } // Value of the function WITHOUT Normalization factor (as if N=1) public double functionValue(double[] var) { return Math.exp( -Math.pow( var[0] - p[0], 2 )/(2*Math.pow( p[1], 2 )) ); } // Each concrete FunctionCore has to implement those methods that deal with Gradients and Normalization public boolean providesGradient() { return true; } public double[] gradient(double[] var) { return new double[] { functionValue(var)*(-2.)*(var[0] - p[0])/(2*Math.pow( p[1], 2 )) }; } public boolean providesParameterGradient() { return true; } public double[] parameterGradient(double[] var) { double y = functionValue(var); return new double[] { y*2.*(var[0] - p[0])/(2*Math.pow( p[1], 2 )), y*2.*Math.pow(var[0] - p[0],2)/(2*Math.pow( Math.abs(p[1]), 3 )) }; } public boolean providesNormalization() { return providesNormalization; } public double normalizationAmplitude(double[] xMin, double[] xMax) { try { double ue = Erf.erf( (xMax[0]-p[0])/(r2*p[1]) ); double le = Erf.erf( (xMin[0]-p[0])/(r2*p[1]) ); return Math.sqrt( Math.PI/2 )*p[1]*( ue - le ); } catch (Exception e) { System.out.println("Problem evaluating normalization between "+xMin[0]+" and "+xMax[0]); } return Double.NaN; } }