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