public class Aitken
{
	final static double tol = 0.1;

	public static void main (String[] args)
	{
		double [] koef = {-2,0,4,1};
		Polynom p1 = new Polynom(koef);

		double xi = FindPiStart(p1);
		double xI = xi - tol - 1;

		int counter = 0;

		while (Math.abs(xi-xI) > tol)
		{
			xi = xI;
			xI = xi - (p1.calcFunc(xi)/p1.calcSteigung(xi));
			System.out.println(counter + "   " + xI);
			counter++;
		}
		System.out.println ("Nullstelle: x="+xI);
	}

	public static double FindPiStart (Polynom p1) //Startpunkt suchen
	{
		double xStart = 0;
		while (Math.abs(p1.calcSteigung(xStart))<1.0)		//Steigung am Startpunkt muss grösser 1 sein
		{
			xStart = xStart + 0.1;							//Startpunkt wird um 0.1 nach rechts verlegt
		}
		System.out.println("Startpunkt: x="+xStart);
		return xStart;
	}
}

class Polynom
{
	double [] koef;
	final double dx = 0.01;

	Polynom( double [] _koef)
	{
		koef = _koef;
	}

	public double calcSteigung ( double x)
	{
		return (calcFunc (x+dx) - calcFunc (x))/ dx;
	}

	public double calcFunc (double x)
	{
		double y = 0;

		for (int i=0; i<koef.length; i++)
		{
			y = y + Math.pow(x,i) * koef[i];
		}

		return y;
	}

}

class AitkenFunction
{
	// 3 Schritte müssen vorhanden sein!
	double pn, pn1, pn2;



	public double calcAitken ( double x)
	{
		double pNew = pn - (pn1-pn)*(pn1-pn) / (pn2-2*pn1+pn);


		return pNew;
	}
}
