Sei sulla pagina 1di 41

MATLAB

Programmare in MATLAB

Le espressioni in MATLAB
MATLAB consente di programmare utilizzando espressioni matematiche, che lavorano con matrici Alla base delle espressioni ci sono Numeri Variabili Operatori Funzioni
2

I Numeri
MATLAB usa la notazione decimale convenzionale con segno La notazione scientifica usa la lettera e (E) per specificare il fattore di scala in potenze di 10. I numeri complessi usano i o j come suffisso. Tutti i calcoli effettuati in MATLAB sono eseguiti in doppia precisione, ma si possono visualizzare in un formato diverso usando i comandi: format short format long Format short e Format long e Virgola fissa con 4 decimali Virgola fissa con 15 decimali Notazione scientifica 4 dec. Notazione scientifica 15 dec.
3

Esempio
x = [4/3 1.2345e-6]
format short format short e format short g format long format long e format long g format bank format rat format hex 1.3333 0.0000 1.3333e+000 1.2345e-006 1.3333 1.2345e-006 1.33333333333333 0.00000123450000 1.333333333333333e+000 1.234500000000000e-006 1.33333333333333 1.2345e-006 1.33 0.00 4/3 1/810045 3ff5555555555555 3eb4b6231abfd271
4

Le Costanti
Nome pi i, j eps realmin Valore 3.14159265 Unit immaginarie, sqrt(-1) Floating-point relative precision, 2-52 Smallest floating-point number, 2-1022 NOTA

I nomi delle costanti


non sono riservati: si pu sovrascrivere ognuno di essi con una nuova variabile

Il valore originale realmax Largest floating-point number, (2-)21023 pu essere ripristinato digitando Inf Infinito
NaN Not-a-number
clear nome_costante

Infinito viene generato quando si divide per zero un valore non nullo o quando ben definite espressioni matematiche forniscono un risultato che supera il massimo limite realmax NaN viene generato quando si vogliono valutare forme indeterminate del tipo 0/0 o Inf-Inf
5

Le Variabili
MATLAB non richiede che le variabili siano dichiarate o dimensionate allinizio del programma Quando MATLAB trova un nuovo nome di variabile crea automaticamente la variabile e alloca la quantit di memoria necessaria. Se la variabile esiste gi MATLAB ne aggiorna il contenuto e, se necessario, varia di conseguenza la memoria ad essa allocata. I nomi di variabili possono essere composti di lettere, numeri, o underscores, ma il primo carattere DEVE essere alfabetico. MATLAB usa solo i primi 31 caratteri del nome della variabile. MATLAB case sensitive, ossia riconosce lettere maiuscole e lettere minuscole. A e a non sonola stessa variabile. Per visualizzare il contenuto delle variabili basta digitarne il nome sulla linea di comando senza punto e virgola oppure cliccare sulla variabile mostrata sul Workspace Browser.
6

Operatori (Richiamo)
Le espressioni usano i ben noti operatori aritmetici e le regole della precedenza aritmetica. + * / \ ^ '
ecc. Somma Sottrazione Moltiplicazione Divisione Divisione a Sinistra Elevamento a Potenza Trasposta Complessa Coniugata per elemento

.* .^ Esegue le operazioni *, ^, ecc. elemento


7

Generazione di Matrici
zeros ones rand randn
Contiene tutti zeri Contiene tutti uno Gli elementi hanno valori casuali uniformemente distribuiti Gli elementi hanno valori casuali a distribuzione normale

Alcuni esempi:

Le Funzioni
MATLAB fornisce un gran numero di funzioni matematiche elementari, come abs, sqrt, exp, and sin.

MATLAB fornisce inoltre molte altre funzioni matematiche pi complesse, tra cui le funzioni di Bessel e le funzioni gamma. La maggior parte di queste funzioni accetta argomenti complessi. Il comando help elfun fornisce una lista delle funzioni matematiche elementari I comandi help specfun e help elmat forniscono rispettivamente una lista delle funzioni pi complesse e delle funzioni matriciali Alcune funzioni, come sqrt e sin, sono built in, fanno parte cio del nucleo di MATLAB e sono veramente efficienti, ma i dettagli computazionali non possono essere visualizzati. Altre funzioni, come gamma and sinh, sono implementate in Mfiles e di queste possibile visualizzare il codice e persino modificarlo a piacere
9

NOTA: Effettuare la radice quadrata o il logaritmo di un numero negativo non d errore: il risultato corretto (complesso) viene calcolato automaticamente

Esempi di Espressioni
rho = (1+sqrt(5))/2 huge = exp(log(realmax))

rho = 1.6180
a = abs(3+4i)

huge = 1.7977e+308
toobig = pi*huge

a = 5
z = sqrt(besselk(4/3,rho-i))

toobig = Inf

z = 0.3730+ 0.3214i

10

Program Files
MATLAB sia un linguaggio di programmazione molto potente sia un ambiente di calcolo interattivo I files che contengono codice in linguaggio MATLAB si chiamano M-files M-files possono essere creati utilizzando un qualsiasi text editor, e poi possono essere usati esattamente come ogni altra funzione o comando MATLAB nella command window. Ci sono due tipi di M-files:

Un programmatore MATLAB principiante pu creare gli M-files che vuole eseguire nella current directory. Via via svilupper molti M-files e preferir organizzarli in pi directories e toolboxes personali che potr inserire nel search path Se si duplicano i nomi delle funzioni, MATLAB esegue la prima che appare nel search path.
11

Scripts (macro) che non accettano variabili in ingresso n forniscono variabili in uscita, bens lavorano con i dati nel workspace. Funzioni che accettano/richiedono normalmente variabili in ingresso e restituiscono variabili in uscita. Le variabili interne costituiscono variabili locali allinterno della funzione.

Scripts
Quando viene lanciato uno script, MATLAB semplicemente esegue i comandi che trova nel file Gli scripts possono lavorare su dati esistenti nel workspace, o possono crearne di nuovi su cui lavorare. Gli scripts non restituiscono alcuna variabile di uscita Tutte le variabili che essi creano rimangono nel workspace e possono essere utilizzate per calcoli successivi. Gli scripts possono produrre uscite grafiche utilizzando funzioni come plot.
12

