Bisektion

Die Bisektion ist ein iteratives Verfahren zur näherungsweisen Bestimmung einer Nullstelle einer Funktion. Damit hat es den gleichen Zweck wie die Regula Falsi und das Newton-Verfahren.

Das Verfahren benötigt als Eingabe ein Intervall, das die Nullstelle einschließt - die Funktion hat für die beiden Intervallgrenzen nicht das gleiche Vorzeichen. Mit jedem Schritt wird die Länge des Intervalls halbiert. Die Mitte des Intervalls und der dortige Funktionswert werden berechnet, dann ersetzt die Mitte dasjenige Ende des Intervalls, für das der Funktionswert das gleiche Vorzeichen hat.

(defproc bisection-iteration (f x1 f1 x2 f2 delta)
  (let
    ((m (/ (+ x1 x2) 2)))
    (if
      (< (abs (- x1 x2)) delta)
      m
      (let
        ((fm (f m)))
        (if
          (opposite-sign? f1 fm)
          (bisection-iteration f x1 f1 m fm delta)
          (bisection-iteration f m fm x2 f2 delta))))))

(defproc bisection (f x1 x2 delta)
  (let
    ((f1 (f x1))
     (f2 (f x2)))
    (if
      (opposite-sign? f1 f2)
      (approximate (bisection-iteration f x1 f1 x2 f2 delta) delta)
      (throw (quote error) "zero not within interval in bisection"))))

Die Hilfsfunktion opposite-sign? prüft, ob zwei Zahlen unterschiedliche Vorzeichen haben.


bisection.sheet.xml