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).


Back