Esempio di Script
Creiamo con leditor un file script che chiamiamo magicrank.m che contiene i seguenti comandi MATLAB:
% script magicrank.m % Investigate the rank of magic squares r=zeros(1,32); for n=3:32 r(n)=rank(magic(n)); end r bar(r)

13

Uscita dello Script magicrank.m


Lanciare listruzione magicrank fa s che MATLAB esegua i comandi, calcoli il rango delle prime 30 matrici magic, e visualizzi il risultato tramite un diagramma a barre. Quando lesecuzione del file finita le variabili n e r restano nel workspace.

14

Le Funzioni
Le funzioni sono degli M-files che accettano variabili dingresso e restituiscono variabili in uscita Il nome dellM-file dovrebbe essere nomefunzione.m Le funzioni lavorano sulle variabili allinterno del loro workspace che separato dal workspace al quale possiamo accedere dal prompt di MATLAB. La prima riga di una funzione M-file inizia con la parola chiave function. Questo esprime il nome della funzione e lordine delle variabili dingresso. Le righe successive fino al primo spazio o alla prima linea eseguibile sono righe di commento che forniscono il testo dellhelp
15

Esempi di funzioni
LM-file rank.m si trova nella directory toolbox/matlab/matfun Possiamo aprire il file ed abbiamo:
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);

16

Esempi di Funzioni (segue)


In questo caso si hanno fino a 2 variabili dingresso e una variabile duscita. Digitando help rank sulla command window MATLAB visualizzer tutto quello che scritto allinizio della funzione come commento Il resto del file il codice MATLAB eseguibile che definisce la funzione. La variabile s introdotta nel corpo della funzione, cos come le variabili sulla prima riga, r, A and tol, sono tutte locali nella funzione; sono separate da tutte le altre variabili contenute nel workspace. Questo esempio mostra un aspetto delle funzioni di MATLAB che non si trova solitamente in altri linguaggi di programmazione un numero variabile di argomenti
17

Esempi di Funzioni (segue)


La funzione rank pu essere usata in diversi modi:
rank(A) r = rank(A) r = rank(A,1.e-6)

Se non viene indicata una variabile duscita, il risultato viene memorizzto in ans. Se la seconda variabile dingresso non viene fornita, la funzione assume il valore di default. Allinterno del corpo di una funzione, le due grandezze nargin and nargout dicono il numero di variabili di ingresso e duscita utilizzato per ogni particolare uso della funzione. La funzione rank usa nargin, mentre non ha bisogno di usare nargout.
18

Variabili Globali
Per utilizzare una stessa variabile in pi funzioni si dichiara la variabile come global in tutte le funzioni. La dichiarazione delle variabili globali deve essere fatta prima che la variabile venga realmente usata in una funzione. Esempio:
function h = falling(t) global GRAVITY h = 1/2*GRAVITY*t.^2;

Lanciando al prompt le istruzioni:


global GRAVITY GRAVITY = 32; y = falling((0:.1:5))

tramite le due dichiarazioni global rendiamo il valore assegnato a GRAVITY al prompt disponibile anche allinterno della funzione.
19

Vettorizzazione
Per rendere MATLAB pi veloce ed efficiente possibile importante vettorizzare gli algoritmi dei propri M-files. Dove con altri linguaggi di programmazione bisogna usare cicli FOR o DO, MATLAB pu utilizzare operazioni tra vettori o matrici. Es:
x =.1; for k = 1:1001 y(k)=log10(x); x = x+.01 end

Una versione vettorizzata dello stesso codice


x = .01:.01:10 y = log10(x)

Per codici pi complicati le versioni vettorizzate non sono poi cos ovvie. Tuttavia quando la velocit di elaborazione importante bisogna sempre cercare di vettorizzare il proprio algoritmo.
20

Pre-definizione
Qualora non fosse prorpio possibile vettorizzare un pezzo di codice, si possono rendere i cicli pi veloci pre-definendo i vettori o le matrici in cui andranno memorizzati i risultati Esempio:
r = zeros(32,1); for n=1:32 r(n) = rank(magic(n)); end

Senza la pre-definizione nellesempio precedente linterpreter di MATLAB deve aumentare il vettore r di un elemento ogni passo del ciclo. La pre-definizione di un vettore elimina questo step e rende pi veloce lesecuzione.
21

Istruzioni di Flow Control


I costrutti di MATLAB di tipo flow control:

if switch and case for while continue break

22

LOperatore IF
La forma generale del costrutto IF-THEN-ELSE la stessa di un qualsiasi linguaggio di programmazione:
if condizione1, operazioni1; elseif condizione2, operazioni2; else operazioni3; end;

Listruzione if valuta una espressione logica ed esegue un gruppo di istruzioni solo quando lespressione verificata. Le istruzioni elseif e else permettono lesecuzione di gruppi alternativi di istruzioni. La parola end, che chiude un if, termina lultimo gruppo di istruzioni. I gruppi di istruzioni sono delineati dalle 4 parole chiave e non sono necessarie parentesi graffe n quadre. 23

LOperatore IF (segue)
Condizione1,2 devono essere condizioni che restituiscono come risultato VERO (1) o FALSO (0). Gli operatori disponibili per tali confronti sono: <,> <= , >= == ~= & | ~ maggiore di, minore di non superiore a, non inferiore a uguale diverso and logico or logico not logico
24

LOperatore IF - Esempio
Operazioni1,2,3 sono le operazioni da compiere se la condizione corrispondente risulta vera. Le varie istruzioni sono separate da virgole e l'ultima seguita da un punto e virgola. Solo la prima istruzione che verifica la condizione ad essa associata verr eseguita
if n==10, a=b*c, d=e/f; elseif n~=20, a=e*f, d=a/b; else disp ('Errore !!!'); end;
25

LOperatore IF (segue)
E importante chiarire COME gli operatori relazionali e le istruzioni if lavorano sulle matrici. if A == B, ...

La maniera pi appropriata per verificare luguaglianza tra due variabili quella di utilizzare la funzione isequal

