All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.epfl.gsn.utils.models.auxiliar.ChebyshevPolynomial Maven / Gradle / Ivy

The newest version!
/**
* Global Sensor Networks (GSN) Source Code
* Copyright (c) 2006-2016, Ecole Polytechnique Federale de Lausanne (EPFL)
* 
* This file is part of GSN.
* 
* GSN 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 3 of the License, or
* (at your option) any later version.
* 
* GSN 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 GSN.  If not, see .
* 
* File: src/ch/epfl/gsn/utils/models/auxiliar/ChebyshevPolynomial.java
*
* @author Alexandru Arion
* @author Sofiane Sarni
*
*/

package ch.epfl.gsn.utils.models.auxiliar;

import java.util.Vector;

public class ChebyshevPolynomial {

	int degree;
	Vector polis;
	double[] coefs;

	public ChebyshevPolynomial(int degree, double[] coefs)
	{
		this.degree = degree;
		this.polis = new Vector();
		//generate polis up to degree
		//degree 0
		this.polis.add(new Polynomial(new double[]{1}));
		//degree 1
		if(degree >= 1)
			this.polis.add(new Polynomial(new double[]{0, 1}));
		//other degrees
		for(int i = 2; i <= degree; i++)
		{
			this.polis.add(new Polynomial(GetNextPoly(i)));
		}
		this.coefs = coefs;
	}

	public double Calculate(double x)
	{
		double retval = 0.0;

		for(int i = 1; i < this.polis.size(); i++)
		{
			retval += this.polis.elementAt(i).Compute(x) * this.coefs[i];
		}

		retval += this.coefs[0] / 2;

		return retval;
	}

	public double Calculate(double[] cfs, double x)
	{
		double retval = 0.0;

		double term = 1;
		for(int i = 0; i < cfs.length; i++)
		{
			retval += term * cfs[i];
			term *= x;
		}

		return retval;
	}

	public double[] GetFullCoeficients()
	{
		double[] retval = new double[this.coefs.length];

		for(int i = 0; i < retval.length; i++)
		{
			retval[i] = 0.0;
			for(int j = i; j < this.polis.size(); j++)
			{
				retval[i] += this.polis.get(j).coefs[i];
			}
		}

		return retval;
	}

	private double[] GetNextPoly(int i)
	{
		double[] retval = new double[i + 1];
		double[] coef_1 = this.polis.elementAt(i - 1).getCoefs();
		double[] coef_2 = this.polis.elementAt(i - 2).getCoefs();

		for(int j = 0; j < i + 1; j++)
		{
			retval[j] = 0;
		}

		for(int j = 0; j < i - 1; j++)
		{
			retval[j] += -coef_2[j];
		}

		for(int j = 1; j < i + 1; j++)
		{
			retval[j] += 2 * coef_1[j - 1];
		}

		return retval;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy