Kapitel 4.2
Transcrição
Kapitel 4.2
37 4.2 Selbstdefinierte Matlab-Funktionen 1. Teil Ein m-File mit Namen Funktionsname.m und einer ersten Zeile der folgenden Form: function Funktionsname(input1,input2,. . . ,inputn) oder function output1=Funktionsname(input1,input2,. . . ,inputn) oder function [output1,. . . ,outputm]=Funktionsname(input1,. . . ,inputn) definiert eine Matlab-Funktion. Werden keine Inputargumente verwendet, fällt der Teil in den runden Klammern samt den runden Klammern weg. Die zugehörige Datei muss wieder im Pfad oder im aktuellen Verzeichnis stehen. Entscheidend für den Funktionsnamen ist der Dateiname und nicht der Name, der in der Datei steht. Es sollten immer nur Kleinbuchstaben für den Namen verwendet werden (Portierbarkeit zwischen Betriebssystemen). 38 Was macht Matlab, falls es auf einen Funktionsaufruf f(x) stößt? Es untersucht, ob 1. f eine Variable ist, 2. f eine Funktion im aktuellen Verzeichnis ist, 3. f eine Funktion im Matlab-Pfad ist. Beispiel: Ein Inputargument, ein Outputargument. Berechnung der Funktion f (x) = x2 sin(x). function y=f(x) y = x.^2.*sin(x); Abspeichern unter f.m. Aufruf z.B.: >> xx=f(2.4). 39 Beispiel: Ein Inputargument, zwei Outputargumente. function [y,ys]=g(x) y = sin(x); ys = cos(x); Aufruf: >> [z,zs] = g(1.3) z = 0.9636 zs = 0.2675 >> z = g(1.3) z = 0.9636 Bei der zweiten Aufrufvariante wurde nur ein Outputargument angegeben. Die Variable z ist daher mit dem Wert des ersten Outputarguments belegt. Das zweite Outputargument wurde zwar berechnet, das Resultat ist hier aber nicht verfügbar. 40 Beispiel: Keine Argumente. Wir bauen die Skriptdatei plot sin.m in eine Funktionsdatei plot sin2.m um: function plot_sin2 % Sinuskurve plotten % das ist auch noch eine Kommentarzeile fuer help % diese nicht mehr x = linspace(0,2*pi,200); y = sin(x); plot(x,y) % plotten % Beschriftung xlabel(’x’) ylabel(’sin(x)’) Aufruf: plot sin2, nicht plot sin2(). 41 Die ersten zusammenhängenden Kommentarzeilen nach dem Funktionskopf ergeben den Hilfetext: >> help plot_sin2 Sinuskurve plotten das ist auch noch eine Kommentarzeile fuer help 42 Die Variablen in einer Funktion sind lokal Wir rufen vor dem Aufruf von plot sin2 den Befehl clear all auf und löschen damit alle Variablen im sogenannten Workspace. Die Variablen, die in plot sin.m verwendet werden, sind nach Ausführung von plot sin2 nicht im Workspace vorhanden (bei Aufruf der Skriptdatei plot sin aber schon). Alle Variablen innerhalb einer Matlab-Funktion sind lokale Variablen. Variablen mit gleichem Namen im aufrufenden Programm werden nicht verändert. Variablen im aufrufenden Programm werden ausschießlich durch Zuweisung der Rückgabewerte der Matlab-Funktion verändert. Die Inputargumente werden ebenfalls nicht verändert. Die Übergabe der Argumente erfolgt call by value, d.h. es wird eine Kopie übergeben. Die im aufrufenden Programm verwendeten Variablen sind für die Matlab-Funktion nicht sichtbar. Die gesamte Kommunikation zwischen aufrufendem Programmteil und der Matlab-Funktion erfolgt über die Inputund Outputargumente. Beide Teile (aufrufender Programmteil und aufgerufene Matlab-Funktion) besitzen einen eigenen unabhängigen Workspace bzw. Speicherbereich. Jeder Teil hat nur auf seinen eigenen Workspace Zugriff. 5 Kontrollstrukturen 5 Kontrollstrukturen 5.1 for-Schleifen Syntax: for Zählvariable = Start:Ende Befehle end for Zählvariable = Start:Schrittweite:Ende Befehle end for Zählvariable = Zeilenvektor Befehle end Es wird die Zählvariable sukzessive mit Werten aus dem Vektor Start:Ende, Start:Schrittweite:Ende bzw. Zeilenvektor belegt. 44 5 Kontrollstrukturen Beispiel: Den Inhalt des Vektors x=[1 3 4 7] aufsummieren. 1. Variante x = s = for s end [1 3 4 7]; 0; i=1:length(x) = s+x(i); Die Elemente des Vektors 1:length(x) sind die Indizes 1,2,3 und 4 um auf alle Elemente von x zugreifen zu können. 2. Variante x = s = for s end [1 3 4 7]; 0; xi=x = s+xi; 45 5 Kontrollstrukturen Bei dieser Variante wird die Zählvariable xi direkt sukzessive mit den Elementen von x belegt. 46 5 Kontrollstrukturen 5.2 47 if-Abfragen Syntax: if (logischer Ausdruck) Befehle end if (logischer Ausdruck) Befehle else Befehle end < < ≤ <= = == ≥ >= > > 6 = ∼= if (logischer Ausdruck 1) Befehle elseif (logischer Ausdruck 2) Befehle elseif (logischer Ausdruck 3) .. . else Befehle end und & bzw. && oder | bzw. || nicht ∼ 5 Kontrollstrukturen Die logischen Ausdrücke liefern einen Wert zurück, 1 für wahr und 0 für falsch. Etwas, das ungleich 0 ist, ist immer wahr, und etwas, das gleich 0 ist, ist immer falsch. Beispiel: Signum-Funktion. if (x>0) sign_x = 1; elseif (x==0) sign_x = 0; else sign_x = -1; end Test ob eine Variable a “wahr” oder “falsch” ist: (a) für Test auf wahr, (∼ a) für Test auf falsch. Es muss also nicht if (a==1) oder if (a==0) geschrieben werden. 48 5 Kontrollstrukturen Der Unterschied zwischen & und &&: Bei & wird das was links und was rechts von & steht ausgewertet und dann geschaut, ob beides wahr ist oder nicht. Bei && wird das was links steht ausgewertet. Ist dies bereits falsch, wird die rechte Seite nicht mehr ausgewertet, da sich am Gesamtergebnis nichts mehr ändern kann. Ähnliches gilt für | und ||. Achtung: Auf Vektoren bzw. Matrizen werden die Vergleichsoperatoren elementweise angewendet. Das Resultat Vektoren bzw. Matrizen aus Nullen und Einsen. isequal(v,w) macht das, was man sich von v==w erwarten würde. Bei komplizierteren logischen Ausdrücken sollten Klammern gesetzt werden um die richtige Reihenfolge bei der Auswertung zu garantieren (oder die entsprechenden Regeln lernen). 49 5 Kontrollstrukturen 5.3 while-Schleifen while (logischer Ausdruck) Befehle end Die Schleife wird abgearbeitet solange der logische Ausdruck wahr ist. Simulation einer repeat-until-Schleife: while (1) % immer wahr Befehle if (logischer Ausdruck) break end end Mit break kann eine while- oder for-Schleife vorzeitig verlassen werden. Mit continue kann der momentane Durchlauf abgebrochen werden und der nächste Durchlauf begonnen werden. 50 5 Kontrollstrukturen 5.4 switch, case, otherwise switch (Variable) case Variablenwert 1, Befehle case Variablenwert 2, Befehle .. . end switch (Variable) case {Variablenwert 1a, Variablenwert 1b}, Befehle .. . case Variablenwert n, Befehle otherwise Befehle end 51 5 Kontrollstrukturen Die Variable ist entweder eine skalare Variable oder eine String-Variable. switch/case ist eigentlich nur eine Vereinfachung der if-Abfrage. Vergleich if und switch: switch (methode) case 1, I = rechtecksregel(f,a,b,n); case 2, I = trapezregel(f,a,b,n); otherwise error(’Unbekannte Integrationsregel’); end if (methode==1) I = rechtecksregel(f,a,b,n); elseif (methode==2) I = trapezregel(f,a,b,n); else error(’Unbekannte Integrationsregel’); end 52 5 Kontrollstrukturen Mit Strings: Ein String wird in einfache Anführungszeichen eingeschlossen! switch (methode) case ’rechteck’, I = rechtecksregel(f,a,b,n); case {’trapez’,’trapezoidal’} I = trapezregel(f,a,b,n); otherwise error(’Unbekannte Integrationsregel’); end if (strcmp(methode,’rechteck’)) I = rechtecksregel(f,a,b,n); elseif (strcmp(methode,’trapez’) | strcmp(methode,’trapezoidal’)) I = trapezregel(f,a,b,n); else error(’Unbekannte Integrationsregel’); end 53