Questo codice MATLAB corretto, e fa quello che ci si aspetta quando A e B sono scalari. Quando A e B sono matrici, A == B non va a verificare SE A e B sono uguali, ma testa DOVE sono uguali, ossia per quali elementi; ne risulta unaltra matrice di 0 e 1 che mostra luguaglianza (o meno) elemento-per-elemento. Se infine A e B non hanno la stessa dimensione, A == B d errore.

Ci sono molte funzioni atte a rendere i confronti tra matrici simili ai confronti tra scalari allinterno di costrutti if, ad es.:

if isequal(A,B), ...

(A e B possono anche essere due matrici)

isequal, isempty , all , any

26

LIstruzione Switch
Listruzione switch esegue gruppi di istruzioni in dipendenza dal valore di una variabile o di una espressione. Le parole chiave case e otherwise indicano i gruppi. Viene eseguito solo il primo caso che corrisponde Lo switch deve sempre essere chiuso con un end. Diversamente dal linguaggio C listruzione switch in MATLAB esegue il caso corrispondente alla prima condizione verificata ed esce, quindi listruzione break non richiesta.
27

Istruzioni per Cicli


I cicli si possono fare con due diversi costrutti: Il ciclo for ripete un gruppo di istruzioni un numero fisso, assegnato, di volte:
for k = 1:step:n, operazioni, end;

Il ciclo esegue le operazioni (separate da virgole) incrementando la variabile k da 1 a n con il passo indicato in step. Un end dopo lultima istruzione indica la fine del ciclo Oppure ...
28

Istruzioni per Cicli (segue)


Il ciclo while ripete un gruppo di istruzioni per un numero indefinito di volte sotto il controllo di una condizione logica.
while condizione, operazioni; end;

Il ciclo esegue le operazioni (separate da virgole) fino a che la condizione verificata. La condizione viene costruita con le stesse regole (vincoli ed operatori) di quella dell'IF-THEN-ELSE.
29

Esempi
a = 0; fa = -Inf; for n = 3:32 b = 3; fb = Inf; r(n) = rank(magic(n)); while b-a > eps*b end x = (a+b)/2; r fx = x^3-2*x-5; for i = 1:m if sign(fx) == sign(fa) for j = 1:n a = x; fa = fx; H(i,j) = 1/(i+j); else end b = x; fb = fx; end end end x
30

LIstruzione Break
Listruzione break permette di uscire prima da un ciclo for o while. Se i cicli sono uno dentro laltro, break esce solo dal ciclo nel quale contenuto Esempio: a = 0; fa = -Inf;
b = 3; fb = Inf; while b-a > eps*b x = (a+b)/2; fx = x^3-2*x-5; if fx == 0 break elseif sign(fx) == sign(fa) a = x; fa = fx; else b = x; fb = fx; end end x

31

Importare ed Esportare Dati


Ci sono varie tecniche per importare nel workspace di MATLAB i dati creati da altre applicazioni, compreso un Import Wizard Ed altrettante per salvare le variabili contenute nel workspace in un formato tale da poter essere utilizzate da altre applicazioni L Import Wizard stato introdotto nelle versioni pi recenti di MATLAB e permette di importare dati con estensione .DAT, .TXT, :XLS, ecc. cliccando sul nome del file nel Current Directory Browser o digitando uiimport <nome file> o selezionando File -> Import Data sulla Command Window. Il modo pi veloce in Matlab utilizzare i comandi save e load che salvano e richiamano file con estensione .MAT, che per possono essere utilizzati solo in Matlab Altrimenti si possono utilizzare i comandi standard di scrittura e lettura di un file di testo
32

load carica nel workspace tutte le variabili contenute in matlab.mat load filename carica nel workspace tutte le variabili contenute in filename Se filename non ha estensione, load
controlla se filename un MAT-file. Se ha una estensione diversa, lo considera un file ASCII. load filename X Y Z ... Tra tutte le variabili salvate in filename carica solo le variabili X Y Z specificate. load ascii filename o load mat filename obbliga load a considerare il file come un file ASCII o un file MAT, senza curarsi dellestensione del file. Con -ascii, load d errore se il file non di testo (numerico). Con -mat, load d errore se il file non un MAT-file.

LOAD

File I/O
save

SAVE
salva tutte le variabili del workspace in formato binario nella directory corrente in un MAT-file chiamato matlab.mat. save filename salva tutte le variabili del workspace in filename.mat nella directory corrente. specificate

save filename var1 var2 ... Salva solo le variabili


in

variabili del workspace nel formato specificato da option


33

filename.mat. save ... option salva le

I/O su file di testo


Per creare un archivio: Definisco larchivio file.txt e lo identifico con fid: fid=fopen ( file.txt , wt); Deposito nellarchivio la variabile A (matrice a 2 colonne) nel formato desiderato: fprintf ( nomefile , %6.2g %8.4g\n , A);
la prima colonna con 6 cifre di cui 2 decimali la seconda colonna 8 cifre di cui 4 decimali

Chiudo il file con il comando: fclose (fid); Se voglio analizzare il file cosi creato posso farlo con un editor di testo qualsiasi. Per leggere dati da un archivio: Larchivio di testo file.txt pu anche essere stato generato con un programma esterno. Lo identifico con fid: fid = fopen ( file.txt , r); Si preleva dallarchivio fid la matrice A leggendo le due colonne di numeri in formato %g A = fscanf ( fid, %g %g , [2 inf] );
34

MATLAB
Cenni di Analisi Numerica

Minimizzazione di funzioni Calcolare gli zeri di una funzione Integrazione numerica

35

Come Rappresentare le Funzioni


Le funzioni matematiche possono essere espresse come vere e proprie funzioni MATLAB in M-files o come oggetti inline. Consideriamo per es. la funzione 1 1 f(x) = + 6 2 2 (x 0.3) + 0.01 (x 0.9) + 0.04 Come funzione MATLAB
%humps.m. function y = humps(x) y = 1./((x - 0.3).^2 + 0.01) + 1./((x - 0.9).^2 + 0.04) - 6;

