Funktionen in Matlab Vorlesung Computergestützte Mathematik zur Linearen Algebra Lehrstuhl für Angewandte Mathematik Sommersemester 2008 15. und 29. Mai 2008
Funktionen in Matlab Wir kennen schon diverse Matlab-Funktionen: sin, cos, diag, size,... diese wurden meist durch y = funktion(x) aufgerufen, wobei x eine Eingabevariable und y eine Ausgabevariable war. was in der Funktion passiert, ist für uns unsichtbar (black box) der Funktionsaufruf hinterlässt im Unterschied zu Skripten keine Spuren (z.b. Hilfsvariablen) im Arbeitsspeicher. Matlab kann nicht nur durch Skripte sondern auch durch Funktionen ergänzt werden!
Matlab-eigene Funktionen In Matlab gibt es so genannte built-in Funktionen, die besonders schnell laufen und nicht in Matlab programmiert sind. Beispiel: type diag Es gibt aber auch viele in Matlab programmierte Funktionen: Beispiel: type flipud Funktionen sind wie Skripte Textdateien, deren Name mit.m endet.
Funktionen Aufbau einer Funktion: 1. Definition der Funktion (abgespeichert in funname.m) function [out_1,out_2,...,out_k] =... funname(in_1,in_2,...,in_m) Die Listen der Ein- oder Ausgabevariablen können auch leer sein. 2. Kommentarzeilen (was tut die Funktion, welche Ein- und Ausgabevariablen muss der Benutzer verwenden). Der erste zusammenhängende Block von Kommentarzeilen wird bei help funname angezeigt. Die erste Zeile der Kommentarzeilen wird bei lookfor durchsucht.
Funktionen, Fortsetzung 3. Häufig folgt dann die Überprüfung der Eingabedaten: sind genügend Eingabevariablen vorhanden? sind die Eingabedaten vernünftig? sind höchstens k Ausgabevariablen gefragt? Falls dies nicht der Fall ist: Fehlermeldung und Ausstieg 4. Matlab-Befehle für die eigentliche Funktion Die Variablen in_1,...,in_m und out_1,...,out_k und alle in der Funktion neu definierten Variablen sind lokal, also nicht im Matlab-Workspace vorhanden. Aufruf: (es darf x k und y m sein) [out_1,...,out_x]=funname(in_1,in_2,...,in_y)
Beispiel ggt als Funktion, gespeichert in ggt.m function g = ggt(m,n); % function g = ggt(m,n); % Berechnung des ggt zweier ganzer Zahlen if (m > 0 & n > 0) while m ~= n... end g = m; else error( fehlerhafte Eingabedaten ); end Aufruf: x=3; y=5; f=ggt(x,y); whos
Arbeitsspeicher Aufruf: f=ggt(x,y) Funktion g=ggt(m,n) Matlab-Workspace vorher: x,y nachher: x,y,f x m y n f g ggt-workspace Input: m,n Output: g Der Workspace kann mit whos angezeigt werden (am Matlab-Prompt bzw. innerhalb der Funktion ggt)
Regeln für Funktionen I Für Funktionsnamen gelten dieselben Regeln wie für Variablen Eine Funktion endet nachdem die letzte Zeile ausgeführt wurde oder durch ein return-kommando Eine Funktion kann durch warning( eine Warnung ) eine Warnung geben. Im Unterschied zu disp( eine Warnung ) können durch warning on bzw. warning off Warnungen global an- bzw. ausgeschaltet werden Matlab-Funktionen können Skripte oder andere Matlab-Funktionen aufrufen.
Regeln für Funktionen II In einem m-file können mehrere Funktionen abgespeichert werden. Solche Unterfunktionen werden an die erste Funktion (die Hauptfunktion) angehängt. Sie beginnen mit einem Standard function-kommando und genügen denselben Regeln wie vorher. Unterfunktionen können durch die Hauptfunktion oder durch andere Unterfunktionen aus demselben m-file aufgerufen werden, nicht aber aus anderen Funktionen oder Skripten. Unterfunktionen haben ihren eigenen lokalen Arbeitsspeicher. Die Reihenfolge von Unterfunktionen spielt keine Rolle.
Beispiel: Binomialkoeffizienten Aufgabe: Gegeben sei eine Funktion f=fac(n) die f = n! liefert und in fac.m gespeichert ist. Mit dieser soll ( n k) berechnet werden: ( ) n = k { 1, n = k oder k = 0 n! (n k)!k!, 0 < k < n Lösung: function b=bin(n,k) Input: n,k Output: b
function b = bin(n,k); % function b = bin(n,k); Binomialkoeffizient if (n == k k == 0) b = 1; elseif (0 < k & k < n) b = fac(n)/fac(n-k)/fac(k); else error([ erster Eingabewert muss groesser,... als der zweite sein ]); end
Arbeitsspeicher Matlab n,k b bin fac
Beispiel: Approximation an e x Aufgabe: Berechnen Sie so viele Folgenglieder ( x n = 1 + x n, n) bis gilt x n x n 1 tol Lösung: while-schleife
Berechnung von Funktionen Aufgabe: Schreiben Sie eine Funktion function y=fun1(x), mit der Sie f (x) = sin(x)/x auswerten können. Falls x ein Vektor oder eine Matrix ist, soll die Funktion für jedes Element berechnet werden. Lösung: Fallunterscheidung für Elemente von x = 0 nötig: Für x < 10 5 verwende Taylor-Entwicklung: sin(x) x = 1 1 3! x2 + 1 5! x4 1 7! x6 Bestimme diese Elemente mit find. Achtung: find gibt Spaltenindizes zurueck, daher schreibe x zunächst als Vektor.
Beispiel: Mandelbrot-Menge Aufgabe: Bestimme alle z C, welche unter der Abbildung z z 2 + c gestartet mit z = c beschränkt bleiben. Lösung: 1. Definition von Punkten z jk C in einem Rechteck 2. Funktion auf diesen Punkten, Startwert z jk = c für alle j,k 3. Führe Iteration für alle z jk gleichzeitig aus (for- oder while-schleife) 4. Plotte alle Punkte z jk mit z jk < M (z.b. M = 10 6 )