Scripts e Funzioni
MATLAB è un linguaggio di programmazione potente così come un
ambiente computazionale interattivo. 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:
1)Scripts che non accettano argomenti d'entrata o argomenti di uscita.
Loro operano su dati nel workspace.
2)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 puoi 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 non forniscono 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 magicrank.m che contiene questi comandi MATLAB:
% Determinazione del rango della magic squares
r = zeros(1,32);
for n = 3:32
r(n) = rank(magic(n));
end
r
bar(r)
Digitando l'asserzione:
magicrank
imponiamo a MATLAB di eseguire i comandi, calcola il rango delle prime 30
magic squares, e traccia il grafico del risultato. 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.
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.
function r = rank(A,tol)
% RANK Matrix rank.
% RANK(A) provides an estimate of the number of linearly
% independent rows or columns of a matrix A.
% RANK(A,tol) is the number of singular values of A
% that are larger than tol.
% RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.
s = svd(A);
if nargin==1
tol = max(size(A)) * max(s) * eps;
end
r = sum(s > tol);
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, rappresentano dei commenti
per un aiuto, non vengono considerate nell'applicazione, e sono precedute dal simbolo %.
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 trovano
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)
Molte M-file lavorano così. Se nessuno argomento di output è approvvigionato, il risultato è
immagazzinato in ans. Se il secondo argomento di input non è approvvigionato, 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.
Variabile globale
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 August17.dat
help magic
type rank
Un metodo alternato di approvvigionare i modificatori di comando fornisce una sequenza di
argomenti di funzioni.
load('August17.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 implementare una più potente
agevolazione 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.
for d = 1:31
s = ['load August' int2char(n) '.dat']
eval(s)
% Process the contents of the d-th file
end
Vettorizzazione
È 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.
x = 0;
for k = 1:1001
y(k) = log10(x);
x = x + .01;
end
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 della funzione
Una classe di funzioni, chiamate "funzioni della funzione," lavorano con funzioni nonlineari
di una variabile scalare . Ovvero, una funzione lavora su un altra funzione. Le
funzioni della funzione includono:
-Zero finding
-Optimization
-Quadrature
-Ordinary differential equations
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)
Il grafico mostra che la funzione ha un minimo locale vicino a 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,
humps(p)
ans =
11.2528
Analisti numerici usano i termini quadratura ed integrazione per distinguere
tra approssimazione numerica di un integrale definito e
integrazione numerico 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.