> restart: # Bedingte Schleifen, kopfgesteuert # Beispiel: Quadratwurzelziehen mit der babylonischen Methode # Ausgehend von einem Schaetzwert werden die Naeherungen der # Wurzel immer wieder verbessert, bis der Fehler kleiner # als die gewaehlte Toleranz ausfaellt. Ein solches Vorgehen, # bei dem die Anzahl der Durchlaeufe der Schleife von vornherein nicht # bekannt ist, heisst Iterationsverfahren. # Im vorliegenden Fall handelt es sich um nichts anderes als das # Newton'sche Verfahren zur Ermittlung einer Nullstelle des # Funktionsausdrucks x^2-a. > a:=64; # Zahl deren Quadratwurzel berechnet werden soll > x:=1; # Anfangsschaetzung der Wurzel (Initialisierung der Iteration) > while abs(x^2-a)>1.0E-7 do > x:=0.5*(x+a/x) > end do; # > a:=5; > x:=1; > while abs(x^2-a)>1.0E-7 do > x:=0.5*(x+a/x) > end do: > x; > sqrt(5.0); # Zum Vergleich # > sqrt(-5.0); # Das Ergebnis ist eine rein imaginaere Zahl. Wenn wir wieder mit der # Schaetzung x=1 beginnen, dann liefert die Iterationsschleife bei jedem # Durchlauf einen reellen Wert, so dass die Iteration unmoeglich zum Ziel # fuehren kann. Wir wuerden also eine Endlosschleife erhalten (boeser Programmierfehler!) # Diese laesst sich durch Kombination der bedingten Schleife mit einer # Zaehlschleife vermeiden. # > a:=-5; > x:=1; > to 20 while abs(x^2-a)>1.0E-7 do > x:=0.5*(x+a/x) > end do: > x; # Dieses Vorgehen ist noch nicht befriedigend, weil wir nicht erkennen, ob # das richtige Ergebnis errechnet oder die Iteration lediglich abgebrochen wurde. # Das klaeren wir durch folgenden nachgeschalteten Befehl: > if abs(x^2-a)>1.0E-7 then > print("Keine Konvergenz") > else > print("x=",x) > end if: # Wir testen auch noch einmal den Erfolgsfall: > a:=5; > x:=1; > to 20 while abs(x^2-a)>1.0E-7 do > x:=0.5*(x+a/x) > end do: > if abs(x^2-a)>1.0E-7 then > print("Keine Konvergenz") > else > print("x=",x) > end if: # Wem diese Ausgabe graphisch nicht gefaellt, der kann sie wie folgt verbessern: > x_str:=convert(x,string): print(cat("x=",x_str));