Per calcolare la funzione humps in 2.0, si pu utilizzare loperatore @ per ottenere un function handle (letteralmente manico) per humps, da passare alla funzione feval.
fh = @humps; feval(fh,2.0) ans = -4.8552

36

Come Rappresentare le Funzioni - 2


Come oggetto inline
f = inline( 1./((x-0.3).^2 + 0.01) + 1./((x-0.9).^2 + 0.04)-6 ); f(2.0) ans = -4.8552

E anche possibile creare delle funzioni di pi variabili con il comando inline specificando i nomi delle variabili di ingresso insieme allespressione della funzione Per esempio:

f= inline('y*sin(x)+x*cos(y)','x','y') f(pi,2*pi) ans = 3.1416

37

Minimizzare funzioni di una variabile


Data una funzione matematica di una variabile implementata in un M-file si pu utilizzare la funzione fminbnd per trovare un punto di minimo locale della funzione in un dato intervallo. Per esempio, per trovare un minimo della funzione humps nel range (0.3, 1), la linea di codice
x = fminbnd(@humps,0.3,1)

che restituisce
x = 0.6370

Si pu anche ottenere una tabella di output passando a fminbnd una quarta variabile di ingresso creata dal comando optimset:
x = fminbnd(@humps,0.3,1,optimset('Display','iter'))

38

Minimizzare funzioni di una variabile - 2


Il risultato sar:
Func-count 1 2 3 4 5 6 7 8 9 x 0.567376 0.732624 0.465248 0.644416 0.6413 0.637618 0.636985 0.637019 0.637052 f(x) 12.9098 13.7746 25.1714 11.2693 11.2583 11.2529 11.2528 11.2528 11.2528 Procedure Initial Golden Golden Parabolic Parabolic Parabolic Parabolic Parabolic Parabolic

x = 0.6370

Il risultato mostra il valore corrente di x ed il valore della funzione f(x) ad ogni istante in cui viene calcolata la funzione. Per fminbnd calcolare la funzione corrisponde ad una iterazione dellalgoritmo. Lultima colonna mostra quale procedura viene utilizzata ad ogni iterazione, o la ricerca della sezione aurea o una interpolazione parabolica.
39

Minimizzare funzioni di pi variabili


La funzione fminsearch simile a fminbnd ma lavora con funzioni di pi variabili, ed necessario definire le condizioni iniziali tramite un vettore x0 anzich tramite un intervallo. fminsearch cerca un punto di minimo locale della funzione matematica che sia vicino al vettore x0 e restituisce tale valore in un vettore x.

Esempio

function b = three_var(v) %create a function three_var of 3 variables x = v(1); y = v(2); z = v(3); b = x.^2 + 2.5*sin(y) - z^2*x^2*y^2; v = [-0.6 -1.2 0.135]; a = fminsearch(@three_var,v) a = 0.0000 -1.5708 0.1803
40

Vogliamo trovare un minimo per questa funzione vicino a (-0.6, -1.2, 0.135)

Opzioni per la Minimizzazione


Si possono specificare opzioni di controllo che assegnano alcuni parametri di minimizzazione utilizzando le sintassi:
x = fminbnd(fun,x1,x2,options) x = fminsearch(fun,x0,options)

options una struttura usata dalle funzioni di ottimizzazione. Si usa optimset per assegnare i valori alla struttura options: fminbnd e fminsearch usano solo i parametri riportati di seguito.

options = optimset('Display','iter');

options.Display I passi intermedi nella minimizzazione vengono visualizzati sullo schermo se si assegna 'iter a questa opzione; se, altrimenti, si assegna 'off', non verranno visualizzate le soluzioni intermedie; se, infine, si assegna final verr visualizzato soltanto il risultato finale. options.TolX La tolleranza di arresto per x. Il valore di default 1.e-4. options.TolFun (fminsearch) La tolleranza di arresto per il valore della funzione. Il valore di default 1.e-4. options.MaxFunEvals Il massimo numero di iterazioni previsto. Il valore di default 500 per fminbnd e 200*length(x0) per fminsearch. 41

Trovare gli Zeri di Funzioni


La funzione fzero cerca per quale valore una equazione di una variabile si annulla. Tale funzione accetta come condizione iniziale sia un valore (punto di partenza) sia un vettore di due elementi che rappresenta un intervallo. Fornendo a fzero un punto di partenza x0, fzero inizialmente cerca un intervallo intorno a questo punto in cui la funzione cambia segno.

In alternativa, se si conoscono due punti dove la funzione assume segni opposti, si pu specificare lintervallo iniziale tramite un vettore di due elementi; fzero sicuramente restringer questo intervallo fino a restituire un valore vicino al punto di cambiamento di segno.
42

Se lo trova, fzero restituisce un valore vicino a quello in cui la funzione cambia segno. Altrimenti, restituisce NaN.

Esempio
Usiamo fzero per calcolare uno zero della funzione humps vicino a -0.2
a = fzero(@humps,-0.2) a = -0.1316

fzero cerca in un intorno di -0.2 fin quando trova un cambio di

segno tra -0.10949 and -0.264. Questo intervallo viene poi ristretto fino a -0.1316. Possiamo verificare che in -0.1316 la funzione assume un valore molto vicino a zero:
humps(a) ans = 8.8818e -16

Supponiamo ora di conoscere due punti dove i valori della funzione humps hanno segno opposto come per es. x = 1 and x = -1.
43

Esempio (segue)
humps(1) ans = 16 humps(-1) ans = -5.1378

Possiamo allora fornire questo intervallo ad fzero che restituir un punto vicino a dove la funzione cambia segno. Possiamo anche visualizzare i risultati passo passo. Le iterazioni dellalgoritmo prevedono la bisezione o linterpolazione che vengono indicate nellultima colonna dal titolo Procedure. Nel caso in cui si parta da un solo punto anzich da un intervallo, i primi passi potrebbero includere alcune iterazioni in cui fzero cerca un intervallo che contenga un cambio di segno. Si pu specificare la tolleranza dellerrore relativo tramite optimset. Se si passa una matrice vuota verr utilizzato il valore 44 di default (eps).

options = optimset('Display','iter'); a = fzero(@humps,[-1 1],options)


