Funktioner i Matlab
Här följer några ord om hur man skriver funktioner i Matlab. Dessutom beskrivs hur globala variabler används och hur man skickar en funktion som parameter.
Den enklaste formen av Matlabfunktion har följande utseende:
function resultat = namn(parameter)
resultat = något uträknat;
namn
är funktionens namn (spara filen som
namn.m
). Du ger funktionen ett värde genom att
tilldela
variabeln resultat
ett värde i funktionen.
parameter
är den variabel som innehåller det
värde
för vilket funktionen skall beräknas.
Funktionen kan sedan användas som vilken funktion
(sin
, cos
etc.) som helst, t.ex.
a = namn(1.22) + 4.56 * namn(-2.33);
if namn(2.56) > 0
b = c + 1;
end
resultat
och även parameter
kan
givetvis vara
en vektor eller en matris.
Funktioner med mer än en parameter
En Matlabfunktion kan ha flera inparametrar och kan även returnera mer än ett resultat.
function [res1, res2, ..., resn] = namn(par1, par2, ..., parm)
res1 = ...
res2 = ...
etc.
resn = ...
Varje res
och varje par
kan vara en
skalär
variabel men även en vektor eller en matris.
Funktionen anropas t.ex. genom:
[ut, a, z] = func(A, b, x, p);
Globala variabler
I vissa fall måste man skicka variabler till en funktion, där variabeln inte kan vara en parameter. Detta kan t.ex. vara fallet om man använder en rutin i Matlab som kräver en funktion som parameter och där denna funktion har en fix prototyp (parameterlista och typ har bestämts en gång för alla). Man kan då kommunicera mellan funktion och omgivning (huvudprogram eller en annan funktion t.ex.) genom att använda globala variabler. Detta gör man genom att i funktionen använda global-deklarationen. Observera att deklarationen också måste finnas med i huvudprogrammet (eller den funktion, högre upp i anropskedjan, som man vill kommunicera med). Så här kan det se ut:
I main.m
global a temp x
a = ...; % Deklarera först tilldela sedan
temp = ...;
x = ...;
...
y = func(z)
I funktionen func
:
function y = func(z)
global a temp x
...
y = ...
Använd inte samma namn på en parameter och en
variabel
i global-listan. function y = func(a)
, i exemplet ovan,
ger
problem.
Vissa funktioner, som ode45
, tar extra argument
där man
kan skicka med data. Läser man help ode45
står
det
[T,Y] = ODE45(ODEFUN,TSPAN,Y0,OPTIONS,P1,P2...) passes the
additional
parameters P1,P2,... to the ODE function as ODEFUN(T,Y,P1,P2...), and
to all functions specified in OPTIONS. Use OPTIONS = [] as a place
holder if no options are set.
Funktioner som parametrar
En funktion kan även ta en funktion som parameter (som är
fallet
med ode45
). Det finns lite olika syntax för detta.
Den
äldsta formen är att skicka funktionens namn som en
textsträng,
dvs. ode45('func', ...
I senare Matlabversioner kan man
skicka
ett handtag till funktionen: ode45(@func, ...
Om man har enkla funktioner (detta är inte intressant i
Z-labbarna)
kan man ibland skicka ett numeriskt uttryck. Rutinen
quadl
(för integration) klarar detta t.ex.
Om vi vill approximera integralen av sin(exp(x)) för x i [0, 2] kan vi skriva:
quadl('sin(exp(x))', 0, 2)
och får svaret 5.5094e-01.
I detta fall kan vi
också
skapa ett funktionsobjekt med hjälp av funktionen inline
.
Sålunda:
>> h = inline('sin(exp(x))')
h =
Inline function:
h(x) = sin(exp(x))
>> quadl(h, 0, 2)
ans = 5.5094e-01
Ytterligare ett alternativ är att skapa en anonym funktion:
>> f = @(x) (sin(exp(x)));
>> quadl(f, 0, 2)
ans = 0.5509
Om man vill evaluera värdet på en funktion som man
fått
som parameter används kommandot feval
(skriv help
feval
).