6. Der MATLAB-Editor/Debugger

M-Files können mit irgend einem Editor bearbeitet werden. Einige können aber Programmstrukturen (Schleifen, Text, Kommentar) anzeigen und damit schon beim Eintippen helfen, Syntax-Fehler zu vermeiden. Der MATLAB-Editor kann aber bequemer im Zusammenspiel mit dem MATLAB-Debugger gebraucht werden. Wir wollen dies an dem einfachen Beispiel der Berechnung der Wurzel einer positiven Zahl zeigen, vgl. Übungsaufgabe in Abschnitt 5.3.6. Die Newton-Iteration zur Berechnung von $ \sqrt{a}$, $ a>0$, d.h. zur Berechnung der positiven Nullstelle von $ f(x)=x^2-a$,

$\displaystyle x_{k+1} = \frac{1}{2} \left( x_k + \frac{a}{x_k} \right)
$

soll mit dem Wert $ x_0 = 1$ gestartet werden. Eine erste Implementation könnte folgendermassen aussehen.
    function [x] = wurzel(a);
    %WURZEL  x = wurzel(a) berechnet die Quadratwurzel von a
    %        mit dem Newtonverfahren

    x = 1;
    while x^2 - a ~= 0,
        x = (x + a/x)/2;
    end
Diese Funktion kommt aber im allgemeinen nicht zurück, d.h., die Abbruchbedingung der while-Schleife wird nie erfüllt.

Um herauszufinden, wo das Problem liegt untersuchen wir die Werte, die die Variable x in der while-Schleife annimmt. Wir benützen die Möglichkeit, in MATLAB sog. Break points zu setzen. Im MATLAB-Editor kann man auf das Minus-Zeichen vor Zeile 7 klicken, um einen Break point zu setzen, vgl. Abb. 6.1

Abbildung 6.1: Anzeige eines Break points vor Zeile 7 im MATLAB-Editor
Image wurzel0
Breakpoints können auch vom Kommandofenster gesetzt werden durch
    >> dbstop in wurzel at 7
Ein Breakpoint kann wieder aufgelöst werden durch
    >> dbclear in wurzel at 7
Im Editor-Fenster kann ein Breakpoint durch Klicken auf den entsprechenden roten Punkt aufgelöst werden.

Wenn MATLAB den Break point erreicht, hält das Program an, und MATLAB schaltet in den ``debug mode'' um. Der Prompt hat dann die Form . K steht für keyboard6.1. Irgend ein MATLAB-Befehl ist dann zulässig. Insbesondere kann der Wert der Variable x angezeigt werden. Um in der Rechnung weiter zu fahren, gibt man dbcont oder dbstep oder return ein. Mit dbquit verlässt man den Debugger. Mit dbup kann man den Arbeitsspeicher der aufrufenden Funktion einsehen, mit dbdown kommt man in den Speicherbereich der nächsttieferen Funktion zurück.

In unserem Beispiel (mit $ a=3$) zeigt die Analyse, dass die $ x_k$ konvergieren, dass $ x^2_k - a$ aber nicht Null wird. Deshalb ändern wir die Abbruchbedingung der while-Schleife so, dass aufeinanderfolgende Werte von x verglichen werden:

    function [x] = wurzel(a);
    %WURZEL  x = wurzel(a) berechnet die Quadratwurzel von a
    %        mit dem Newtonverfahren

    x = 1; xalt = 0;
    while x - xalt > 0,
        xalt = x;
        x = (x + a/x)/2;
    end

Diese Iteration kann verfrüht abbrechen, wenn xalt grösser als x ist. Dies sieht man leicht ein, wenn man einen Breakpoint auf Zeile 8 (x = (x + a/x)/2) setzt und die Werte von xalt und x anzeigen lässt. Deshalb ändern wir das Programm so ab, dass der Abstand zwischen x und xalt berechnet wird:

    function [x] = wurzel(a);
    %WURZEL  x = wurzel(a) berechnet die Quadratwurzel von a
    %        mit dem Newtonverfahren

    x = 1; xalt = inf; tau = 10*eps;
    while abs(x - xalt) > tau,
        xalt = x;
        x = (x + a/x)/2;
    end

Eine Lösung von Aufgabe 2 in Abschnitt 5.3.6 schliesslich ist gegeben durch

    function [x,n] = wurzel(a, tau);
    %WURZEL  x = wurzel(a) berechnet die Quadratwurzel von a
    %        mit dem Newtonverfahren

    x = 1; xalt = inf; n = 0; 
    if nargin == 1, tau = eps; end
    while abs(x - xalt) > tau,
        xalt = x;
        x = (x + a/x)/2;
        n = n+1;
    end
Hier wird auch noch die Zahl der Iterationsschritte bis zur Konvergenz gezählt. Zudem besteht die Möglichkeit die Genauigkeit der Abbruchkriteriums zu variieren. Man beachte die Verwendung der MATLAB-internen Funktion nargin, die die Zahl der Eingabeparameter angibt, die an die Funktion übergeben wurden. Fehlt der zweite Parameter tau, so wird er gleich der Maschinengenauigkeit eps gesetzt.

Peter Arbenz 2008-09-24