abc Matlab - elektronski priručnik
VII dio Dodaci /APPENDIX/ - 7.1. Programiranje u Matlabu 1

7.1.2. Inline funkcije i komanda fevali

Ponekad je pogodno definisati funkciju koja će se koristiti samo za vrijeme tekuće MATLAB sesije. MATLAB ima komandu inline koja se koristi da definiše tzv. inline funkcije u Command Window.

Neka je

f = inline('sqrt(x.^2+y.^2)','x','y')

f =
         Inline function:
         f(x,y) = sqrt(x.^2+y.^2)

Možemo evaluirati ovu funkciju na uobičajen način
f(3,4)

ans =
         5
Primijetimo da ova funkcija takođe radi sa nizovima. Neka je
A = [1 2;3 4]

A =
         1     2
         3     4

i

B = ones(2)

B =
         1     1
         1     1

Tada je

C = f(A, B)

C =
         1.4142      2.2361
         3.1623      4.1231
Za kasniju upotrebu pomenimo kratko koncept stringa u MATLAB-u. Karakter string je tekst između jednostrukih navodnika. Na primjer,

str = 'programiranje u MATLAB-u je lako'

str =
         programiranje u MATLAB-u je lako

je primjer stringa.

Neke funkcije uzimaju kao ulazni argument ime druge funkcije, koje je specificirano kao string. Da bismo izvršili funkciju specificiranu stringom trebamo koristiti komandu feval kao što je prikazano ovdje

feval('functname', ulazni parametri funkcije functname)

Razmotrimo problem računanja najmanjeg zajedničkog sadržaoca dva cijela broja. MATLAB ima ugrađenu funkciju lcm koja računa traženi broj. Prisjetimo se da najmanji zajednički sadržalac i najveći zajednički djelilac  (gcd) zadovoljavaju sljedeću jednačinu

ab = lcm(a, b)gcd(a, b)

MATLAB ima svoju vlastitu funkciju, imena gcd, za računanje najvećeg zajedničkog djelioca.

Da ilustrujemo upotrebu komande feval pogledajmo bliže kod u m-fajlu mylcm

function c = mylcm(a, b)

% Najmanji zajednicki sadrzalac c dva cijela broja a i b.

if feval('isint',a) & feval('isint',b)
         c = a.*b./gcd(a,b);
else
         error('Ulazni argumenti moraju biti cijeli brojevi')
end
Komanda feval se koristi dvaput u liniji dva (ne broje se linije komentara i prazne linije). Ona provjerava da li su oba ulazna argumenta cijeli brojevi. Logički and operator & upotrijebljen ovdje biće razmotren kasnije. Ako je ovaj uslov zadovoljen, tada se najmanji zajednički sadržalac računa koristeći ranije pomenutu formulu, inače se generiše poruka o greški. Primijetimo upotrebu komande error, koja uzima string kao argument. Uslov if - else – end koji je ovdje korišten biće razmotren kasnije. Funkcija koja se izvršava dvaput u tijelu funkcije mylcm se naziva isint

function k = isint(x);

% Provjerava da li je x cijeli broj.
% Ako jeste, funkcija isint vraca 1 inace vraca 0.
if abs(x - round(x)) < realmin
         k = 1;
else
         k = 0;
end
Nove funkcije korištene ovdje su funkcija apsolutne vrijednosti (abs) i funkcija zaokruživanja (round). Prva je klasična matematička funkcija dok druga uzima broj i zaokružuje ga na najbliži cijeli. Druge funkcije koje se koriste za zaokruživanje realnih brojeva na cijele biće razmotrene kasnije. Konačno, realmin je najmanji pozitivni realni broj na našem računaru

format long

realmin

ans =
         2.225073858507201e-308

format short

Trapezoidno Pravilo sa korekcionim članom se često koristi za numeričku integraciju funkcija koje su diferencijabilne na intervalu integracije

gdje je h = b – a. Ova formula se lako implementira u MATLAB-u
function y = corrtrap(fname, fpname, a, b)

% Korigovano trapezoidno pravilo y.
% fname - m-fajl koristen za evaluaciju integranda,
% fpname - m-fajl koristen za evaluaciju prvog izvoda
% integranda,
% a,b – krajnje tacke intervala integracije.

h = b - a;
y = (h/2).*(feval(fname,a) + feval(fname,b))+ (h.^2)/12.*( ...
         feval(fpname,a) - feval(fpname,b));

Ulazni parametri a i b mogu biti nizovi istih dimenzija. Ovo je moguće zato što dot operator izvršava izvjesne aritmetičke operacije u komandi koja definiše varijablu y.

U ovom primjeru ćemo integrisati sinusnu funkciju nad dva intervala čije su krajnje tačke spremljene u nizovima a i b, gdje je

a = [0 0.1];
b = [pi/2 pi/2 + 0.1];

y = corrtrap('sin', 'cos', a, b)

y =
         0.9910      1.0850

Pošto su i integrand i njegov prvi izvod ugrađene funkcije, nema potrebe da definišemo te funkcije u m-fajlovima.

m-fajlovi    <    Index    >    Kontrola toka