Importing release version 322 from old repos
This commit is contained in:
		
							
								
								
									
										52
									
								
								src/wsi/ra/math/interpolation/AbstractDataModifier.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/wsi/ra/math/interpolation/AbstractDataModifier.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: AbstractDataModifier.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:24:58 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
* CLASS DECLARATION
 | 
			
		||||
*==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The minimal set of functions which should implemented in a data modifier for
 | 
			
		||||
 * <code>AbstractDataSet</code>.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class AbstractDataModifier
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	/*-------------------------------------------------------------------------*
 | 
			
		||||
	 * abstract methods
 | 
			
		||||
	 *-------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	* Modifies the X data.
 | 
			
		||||
	*/
 | 
			
		||||
	public abstract void modifyX(double[] setX);
 | 
			
		||||
	/**
 | 
			
		||||
	* Modifies the Y data.
 | 
			
		||||
	*/
 | 
			
		||||
	public abstract void modifyY(double[] setY);
 | 
			
		||||
	/**
 | 
			
		||||
	* Modifies the data.
 | 
			
		||||
	*/
 | 
			
		||||
	public abstract void modify(double[] setX, double[] setY);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
							
								
								
									
										116
									
								
								src/wsi/ra/math/interpolation/AbstractDataSet.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								src/wsi/ra/math/interpolation/AbstractDataSet.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: AbstractDataSet.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:25:04 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
* CLASS DECLARATION
 | 
			
		||||
*==========================================================================*/
 | 
			
		||||
 | 
			
		||||
