Funktioner och script

För att upprepa enstaka kommandon kan man använda Matlabs historiemekanism (uppåtpil, bland annat). Det blir lite opraktiskt om man vill upprepa längre kommandosekvenser. Det är då bekvämt att lägga de kommandon som skall upprepas på en fil, (sk script-fil). Antag att filen heter lab.m. När man skriver lab läser Matlab kommandona från filen. Observera att en scriptfil inte inleds med function (eller något likande) utan första raden är första kommandot man vill utföra. Första raden kan givetvis vara en kommentar.

I bland behöver man dock funktioner. Man vill kanske överföra parametrar eller skicka en funktion till en annan funktion. Observera dock att variabler som skapas i en funktion är lokala till funktionen. Dessa variabler upphör också att existera när återhopp görs från funktionen. Detta gör det svårare att avlusa funktioner. Många studenter använder funktioner när scriptfler vore ett bekvämare alternativ.

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. Ett enkelt exemepl ges av:

function resultat = namn(parameter)
resultat = parameter^2;  % kvadrera argumentet

Funktionen  kan sedan användas som vilken funktion (sin, cos etc.) som helst, t.ex.

>> namn(3)
ans =
     9

>> a = namn(1.22) + 4.56 * namn(-2.33);

>> if namn(d) > 6
     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 (help global). 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.

Funktioner som parametrar

En funktion kan även ta en funktion som parameter, nödvändigt när vi använder ode45, till exempel. Det finns lite olika syntax för detta. I den senaste Matlabversionen skickar man normalt ett handtag till funktionen:  ode45(@func, ...  @func är ett handtag till funktionen func.

Om man har enkla funktioner (detta är inte intressant i labbarna) kan man ibland skicka ett numeriskt uttryck. Säg att vi vill beräkna den bestämda integralen av sin(exp(x)) över intervallet [0, 2]. Vi använder rutinen quadl och skapar en så kallad anonym funktion.

Om vi vill approximera integralen av sin(exp(x)) för x i [0, 2] kan vi skriva:

>> quadl(@(x) sin(exp(x)), 0, 2)
ans =
     5.5094e-01

Vi kan alternativt använda en variabel:

>> F = @(x) sin(exp(x));
>> quadl(F, 0, 2)
ans = 5.5094e-01

Här ett exempel som också visar hur man använder funktionen som skickas som parameter:

function func_ex

my_func(@a_function)  % anropa my_func

% Om funktionen är mycket enkel
F = @(x) sin(exp(x));
my_func(F)

% eller
my_func(@(x) sin(exp(x)))

% ------------------------------

function y = a_function(x)
y = sin(exp(x));

% ------------------------------

function my_func(f)
% my_func:s parameter är ett handtag till en funktion

f(2)  % här använder vi funktionen, skriver bara ut ett värde


Back