# Heron-Verfahren



## ekago (15. Dez 2014)

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̃=∣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.


----------



## Gucky (15. Dez 2014)

Wieso wenigstens?

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


----------



## ekago (16. Dez 2014)

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 (16. Dez 2014)

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 (16. Dez 2014)

ekago hat gesagt.:


> Die Genauigkeit kann bestimmt werden, indem man den Fehlerwert ã=∣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?


----------



## Varthor (16. Dez 2014)

Flown hat gesagt.:


> Vor allem was ist das "la" bei dem Fehlerwert?




Vermutlich der "Anfang" vom Betrag a-xn  ?


----------



## ekago (16. Dez 2014)

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.


----------



## Flown (16. Dez 2014)

Heron-Verfahren: Algorithmus







wobei: 
	

	
	
		
		

		
		
	


	




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 (16. Dez 2014)

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 ;(


----------



## Gucky (16. Dez 2014)

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 (17. Dez 2014)

das steht als tipp in der aufgabenstellung drin


----------



## ekago (17. Dez 2014)

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?


```
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?  
	
	
	
	





```
while (x1 && y1 < 1e-9)
```
  :bahnhof:


----------



## ekago (17. Dez 2014)

```
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???

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


----------



## Flown (17. Dez 2014)

Kommt das richtige Ergebnis raus?

1e-9 siehe HIER


----------



## ekago (17. Dez 2014)

ja ich hab schon selber auch auf wikipedia geschaut
heißt das dann 10^18-9 oder wie


----------



## Tobse (17. Dez 2014)

Nein, 1E-9 = 0.000000001.

Ob es funktioniert? Keine Ahnung, stimmt denn das Ergebnis? (Bspw. für 9 oder 16)?


----------



## ekago (17. Dez 2014)

nein stimmt nicht 
ich weiß nicht wie ich ds 1e-9 reinschreiben muss


----------



## Tobse (17. Dez 2014)

So wie es da steht: 1E-9 


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

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


----------



## ekago (17. Dez 2014)

nein ich meine hier 
	
	
	
	





```
double max=1e-9;
```


----------



## Gucky (17. Dez 2014)

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?


----------



## ekago (17. Dez 2014)

Ok vergiss es


----------



## ekago (18. Dez 2014)

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 (18. Dez 2014)

Also mal ganz im Ernst... mein Codebeispiel ist doch super mega eindeutig?!


Tobse hat gesagt.:


> ```
> System.out.println(1E-3);
> // 0.001
> 
> ...



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


----------



## ekago (18. Dez 2014)

Also mein Problem ist dass ich nicht weiß was das e zum Beispiel in 1e-9 überhaupt bedeutet


----------



## Gucky (19. Dez 2014)

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 (19. Dez 2014)

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


```
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
```


----------

