Autor |
Beitrag |
xilos
      
Beiträge: 59
|
Verfasst: 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.
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; a,b,i :real; begin zahl := strtoint(E_a.text); a := zahl; b := strtofloat(E_b.text); i := 0; repeat a := (a+b)/2; b := zahl/a; i := i+1; M_Ausgabefeld.lines.add(floattostr(a)); until i=10; 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 Christian S.: Topic aus VCL (Visual Component Library) verschoben am So 22.04.2007 um 13:56
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Sa 21.04.07 22:24
Ich hab mal deine Prozedur ein bisschen 'verbessert', d.h. so wie ich sie schreiben würde.
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; a, a2, b: Double; begin zahl := StrToInt(E_a.Text); a := zahl; b := StrToFloat(E_b.Text); repeat a2 := a; b := zahl / a; a := (a + b) / 2; M_Ausgabefeld.Lines.Add(FloatToStr(a)); until a = a2; 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 22.04.07 14:47
BenBE 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 
      
Beiträge: 59
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 59
|
Verfasst: So 22.04.07 20:28
okay...und das ganze jetzt noch mal für nicht mathestudenten xD
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: So 22.04.07 20:36
Ist doch egal was der Code macht, Hauptsache du bekommst ne gute Note.
Ehrlich gesagt, ich habs auch ned kapiert was die labern 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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
|
|
|