# Polynom mit Newtonverfahren



## madman (21. Jun 2011)

Hey Leute, ich häng schon wieder fest 

Mein Prob: liegt in der Methode getNewton. Ich soll das Newtonverfahren anwenden und das heißt hier in dem Fall: 

Funktion / Erste Ableitung
f(x)/ f '(x)
den Wert für f(x) bekomme ich raus.. blos die Division gelingt mir nicht
das f(x) ist vom Typ double und das f '(x) ist vom Typ Polynom




```
package Projekt;

public class Polynom
{

	private double koeffizienten[] = { 0.0 }; // Null-Polynom

	public Polynom(double[] koeffizienten)
	{
		this.koeffizienten = koeffizienten;
	}

	private Polynom polynom;

	public Polynom getDerivative()
	{
		Polynom ableitung = null;

		if (getDegree() > 0) {
			double[] koeffizientenDerAbleitung = new double[koeffizienten.length - 1];
			for (int i = 1; i < koeffizienten.length; i++) {
				koeffizientenDerAbleitung[i - 1] = koeffizienten[i] * i;
			}
			ableitung = new Polynom(koeffizientenDerAbleitung);
		} else {
			ableitung = new Polynom();
		}

		return ableitung;
	}

	public Polynom()
	{
	}

	public double getValue(double x)
	{
		double funktionsWert = 0.0;

		for (int i = getDegree(); i >= 0; i--) {
			funktionsWert *= x;
			funktionsWert += getKoeffizient(i);
		}

		return funktionsWert;
	}

	public int getDegree()
	{
		return this.koeffizienten.length - 1;

	}

	public double getKoeffizient(int stelle)
	{
		return koeffizienten[stelle];
	}

	public double getNewton(double start, double precision, int iterations)
	{
		double start2 = 0;
		start = start2;

		start2 = start - polynom.getValue(start)
				/ getDerivative().getValue(start);

		return start2;
	}

	@Override
	public String toString()
	{

		System.out.print("f(x)=");
		if (getDegree() < 0)
			System.out.println("ERROR: Grad negativ!");
		if (getDegree() == 0)
			System.out.println(koeffizienten[0]);
		if (getDegree() > 0) {
			System.out.print(koeffizienten[getDegree()]);
			if (getDegree() > 1) {
				System.out.print("*x^");
				System.out.print(getDegree());
			} else
				System.out.print("x");
			for (int i = getDegree() - 1; i >= 0; i--) {
				if (koeffizienten[i] > 0)
					System.out.print(" +");
				if (koeffizienten[i] < 0)
					System.out.print(" ");
				if (koeffizienten[i] != 0) {
					System.out.print(koeffizienten[i]);
					if (i > 1) {
						System.out.print("*x^");
						System.out.print(i);
					} else if (i == 1)
						System.out.print("x");
				}
			}

		}

		return "";
	}


public static void main(String[] args)
{
	double x = 2;	
	double[] test1 = { -5 , -4.0 , -3.0 , -2.0, 10.0};
	Polynom poly1 = new Polynom(test1);

	System.out.println("Polynom " + poly1.getDegree() + ". Grades");
	System.out.println(poly1);
	
	System.out.println("_____________________");
	System.out.println("Ableitung:");
	System.out.println(poly1.getDerivative());
	System.out.println("_____________________");
	System.out.println("Funktionswert an der Stelle: "+x+" beträgt:   \n"+ "f("+x+")="+poly1.getValue(x));
	System.out.println("_____________________");
	System.out.println("Newton-Verfahren für Nullstellen");
	System.out.println(poly1.getNewton(1.0, 1.0, 1));



	System.out.println();
	
}
}
```


----------



## madman (21. Jun 2011)

wie bekomm ich das hin ??..

wie bekomm ich die Division hin ???

(ach .. die Parameter in der Methode sind Abbruchkriterien.. das sollte kein Hindernis für mich sein, daher nicht weiter zu beachten)

Danke schon mal im Voraus


----------



## Landei (22. Jun 2011)

Du wirfst hier etwas durcheinander. Erst einmal ist y=f(x) ein Polynom, sagen wir y = x². Davon kann man eine Ableitung y = f'(x) bilden, hier y = 2x. Das Newton-Verfahren startet nun an ein bestimmtes x, sagen wir x0, und berechnet x1 = x0 - f(x0)/f'(x0), x2 = x1 - f(x1)/f'(x1) u.s.w., bis sich der Wert nicht mehr ändert. Du setzt also den aktuellen Nährungswert sowohl in das Polynom *wie auch in dessen Ableitung* ein, und dividierst die beiden resultierenden [c]double[/c]-Werte.

Angenommen, wir starten bei x0 = 1.
Dann ist x1 = 1-f(1)/f'(1) = 1-1²/(2*1) = 1 - 0.5 = 0.5. 
Dann ist x2 = 0.5 - 0.5²/(2*0.5) = 0.5 - 0.25 = 0.25. u.s.w. 

Wie du siehst nährt sich das Verfahren wie erwartet der Nullstelle x = 0 von y = x².


----------



