package statistics.simulators;
import distributions.*;
public class PolynomialModel extends Model{
double[] coefficients;
double[] powers;
// Default min max range for coefficients and powers
static double defaultMin=-4;
static double defaultMax=4;
public PolynomialModel(){super();}
public PolynomialModel(double[] c, double[] p){
super();
coefficients=c;
powers=p;
t=0;
}
public PolynomialModel(double[] c, double[] p, Distribution e){
super();
coefficients=c;
powers=p;
error=e;
t=0;
}
@Override
public void setParameters(double[] p) {
if(p.length%2!=0)
throw new UnsupportedOperationException("Error, the Polynomial model input must be of even length, first half the powers, second half coefficients,");
coefficients=new double[p.length/2];
powers=new double[p.length/2];
System.arraycopy(p,0,powers,0, p.length/2);
System.arraycopy(p, p.length/2,coefficients, 0, p.length/2);
error=new NormalDistribution(0,1);
t=0;
}
@Override
public double generate(double x)
{
double p;
p=generateDeterministic(x);
p+=error.simulate();
t=x;
return p;
}
@Override
public double generate()
{
double p=generateDeterministic(t);
p+=error.simulate();
t++;
return p;
}
public double generateDeterministic(double x)
{
double p=0;
if(x==0) //Slight hack, what about constants?
return 0;
for(int i=0;i<powers.length;i++)
p+=coefficients[i]*Math.pow(x,powers[i]);
return p;
}
public void setTime(int t){this.t=t;}
public double[] getCoefficients(){return coefficients;}
public double[] getPowers(){return powers;}
@Override
public String toString()
{
String str="";
for(int i=0;i<powers.length;i++)
str+=coefficients[i]+"*x^"+powers[i]+"\t+\t";
str+=error;
return str;
}
public static PolynomialModel generateRandomModel(int r)
{
return generateRandomModel(r,defaultMin,defaultMax,defaultMin,defaultMax);
}
public static PolynomialModel generateRandomModel(int r, double min, double max)
{
return generateRandomModel(r,min,max,min,max);
}
public static PolynomialModel generateRandomModel(int r, double minC, double maxC,double minP, double maxP)
{
double[] coeffs,powers;
coeffs=new double[r];
powers=new double[r];
for(int i=0;i<r;i++)
{
coeffs[i]=minC+(maxC-minC)*Distribution.RNG.nextDouble();
powers[i]=minP+(maxP-minP)*Distribution.RNG.nextDouble();
}
return new PolynomialModel(coeffs,powers, new NormalDistribution(0,1));
}
public static void main(String[] args){
System.out.println(" Test Harness not implemented yet");
}
}