Heron-Verfahren

ekago

Mitglied
könnt ihr mir wenigstens bei Algorithmus helfen ??

Das Heron-Verfahren ist eine iterative Methode zur Berechnung der Quadratwurzel einer Zahl a. Sie
funktioniert wie folgt:
Wähle x0=(a+1)/2

2. Solange die gewünschte Genauigkeit noch nicht erreicht ist, berechne
x[SUB]n+1[/SUB]=(x[SUB]n[/SUB]+a/x[SUB]n[/SUB])/2

Die Genauigkeit kann bestimmt werden, indem man den Fehlerwert ã=∣a−xn berechnet.
Tipp: Der Betrag einer Zahl kann mit Math.abs() berechnet werden.
Schreiben Sie ein Programm, das die Wurzel einer einzulesenden Zahl mit einem Fehler von max.
1e-9 berechnet und ausgibt.
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Wieso wenigstens?

Klar können wir aber du sagtest es bereits. HELFEN werden wir dir. Ansonsten musst du in der Jobbörse gucken.
 

ekago

Mitglied
ich weiß jetzt nicht was ich mit der antwort anfangen soll
ich frag ja schon nach dem algorithmus dass ich das programm selber versuchen kann zu schreiben
aber ich weiß ja nicht mal wie ich anfangen soll
 

Gucky

Top Contributor
Die Antwort sollte ausdrücken, dass wir dir keinen fertigen Code liefern werden, ohne das wir sehen können, dass du immerhin etwas versucht hast.

Fang mal mit Google an. Dann wirst du relativ schnell auf Wikipedia weitergeleitet werden und dort müsste des Rätsels Lösung stehen.

Ein Tipp: Rekursiv ist das ganze sehr leicht zu programmieren. Du musst nur bei mehr Durchläufen darauf achten, das dein Speicher nicht überläuft.
 

Flown

Administrator
Mitarbeiter
Die Genauigkeit kann bestimmt werden, indem man den Fehlerwert ã=∣a−xn berechnet.
Tipp: Der Betrag einer Zahl kann mit Math.abs() berechnet werden.
Schreiben Sie ein Programm, das die Wurzel einer einzulesenden Zahl mit einem Fehler von max.
1e-9 berechnet und ausgibt.

Vor allem was ist das "la" bei dem Fehlerwert?
 
Zuletzt bearbeitet:

ekago

Mitglied
danke für eure bemühungen aber ich kann das einfach nicht alleine. ich hab tausend fragen
sowohl mathematisch als auch aus programmier-sicht und überhaupt keinen ansatz oder ideen.
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Heron-Verfahren: Algorithmus

2829e7f2d14281ca1b3fa8268c1c602c.png


wobei:
98a6bf7b655e867c8a134b153773e060.png


Schritt 2) Programmieren

Du machst die Schritte so lange wie (xn^k - a)/a < 1e-9 (wow: ist schon ne Schleifen-/Rekursionabbruchbedingung)

Und jetzt mach!
 

ekago

Mitglied
also ich wähle jetzt einfach eine wurzel zahl? bsp wurzel12
und noch 2 seitenlängen?

und wie soll ich das verstehen wenn es heißt der betrag einer zahl kann mit math.abs berechnet werden
math.abs zeigt doch einfach alle zahlen ob positiv oder negativ positiv an..
was auch schon wenig sinn für mich macht... wenn ich eine positive zahl ausgegeben haben möchte dann gebe ich sie doch auch positiv ein ;(
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Wie kommst du jetzt von Wurzeln und Heron auf Beträge?
Dein Beitrag ergibt überhaupt keinen Sinn in diesem Zusammenhang.

Wenn du eine Zahl positiv haben willst, gibst du sie auch positiv ein. HÄ???????!!!!
 

ekago

Mitglied
Also so weit bin ich mal gekommen dass ich x1 und y1 habe
jetzt muss ich doch eine while schleife machen oder ? bis die bedingung 1e-9 erfüllt ist oder? wie mach ich das?

Java:
	public static void main(String[] args) {
		
System.out.println("Geben Sie die zu berechnende Zahl ein");
		int a= new Scanner(System.in).nextInt();
		float x=1;
		float y=a/x;
		
		
		float x1=(x+y)/2;
		float y1=a/x1;
		
		System.out.println(x1);
		System.out.println(y1);
		
	}

}


irgendwie sowas noch rein?
Java:
 while (x1 && y1 < 1e-9)
:bahnhof:
 
Zuletzt bearbeitet:

ekago

