Autor Beitrag
xilos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: Sa 21.04.07 21:42 
Hi,
ich habe ein Problem! Ich soll ein Program schreiben, das mir mit dem Heron Verfahren zur Wurzelberechnung die Quadratwurzel einer Zahl ausrechnen soll. Mann soll die Zahl, aus der die Wurzel gezogen wird und den Startwert eingeben sollen. Das Ergebnis soll in einem Memo Feld ausführlich ausgegeben werden. Und der Quellcode soll von mir verständlich kommentiert werden. Ich habe angefangen einen Teil des Quellcodes zu schreiben jedoch wird irgendwie nur die Quadratwurzel mit dem Startwert "1" richtig berechnet, der Rest falsch.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.B_BerechnenClick(Sender: TObject);
var zahl: integer;                  //Variablen setzten
    a,b,i :real;                    //Variablen setzten
begin                               //Variablen definieren
  zahl := strtoint(E_a.text);       //Variable "zahl" wird aus dem E_a-Textfeld entnommen
  a    := zahl;                     //Variable "a" wird gleich "zahl" gesetzt
  b    := strtofloat(E_b.text);     //Variable "b" wird aus dem E_b-Textfeld entnommen
  i    := 0;                        //Variable "i" wird gleich "0" gesetzt
repeat                              //Anfang der Repeat-Schleife
  a    := (a+b)/2;                  //???Fehler hier???
  b    := zahl/a;                   //???Fehler hier???
  i    := i+1;                      //Erhöhung der Variablen um "1"
  M_Ausgabefeld.lines.add(floattostr(a)); //Ausgabe der Ergebnis-Schritte im Memofeld
  until i=10;                       //Ende der Repeat-Schleife nach "10" Wiederholungen
end;


Der zweite Teil der Aufgabe ist, sich für eine bestimmten Schleifentyp zu entscheiden und dies zu begründen. Da ich da keinen großen Unterschied sehe habe ich mich einfach für RepeatUntil entschieden, gibt es eine bessere Variante oder welchen Typ hättet ihr gewählt.

Vielen Dank schon mal im Vorraus.


Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am So 22.04.2007 um 13:56
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Sa 21.04.07 22:24 
Ich hab mal deine Prozedur ein bisschen 'verbessert', d.h. so wie ich sie schreiben würde.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.B_BerechnenClick(Sender: TObject);  
var 
  zahl: Integer;                            // Variablen deklarieren 
  a, a2, b: Double;                   
begin                                
  zahl := StrToInt(E_a.Text);               // Variable "zahl" wird aus dem E_a-Textfeld entnommen  
  a := zahl;                                // Variable "a" wird gleich "zahl" gesetzt  
  b := StrToFloat(E_b.Text);                // Variable "b" wird aus dem E_b-Textfeld entnommen  
  repeat                     
    a2 := a;                                // Das alte "a" wird in "a2" gesichert
    b := zahl / a;                         
    a := (a + b) / 2;                          
    M_Ausgabefeld.Lines.Add(FloatToStr(a)); // Ausgabe der Ergebnis im Memofeld  
  until a = a2;                             // Wenn sich der Wert nicht mehr geändert hat, Schleife verlassen 
end;

Die Zuweisungen von a und b hab ich vertauscht, die End-Bedingung verbessert (sobald sich der Wert nicht mehr ändert, wird die Schleife verlassen), den Datentyp von Real auf Double umgestellt (Real ist veraltet, nimm lieber Single oder Double oder Extended), und den Quelltext schön formatiert. :)
Habs nicht ausprobiert, sollte aber funktionieren.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 22.04.07 13:19 

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 22.04.07 14:27 
BenBE: Ich denke in diesem Fall ist es okay. Hier wir ja nicht mit einer Zahl verglichen sondern mit dem vorhergehenden Resultat. Entweder gibt es eine Verbesserung des Resultats, dann können wir auch weiterrechnen, oder es ist bei der Rechengenauigkeit keine Verbesserung mehr möglich, dann bricht das Verfahren ab.

Durch die Mittelung denke ich, dass eine Iteration das Ergebnis nie verschlechtert, sondern nur entweder verbessert oder gleich lässt. Und da die Folge monoton und beschränkt ist muss sie irgendwann konvergieren; und das tut sie ja sogar quadratisch (kommt ja vom Newtonverfahren).