Func-count 1 1 2 3 4 5 6 7 8 9 10 11 12 a = -0.1316 x -1 1 -0.513876 0.243062 -0.473635 -0.115287 -0.150214 -0.132562 -0.131666 -0.131618 -0.131618 -0.131618 -0.131618 f(x) -5.13779 16 -4.02235 71.6382 -3.83767 0.414441 -0.423446 -0.0226907 -0.0011492 1.88371e-07 -2.7935e-11 8.88178e-16 -9.76996e-15 Procedure initial initial interpolation bisection interpolation bisection interpolation interpolation interpolation interpolation interpolation interpolation interpolation

... in codice

45

Integrazione Numerica (Quadrature)


Larea al di sotto di una sezione di una funzione F(x) pu essere calcolata integrando numericamente F(x), un processo noto come quadrature. Le funzioni quadrature in MATLAB sono:
I. II. III. IV.

quad Usa il metodo adattativo di Simpson quadl Usa il metodo adattativo di Lobatto dblquad Calcola numericamente integrali doppi triplequad Calcola numericamente integrali tripli
q = quad(@humps,0,1) q = 29.8583

Per integrare la funzione definita in humps.m da 0 a 1:

Entrambi quad e quadl lavorano ricorsivamente. Quando incontrano una possibile singolarit visualizzano un warning. Si pu passare a quad o a quadl un quarto argomento che specifica la tolleranza dellerrore relativo per lintegrazione. Se si specifica anche un quinto argomento non nullo vengono visualizzate anche i valori delle funzioni calcolati ad ogni iterazione
46

Esempio: Calcolare la lunghezza di una curva


Consideriamo la curva parametrizzata dalle equazioni: x(t) = sin(2t), y(t) = cos(t), z(t) = t dove t[0,3p]. Un grafico in 3-D di questa funzione Esiste un teorema che ci dice che la lunghezza della curva lintegrale della norma delle derivate delle equazioni parametrizzate:
3

t = 0:0.1:3*pi; plot3(sin(2*t),cos(t),t)

4 cos2 (2 t) + sin2( t) + 1 dt

Definiamo la funzione hcurve che calcola lintegrando Calcoliamo lintegrale tramite quad
len = quad(@hcurve,0,3*pi) len = 1.7222e+01 function f = hcurve(t) f = sqrt(4*cos(2*t).^2 + sin(t).^2 + 1);

La lunghezza di questa curva circa 17.2.

47

Esempio: Integrale doppio


Vogliamo risolvere per via numerica lintegrale
y MAX x MAX y MIN x MIN

dxdy f(x, y)

Sia f(x,y)=ysin(x)+xcos(y). Il primo passo consiste nel costruire la funzione da calcolare. La funzione deve restituire un vettore duscita dato un vettore in ingresso. Bisogna anche tenere presente quale variabile compete allintegrale pi interno e quale a quello pi esterno. In questo nostro esempio, la variabile pi interna x e quella pi esterna y (lordine nellintegrale dxdy). In questo caso, la funzione integranda sar Per calcolare lintegrale abbiamo a disposizione due funzioni, quad e quadl, che possono essere chiamate da dblquad. Questo M-file calcola il loop pi esterno usando quad o quadl. Ad ogni iterazione, quad (quadl) chiama una seconda funzione ausiliaria che calcola il ciclo pi interno. Per calcolare lintegrale doppio si usa
result = dblquad(@integrnd,xmin,xmax,ymin,ymax);
48

function out = integrnd(x,y) out = y*sin(x) + x*cos(y);

Esempio (segue)
@integrnd una stringa che rappresenta il nome della funzione integranda xmin esprime il limite inferiore dellintegrale pi interno xmax esprime il limite superiore dellintegrale pi interno ymin esprime il limite inferiore dellintegrale pi esterno ymax esprime il limite superiore dellintegrale pi esterno

Ad esempio:

xmin = pi; xmax = 2*pi; ymin = 0; ymax = pi; result = dblquad(@integrnd,xmin,xmax,ymin,ymax) result = -9.8698.

Per default, dblquad chiama quad. Per svolgere lintegrale doppio dellesempio proposto usando quadl (assumendo come tolleranza il valore di default), si usa Si pu passare a dblquad qualsiasi nome di funzione quadrature definita dallutente purch ovviamente abbia gli stessi argomenti di 49 ingresso e di uscita di quad
result = dblquad(@integrnd,xmin,xmax,ymin,ymax,[],@quadl);

MATLAB Calcolo Numerico


Polinomi Equazioni alle differenze e filtraggi Analisi di Fourier e FFT Curve di Regressione

50

Operazioni su/con Polinomi


Rappresentare i polinomi in MATLAB Calcolare le radici di un polinomio Calcolare i coefficienti del polinomio caratteristico di una matrice Calcolare un polinomio per un certo valore della variabile Moltiplicazione/divisione tra polinomi Derivata di un polinomio Trovare il polinomio che meglio approssima landamento di punti dati (es. dati sperimentali) Conversioni tra espansioni in fratti semplici e coefficienti del polinomio associato
51

Elenco delle Funzioni per i Polinomi


FUNZIONE conv deconv poly polyder polyfit polyval polyvalm residue roots DESCRIZIONE Moltiplicazione di polinomi Divisione di polinomi Date le radici di un polinomio ne calcola i coefficienti Calcola la derivata di un polinomio Regressione di curve tramite polinomi Calcolo di polinomi Calcolo di polinomi matriciali Espansione in fratti semplici (residui) Trova le radici di un polinomio
52

Rappresentazione dei Polinomi


MATLAB rappresenta un polinomio tramite un vettore riga Gli elementi di tale vettore riga sono i coefficienti del polinomio ordinati secondo le potenze decrescenti Ad esempio, per rappresentare in MATLAB il polinomio: p(x) = x3 2x 5 bisogna definire il vettore p = [1 0 -2 -5]
53

Calcolo delle radici di un polinomio


Il calcolo delle radici di un polinomio viene fatto dalla funzione roots:
r = roots(p) r = 2.0946 -1.0473 + 1.1359i -1.0473 - 1.1359i

