Home > Doc > Manuale Matlab > Scripts e Funzioni

Manuale Matlab

Scripts e Funzioni

MATLAB è un linguaggio di programmazione potente, così come un ambiente computazionale interattivo. I Files che contengono codice MATLAB sono chiamati M-files. Dopo aver creato un M-file usando un qualsiasi editor di testo, tale file può essere usato come un comando od una funzione MATLAB. Ci sono due generi di M-file:

 Scripts che non accettano argomenti d’entrata o argomenti di uscita. Loro operano su dati nel workspace.

 Functions che possono accettare argomenti d’entrata e argomenti di uscita. Una variabile interna è locale alla funzione.

Se sei un nuovo programmatore di MATLAB,crea gli M-file di prova e posizionali nella directory corrente. In seguito gli M-file,potranno essere organizzati in altre directory e toolboxes personali che potrai aggiungere al percorso di ricerca di MATLAB. Se si duplicano nomi di funzioni, MATLAB esegue quello che viene prima nel percorso di ricerca. Per vedere i contenuti di un M-file, per esempio myfunction.m, posso digitare:

myfunction

 Script Quando si richiama uno script, MATLAB esegue semplicemente i comandi presenti nel file.Gli Script possono operare su dati esistenti nel workspace, o loro possono creare dati nuovi su cui operare. Sebbene gli script non forniscano dati di output, qualsiasi variabile che loro creano rimane nel workspace, per essere usata in calcoli susseguenti. Inoltre, gli script possono produrre dei grafici, usando funzioni come plot. Per esempio, creiamo un file chiamato rango.m che contiene questi comandi MATLAB:

Digitando l’asserzione:

rango

imponiamo a MATLAB di eseguire i seguenti comandi:

1)calcola il rango delle prime 30 magic squares

2)traccia il grafico del risultato

Si ottiene così il grafico seguente:

Dopo l’esecuzione del file , le variabili n e r rimangono nel workspace.

 Funzioni Le Funzioni sono M-file che possono accettare argomenti d’entrata e forniscono argomenti di uscita. Il nome dell’M-file e della funzione deve essere lo stesso. Le Funzioni operano su variabili definite nel workspace proprio, separato dal workspace a cui si accede all’ingresso di MATLAB, cioè le variabili usate all’interno della funzione sono locali.

Vediamo come scrivere una una funzione con parametri in ingresso e parametri in uscita. Si voglia costruire una funzione che, dati i lati ”a” e ”b” di un rettangolo fornisca l’area ”A”, il perimetro ”p” e la diagonale ”d”. Indichiamo con (a; b) la lista d’ingresso (parentesi tonde) e con [A; p; d] la lista d’uscita (parentesi quadre) (si noti la virgola fra i parametri).

Si noti che non c’e’ confusione tra la lettera A e la a perche’ MATLAB distingue le lettere maiuscole dalle minuscole. Questa function, salvata con il nome rettang.m puo’ essere richiamata da un altro modulo o direttamente dalla finestra comandi ad esempio con il comando:

[area; perim; diag] =rettang(2; 3)

Quindi la sintassi e’ la seguente:

function [lista d'uscita] = nome (lista d'ingresso)

Un buono esempio è fornito dalla funzione rank. L’M-file rank.m è disponibile nella directory toolbox/ matlab/matfun

Si può lanciare il file digitando:

rank

Il file in questione è il seguente.

La prima linea di una funzione M-file comincia con la funzione keyword.La quale da il nome alla funzione ed ordina gli argomenti. In questo caso,ci sono due argomenti di input ed uno di output. Le righe seguenti,che iniziano con il simbolo %, rappresentano dei commenti per un aiuto, non vengono considerate nell’applicazione. Queste linee si stampano quando si digita:

help rank

La prima linea del testo di aiuto è la H1 line che MATLAB espone quando si ricerca aiuto digitando help on nella directory che contiene la funzione. Il resto del file rappresenta codice eseguibile MATLAB definendo la funzione. La variabile s presente nel corpo della funzione, così come le variabili sulla prima fila r, A e tol, sono del tutto locali alla funzione; sono indipendenti e separate da qualsiasi variabile nel workspace di MATLAB. Questo esempio illustra un aspetto delle funzioni di MATLAB, che ordinariamente non si trova negli altri linguaggi di programmazione , un numero variabile di argomenti. La funzione rank può essere usata in molti modi diversi:

 

rank(A)

r = rank(A)

r = rank(A,1.e-6)

Molti M-file lavorano così. Se nessuno argomento di output è fornito, il risultato è immagazzinato in ans. Se il secondo argomento di input non è fornito, la funzione calcola un valore di default. Fra il corpo della funzione, due quantità chiamate nargin e nargout sono disponibili,le quali ci dicono il numero di argomenti di input e di output coinvolti in ciascun uso della funzione. La funzione rank usa nargin, ma non ha bisogno di usare nargout.

 Variabili globali Se si vuole che più di una funzione condivida una singola copia di una variabile, basta semplicemente dichiarare la variabile come globale in tutte le funzioni. Si faccia la stessa cosa alla linea di comando se si desidera che ad essa acceda anche il workspace. La dichiarazione globale deve essere posizionata prima che la variabile sia usata in una funzione. Sebbene non sia richiesto, usando lettere maiuscole per i nomi di variabili globali ci si aiuta a distingurle dalle altre variabili. Per esempio, creiamo un M-file chiamato falling.m:

function h = falling(t)

global GRAVITY

h = 1/2*GRAVITY*t.^2;

Poi interattivamente introduciamo le asserzioni:

global GRAVITY GRAVITY = 32;

y = falling((0:.1:5)');

Le due asserzioni globali danno il valore assegnato a GRAVITY al prompt di comando nella funzione. Si può cambiare poi GRAVITY interattivamente per ottenere soluzioni nuove senza compilare alcun file.

 Dualità Command/Function Comandi di MATLAB sono :

load help

Molti comandi accettano modificatori che specificano operandi.

load giuseppe.dat

help magic

type rank

Un metodo alternato di approvvigionare i modificatori di comando fornisce una sequenza di argomenti di funzioni.

load('giuseppe.dat')

help('magic')

type('rank')

Questa è la ”dualità tra command/function” di MATLAB. Qualsiasi comando della forma:

command argument

può essere scritto anche nella forma funzionale:

command('argument')

Il vantaggio dell’approccio funzionale viene quando l’argomento della sequenza è costruito dagli altri pezzi. L’esempio seguente processa files multipli, August1.dat, August2.dat e così via.In esso si usa la funzione int2str, che converte un numero intero in una sequenza di caratteri, per aiutare alla costruzione del nome del file.

for d = 1:31 s = ['August' int2str(n) '.dat'] load(s)

% Process the contents of the d-th file

end

 La funzione eval La funzione eval lavora con variabili di testo per rendere più agevole l’uso delle macro. L’espressione o asserzione:

eval(s)

usa l’interprete di MATLAB per valutare l’espressione o eseguire l’asserzione contenuta nella sequenza del testo s. L’esempio della sezione precedente potrebbe essere fatto anche col codice seguente, sebbene questo risulta meno efficiente perchè coinvolge il pieno interprete, non solo una chiamata alla funzione.

 Vettorizzazione E' importante una vettorizzazione per ottenere la più alta velocità di MATLAB, nell’eseguire gli algoritmi contenuti negli M-file. Dove gli altri linguaggi di programmazione userebbero cicli for o do , MATLAB può usare operazioni su vettori o matrici. Un semplice esempio si ottiene creando una tavola di logaritmi.

Agli utenti di MATLAB esperti piace dire ”La Vita è troppo corta per spenderla scrivendo dei cicli.” Una versione vettorizzata dello stesso codice è:

x = 0:.01:10;

y = log10(x);

Per codici più complicati, le opzioni di vettorizzazione non sono sempre così ovvie. Quando la velocità è importante, si dovrebbe sempre cercare di vettorizzare i propri algoritmi.

 Preallocation Se non si può vettorizzare un pezzo di codice, si può fare velocizzare un ciclo FOR preallocando qualsiasi vettore o array nei quali sono immagazzinati i risultati di output. Per esempio, questo codice usa la funzione zeros per preallocare il vettore creato nel ciclo FOR. Questo fa sì che il ciclo sia eseguito più velocemente.

r = zeros(32,1);

for n = 1:32

r(n) = rank(magic(n));

end

Senza la preallocation nell’esempio precedente, l’interprete di MATLAB allarga il vettore r di un elemento ad ogni ciclo. La vector preallocation elimina questo passo ed il risultato è una esecuzione più veloce.

 Funzioni di funzione Una classe di funzioni, chiamate ”funzioni della funzione,” lavora con funzioni nonlineari di una variabile scalare . Ovvero, una funzione lavora su un altra funzione. Le funzioni della funzione includono:

 Ricerche di zeri

 Ottimizzazioni

 Quadrature

 Equazioni differenziali ordinarie

MATLAB rappresenta le funzioni nonlineari attraverso una M-file funzione. Per esempio, qui c’è una versione semplificata della funzione humps dalla directory matlab/demos:

function y = humps(x)

y = 1./((x-.3).^2 + .01) + 1./((x-.9).^2 + .04) - 6;

Valutare questa funzione per un set di valori nell’intervallo seguente:

x = 0:.002:1;

y = humps(x);

Poi tracciare il grafico della funzione con:

plot(x,y)

si ottiene il seguente grafico:

Il grafico mostra che la funzione ha un minimo locale vicino ad x= 0.6. La funzione fmins trova il minimo valore di x . Il primo argomento di fmins è il nome del funzione di cui deve essere trovato il minimo, il secondo argomento è una supposizione grezza dell’ubicazione del minimo.

p = fmins('humps',.5)

p = 0.6370

Per valutare la funzione in corrispondenza del minimo digitare: humps(p)

ans = 11.2528

Analisti numerici usano i termini quadratura ed integrazione per distinguere tra approssimazione numerica di un integrale definito ed integrazione numerica di equazioni differenziali. Le routine di quadratura di MATLAB sono quad e quad8. L’asserzione:

Q = quad8('humps',0,1)

calcola l’area sotto la curva nel grafico e fornisce

Q = 29.8583

Finalmente, il grafico mostra che la funzione non è mai zero su questo intervallo. Così, se si cerca uno zero con

z = fzero('humps',.5)

lo si troverà fuori dell’intervallo

z = -0.1316.

 

G. Ciaburro

Successivo: Polinomi

Sommario: Index