Der sture Vergleich mit eps (wie bei Luckie) ist bei numerischen Verfahren übrigens keine gute Idee (nichts gegen Luckie ;) er schreibt's ja selbst). Denn eps ist die Differenz zwischen 1 und der nächsthöheren Zahl. Ab 2 sind die Fliesskommazahlen halb so tief gesampelt (d.h. 1+eps<>1 aber 2+eps=2). Also: Wenn man mit eps operiert dann mit relativen Grössen. Häufig lässt sich das Abbruchkriterium auch umschreiben, sodass keine explizite Verwendung von eps mehr nötig ist.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 22.04.07 14:34 
Warum ich den Link hier genannt hab hat damit zu tun, dass das Ergebnis im schlechtesten Fall periodisch zwischen zwei in der Epsilon-Umgebung benachbarten Punkten schwanken kann, was beim Heron-Verfahren zwar sehr unwahrscheinlich, bei der Rechengenauigkeit von Pentium-CPUs aber auch nicht ganz unmöglich ist ;-) Außerdem war's ja auch nur ein Hinweis, dass man u.U. bitte das interne Zahlenformat beachten sollte, statt blind drauf los zu rechnen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 22.04.07 14:47 
user profile iconBenBE hat folgendes geschrieben:
im schlechtesten Fall periodisch zwischen zwei in der Epsilon-Umgebung benachbarten Punkten schwanken kann

Naja, wie gesagt ging ich davon aus, dass sich durch die Mittelung und der Tatsache der quadratischen Konvergenz das Resultat sich nie verschlechtert.

Besser wäre hier vermutlich auf eine strikt monoton abfallende Lösung zu testen und abzubrechen, fall dies nicht mehr der Fall ist. (Bei num. Verfahren kann man sowas häufig mit dem Absolutwert des Residuums anstellen. Man sollte jedoch sicherstellen, dass die Konvergenz einigermassen schnell ist, um eine fast-endlos-Schleife zu verhindern (viele Algorithmen bauen eine maximale Anzahl Iterationen ein)...)
xilos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: So 22.04.07 20:17 
also das klappt soweit eigentlich schon ganz gut, jedoch berechnet er die wurzel der zahl immer nur mit dem startwert "1".
hat einer von euch eine idee warum das so ist?

dankeschön jetzt schon mal
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 22.04.07 20:20 
Weil das Heron-Verfahren die Fläche des mit A und B eingeschlossenen Rechtecks angibt und dabei eine Quadratur versucht ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
xilos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 59



BeitragVerfasst: So 22.04.07 20:28 
okay...und das ganze jetzt noch mal für nicht mathestudenten xD
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: So 22.04.07 20:36 
Ist doch egal was der Code macht, Hauptsache du bekommst ne gute Note. :mrgreen:
Ehrlich gesagt, ich habs auch ned kapiert was die labern ;)
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 22.04.07 21:15 
Naja, kurz zur Erklärung: Hab mich nur mit Delfiphan über ein theoretisches Problem unterhalten, was mit der Abbruchbedingung zu bedenken wäre (ausgelagert in PN-Diskussion) und ansonsten halt kurz erklärt, was der Algo macht: Der Algo versucht von einem Rechteck mit einer gegebenen Fläche (von N Einheiten) ein Quadrat zu bilden, was genau die gleiche Fläche besitzt. Die Seitenlänge dieses Quadrates ist die Wurzel von N, da ja die Fläche eines Quadrates als A = a^2 definiert ist, was umgestellt nach der Seitenlänge a = sqrt(A) ergibt. Eben das, was Du versuchst mit dem Heronverfahren rauszubekommen ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: So 22.04.07 22:07 
Zitat:
den Datentyp von Real auf Double umgestellt (Real ist veraltet, nimm lieber Single oder Double oder Extended)

Ab D7 (ev. schon vorher) nimmt Delphi von alleine beim Compilieren den Typ Double, wenn Real dasteht.
Wenn sich die Programmierer nicht ändern, dann ändert man eben den Compiler ;-)

ub60