Per convenzione, MATLAB salva le radici in vettori colonna La funzione inversa a roots, ossia la funzione che date in ingresso le radici di un polinomio ne calcola i coefficienti, si chiama poly:
p2 = poly(r) p2 = 1 8.8818e-16 -2 -5

54

Polinomi Caratteristici
La funzione poly calcola anche i coefficienti del polinomio caratteristico di una matrice
A = [1.2 3 -0.9; 5 1.75 6; 9 0 1]; poly(A) ans = 1.0000 -3.9500 -1.8500 -163.2750

Le radici di questo polinomio, calcolate con roots, sono le radici caratteristiche, o autovalori, della matrice A. (Per calcolare direttamente gli autovalori (eigenvalues in inglese) di una matrice esiste la funzione eig)

55

Calcolo di un Polinomio
La funzione polyval calcola un polinomio per un dato valore. Per es. calcoliamo p(s) = s32s5 per s = 5:
polyval(p,5) ans = 110

E anche possibile calcolare un polinomio la cui variabile sia una matrice. In questo caso p(s)=s32s5 diventa p(X)=X32X5I dove X una matrice quadrata e I la matrice identit. Per es. Definiamo una matrice X e calcoliamo il polinomio p in X:
X = Y = Y = 377 111 490 [2 4 5; -1 0 3; 7 1 5]; polyvalm(p,X) 179 439 81 136 253 639

56

Moltiplicazione e Divisione di Polinomi


Le operazioni di moltilicazione e divisione di polinomi corrispondono alle operazioni di convoluzione e deconvoluzione implementate nelle funzioni conv e deconv Ad es., vogliamo calcolare il prodotto dei polinomi e b(s)=4s2+5s+6 a(s)=s2+2s+3 Definiamo: Il prodotto risulta:
c = conv(a,b) c = 4 13 28 27 18 a = [1 2 3]; b = [4 5 6];

Per riottenere uno dei fattori dal prodotto, uso invece la deconvoluzione:
[q,r] = deconv(c,a) q = 4 5 6 r = 0 0 0 0 0

57

Derivare un Polinomio
Si usa la funzione polyder . Per es., per calcolare la derivata del polinomio p = [1 0 -2 -5]:
q = polyder(p) q = 3 0 -2 a = [1 3 5]; b = [2 4 6];

polyder calcola anche la derivata del prodotto o della divisione di due polinomi. Per es., siano:
La derivata del prodotto a*b si ottiene lanciando polyder con una sola variabile duscita:
c = polyder(a,b) c = 8 30 56 38

Se invece chiedo 2 variabili di uscita, polyder restituisce a/b:


[q,d] = polyder(a,b) q = -2 -8 -2 d = 4 16 40 48 36

58

polyfit trova i coefficienti del polinomio di ordine assegnato che meglio approssima un insieme di dati in termini dellerrore quadratico medio
dove x e y sono i vettori che contengono i dati x e y=f(x) da approssimare, e n lordine del polinomio richiesto Esempio:
x = [1 2 3 4 5]; y = [5.5 43.1 128 290.7 498.4]; p = polyfit(x,y,3) p = -0.1917 31.5821 -60.3262 35.3400 x2 = 1:.1:5; y2 = polyval(p,x2); plot(x,y,'o',x2,y2) grid on

Approssimare con un polinomio landamento di punti dati


p = polyfit(x,y,n)

59

Espansione in fratti semplici


La funzione residue effettua lespansione in fratti semplici del rapporto di due polinomi Questa rappresentazione particolarmente utile per applicazioni in cui si rappresentino i sistemi tramite la loro funzione di trasferimento. Per due polinomi b e a, se non ci sono radici multiple, si ha b (s) r1 r2 rn = + + ... + + ks a (s) s p1 s p2 s pn dove r un vettore colonna che contiene i residui, p un vettore colonna che contiene i poli e k un vettore riga che contiene i termini noti Se invece diamo in ingresso alla funzione residue tre variabili (r, p, e k), essa restituisce la forma polinomiale
60

Esempio
Si consideri la funzione di trasferimento:
[r,p,k] = residue(b,a) r = -12 8 12 p = -4 s + 4 -2 k = [] [b2,a2] = residue(r,p,k) b2 = -4 8 a2 = 1 6 8

- 4s + 8 s2 + 6s + 8

Posso rappresentarla con i due polinomi b=[-4 8] ed a=[1 6 8]

8 s + 2

4s + 8 (s) b2 = 2 (s) a2 s + 6s + 8
61

Regressioni e Fit di Curve


Spesso utile trovare delle funzioni che descrivano la relazione che esiste tra le variabili osservate Lidentificazione dei coefficienti della legge selezionata spesso conduce alla formulazione di un sistema di equazioni lineari Noi consideremo i seguenti tipi di regressione:

Supponiamo di aver misurato una grandezza y a diversi istanti del tempo t:


t = [0 .3 .8 1.1 1.6 2.3]'; y = [0.5 0.82 1.14 1.25 1.35 1.40]'; plot(t,y,'o'), grid on

Polinomiale Lineare nei parametri Regressioni multiple

62

Regressione Polinomiale
Dalla figura sembra che questi dati possano essere rappresentati con un polinomio del tipo: I coefficienti a0, a1, and a2 possono essere calcolati tramite un fit ai minimi quadrati (least squares fit), che minimizza la somma dei quadrati delle deviazioni dei dati dal modello. Si ottengono 6 equazioni in 3 incognite:
y=a0+a1t+a2t2

1 t1 y 1 y 1 t2 2 1 t3 y 3 = 1 t4 y 4 1 t y 5 5 y 6 1 t6

2 t1 2 t2 a 2 0 t3 a1 2 t4 a 2 2 t5 2 t6

63

Regressione Polinomiale (segue)


Il sistema di equazioni pu essere rappresentato dalla matrice 6x3
X = [ones(size(t)) t t.^2] X = 1.0000 0 0 1.0000 0.3000 0.0900 1.0000 0.8000 0.6400 1.0000 1.1000 1.2100 1.0000 1.6000 2.5600 1.0000 2.3000 5.2900