## madman (22. Jun 2011)

```
...

	public double getRoot(double start, double precision, int iterations)
	{
		double start2 = start;
		
		start2 = start - getValue(start)
				/ getDerivative().getValue(start);
		return start2;
	}
```

mein getValue(start)  gibt ein Double , blos die getDerivative gibt ein Polynom zurück -.- ..
und das kann ich ja nicht dividieren.. das ist ja das prob..weil die schleife drumrum bekomm ich schon hin..blos die division .. wie bekomm ich getDerivative() als Double ??

verstehst du was ich meine??


----------



## Landei (22. Jun 2011)

Aber [c]getDerivative().getValue(start);[/c] sollte doch auch einen [c]double[/c] zurückliefern, wo genau ist das Problem? 

Der Punkt bindet natürlich stärker als ein [c]/[/c], also wird [c]a/b.c[/c] als  [c]a/(b.c) [/c] aufgefasst, *nicht* als [c](a/b).c[/c].


----------



## madman (22. Jun 2011)

Landei hat gesagt.:


> Aber [c]getDerivative().getValue(start);[/c] sollte doch auch einen [c]double[/c] zurückliefern, wo genau ist das Problem?
> 
> Der Punkt bindet natürlich stärker als ein [c]/[/c], also wird [c]a/b.c[/c] als  [c]a/(b.c) [/c] aufgefasst, *nicht* als [c](a/b).c[/c].




ich habs.. die lösung kam irgendwie von selbst .. weiss nicht.. hab rein gar nix gemacht am morgen gings .. hab jetzt die schleife drum gebastelt und gut ist ^^

thx nochma


package Projekt;

public class Polynom
{

	private double koeffizienten[] = { 0.0 }; // Null-Polynom

	public Polynom(double[] koeffizienten)
	{
		this.koeffizienten = koeffizienten;
	}

	private Polynom polynom;

	private static double fprime(double x)
	{
		return Math.cos(x);
	}

	private double f(double x)
	{
		return Math.sin(x);
	}

	public Polynom getDerivative()
	{
		Polynom ableitung = null;

		if (getDegree() > 0) {
			double[] koeffizientenDerAbleitung = new double[koeffizienten.length - 1];
			for (int i = 1; i < koeffizienten.length; i++) {
				koeffizientenDerAbleitung[i - 1] = koeffizienten_ * i;
			}
			ableitung = new Polynom(koeffizientenDerAbleitung);
		} else {
			ableitung = new Polynom();
		}

		return ableitung;
	}

	public Polynom()
	{
	}

	public double getValue(double x)
	{
		double funktionsWert = 0.0;

		for (int i = getDegree(); i >= 0; i--) {
			funktionsWert *= x;
			funktionsWert += getKoeffizient(i);
		}

		return funktionsWert;
	}

	public int getDegree()
	{
		return this.koeffizienten.length - 1;

	}

	public double getKoeffizient(int stelle)
	{
		return koeffizienten[stelle];
	}

	public double getRoot(double start, double precision, int iterations)
	{
		Polynom ableitung = getDerivative();

		//
		int i =1;  
		do {
			i++;
			start = start - getValue(start) / ableitung.getValue(start);
			System.out.println(i-1+": "+start);
		} while ((Math.abs(getValue(start)) > precision)&&i<=iterations);
		return start;

	}

	@Override
	public String toString()
	{

		System.out.print("f(x)=");
		if (getDegree() < 0)
			System.out.println("ERROR: Grad negativ!");
		if (getDegree() == 0)
			System.out.println(koeffizienten[0]);
		if (getDegree() > 0) {
			System.out.print(koeffizienten[getDegree()]);
			if (getDegree() > 1) {
				System.out.print("*x^");
				System.out.print(getDegree());
			} else
				System.out.print("x");
			for (int i = getDegree() - 1; i >= 0; i--) {
				if (koeffizienten > 0)
					System.out.print(" +");
				if (koeffizienten < 0)
					System.out.print(" ");
				if (koeffizienten != 0) {
					System.out.print(koeffizienten);
					if (i > 1) {
						System.out.print("*x^");
						System.out.print(i);
					} else if (i == 1)
						System.out.print("x");
				}
			}

		}

		return "";
	}

	public static void main(String[] args)
	{
		double x = 2;
		double[] test1 = {-40.0, -20.0, -15.0, 65.0 };
		Polynom poly1 = new Polynom(test1);

		System.out.println("Polynom " + poly1.getDegree() + ". Grades");
		System.out.println(poly1);

		System.out.println("_____________________");
		System.out.println("Ableitung:");
		System.out.println(poly1.getDerivative());
		System.out.println("_____________________");
		System.out.println("Funktionswert an der Stelle: " + x
				+ " beträgt:   \n" + "f(" + x + ")=" + poly1.getValue(x));
		System.out.println("_____________________");
		System.out.println("Newton-Verfahren f(x)/ f '(x)");
		System.out.println(poly1.getRoot(1.0, 0.000001, 2));

		System.out.println();

	}
}_


----------



## Landei (22. Jun 2011)

[JAVA] Tags!!!


----------