public abstract class AbstractDataSet
 | 
			
		||||
{
 | 
			
		||||
	/*-------------------------------------------------------------------------*
 | 
			
		||||
	 * public member variables
 | 
			
		||||
	 *-------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
	/*--------------------------------------------------------------o-----------*
 | 
			
		||||
	 * protected member variables
 | 
			
		||||
	 *-------------------------------------------------------------------------*/
 | 
			
		||||
	/**
 | 
			
		||||
	* double array of X data.
 | 
			
		||||
	*
 | 
			
		||||
	* @see #yDoubleData
 | 
			
		||||
	*/
 | 
			
		||||
	protected double[] xDoubleData = { -1, 1 };
 | 
			
		||||
	/**
 | 
			
		||||
	* double array of Y data.
 | 
			
		||||
	*
 | 
			
		||||
	* @see #xDoubleData
 | 
			
		||||
	*/
 | 
			
		||||
	protected double[] yDoubleData = { 1, 1 };
 | 
			
		||||
 | 
			
		||||
	/*-------------------------------------------------------------------------*
 | 
			
		||||
	 * abstract methods
 | 
			
		||||
	 *-------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	* Returns the length of the data set
 | 
			
		||||
	* @return   the length of the data set
 | 
			
		||||
	*/
 | 
			
		||||
	public int getLength()
 | 
			
		||||
	{
 | 
			
		||||
		return xDoubleData.length;
 | 
			
		||||
	}
 | 
			
		||||
	/**
 | 
			
		||||
	* Returns an array of the X data
 | 
			
		||||
	* @return   the array of the X data
 | 
			
		||||
	*/
 | 
			
		||||
	public double[] getXData()
 | 
			
		||||
	{
 | 
			
		||||
		return xDoubleData;
 | 
			
		||||
	}
 | 
			
		||||
	/**
 | 
			
		||||
	* Returns an array of the Y data
 | 
			
		||||
	* @return   the array of the Y data
 | 
			
		||||
	*/
 | 
			
		||||
	public double[] getYData()
 | 
			
		||||
	{
 | 
			
		||||
		return yDoubleData;
 | 
			
		||||
	}
 | 
			
		||||
	/**
 | 
			
		||||
	* Returns the X label of the data set
 | 
			
		||||
	* @return   the X label of the data set
 | 
			
		||||
	*/
 | 
			
		||||
	public abstract String getXLabel();
 | 
			
		||||
	/**
 | 
			
		||||
	* Returns the Y label of the data set
 | 
			
		||||
	* @return   the Y label of the data set
 | 
			
		||||
	*/
 | 
			
		||||
	public abstract String getYLabel();
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	* Modifies the X data.
 | 
			
		||||
	*
 | 
			
		||||
	* @param the data modifier
 | 
			
		||||
	*/
 | 
			
		||||
	public void modifyXData(AbstractDataModifier modifier)
 | 
			
		||||
	{
 | 
			
		||||
		modifier.modifyX(xDoubleData);
 | 
			
		||||
	}
 | 
			
		||||
	/**
 | 
			
		||||
	* Modifies the Y data.
 | 
			
		||||
	*
 | 
			
		||||
	* @param the data modifier
 | 
			
		||||
	*/
 | 
			
		||||
	public void modifyYData(AbstractDataModifier modifier)
 | 
			
		||||
	{
 | 
			
		||||
		modifier.modifyY(yDoubleData);
 | 
			
		||||
	}
 | 
			
		||||
	/**
 | 
			
		||||
	* Modifies the data.
 | 
			
		||||
	*
 | 
			
		||||
	* @param the data modifier
 | 
			
		||||
	*/
 | 
			
		||||
	public void modifyData(AbstractDataModifier modifier)
 | 
			
		||||
	{
 | 
			
		||||
		modifier.modify(xDoubleData, yDoubleData);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
							
								
								
									
										100
									
								
								src/wsi/ra/math/interpolation/BasicDataSet.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/wsi/ra/math/interpolation/BasicDataSet.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: BasicDataSet.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:25:11 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
import wsi.ra.sort.XYDoubleArray;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The minimum wrapper class for an <code>AbstractDataSet</code>.
 | 
			
		||||
 */
 | 
			
		||||
public class BasicDataSet extends AbstractDataSet
 | 
			
		||||
{
 | 
			
		||||
	/*-------------------------------------------------------------------------*
 | 
			
		||||
	 * protected member variables
 | 
			
		||||
	 *-------------------------------------------------------------------------*/
 | 
			
		||||
	protected int dataType = -1;
 | 
			
		||||
	protected String xLabel = null;
 | 
			
		||||
	protected String yLabel = null;
 | 
			
		||||
 | 
			
		||||
	/*------------------------------------------------------------------------*
 | 
			
		||||
	 * constructor
 | 
			
		||||
	 *------------------------------------------------------------------------*/
 | 
			
		||||
	public BasicDataSet()
 | 
			
		||||
	{
 | 
			
		||||
		this(null, null, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public BasicDataSet(XYDoubleArray data)
 | 
			
		||||
	{
 | 
			
		||||
		this(data.x, data.y, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public BasicDataSet(XYDoubleArray data, String xLabel, String yLabel)
 | 
			
		||||
	{
 | 
			
		||||
		this(data.x, data.y, xLabel, yLabel);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public BasicDataSet(
 | 
			
		||||
		double[] xDoubleData,
 | 
			
		||||
		double[] yDoubleData,
 | 
			
		||||
		int dataType)
 | 
			
		||||
	{
 | 
			
		||||
		this(xDoubleData, yDoubleData, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public BasicDataSet(
 | 
			
		||||
		double[] xDoubleData,
 | 
			
		||||
		double[] yDoubleData,
 | 
			
		||||
		String xLabel,
 | 
			
		||||
		String yLabel)
 | 
			
		||||
	{
 | 
			
		||||
		this.xDoubleData = xDoubleData;
 | 
			
		||||
		this.yDoubleData = yDoubleData;
 | 
			
		||||
		this.xLabel = xLabel;
 | 
			
		||||
		this.yLabel = yLabel;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*-------------------------------------------------------------------------*
 | 
			
		||||
	* public methods
 | 
			
		||||
	*-------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
	public int getDataType()
 | 
			
		||||
	{
 | 
			
		||||
		return dataType;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String getXLabel()
 | 
			
		||||
	{
 | 
			
		||||
		return xLabel;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String getYLabel()
 | 
			
		||||
	{
 | 
			
		||||
		return yLabel;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String getAdditionalInformation(String parm1)
 | 
			
		||||
	{
 | 
			
		||||
		return new String();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
							
								
								
									
										44
									
								
								src/wsi/ra/math/interpolation/InterpolationException.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/wsi/ra/math/interpolation/InterpolationException.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: InterpolationException.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:25:17 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * CLASS DECLARATION
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Exception for interpolation error.
 | 
			
		||||
 */
 | 
			
		||||
public class InterpolationException extends Exception
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	public InterpolationException()
 | 
			
		||||
	{
 | 
			
		||||
		super();
 | 
			
		||||
	}
 | 
			
		||||
	public InterpolationException(String s)
 | 
			
		||||
	{
 | 
			
		||||
		super(s);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
							
								
								
									
										573
									
								
								src/wsi/ra/math/interpolation/LinearInterpolation.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										573
									
								
								src/wsi/ra/math/interpolation/LinearInterpolation.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,573 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: LinearInterpolation.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Original author: Charles S. Stanton
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:25:23 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
//import cern.jet.stat.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Defines the routines for the spline interpolation of data.
 | 
			
		||||
 */
 | 
			
		||||
public class LinearInterpolation
 | 
			
		||||
{
 | 
			
		||||
	AbstractDataSet abstractDataSet = null;
 | 
			
		||||
	private double[] x, y;
 | 
			
		||||
	//vectors of x,y
 | 
			
		||||
	private double sumX = 0;
 | 
			
		||||
	private double sumY = 0;
 | 
			
		||||
	private double sumXY = 0;
 | 
			
		||||
	private double sumXsquared = 0;
 | 
			
		||||
	private double sumYsquared = 0;
 | 
			
		||||
	private double Sxx, Sxy, Syy, n;
 | 
			
		||||
	private double a = 0, b = 0;
 | 
			
		||||
	//coefficients of regression
 | 
			
		||||
	private int dataLength;
 | 
			
		||||
	private double[][] residual;
 | 
			
		||||
	// residual[0][i] = x[i], residual[1][i]= residual
 | 
			
		||||
	private double maxAbsoluteResidual = 0.0;
 | 
			
		||||
	private double SSR = 0.0;
 | 
			
		||||
	//regression sum of squares
 | 
			
		||||
	private double SSE = 0.0;
 | 
			
		||||
	//error sum of squares
 | 
			
		||||
	private double minX = Double.POSITIVE_INFINITY;
 | 
			
		||||
	private double maxX = Double.NEGATIVE_INFINITY;
 | 
			
		||||
	private double minY = Double.POSITIVE_INFINITY;
 | 
			
		||||
	private double maxY = Double.NEGATIVE_INFINITY;
 | 
			
		||||
 | 
			
		||||
	//MISC
 | 
			
		||||
	String xName, yName;
 | 
			
		||||
	double aCILower, aCIUpper, bCILower, bCIUpper; //confidence interval
 | 
			
		||||
	double t, bSE, aSE;
 | 
			
		||||
	double MSE, F;
 | 
			
		||||
	static double[] t025 =
 | 
			
		||||
		{
 | 
			
		||||
			Double.NaN,
 | 
			
		||||
			12.706,
 | 
			
		||||
			4.303,
 | 
			
		||||
			3.182,
 | 
			
		||||
			2.776,
 | 
			
		||||
			2.571,
 | 
			
		||||
			2.447,
 | 
			
		||||
			2.365,
 | 
			
		||||
			2.306,
 | 
			
		||||
			2.262,
 | 
			
		||||
			2.228,
 | 
			
		||||
			2.201,
 | 
			
		||||
			2.179,
 | 
			
		||||
			2.160,
 | 
			
		||||
			2.145,
 | 
			
		||||
			2.131,
 | 
			
		||||
			2.120,
 | 
			
		||||
			2.110,
 | 
			
		||||
			2.101,
 | 
			
		||||
			2.093,
 | 
			
		||||
			2.086,
 | 
			
		||||
			2.080,
 | 
			
		||||
			2.075,
 | 
			
		||||
			2.069,
 | 
			
		||||
			2.064,
 | 
			
		||||
			2.060,
 | 
			
		||||
			2.056,
 | 
			
		||||
			2.052,
 | 
			
		||||
			2.048,
 | 
			
		||||
			2.045,
 | 
			
		||||
			1.960 };
 | 
			
		||||
 | 
			
		||||
	/*------------------------------------------------------------------------*
 | 
			
		||||
	 * constructor
 | 
			
		||||
	 *------------------------------------------------------------------------*/
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes this class.
 | 
			
		||||
	 */
 | 
			
		||||
	public LinearInterpolation() throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Constructor for regression calculator.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param  x  is the array of x data
 | 
			
		||||
	 * @param  y  is the array of y data
 | 
			
		||||
	 */
 | 
			
		||||
	public LinearInterpolation(double[] x, double[] y)
 | 
			
		||||
	{
 | 
			
		||||
		this.x = x;
 | 
			
		||||
		this.y = y;
 | 
			
		||||
		if (x.length != y.length)
 | 
			
		||||
		{
 | 
			
		||||
			System.out.println("x, y vectors must be of same length");
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			dataLength = x.length;
 | 
			
		||||
			doStatistics();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes this class and calculates the second derivative of the spline.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 */
 | 
			
		||||
	public LinearInterpolation(AbstractDataSet abstractDataSet)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.setAbstractDataSet(abstractDataSet);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setAbstractDataSet(AbstractDataSet abstractDataSet)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = abstractDataSet;
 | 
			
		||||
		x = abstractDataSet.getXData();
 | 
			
		||||
		y = abstractDataSet.getYData();
 | 
			
		||||
		if (x.length != y.length)
 | 
			
		||||
		{
 | 
			
		||||
			System.out.println("x, y vectors must be of same length");
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			dataLength = x.length;
 | 
			
		||||
			doStatistics();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Find the p value for a given value of F.
 | 
			
		||||
	 * Requires the COLT high performance library:
 | 
			
		||||
	 * http://hoschek.home.cern.ch/hoschek/colt/
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param  fValue  the value for the CDF
 | 
			
		||||
	 * @return         The P value
 | 
			
		||||
	 */
 | 
			
		||||
	//	public double getP(double fValue) {
 | 
			
		||||
	//		double answer;
 | 
			
		||||
	//		double y1;
 | 
			
		||||
	//		double y2;
 | 
			
		||||
	//		//nu1 = 1;
 | 
			
		||||
	//		//x2 =1
 | 
			
		||||
	//		double nu2 = n - 2;
 | 
			
		||||
	//		y1 = nu2 / (nu2 + fValue);
 | 
			
		||||
	//		y2 = 0.0;
 | 
			
		||||
	//		answer = Gamma.incompleteBeta(nu2 / 2.0, 1 / 2.0, y1)
 | 
			
		||||
	//				 - Gamma.incompleteBeta(nu2 / 2.0, 1 / 2.0, y2);
 | 
			
		||||
	//		return answer;
 | 
			
		||||
	//	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 *  Here are the accessor methods
 | 
			
		||||
	 *
 | 
			
		||||
	 */
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the intercept of the regression line.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The intercept.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getIntercept()
 | 
			
		||||
	{
 | 
			
		||||
		return a;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the Slope of the regression line.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The slope.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getSlope()
 | 
			
		||||
	{
 | 
			
		||||
		return b;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the residuals of the regression.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The residuals.
 | 
			
		||||
	 */
 | 
			
		||||
	public double[][] getResiduals()
 | 
			
		||||
	{
 | 
			
		||||
		return residual;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the x data for the regression.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The array of x values.
 | 
			
		||||
	 */
 | 
			
		||||
	public double[] getDataX()
 | 
			
		||||
	{
 | 
			
		||||
		return x;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the y data for the regression.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The array of y values.
 | 
			
		||||
	 */
 | 
			
		||||
	public double[] getDataY()
 | 
			
		||||
	{
 | 
			
		||||
		return y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the minimum of the x values.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The minimum.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getMinX()
 | 
			
		||||
	{
 | 
			
		||||
		return minX;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the maximum of the x values.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The maximum.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getMaxX()
 | 
			
		||||
	{
 | 
			
		||||
		return maxX;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the minimum of the y values.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The minumum.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getMinY()
 | 
			
		||||
	{
 | 
			
		||||
		return minY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the maximum of the y values.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The maximum.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getMaxY()
 | 
			
		||||
	{
 | 
			
		||||
		return maxY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the maximum absolute residual.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The maximum.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getMaxAbsoluteResidual()
 | 
			
		||||
	{
 | 
			
		||||
		return maxAbsoluteResidual;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the sum of the square x deviations from mean of x.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The Sxx value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getSxx()
 | 
			
		||||
	{
 | 
			
		||||
		return Sxx;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the sum of the square y deviations from mean of y.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The Syy value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getSyy()
 | 
			
		||||
	{
 | 
			
		||||
		return Syy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets  SSR = Sxy * Sxy / Sxx;
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The SSR value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getSSR()
 | 
			
		||||
	{
 | 
			
		||||
		return SSR;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets SSE = Syy - SSR.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The SSE value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getSSE()
 | 
			
		||||
	{
 | 
			
		||||
		return SSE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the mean square error MSE.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The MSE value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getMSE()
 | 
			
		||||
	{
 | 
			
		||||
		return SSE / (n - 2);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the mean XBar of x.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The XBar value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getXBar()
 | 
			
		||||
	{
 | 
			
		||||
		return sumX / n;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the mean YBar of y.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The YBar value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getYBar()
 | 
			
		||||
	{
 | 
			
		||||
		return sumY / n;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the sample size.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The sample size.
 | 
			
		||||
	 */
 | 
			
		||||
	public int getDataLength()
 | 
			
		||||
	{
 | 
			
		||||
		return x.length;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the Pearson R statistic of the regression.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The PearsonR value
 | 
			
		||||
	 */
 | 
			
		||||
	public double getPearsonR()
 | 
			
		||||
	{
 | 
			
		||||
		return Sxy / Math.sqrt(Sxx * Syy);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Gets the sum of the x squared values.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return    The sum of the x squared values.
 | 
			
		||||
	 */
 | 
			
		||||
	public double getSumXSquared()
 | 
			
		||||
	{
 | 
			
		||||
		return sumXsquared;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * reset data to 0
 | 
			
		||||
	 */
 | 
			
		||||
	public void reset()
 | 
			
		||||
	{
 | 
			
		||||
		x = new double[0];
 | 
			
		||||
		y = new double[0];
 | 
			
		||||
		dataLength = 0;
 | 
			
		||||
		n = 0.0;
 | 
			
		||||
		residual = new double[0][0];
 | 
			
		||||
 | 
			
		||||
		sumX = 0;
 | 
			
		||||
		sumXsquared = 0;
 | 
			
		||||
		sumY = 0;
 | 
			
		||||
		sumYsquared = 0;
 | 
			
		||||
		sumXY = 0;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 *  Adds a new point to the regression (for interactive use).
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param  xValue  The new x value
 | 
			
		||||
	 * @param  yValue  The new y value
 | 
			
		||||
	 */
 | 
			
		||||
	public void addPoint(double xValue, double yValue)
 | 
			
		||||
	{
 | 
			
		||||
		dataLength++;
 | 
			
		||||
		double[] xNew = new double[dataLength];
 | 
			
		||||
		double[] yNew = new double[dataLength];
 | 
			
		||||
		System.arraycopy(x, 0, xNew, 0, dataLength - 1);
 | 
			
		||||
		System.arraycopy(y, 0, yNew, 0, dataLength - 1);
 | 
			
		||||
		xNew[dataLength - 1] = xValue;
 | 
			
		||||
		yNew[dataLength - 1] = yValue;
 | 
			
		||||
		x = xNew;
 | 
			
		||||
		y = yNew;
 | 
			
		||||
		updateStatistics(xValue, yValue);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void doStatistics()
 | 
			
		||||
	{
 | 
			
		||||
		//Find sum of squares for x,y and sum of xy
 | 
			
		||||
		for (int i = 0; i < dataLength; i++)
 | 
			
		||||
		{
 | 
			
		||||
			minX = Math.min(minX, x[i]);
 | 
			
		||||
			maxX = Math.max(maxX, x[i]);
 | 
			
		||||
			minY = Math.min(minY, y[i]);
 | 
			
		||||
			maxY = Math.max(maxY, y[i]);
 | 
			
		||||
			sumX += x[i];
 | 
			
		||||
			sumY += y[i];
 | 
			
		||||
			sumXsquared += x[i] * x[i];
 | 
			
		||||
			sumYsquared += y[i] * y[i];
 | 
			
		||||
			sumXY += x[i] * y[i];
 | 
			
		||||
		}
 | 
			
		||||
		//Caculate regression coefficients
 | 
			
		||||
		n = (double) dataLength;
 | 
			
		||||
		Sxx = sumXsquared - sumX * sumX / n;
 | 
			
		||||
		Syy = sumYsquared - sumY * sumY / n;
 | 
			
		||||
		Sxy = sumXY - sumX * sumY / n;
 | 
			
		||||
		b = Sxy / Sxx;
 | 
			
		||||
		a = (sumY - b * sumX) / n;
 | 
			
		||||
		SSR = Sxy * Sxy / Sxx;
 | 
			
		||||
		SSE = Syy - SSR;
 | 
			
		||||
		calculateResiduals();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void calculateResiduals()
 | 
			
		||||
	{
 | 
			
		||||
		residual = new double[2][dataLength];
 | 
			
		||||
		maxAbsoluteResidual = 0.0;
 | 
			
		||||
		for (int i = 0; i < dataLength; i++)
 | 
			
		||||
		{
 | 
			
		||||
			residual[0][i] = x[i];
 | 
			
		||||
			residual[1][i] = y[i] - (a + b * x[i]);
 | 
			
		||||
			maxAbsoluteResidual =
 | 
			
		||||
				Math.max(maxAbsoluteResidual, Math.abs(y[i] - (a + b * x[i])));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//update statistics for a single additional data point
 | 
			
		||||
	private void updateStatistics(double xValue, double yValue)
 | 
			
		||||
	{
 | 
			
		||||
		//Find sum of squares for x,y and sum of xy
 | 
			
		||||
		n++;
 | 
			
		||||
		sumX += xValue;
 | 
			
		||||
		sumY += yValue;
 | 
			
		||||
		sumXsquared += xValue * xValue;
 | 
			
		||||
		sumYsquared += yValue * yValue;
 | 
			
		||||
		sumXY += xValue * yValue;
 | 
			
		||||
		//Caculate regression coefficients
 | 
			
		||||
		n = (double) dataLength;
 | 
			
		||||
		Sxx = sumXsquared - sumX * sumX / n;
 | 
			
		||||
		Syy = sumYsquared - sumY * sumY / n;
 | 
			
		||||
		Sxy = sumXY - sumX * sumY / n;
 | 
			
		||||
		b = Sxy / Sxx;
 | 
			
		||||
		a = (sumY - b * sumX) / n;
 | 
			
		||||
		SSR = Sxy * Sxy / Sxx;
 | 
			
		||||
		SSE = Syy - SSR;
 | 
			
		||||
		calculateResiduals();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * regression line y = a + bx.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param x
 | 
			
		||||
	 * @return double
 | 
			
		||||
	 * @throws InterpolationException
 | 
			
		||||
	 */
 | 
			
		||||
	public double getY(double x) throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		return a + b * x;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String toString()
 | 
			
		||||
	{
 | 
			
		||||
		StringBuffer sb = new StringBuffer(1000);
 | 
			
		||||
 | 
			
		||||
		sb.append("Regression Statistics for " + yName + " = a + b*" + xName);
 | 
			
		||||
		sb.append("");
 | 
			
		||||
		sb.append("Sample Statistics");
 | 
			
		||||
		int n = this.getDataLength();
 | 
			
		||||
		sb.append("Sample size     n = " + n);
 | 
			
		||||
		sb.append("Mean of " + yName + "   Y bar = " + this.getYBar());
 | 
			
		||||
		sb.append("s_Y");
 | 
			
		||||
		sb.append("= " + Math.sqrt(this.getSyy() / ((float) (n - 1))));
 | 
			
		||||
		sb.append("Pearson correlation R = " + this.getPearsonR());
 | 
			
		||||
		sb.append("");
 | 
			
		||||
		sb.append("Coefficient Estimates");
 | 
			
		||||
		a = this.getIntercept();
 | 
			
		||||
		b = this.getSlope();
 | 
			
		||||
		sb.append("a = " + a);
 | 
			
		||||
		sb.append("b = " + b);
 | 
			
		||||
		sb.append("");
 | 
			
		||||
 | 
			
		||||
		sb.append("95%  Confidence Intervals");
 | 
			
		||||
 | 
			
		||||
		if (n > 32)
 | 
			
		||||
		{
 | 
			
		||||
			t = t025[30];
 | 
			
		||||
		}
 | 
			
		||||
		else if (n > 2)
 | 
			
		||||
		{
 | 
			
		||||
			t = t025[n - 2];
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			t = Double.NaN;
 | 
			
		||||
		}
 | 
			
		||||
		MSE = this.getMSE();
 | 
			
		||||
		if (n > 2)
 | 
			
		||||
		{
 | 
			
		||||
			bSE = Math.sqrt(MSE / this.getSxx());
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			bSE = Double.NaN;
 | 
			
		||||
		}
 | 
			
		||||
		aSE = bSE * Math.sqrt(this.getSumXSquared() / n);
 | 
			
		||||
		aCILower = a - t * aSE;
 | 
			
		||||
		aCIUpper = a + t * aSE;
 | 
			
		||||
		sb.append("a   :    (" + aCILower + ", " + aCIUpper + ")");
 | 
			
		||||
		bCILower = b - t * bSE;
 | 
			
		||||
		bCIUpper = b + t * bSE;
 | 
			
		||||
		sb.append("b    :    (" + bCILower + ", " + bCIUpper + ")");
 | 
			
		||||
		sb.append("");
 | 
			
		||||
		sb.append("Analysis of Variance");
 | 
			
		||||
		sb.append("Source      Degrees Freedom   Sum of Squares");
 | 
			
		||||
		sb.append("");
 | 
			
		||||
		SSR = this.getSSR();
 | 
			
		||||
		//allow one degree of freedom for mean
 | 
			
		||||
		sb.append(
 | 
			
		||||
			"model                            1                                 "
 | 
			
		||||
				+ SSR);
 | 
			
		||||
		sb.append(
 | 
			
		||||
			"error                         "
 | 
			
		||||
				+ (n - 2)
 | 
			
		||||
				+ "                         "
 | 
			
		||||
				+ this.getSSE());
 | 
			
		||||
		sb.append(
 | 
			
		||||
			"total(corrected)              "
 | 
			
		||||
				+ (n - 1)
 | 
			
		||||
				+ "                            "
 | 
			
		||||
				+ this.getSyy());
 | 
			
		||||
		sb.append("");
 | 
			
		||||
		sb.append("MSE =" + MSE);
 | 
			
		||||
		F = SSR / MSE;
 | 
			
		||||
		sb.append("F = " + F + "    ");
 | 
			
		||||
		//sb.append("p = " + this.getP(F));
 | 
			
		||||
 | 
			
		||||
		return sb.toString();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
							
								
								
									
										453
									
								
								src/wsi/ra/math/interpolation/PolyInterpolation.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										453
									
								
								src/wsi/ra/math/interpolation/PolyInterpolation.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,453 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: PolyInterpolation.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:25:30 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Defines the routines for the interpolation of data.
 | 
			
		||||
 */
 | 
			
		||||
public class PolyInterpolation
 | 
			
		||||
{
 | 
			
		||||
	AbstractDataSet abstractDataSet = null;
 | 
			
		||||
	boolean sloppy = true;
 | 
			
		||||
	double[] polynomialCoefficients = null;
 | 
			
		||||
 | 
			
		||||
	/*------------------------------------------------------------------------*
 | 
			
		||||
	 * constructor
 | 
			
		||||
	 *------------------------------------------------------------------------*/
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes this class.
 | 
			
		||||
	 */
 | 
			
		||||
	public PolyInterpolation() throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = null;
 | 
			
		||||
		sloppy = true;
 | 
			
		||||
		polynomialCoefficients = null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes this class and calculates the coefficients of the polynom.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 */
 | 
			
		||||
	public PolyInterpolation(AbstractDataSet abstractDataSet)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = abstractDataSet;
 | 
			
		||||
		sloppy = true;
 | 
			
		||||
		this.polynomialCoefficients = calculatePolynomialCoefficients();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes this class and calculates the coefficients of the polynom.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 * @param sloppy if <code>true</code> Neville's algorithm which is used in the
 | 
			
		||||
	 *     <code>polynomialInterpolation</code>-routines does only print a
 | 
			
		||||
	 *    warning message on the screen and does not throw an
 | 
			
		||||
	 *    <code>Exception</code> if two x values are identical.
 | 
			
		||||
	 */
 | 
			
		||||
	public PolyInterpolation(AbstractDataSet abstractDataSet, boolean sloppy)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = abstractDataSet;
 | 
			
		||||
		this.sloppy = sloppy;
 | 
			
		||||
		this.polynomialCoefficients = calculatePolynomialCoefficients();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the new <code>AbstractDataSet</code> and calculates the coefficients
 | 
			
		||||
	 * of the polynom.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 */
 | 
			
		||||
	public void setAbstractDataSet(AbstractDataSet abstractDataSet)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = abstractDataSet;
 | 
			
		||||
		this.polynomialCoefficients = calculatePolynomialCoefficients();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Uses the polynom with the calculated coefficients to calculate the
 | 
			
		||||
	 * <code>y</code> value. This algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 5, pages 173-176.</a><br>
 | 
			
		||||
	 * The Neville's algorithm which is used in the <code>polynomialInterpolation</code>-
 | 
			
		||||
	 * routines returns also the error of this interpolated point.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param x the x value
 | 
			
		||||
	 * @return the interpolated y value
 | 
			
		||||
	 * @see #polynomialInterpolation(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(AbstractDataSet, double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double[], double[], double)
 | 
			
		||||
	 * @see #getYandDerivatives(double, int)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients()
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(AbstractDataSet)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(double[], double[])
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	public double getY(double x)
 | 
			
		||||
	{
 | 
			
		||||
		int n = polynomialCoefficients.length - 1;
 | 
			
		||||
		double y = polynomialCoefficients[n];
 | 
			
		||||
		for (int j = n - 1; j >= 0; j--)
 | 
			
		||||
			y = y * x + polynomialCoefficients[j];
 | 
			
		||||
 | 
			
		||||
		return y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Uses the polynom with the calculated coefficients to calculate the
 | 
			
		||||
	 * <code>y</code> value and the derivatives at the point <code>x</code>,
 | 
			
		||||
	 * <code>y</code>. This algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 5, pages 173-176.</a><br>
 | 
			
		||||
	 * The Neville's algorithm which is used in the <code>polynomialInterpolation</code>-
 | 
			
		||||
	 * routines returns also the error of this interpolated point.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param x the x value
 | 
			
		||||
	 * @param ndDerivateNumber the number of the calculated derivatives
 | 
			
		||||
	 * @return the interpolated y value at ...[0], the 1st derivativ value at
 | 
			
		||||
	 *         ...[1], the 2nd derivativ at ...[2] and so on ...
 | 
			
		||||
	 * @see #getY(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(AbstractDataSet, double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double[], double[], double)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients()
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(AbstractDataSet)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(double[], double[])
 | 
			
		||||
	 */
 | 
			
		||||
	public double[] getYandDerivatives(double x, int ndDerivateNumber)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		if (ndDerivateNumber < 0)
 | 
			
		||||
			throw new InterpolationException("Negative derivative numbers make no sense.");
 | 
			
		||||
		else if (ndDerivateNumber == 0)
 | 
			
		||||
		{
 | 
			
		||||
			double[] pd = new double[1];
 | 
			
		||||
			pd[0] = getY(x);
 | 
			
		||||
			return pd;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		int nnd, j, i;
 | 
			
		||||
		int nc = polynomialCoefficients.length - 1;
 | 
			
		||||
		double[] pd = new double[ndDerivateNumber + 1];
 | 
			
		||||
		double cnst = 1.0;
 | 
			
		||||
 | 
			
		||||
		pd[0] = polynomialCoefficients[nc];
 | 
			
		||||
		for (j = 1; j <= ndDerivateNumber; j++)
 | 
			
		||||
			pd[j] = 0.0;
 | 
			
		||||
		for (i = nc - 1; i >= 0; i--)
 | 
			
		||||
		{
 | 
			
		||||
			nnd = (ndDerivateNumber < (nc - i) ? ndDerivateNumber : nc - i);
 | 
			
		||||
			for (j = nnd; j >= 1; j--)
 | 
			
		||||
				pd[j] = pd[j] * x + pd[j - 1];
 | 
			
		||||
			pd[0] = pd[0] * x + polynomialCoefficients[i];
 | 
			
		||||
		}
 | 
			
		||||
		for (i = 2; i <= ndDerivateNumber; i++)
 | 
			
		||||
		{
 | 
			
		||||
			cnst *= i;
 | 
			
		||||
			pd[i] *= cnst;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return pd;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Neville's interpolation algorithm. This algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 108-122.</a><br>
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param x the x value
 | 
			
		||||
	 * @return the interpolated y value and the interpolation error
 | 
			
		||||
	 * @see #polynomialInterpolation(AbstractDataSet, double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double[], double[], double)
 | 
			
		||||
	 * @see #getY(double)
 | 
			
		||||
	 * @see #getYandDerivatives(double, int)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients()
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(AbstractDataSet)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(double[], double[])
 | 
			
		||||
	 */
 | 
			
		||||
	public PolynomialInterpolationResult polynomialInterpolation(double x)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		if (abstractDataSet == null)
 | 
			
		||||
			throw new InterpolationException(
 | 
			
		||||
				"No data." + " The AbstractDataSet was not defined.");
 | 
			
		||||
		return polynomialInterpolation(
 | 
			
		||||
			abstractDataSet.getXData(),
 | 
			
		||||
			abstractDataSet.getYData(),
 | 
			
		||||
			x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Neville's interpolation algorithm. This algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 108-122.</a><br>
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 * @param x the x value
 | 
			
		||||
	 * @return the interpolated y value and the interpolation error
 | 
			
		||||
	 * @see #polynomialInterpolation(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double[], double[], double)
 | 
			
		||||
	 * @see #getY(double)
 | 
			
		||||
	 * @see #getYandDerivatives(double, int)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients()
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(AbstractDataSet)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(double[], double[])
 | 
			
		||||
	 */
 | 
			
		||||
	public PolynomialInterpolationResult polynomialInterpolation(
 | 
			
		||||
		AbstractDataSet abstractDataSet,
 | 
			
		||||
		double x)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		if (abstractDataSet == null)
 | 
			
		||||
			throw new InterpolationException(
 | 
			
		||||
				"No data." + " The AbstractDataSet was not defined.");
 | 
			
		||||
		return polynomialInterpolation(
 | 
			
		||||
			abstractDataSet.getXData(),
 | 
			
		||||
			abstractDataSet.getYData(),
 | 
			
		||||
			x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Neville's interpolation algorithm. This algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 108-122.</a><br>
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param xa the array of x values
 | 
			
		||||
	 * @param ya the array of y values
 | 
			
		||||
	 * @param x the x value
 | 
			
		||||
	 * @return the interpolated y value and the interpolation error
 | 
			
		||||
	 * @see #polynomialInterpolation(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(AbstractDataSet, double)
 | 
			
		||||
	 * @see #getY(double)
 | 
			
		||||
	 * @see #getYandDerivatives(double, int)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients()
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(AbstractDataSet)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(double[], double[])
 | 
			
		||||
	 */
 | 
			
		||||
	public PolynomialInterpolationResult polynomialInterpolation(
 | 
			
		||||
		double[] xa,
 | 
			
		||||
		double[] ya,
 | 
			
		||||
		double x)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		if (xa == null || ya == null)
 | 
			
		||||
			throw new InterpolationException("No data.");
 | 
			
		||||
		int i, m, ns = 1;
 | 
			
		||||
		double den, dif, dift, ho, hp, w;
 | 
			
		||||
		double[] c = new double[xa.length + 1];
 | 
			
		||||
		double[] d = new double[xa.length + 1];
 | 
			
		||||
		PolynomialInterpolationResult result =
 | 
			
		||||
			new PolynomialInterpolationResult();
 | 
			
		||||
 | 
			
		||||
		dif = Math.abs(x - xa[1 - 1]);
 | 
			
		||||
		for (i = 1; i <= xa.length; i++)
 | 
			
		||||
		{
 | 
			
		||||
			if ((dift = Math.abs(x - xa[i - 1])) < dif)
 | 
			
		||||
			{
 | 
			
		||||
				ns = i;
 | 
			
		||||
				dif = dift;
 | 
			
		||||
			}
 | 
			
		||||
			c[i] = ya[i - 1];
 | 
			
		||||
			d[i] = ya[i - 1];
 | 
			
		||||
			//System.out.println("x"+xa[i-1]+" y"+ya[i-1]);
 | 
			
		||||
		}
 | 
			
		||||
		result.y = ya[ns - 1];
 | 
			
		||||
		//System.out.println("y="+result.y+" ns="+ns);
 | 
			
		||||
		ns--;
 | 
			
		||||
		for (m = 1; m < xa.length; m++)
 | 
			
		||||
		{
 | 
			
		||||
			for (i = 1; i <= xa.length - m; i++)
 | 
			
		||||
			{
 | 
			
		||||
				ho = xa[i - 1] - x;
 | 
			
		||||
				hp = xa[i + m - 1] - x;
 | 
			
		||||
				w = c[i + 1] - d[i];
 | 
			
		||||
				if ((den = ho - hp) == 0.0)
 | 
			
		||||
				{
 | 
			
		||||
					if (sloppy)
 | 
			
		||||
					{
 | 
			
		||||
						System.out.println(
 | 
			
		||||
							"Two identical x values. The values must be distinct.");
 | 
			
		||||
						den = 1.0;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
						throw new InterpolationException("Two identical x values.");
 | 
			
		||||
				}
 | 
			
		||||
				den = w / den;
 | 
			
		||||
				d[i] = hp * den;
 | 
			
		||||
				c[i] = ho * den;
 | 
			
		||||
			}
 | 
			
		||||
			result.y
 | 
			
		||||
				+= (result.yError =
 | 
			
		||||
					(2 * ns < (xa.length - m) ? c[ns + 1] : d[ns--]));
 | 
			
		||||
		}
 | 
			
		||||
		return result;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Calculates the coefficients of a polynom of the grade <code>N-1</code>. This
 | 
			
		||||
	 * interpolation algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 108-122.</a><br>
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return the array with the polynomial coefficients y = ...[0] +
 | 
			
		||||
	 *         ...[1]*x<SUP>2</SUP> + ...[2]*x<SUP>3</SUP> + ...
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(AbstractDataSet)
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(double[], double[])
 | 
			
		||||
	 * @see #polynomialInterpolation(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(AbstractDataSet, double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double[], double[], double)
 | 
			
		||||
	 * @see #getY(double)
 | 
			
		||||
	 * @see #getYandDerivatives(double, int)
 | 
			
		||||
	 */
 | 
			
		||||
	public double[] calculatePolynomialCoefficients()
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		if (abstractDataSet == null)
 | 
			
		||||
			throw new InterpolationException(
 | 
			
		||||
				"No data." + " The AbstractDataSet was not defined.");
 | 
			
		||||
		return calculatePolynomialCoefficients(
 | 
			
		||||
			abstractDataSet.getXData(),
 | 
			
		||||
			abstractDataSet.getYData());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Calculates the coefficients of a polynom of the grade <code>N-1</code>. This
 | 
			
		||||
	 * interpolation algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 108-122.</a><br>
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 * @return the array with the polynomial coefficients y = ...[0] +
 | 
			
		||||
	 *         ...[1]*x<SUP>2</SUP> + ...[2]*x<SUP>3</SUP> + ...
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients()
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(double[], double[])
 | 
			
		||||
	 * @see #polynomialInterpolation(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(AbstractDataSet, double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double[], double[], double)
 | 
			
		||||
	 * @see #getY(double)
 | 
			
		||||
	 * @see #getYandDerivatives(double, int)
 | 
			
		||||
	 */
 | 
			
		||||
	public double[] calculatePolynomialCoefficients(AbstractDataSet abstractDataSet)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		if (abstractDataSet == null)
 | 
			
		||||
			throw new InterpolationException(
 | 
			
		||||
				"No data." + " The AbstractDataSet was not defined.");
 | 
			
		||||
		return calculatePolynomialCoefficients(
 | 
			
		||||
			abstractDataSet.getXData(),
 | 
			
		||||
			abstractDataSet.getYData());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Calculates the coefficients of a polynom of the grade <code>N-1</code>. This
 | 
			
		||||
	 * interpolation algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 108-122.</a><br>
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param x the array of x values
 | 
			
		||||
	 * @param y the array of y values
 | 
			
		||||
	 * @return the array with the polynomial coefficients y = ...[0] +
 | 
			
		||||
	 *         ...[1]*x<SUP>2</SUP> + ...[2]*x<SUP>3</SUP> + ...
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients()
 | 
			
		||||
	 * @see #calculatePolynomialCoefficients(AbstractDataSet)
 | 
			
		||||
	 * @see #polynomialInterpolation(double)
 | 
			
		||||
	 * @see #polynomialInterpolation(AbstractDataSet, double)
 | 
			
		||||
	 * @see #polynomialInterpolation(double[], double[], double)
 | 
			
		||||
	 * @see #getY(double)
 | 
			
		||||
	 * @see #getYandDerivatives(double, int)
 | 
			
		||||
	 */
 | 
			
		||||
	public double[] calculatePolynomialCoefficients(double x[], double y[])
 | 
			
		||||
	{
 | 
			
		||||
		int k, j, i, n = x.length - 1;
 | 
			
		||||
		double phi, ff, b;
 | 
			
		||||
		double[] s = new double[n + 1];
 | 
			
		||||
		double[] cof = new double[n + 1];
 | 
			
		||||
 | 
			
		||||
		for (i = 0; i <= n; i++)
 | 
			
		||||
		{
 | 
			
		||||
			s[i] = cof[i] = 0.0;
 | 
			
		||||
		}
 | 
			
		||||
		s[n] = -x[0];
 | 
			
		||||
 | 
			
		||||
		for (i = 1; i <= n; i++)
 | 
			
		||||
		{
 | 
			
		||||
			for (j = n - i; j <= n - 1; j++)
 | 
			
		||||
			{
 | 
			
		||||
				s[j] -= x[i] * s[j + 1];
 | 
			
		||||
			}
 | 
			
		||||
			s[n] -= x[i];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (j = 0; j < n; j++)
 | 
			
		||||
		{
 | 
			
		||||
			phi = n + 1;
 | 
			
		||||
			for (k = n; k >= 1; k--)
 | 
			
		||||
			{
 | 
			
		||||
				phi = k * s[k] + x[j] * phi;
 | 
			
		||||
			}
 | 
			
		||||
			ff = y[j] / phi;
 | 
			
		||||
			b = 1.0;
 | 
			
		||||
			for (k = n; k >= 0; k--)
 | 
			
		||||
			{
 | 
			
		||||
				cof[k] += b * ff;
 | 
			
		||||
				b = s[k] + x[j] * b;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return cof;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
@@ -0,0 +1,56 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: PolynomialInterpolationResult.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:25:36 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * CLASS DECLARATION
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The result data for a polynomial interpolation.
 | 
			
		||||
 */
 | 
			
		||||
public class PolynomialInterpolationResult
 | 
			
		||||
{
 | 
			
		||||
	/*-------------------------------------------------------------------------*
 | 
			
		||||
	 * public member variables
 | 
			
		||||
	 *-------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
	public double y = Double.NaN;
 | 
			
		||||
	public double yError = Double.NaN;
 | 
			
		||||
 | 
			
		||||
	/*------------------------------------------------------------------------*
 | 
			
		||||
	 * constructor
 | 
			
		||||
	 *------------------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
	public PolynomialInterpolationResult()
 | 
			
		||||
	{
 | 
			
		||||
		y = Double.NaN;
 | 
			
		||||
		yError = Double.NaN;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public PolynomialInterpolationResult(double y, double yError)
 | 
			
		||||
	{
 | 
			
		||||
		this.y = y;
 | 
			
		||||
		this.yError = yError;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
							
								
								
									
										299
									
								
								src/wsi/ra/math/interpolation/SplineInterpolation.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										299
									
								
								src/wsi/ra/math/interpolation/SplineInterpolation.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,299 @@
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//  Filename: $RCSfile: SplineInterpolation.java,v $
 | 
			
		||||
//  Purpose:  Some interpolation stuff.
 | 
			
		||||
//  Language: Java
 | 
			
		||||
//  Compiler: JDK 1.4
 | 
			
		||||
//  Authors:  Joerg K. Wegner
 | 
			
		||||
//  Version:  $Revision: 1.1 $
 | 
			
		||||
//            $Date: 2003/07/22 19:25:42 $
 | 
			
		||||
//            $Author: wegnerj $
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) Dept. Computer Architecture, University of Tuebingen, Germany
 | 
			
		||||
//
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
package wsi.ra.math.interpolation;
 | 
			
		||||
 | 
			
		||||
/*==========================================================================*
 | 
			
		||||
 * IMPORTS
 | 
			
		||||
 *==========================================================================*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Defines the routines for the spline interpolation of data.
 | 
			
		||||
 */
 | 
			
		||||
public class SplineInterpolation
 | 
			
		||||
{
 | 
			
		||||
	AbstractDataSet abstractDataSet = null;
 | 
			
		||||
	double[] secondDerivative = null;
 | 
			
		||||
	double[] xArray = null;
 | 
			
		||||
	double[] yArray = null;
 | 
			
		||||
	boolean ascendingData = true;
 | 
			
		||||
 | 
			
		||||
	/*------------------------------------------------------------------------*
 | 
			
		||||
	 * constructor
 | 
			
		||||
	 *------------------------------------------------------------------------*/
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes this class.
 | 
			
		||||
	 */
 | 
			
		||||
	public SplineInterpolation() throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = null;
 | 
			
		||||
		this.secondDerivative = null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes this class and calculates the second derivative of the spline.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 */
 | 
			
		||||
	public SplineInterpolation(AbstractDataSet abstractDataSet)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.setAbstractDataSet(abstractDataSet);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the new <code>AbstractDataSet</code> and calculates the second
 | 
			
		||||
	 * derivative of the spline.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param abstractDataSet the <code>AbstractDataSet</code>
 | 
			
		||||
	 */
 | 
			
		||||
	public void setAbstractDataSet(AbstractDataSet abstractDataSet)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		this.abstractDataSet = abstractDataSet;
 | 
			
		||||
		double[] x = abstractDataSet.getXData();
 | 
			
		||||
		double[] y = abstractDataSet.getYData();
 | 
			
		||||
		boolean ascending = false;
 | 
			
		||||
		boolean descending = false;
 | 
			
		||||
		int n = x.length;
 | 
			
		||||
 | 
			
		||||
		xArray = new double[n];
 | 
			
		||||
		yArray = new double[n];
 | 
			
		||||
		xArray[n - 1] = x[0];
 | 
			
		||||
		yArray[n - 1] = y[0];
 | 
			
		||||
		for (int i = 0; i < n - 1; i++)
 | 
			
		||||
		{
 | 
			
		||||
			xArray[i] = x[n - i - 1];
 | 
			
		||||
			yArray[i] = y[n - i - 1];
 | 
			
		||||
			if (x[i] < x[i + 1])
 | 
			
		||||
			{
 | 
			
		||||
				//if(descending)throw new InterpolationException("The x values must be"+
 | 
			
		||||
				//          " in continous ascending/descending order.");
 | 
			
		||||
				ascending = true;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				//if(ascending)throw new InterpolationException("The x values must be"+
 | 
			
		||||
				//          " in continous ascending/descending order.");
 | 
			
		||||
				descending = true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		ascendingData = ascending;
 | 
			
		||||
 | 
			
		||||
		if (ascendingData)
 | 
			
		||||
		{
 | 
			
		||||
			xArray = null;
 | 
			
		||||
			yArray = null;
 | 
			
		||||
			xArray = abstractDataSet.getXData();
 | 
			
		||||
			yArray = abstractDataSet.getYData();
 | 
			
		||||
		}
 | 
			
		||||
		this.secondDerivative =
 | 
			
		||||
			spline(
 | 
			
		||||
				xArray,
 | 
			
		||||
				yArray,
 | 
			
		||||
				(yArray[1] - yArray[0]) / (xArray[1] - xArray[0]),
 | 
			
		||||
				(yArray[n - 1] - yArray[n - 2]) / (xArray[1] - xArray[n - 2]));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Uses the spline with the calculated second derivative values to calculate
 | 
			
		||||
	 * the <code>y</code> value. This algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 5, pages 173-176.</a><br>
 | 
			
		||||
	 */
 | 
			
		||||
	public double getY(double x) throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		return splineInterpolation(xArray, yArray, secondDerivative, x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getDerivative(double x) throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		return splineInterpolatedDerivative(
 | 
			
		||||
			xArray,
 | 
			
		||||
			yArray,
 | 
			
		||||
			secondDerivative,
 | 
			
		||||
			x);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Calculates the second derivative of the data. It's important that the
 | 
			
		||||
	 * x<sub>i</sub> values of the function y<sub>i</sub>=f(x<sub>i</sub>) are
 | 
			
		||||
	 * in ascending order, as x<sub>0</sub><x<sub>1</sub><x<sub>2</sub><... .
 | 
			
		||||
	 * This algorithm was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 113-116.</a><br>
 | 
			
		||||
	 */
 | 
			
		||||
	public double[] spline(double[] x, double[] y, double yp0, double ypn)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		if (x[0] > x[1])
 | 
			
		||||
			throw new InterpolationException(
 | 
			
		||||
				"The x values must be" + " in ascending order.");
 | 
			
		||||
		int n = x.length;
 | 
			
		||||
		double[] y2 = new double[n];
 | 
			
		||||
		double[] u = new double[n - 1];
 | 
			
		||||
		int i, k;
 | 
			
		||||
		double p, qn, sig, un;
 | 
			
		||||
 | 
			
		||||
		if (yp0 > 0.99e30)
 | 
			
		||||
			y2[0] = u[0] = 0.0;
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			y2[0] = -0.5;
 | 
			
		||||
			u[0] =
 | 
			
		||||
				(3.0 / (x[1] - x[0])) * ((y[1] - y[0]) / (x[1] - x[0]) - yp0);
 | 
			
		||||
		}
 | 
			
		||||
		for (i = 2; i <= n - 1; i++)
 | 
			
		||||
		{
 | 
			
		||||
			sig = (x[i - 1] - x[i - 2]) / (x[i] - x[i - 2]);
 | 
			
		||||
			p = sig * y2[i - 2] + 2.0;
 | 
			
		||||
			y2[i - 1] = (sig - 1.0) / p;
 | 
			
		||||
			u[i - 1] =
 | 
			
		||||
				(y[i] - y[i - 1]) / (x[i] - x[i - 1])
 | 
			
		||||
					- (y[i - 1] - y[i - 2]) / (x[i - 1] - x[i - 2]);
 | 
			
		||||
			u[i - 1] =
 | 
			
		||||
				(6.0 * u[i - 1] / (x[i] - x[i - 2]) - sig * u[i - 2]) / p;
 | 
			
		||||
		}
 | 
			
		||||
		if (ypn > 0.99e30)
 | 
			
		||||
		{
 | 
			
		||||
			qn = un = 0.0;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			qn = 0.5;
 | 
			
		||||
			un =
 | 
			
		||||
				(3.0 / (x[n - 1] - x[n - 2]))
 | 
			
		||||
					* (ypn - (y[n - 1] - y[n - 2]) / (x[n - 1] - x[n - 2]));
 | 
			
		||||
		}
 | 
			
		||||
		y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);
 | 
			
		||||
		for (k = n - 1; k >= 1; k--)
 | 
			
		||||
		{
 | 
			
		||||
			y2[k - 1] = y2[k - 1] * y2[k] + u[k - 1];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return y2;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Calculates the second derivative of the data. This algorithm
 | 
			
		||||
	 * was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 113-116.</a><br>
 | 
			
		||||
	 */
 | 
			
		||||
	public double splineInterpolation(
 | 
			
		||||
		double[] xa,
 | 
			
		||||
		double[] ya,
 | 
			
		||||
		double[] y2a,
 | 
			
		||||
		double x)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		int n = xa.length;
 | 
			
		||||
		if (n != ya.length || n != y2a.length)
 | 
			
		||||
		{
 | 
			
		||||
			throw new InterpolationException("Arrays have different lengths.");
 | 
			
		||||
		}
 | 
			
		||||
		double y;
 | 
			
		||||
		int klo, khi, k;
 | 
			
		||||
		double h, b, a;
 | 
			
		||||
 | 
			
		||||
		klo = 0;
 | 
			
		||||
		khi = n - 1;
 | 
			
		||||
		while (khi - klo > 1)
 | 
			
		||||
		{
 | 
			
		||||
			k = (khi + klo) >> 1;
 | 
			
		||||
			if (xa[k] > x)
 | 
			
		||||
				khi = k;
 | 
			
		||||
			else
 | 
			
		||||
				klo = k;
 | 
			
		||||
		}
 | 
			
		||||
		h = xa[khi] - xa[klo];
 | 
			
		||||
		//System.out.println(""+x+" between "+xa[khi]+" "+xa[klo]);
 | 
			
		||||
		if (h == 0.0)
 | 
			
		||||
			throw new InterpolationException("Two identical x values. The values must be distinct.");
 | 
			
		||||
		a = (xa[khi] - x) / h;
 | 
			
		||||
		b = (x - xa[klo]) / h;
 | 
			
		||||
		y =
 | 
			
		||||
			a * ya[klo]
 | 
			
		||||
				+ b * ya[khi]
 | 
			
		||||
				+ ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi])
 | 
			
		||||
					* (h * h)
 | 
			
		||||
					/ 6.0;
 | 
			
		||||
		return y;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Calculates the second derivative of the data. This algorithm
 | 
			
		||||
	 * was taken from:<br>
 | 
			
		||||
	 * <a href="http://www.ulib.org/webRoot/Books/Numerical_Recipes/" target="_top">
 | 
			
		||||
	 * William H. Press, Saul A. Teukolosky, William T. Vetterling, Brian P. Flannery,
 | 
			
		||||
	 * "Numerical Recipes in C - The Art of Scientific Computing", Second Edition,
 | 
			
		||||
	 * Cambridge University Press,
 | 
			
		||||
	 * ISBN 0-521-43108-5,
 | 
			
		||||
	 * chapter 3, pages 113-116.</a><br>
 | 
			
		||||
	 */
 | 
			
		||||
	public double splineInterpolatedDerivative(
 | 
			
		||||
		double[] xa,
 | 
			
		||||
		double[] ya,
 | 
			
		||||
		double[] y2a,
 | 
			
		||||
		double x)
 | 
			
		||||
		throws InterpolationException
 | 
			
		||||
	{
 | 
			
		||||
		int n = xa.length;
 | 
			
		||||
		if (n != ya.length || n != y2a.length)
 | 
			
		||||
		{
 | 
			
		||||
			throw new InterpolationException("Arrays have different lengths.");
 | 
			
		||||
		}
 | 
			
		||||
		double dydx;
 | 
			
		||||
		int klo, khi, k;
 | 
			
		||||
		double h, b, a;
 | 
			
		||||
 | 
			
		||||
		klo = 0;
 | 
			
		||||
		khi = n - 1;
 | 
			
		||||
		while (khi - klo > 1)
 | 
			
		||||
		{
 | 
			
		||||
			k = (khi + klo) >> 1;
 | 
			
		||||
			if (xa[k] > x)
 | 
			
		||||
				khi = k;
 | 
			
		||||
			else
 | 
			
		||||
				klo = k;
 | 
			
		||||
		}
 | 
			
		||||
		h = xa[khi] - xa[klo];
 | 
			
		||||
		//System.out.println(""+x+" between "+xa[khi]+" "+xa[klo]);
 | 
			
		||||
		if (h == 0.0)
 | 
			
		||||
			throw new InterpolationException("Two identical x values. The values must be distinct.");
 | 
			
		||||
		a = (xa[khi] - x) / h;
 | 
			
		||||
		b = (x - xa[klo]) / h;
 | 
			
		||||
		dydx =
 | 
			
		||||
			(ya[khi] - ya[klo]) / h
 | 
			
		||||
				- ((3 * (a * a) - 1) * h * y2a[klo]) / 6.0
 | 
			
		||||
				+ ((3 * (b * b) - 1) * h * y2a[khi]) / 6.0;
 | 
			
		||||
		return dydx;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * END OF FILE
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
		Reference in New Issue
	
	Block a user