Mitglied
Java:
	public static void main(String[] args) {
		
		// Einlesen der Zahl x, für die Wurzel berechnet werden soll			
		System.out.println("Geben Sie die zu berechnende Zahl ein");
		double a= new Scanner(System.in).nextInt();
		
		double max=1e-9;
		
		// xn ist das gleiche wie x für n=0;
		double xn=a;
		double xn1;
		double n=1;
		
		//Führe solange aus bis max erreicht
		do {
			xn1= (xn+a/n)/2;
			System.out.println("x(" + n++ + ") = " + xn1);
			xn=xn1;
		}
		// max prüfen
		while (Math.pow(xn1,2) - a > max);
		System.out.println("Ergebnis = " + xn1);
	
		
	}

}

so müsste es doch passen oder???:oops:

eine frage habe ich trotzdem noch was bedeutet das 1e-9?
 

Tobse

Top Contributor
So wie es da steht: 1E-9 :)

Java:
System.out.println(1E-3);
// 0.001

System.out.println(1E-9);
// 1.0E-9
 

Gucky

Top Contributor
Weißt du...wir helfen dir wirklich gern aber bei solchen Fragen denken wir uns einfach "Kann er nicht nachdenken?"
Was meinst du denn, was das heißen könnte?
 
Zuletzt bearbeitet:

ekago

Mitglied
Ich hab schon geschrieben was ich denke. Und wenn ich im Ansatz etwas wusste dann würde ich es ausprobieren. Und ich schreib nicht hier rein wenn ich nicht davor im Internet geschaut hätte. Und dass man da so dämlich hin gestellt wird das muss ich bei meinem Professor schon aushalten.
 

Tobse

Top Contributor
Also mal ganz im Ernst... mein Codebeispiel ist doch super mega eindeutig?!
Java:
System.out.println(1E-3);
// 0.001

System.out.println(1E-9);
// 1.0E-9

Und, nochmal, wenn etwas nciht funktioniert und du nur sagst "das tut nicht" dann muss ich meine Glaskugel benutzen um das Problem zu sehen; die ist aber leider grade Kaputt. Also wenn es ein Problem gibt, sag uns bitte WAS das Problem ist: Ein Kompilerfehler, eine Falsche Ausgabe zusammen mit der Richtigen Ausgabe, ...

Aber bevor sich hier jeder den Mund fusselig redet hilft dir vllt etwas gute Lektüre weiter:
Galileo Computing :: Java ist auch eine Insel - index
Oder als Hardware:
Java von Kopf bis Fuß: Amazon.de: Kathy Sierra, Bert Bates: Bücher
Java ist auch eine Insel: Insel 1: Das umfassende Handbuch Galileo Computing: Amazon.de: Christian Ullenboom: Bücher
 

Gucky

Top Contributor
Wikipedia hat gesagt.:
Wenn keine hochgestellten Ziffern zur Verfügung stehen, wird die folgende Schreibweise genutzt: aus 1·1018 wird 1 E18. Die Zahl 3200 z. B. kann somit auch 3,200 E3 notiert werden.

Das e oder E steht für "mal zehn hoch". Also wäre 1e-9 "eins mal zehn hoch minus neun".


Steht alles in dem Artikel, dessen Link Flown gepostet hat.
 

Andi_CH

Top Contributor
Nein - die Lösung kommt nicht so direkt, aber ....

Der Eine findet jetzt vielleicht raus, warum mal nach dem Absolutwert geragt wurde und der Andere kann sich vielleicht einige Ideen rausholen um das Ganze als Iteration zu programmieren :) .

Tja - verblüffend, dass 4 Rekursionsstufen reichen. Das hätte ich nicht erwartet, aber ich bin ja auch kein Mathematiker

Java:
public class Heron {

	static final double tolerance = 1e-9;
	static int maxDeep = 0;
	
	public static double f(double value, double candiate) {
		System.out.printf("Zahl = %f, Wurzel = %f\n", value, candiate);
		maxDeep += 1;
		if (Math.abs(candiate*candiate-value) < tolerance) {
			return candiate;
		} else {
			double xn = (candiate + value/candiate) / 2;
			return f (value, xn);
		}
	}

	public static void main(String[] args) {
		double value = 2;
		double x0 = (value + 1) / 2.0;
		double res = f(value, x0);
		System.out.printf("Wurzel = %2.15f\n", res);
		System.out.printf("Wurzel ^2 = %2.15f\n", res * res);
		System.out.printf("Maximale Tiefe %d \n", maxDeep);
	}
}

//Zahl = 2.000000, Wurzel = 1.500000
//Zahl = 2.000000, Wurzel = 1.416667
//Zahl = 2.000000, Wurzel = 1.414216
//Zahl = 2.000000, Wurzel = 1.414214
//Wurzel = 1.414213562374690
//Wurzel ^2 = 2.000000000004511
//Maximale Tiefe 4
 
Zuletzt bearbeitet:

Neue Themen


Oben