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 ,
, d.h. zur Berechnung der positiven
Nullstelle von
,
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; endDiese 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
Breakpoints können auch vom Kommandofenster gesetzt werden durch>> dbstop in wurzel at 7Ein Breakpoint kann wieder aufgelöst werden durch
>> dbclear in wurzel at 7Im 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». 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 ) zeigt die Analyse, dass die
konvergieren, dass
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; endHier 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