3 Scilab | |
→ | 3.5 Eingabe |
Funktionen werden mit
function [Rückgabevariable(n)] = Funktionsname(Argument(e)) Funktionskörper endfunction
definiert, siehe auch Beispiel Selbsdefinierte Funktion.
Im Funktionskörper müssen die Rückgabevariablen auf den Wert
gesetzt werden, der als Funktionsergebnis zurückgegeben werden
soll.
Die Anweisungen innerhalb einer Funktion werden üblicherweise immer
mit Semikolon abgeschlossen.
Beispiel:
Die Funktion
function [y] = kugeloberflaeche(r) y = 4 * %pi * r ^ 2; endfunction V1 = kugeloberflaeche(3.5);
berechnet die Oberfläche einer Kugel mit gegebenem Radius.
Eine Funktion kann auch mehrere Werte in Form einer Liste zurückgeben, z.B.:
function [A, V] = kugeldaten(r) A = 4 * %pi * r ^ 2; V = (A * r) / 3; endfunction [A1, V1] = kugeldaten(3.5);
Für alle Funktionen, die üblicherweise einen Skalar als Argument
erhalten, ist es sinnvoll, automatische Vektorisierung zu
ermöglichen.
D.h. wird die Funktion mit einem Vektor oder einer Matrix
aufgerufen, soll sie als Ergebnis einen Vektor bzw. eine Matrix
gleicher Größe liefern, wobei die Berechnung auf jedes Element
einzeln angewandt wird.
Wir verwenden die Operatoren für elementweise Berechnungen, wenn
beteiligte Operanden Skalare, Vektoren oder Matrizen sein
dürfen.
function [A, V] = kugeldaten(r) A = 4 * %pi .* r .^ 2; V = (A .* r) / 3; endfunction M1 = [1 2 3 ; 4 5 6 ; 7 8 9]; [A1, V1] = kugeldaten(M1);
Alle Wertzuweisungen zu Variablen in Funktionen legen
standardmäßig eine lokale Variable an (Variable, die nur innerhalb
der Funktion und nur bis zum Ende der Ausführung der Funktion
definiert ist).
Lokale Variablen "verdecken" gleichnamige Variablen, die weiter
außerhalb definiert sind, z.B. im Arbeitsbereich.
Im Beispiel
a = 5;
function y = test1(x)
printf('a alt: %g\n', a);
a = x;
printf('a neu: %g\n', a);
y = x;
endfunction
printf('a (1) %g\n', a);
test1(3);
printf('a (2) %g\n', a);
wird dies an der Ausgabe
a (1) 5 a alt: 5 a neu: 3 a (2) 5
sichtbar.
Soll eine Funktion Variablen des Arbeitsbereiches ändern oder sich änderbare Variablen des Arbeitsbereiches mit anderen Funktionen teilen, muss die entsprechende Variable vor der ersten Wertzuweisung als "global" definiert werden. Dies muss zum einen in der Funktion passieren (Hinweis, dass die Variable nicht lokal für die Funktion ist), zum anderen im Arbeitsbereich (Erlaubnis zum Ändern aus Funktionen heraus erteilen).
global a;
a = 5;
function y = test1(x)
global a;
printf('a alt: %g\n', a);
a = x;
printf('a neu: %g\n', a);
y = x;
endfunction
printf('a (1) %g\n', a);
test1(3);
Die Ausgabe
a (1) 5 a alt: 5 a neu: 3 a (2) 3
zeigt, dass die Funktion test() die Variable a des Arbeitsbereiches geändert hat.
Innerhalb einer Funktion kann mit
[lhs, rhs] = argn(Auswahl)
die Anzahl an Rückgabewerten (lhs) und die Anzahl an
Argumenten (rhs) ermittelt werden.
Wird das optionale Auswahl-Argument weggelassen, liefert
argn() sowohl lhs als auch rhs.
Mit Auswahl=1 wird lhs zurückgegeben, mit
Auswahl=2 wird rhs zurückgegeben.
Dies ist insbesondere interessant für Funktionen, die eine Liste
von Rückgabewerten liefern. Derartige Funktionen können auch so
aufgerufen werden, dass die Ergebnisliste (Liste der Variablen auf
der linken Seite der Zuweisung) kleiner ist als die Liste der
Rückgabewerte, die überzähligen Elemente der Rückgabeliste werden
dann ignoriert. Die Berechnung der nicht benötigten Rückgabewerte
kann dann entfallen.
Im Beispiel
function [A, V] = kugeldaten(r) [lhs, rhs] = argn(0); if(lhs > 0) then disp("Flaechenberechnung\n"); A = 4 * %pi .* r .^ 2; if(lhs > 1) then disp("Volumenberechnung\n"); V = (A .* r) / 3; end end endfunction M1 = [1 2 3 ; 4 5 6 ; 7 8 9]; [A1, V1] = kugeldaten(M1); A2 = kugeldaten(M1);
wird in der Funktion getestet, wieviele Ergebnisse aus der Rückgabeliste benötigt werden. Die Volumenberechnung wird nur durchgeführt, wenn mehr als ein Element der Rückgabeliste benötigt wird.
In Funktionsaufrufen kann die Zuordnung von Werten zu Funktionsargumenten nicht nur anhand der Reihenfolge erfolgen sondern auch durch Angaben
Name=Wert
Mit
exists(Name, "local")
kann getestet werden, ob ein Name innerhalb einer Funktion
definiert ist (als Funktionsargument oder als Variable).
Für nicht angegebene Funktionsargumente sollten lokale Variablen
mit Standardeinstellungen definiert werden.
Beispiel:
function [y] = verzinsung(anfangsbetrag, zinssatz, zeit) y = 0; [lhs, rhs] = argn(0); mprintf('lhs=%d rhs=%d\n', lhs, rhs); if (rhs < 4) then if ~exists("zinssatz", "local") then zinssatz = 1.25; end if ~exists("zeit", "local") then zeit = 1; end if ~exists("anfangsbetrag", "local") then anfangsbetrag = 1; end y = anfangsbetrag * exp(zeit * log(1.0 + zinssatz/100)); else error("Parameter-Anzahl fehlerhaft!"); end endfunction a = verzinsung(100, 2.5, 20) b = verzinsung(150) b = verzinsung(200, zeit=5) c = verzinsung(250, zinssatz=5.0) d = verzinsung(300, zeit=25, zinssatz=3.0) e = verzinsung()
Eine große Anzahl von Funktiionen ist in Scilab vordefiniert. In der Online-Hilfe finden Sie ein Kapitel "Elementary Functions", hier sind diese Funktionen aufgelistet und dokumentiert.
Funktionen können in *.sci-Dateien gespeichert werden.
Diese Dateien werden mit
exec('Dateiname');
eingelesen. Der Dateiname sollte möglichst als vollständiger Dateiname angegeben werden.