/*
Copyright (C) 2001 Kyle Siegrist, Dawn Duehring
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but without
any warranty; without even the implied warranty of merchantability or
fitness for a particular purpose. See the GNU General Public License for
more details. You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package distributions;
/**This class models the triangle distribution on a specified interval. If (X, Y) is
uniformly distributed on a triangular region, then X and Y have triangular distribuitons.*/
public class TriangleDistribution extends Distribution{
private int orientation;
private double c, minValue, maxValue;
public final static int UP = 0, DOWN = 1;
/**This general constructor creates a new triangle distribution on a specified
interval and with a specified orientation.*/
public TriangleDistribution(double a, double b, int i){
setParameters(a, b, i);
}
/**This default constructor creates a new triangle distribution on the interval
(0, 1) with positive slope*/
public TriangleDistribution(){
this(0, 1, UP);
}
/**This method sets the parameters: the minimum value, maximum value, and
orientation.*/
public void setParameters(double a, double b, int i){
minValue = a;
maxValue = b;
orientation = i;
double stepSize = (maxValue - minValue) / 100;
super.setParameters(minValue, maxValue, stepSize, CONTINUOUS);
//Compute normalizing constant
c = (maxValue - minValue) * (maxValue - minValue);
}
//**This method computes the density.*/
public double getDensity(double x){
if (minValue <= x & x <= maxValue){
if (orientation == UP) return 2 * (x - minValue) / c;
else return 2 * (maxValue - x) / c;
}
else return 0;
}
/**This method computes the maximum value of the getDensity function.*/
public double getMaxDensity(){
double mode;
if (orientation == UP) mode = maxValue;
else mode = minValue;
return getDensity(mode);
}
/**This method computes the mean.*/
public double getMean(){
if (orientation == UP) return minValue / 3 + 2 * maxValue / 3;
else return 2 * minValue / 3 + maxValue / 3;
}
/**This method computes the variance.*/
public double getVariance(){
return (maxValue - minValue) * (maxValue - minValue) / 18;
}
/**This method returns the minimum value.*/
public double getMinValue(){
return minValue;
}
/**This method returns the maximum value.*/
public double getMaxValue(){
return maxValue;
}
/**This method returns the orientation.*/
public int getOrientation(){
return orientation;
}
/**This method simulates a value from the distribution.*/
public double simulate(){
double u = minValue + (maxValue - minValue) * Math.random();
double v = minValue + (maxValue - minValue) * Math.random();
if (orientation == UP) return Math.max(u, v);
else return Math.min(u, v);
}
/**This method computes the cumulative distribution function.*/
public double getCDF(double x){
if (orientation == UP) return (x - minValue) * (x - minValue) / c;
else return 1 - (maxValue - x) * (maxValue - x) / c;
}
}