/*
* PolynomialCoreNorm.java
*
* Created on September 5, 2002, 1:40 PM
*/
package hep.aida.ref.function;
/**
*
* @author serbo
*/
/**
* Normalised Polynomial (Pn) distribution in the form:
* f = (1 + p1*x + p2*x*x + ... )/N , has n-1 paremeters
* Normalization N is calculated by the "normalizationAmplitude" method
*/
public class PolynomialCoreNorm extends PolynomialCoreNotNorm {
public PolynomialCoreNorm(String str) {
super(1, getDimension(str)-1);
setTitle("PolynomialCoreNorm::"+str);
providesNormalization = true;
String[] pNames = new String[numberOfParameters];
for (int i=0; i<numberOfParameters; i++) { pNames[i] = "p" + (i+1); }
setParameterNames(pNames);
}
public PolynomialCoreNorm(String str, double[] pVal) {
super(1, getDimension(str)-1, pVal);
setTitle("PolynomialCoreNorm::"+str);
providesNormalization = true;
String[] pNames = new String[numberOfParameters];
for (int i=0; i<numberOfParameters; i++) { pNames[i] = "p" + (i+1); }
setParameterNames(pNames);
}
// Value of the function WITHOUT Normalization factor (as if N=1)
public double functionValue(double[] var) {
double val = 0;
for (int i=0; i<numberOfParameters; i++) { val += p[i]*Math.pow(var[0], i+1); }
val +=1.;
return val;
}
public double[] gradient(double[] var) {
double[] tmp = new double[] {0.};
if (numberOfParameters == 0) return tmp;
double val = p[0];
for (int i=1; i<numberOfParameters; i++) { val += i*p[i]*Math.pow(var[0], i); }
tmp[0] = val;
return tmp;
}
public double[] parameterGradient(double[] var) {
double[] tmp = new double[numberOfParameters];
tmp[0] = 1;
for (int i=1; i<numberOfParameters; i++) {tmp[i] = Math.pow(var[0], i); }
return tmp;
}
public double normalizationAmplitude(double[] xMin, double[] xMax) {
double val = 0;
val += (xMax[0]-xMin[0]);
for (int i=0; i<numberOfParameters; i++) {
val += (p[i]/(i+2))*(Math.pow(xMax[0], i+2) - Math.pow(xMin[0], i+2));
// System.out.println(" i="+i+" \t val="+val+"\t xMin="+xMin[0]+"\t xMax="+xMax[0]+"\t par="+p[i]);
}
return val;
}
}