E la soluzione pu essere calcolata utilizzando loperatore

backslash:
a = X\y a = 0.5318 0.9191 - 0.2387

Che corrisponde al seguente polinomio di secondo grado:


y = 0.5318 + 0.9191 t - 0.2387 t2
64

Regressione Polinomiale (segue)


Adesso calcoliamo il modello su un insieme pi fitto di punti a spaziatura regolare e sovrapponiamo su un unico grafico la curva di fit ai dati originali.

T = (0:0.1:2.5)'; Y = [ones(size(T)) T T.^2]*a; plot(T,Y,'-',t,y,'o'), grid on

Questo fit non approssima perfettamente i dati. Per ottenere una approssimazione migliore potremmo aumentare lordine del polinomio di fit o considerare altre funzioni
65

Regressione lineare nei parametri


Anzich una funzione polinomiale potremmo considerare una funzione lineare nei parametri, come per es. la funzione esponenziale:
y = a0+a1e-t+a2te-t

Risolvendo tramite loperatore backslash il sistema dei minimi quadrati con la matrice di regressione X, otteniamo:
X = [ones(size(t)) exp(-t) t.*exp(-t)]; a = X\y y = 1.3974 -0.8988 e-t+ 0.4097 te-t

66

Regressione Multipla
Quando y una funzione di pi variabili indipendenti, la matrice rappresentativa del sistema di equazioni esprimer la relazione tra le diverse variabili Supponiamo di aver misurato una grandezza in corrispondenza di diversi valori dei parametri x1 e x2 dati da
x1 = [.2 .5 .6 .8 1.0 1.1]'; x2 = [.1 .3 .4 .9 1.1 1.4]'; y = [.17 .26 .28 .23 .27 .24]';

Un modello a multivariabile per questi dati pu essere: Risolviamo secondo la procedura gi vista: Il modello ai minimi quadrati dei dati considerati risulta:
y = 0.1018 + 0.4844 x1 0.2847 x2
67

y = a0 + a1x1 + a2x2

X = [ones(size(x1)) x1 x2]; a = X\y

Fit Polinomiale o Esponenziale?


Function polyfit polyval Description Fit con curve polinomiali Calcola il fit polinomiale

Sia y il vettore delle osservazioni di una certa grandezza in funzione di un parametro x. Un fit polinomiale di grado n dei dati y su x si calcola con il seguente comando: Dallosservazione dei dati potrebbe sembrare pi conveniente applicare un fit con una funzione esponenziale. Questo pu essere fatto utilizzando le stesse funzioni (con n=1):
logp1 = polyfit(x,log10(y),1); logpred1 = 10.^polyval(logp1,x); Figure(f), semilogy(x,logpred1,'-',x,y,'+');
68

p = polyfit(x,y,n) yfit = polyval(p,x);

Equazioni alle Differenze e Filtri


Esistono in MATLAB delle funzioni (che operano principalmente su vettori) per lavorare con equazioni alle differenze finite e con i filtri. Tali vettori possono contenere segnali campionati o sequenze per lelaborazione dei segnali e lanalisi di dati. In generale unequazione alle differenze finite ha una espressione N M del tipo e serve a rappresentare la relazione ingresso-uscita di un sottoinsieme dei sistemi lineari tempo invarianti (quelli per cui luscita pu essere espressa da una combinazione lineare ricorsiva)
k =0

a y(n
k

k) =

m =0

b x(n
m

m)

Sistema LTI

Per sistemi ad ingresso multiplo la matrice delle uscite dovr essere definita in modo tale che ogni riga contenga i campioni relativi ad ogni ingresso in corrispondenza delle sue colonne
69

La funzione filter
La funzione elabora i dati contenuti nel vettore x con il filtro descritto dai vettori a e b, creando il vettore dei dati filtrati y. Il comando filter pu essere pensato come una efficiente implementazione dellequazione alle differenze finite. La struttura di tale filtro quella generale di un filtro tapped delay-line descritto dallequazione alle differenze dove n lindice del campione attuale, na lordine del polinomio descritto dal vettore a e nb lordine del polinomio descritto dal vettore b. Luscita y(n) una combinazione lineare dei valori della variabile dingresso attuali e precedenti, x(n) x(n-1) ..., e dei valori precedenti della variabile in uscita, y(n-1) y(n-2) ...
70

y = filter(b,a,x)

a(1)y(n) = b(1)x(n)+b(2)x(n-1)+...+b(nb)x(n- nb +1)- a(2)y(n-1)-...-b(na)y(n- na +1)

Esempio
Supponiamo di voler rendere pi morbido landamento dei dati sul traffico con un filtro che media ogni punto dei dati su una finestra temporale sliding avente una durata di 4 ore. Questo processo rappresentato dalla equazione alle differenze 1 1 1 1 y(n) = x (n) + x (n 1) + x (n 2) + x (n 3) 4 4 4 4 In MATLAB:
a = 1; b = [1/4 1/4 1/4 1/4]; load count.dat x = count(:,1); y = filter(b,a,x); t = 1:length(x); plot(t,x,'-.',t,y,'-'), grid on legend('Original Data',... ...'Smoothed Data',2)
71

Analisi di Fourier e Trasformata di Fourier Veloce (FFT)


Funzione fft fft2 fftn ifft ifft2 ifftn abs angle fftshift cplxpair nextpow2 Descrizione Trasformata di Fourier discreta Trasformata di Fourier discreta bi-dimensionale Trasformata di Fourier discreta n-dimensionale Trasformata di Fourier discreta inversa Trasformata di Fourier discreta inversa bi-dimensionale Trasformata di Fourier discreta inversa n-dimensionale Modulo Fase Porta lo zero delle frequenze al centro dello spettro Ordina i numeri in coppie complesse coniugate Calcola la successiva potenza di due
72

MATLAB
Statistics Toolbox
For Use with MATLAB

Probability density function (pdf) Cumulative distribution function (cdf) Inverse of the cumulative distribution function Random number generator Mean and variance as a function of the parameters

73

Introduzione
Lo Statistics Toolbox prevede 20 distribuzioni di probabilit, a ciascuna delle quali sono associate 5 funzioni:

Probability density function (pdf) Cumulative distribution function (cdf) Inverse of the cumulative distribution function Generatore di numeri casuali Media e varianza in funzione dei parametri

Lo Statistics Toolbox contiene anche funzioni che effettuano i pi comuni test delle ipotesi Infine, lo Statistics Toolbox include funzioni che generano numeri casuali con varie distribuzioni di probabilit. Queste funzioni si basano sulluso delle ben note funzioni di MATLAB rand e/o randn per generare i loro outputs.

74

Distribuzioni di Probabilit?
Le distribuzioni di probabilit entrano in gioco quando si ha a che fare con esperimenti (prove) il cui esito casuale. La natura stessa dellesperimento impone quale distribuzione di probabilit pu essere pi appropriata per modellare gli esiti casuali di tale esperimento. Usare un modello statistico non d la facolt di prevedere il risultato di ogni singolo esperimento ma d la probabilit che un dato risultato cada allinterno di un certo intervallo di valori. Ci sono due tipi di distribuzioni: continue e discrete.
75

Esempi
Supponiamo di dover studiare una macchina che produce videocassette. Una misura della qualit del nastro il numero di difetti visivi in ogni decina di metri di nastro. Il risultato di questo esperimento un intero, perch non possibile osservare 1.5 difetti. Per modellare questo esperimento dovremmo quindi usare una distribuzione di probabilit discreta. Una misura che influenza il costo e la qualit del nastro il suo spessore. Costa infatti di pi produrre nastri pi spessi, mentre variazioni nello spessore del nastro sulla bobina aumentano la probabilit di rottura. Supponiamo di misurare lo spessore del nastro ogni 100 metri. Il risultato della misura pu assumere un continuo di valori possibili, per cui opportuno utilizzare una distribuzione continua per modellizzare i risultati.
76

Distribuzioni di Probabilit incluse nello Statistics Toolbox


Continue (dati) Beta Exponential Gamma Lognormal Normal Rayleigh Uniform Weibull Continue (statistiche) Chi-square Noncentral Chi-square t Noncentral t Discrete Binomial Discrete Uniform Geometric Hypergeometric Negative Binomial Poisson

77

Funzione Densit di Probabilit (pdf)


La chiamata ad una funzione pdf ha lo stesso formato per ogni distribuzione definita nello Statistics Toolbox. I seguenti comandi mostrano come chiamare la pdf per la distribuzione NORMALE: La variabile f contiene la densit di probabilit della distribuzione normale (=0 e =1) in corrispondenza dei valori in x. Il primo argomento di ingresso di tutte le pdf linsieme di valori in cui si vuole calcolare la densit. Gli altri argomenti contengono tutti i parametri necessari per definire la distribuzione in maniera univoca. Per es. la distribuzione normale richiede due parametri, uno di posizione (la media, ) ed uno di scala (la deviazione standard, ).
78

x = [-3:0.1:3]; f = normpdf(x,0,1);

Cumulative Distribution Function (cdf)


La chiamata alla funzione cdf ha lo stesso formato generale per ogni distribuzione compresa nello Statistics Toolbox. I seguenti comandi mostrano come chiamare la cdf per la distribuzione NORMALE: La variabile p contiene le probabilit associate alla cdf normale, ossia con parametri =0 and =1, in corrispondenza dei valori in x. Il primo argomento di ingresso di tutte le cdf linsieme dei valori per i quali si vuole calcolare la probabilit. Gli altri argomenti contengono tutti i parametri necessari per definire la distribuzione in maniera 79 univoca.
x = [-3:0.1:3]; p = normcdf(x,0,1);

Generazione di Numeri Casuali


I metodi per generare numeri casuali aventi una qualsiasi distribuzione sono basati sullopportuna elaborazione di numeri casuali a distribuzione uniforme. Ci sono 3 metodi: diretto o tramite inversione o tramite rejection. Il metodo dellinversione

Il metodo dellinversione basato sul noto teorema fondamentale che lega la distribuzione uniforme alle altre distribuzioni continue:

Se F una distribuzione continua avente inversa F -1, ed U un numero casuale uniforme, allora F -1(U) segue la distribuzione F.
Allora si pu generare un numero casuale a distribuzione qualsiasi applicando la funzione inversa della distribuzione in esame ad un numero casuale a distribuzione uniforme. 80

Funzioni per la Generazione di Numeri Casuali


Lo Statistics Toolbox contiene funzioni che generano numeri casuali per ciascuna delle distribuzioni elencate nella seguente tabella. Queste funzioni usano le funzioni di MATLAB rand e/o randn per generare le loro uscite.
Funzioni betarnd binornd chi2rnd exprnd evrnd frnd gamrnd geornd hygernd iwishrnd lognrnd mvnrnd Dipendenza rand, randn rand rand, randn rand rand rand, randn rand rand rand rand, randn randn randn Funzioni mvtrnd nbinrnd ncfrnd nctrnd ncx2rnd normrnd poissrnd mvnrnd mvtrnd nbinrnd Dipendenza rand, randn rand, randn rand, randn rand, randn randn randn rand, randn randn rand, randn rand, randn
81

La sintassi per le funzioni che generano numeri casuali


Si possono generare numeri casuali distribuiti secondo ognuna delle distribuzioni previste Le funzioni preposte forniscono un singolo valore casuale o una matrice di numeri casuali, in dipendenza dagli argomenti che si specificano nella chiamata alla funzione.

Esempio: Distribuzione Beta


a = 1; b = 2; c = [.1 .5; 1 2]; d = [.25 .75; 5 10]; m = [2 3]; nrow = 2; ncol = 3; r1 = betarnd(a,b) r1 = matrici 0.4469

scalare

2x3

r2 = betarnd(c,d) r2 = 0.8931 0.4832 matrice 0.1316 0.2403 r3 = betarnd(a,b,m) r3 = 0.4196 0.6078 0.1392 0.0410 0.0723 0.0782 r4 = betarnd(a,b,nrow,ncol) r4 = 0.0520 0.3975 0.1284 0.3891 0.1848 0.5186

2x2

82