Polynom mit Newtonverfahren

madman

Mitglied
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



Java:
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

Mitglied
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

Top Contributor
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².
 
Zuletzt bearbeitet:

madman

Mitglied
Java:
...

	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

Top Contributor
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].
 
Zuletzt bearbeitet:

madman

Mitglied
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 :D.. 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();

}
}
 

Neue Themen


Oben