Laboratorio di Stima e Filtraggio: Introduzione a Matlab - Automatica
Laboratorio di Stima e Filtraggio: Introduzione a Matlab - Automatica
Laboratorio di Stima e Filtraggio: Introduzione a Matlab - Automatica
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Laboratorio</strong> <strong>di</strong> <strong>Stima</strong> e <strong>Filtraggio</strong>:<br />
<strong>Introduzione</strong> a <strong>Matlab</strong><br />
Chiara Masiero<br />
masiero.chiara@dei.unipd.it<br />
DEI - UniPD<br />
8 Maggio 2013<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 1 / 1
Sommario<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 2 / 1
<strong>Matlab</strong>: cos’è?<br />
<strong>Introduzione</strong><br />
MATrix LABoratory: nasce come software<br />
per il calcolo numerico (vettoriale e<br />
matriciale) a fine anni ’70.<br />
Applicazioni: sistemi <strong>di</strong> controllo, comunicazioni, progettazione<br />
elettronica, ottimizzazione, statistica, biologia computazionale,<br />
finanza, elaborazione <strong>di</strong> immagini, calcolo parallelo. . .<br />
http://www.mathworks.com/products/matlab/<br />
Un’alternativa open source: GNU Octave<br />
http://www.gnu.org/software/octave/<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 3 / 1
<strong>Introduzione</strong><br />
<strong>Matlab</strong>: come si presenta?<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 4 / 1
<strong>Matlab</strong>: l’interfaccia<br />
Elementi fondamentali<br />
1 Command window<br />
2 Workspace<br />
3 Current <strong>di</strong>rectory<br />
4 Command history<br />
5 E<strong>di</strong>tor<br />
<strong>Introduzione</strong><br />
Possiamo impartire le istruzioni. . .<br />
1 . . . tramite la command window: ogni istruzione viene eseguita<br />
imme<strong>di</strong>atamente, ma chiudendo il programma per<strong>di</strong>amo il nostro<br />
lavoro;<br />
2 . . . scrivendole nell’e<strong>di</strong>tor e salvandole in uno script. In questo modo<br />
possiamo conservare il programma in memoria. Inoltre, l’e<strong>di</strong>tor fornisce<br />
anche strumenti che semplificano la programmazione.<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 5 / 1
Definizione delle variabili<br />
Istruzioni <strong>di</strong> base<br />
Definire una variabile numerica:<br />
» a = 5<br />
Definire una stringa:<br />
» s = ’hello’<br />
Definire un vettore<br />
» vettore = [6 2 1 4]<br />
Definire una matrice<br />
» matrice = [1 2; 3 4]<br />
Definire una matrice a elementi complessi:<br />
» C = [2 3+1i; 4; 5-3*1i]<br />
Per sopprimere l’echo: terminare le istruzioni con il punto e virgola:<br />
» k = 10;<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 6 / 1
Gestione delle variabili<br />
Istruzioni <strong>di</strong> base<br />
Lista delle variabili definite nel workspace:<br />
» who<br />
Descrizione delle variabili definite nel workspace:<br />
» whos<br />
Salvataggio <strong>di</strong> tutte le variabili nel file data.mat:<br />
» save data<br />
Salvataggio della sola variabile a:<br />
» save data a<br />
Cancellazione <strong>di</strong> tutte le variabili dal workspace:<br />
» clear all<br />
Cancellazione della sola variabile a:<br />
» clear a<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 7 / 1
Istruzioni <strong>di</strong> base<br />
Vettori: operazioni <strong>di</strong> base - 1<br />
Definire il vettore v = [ 2 4 6 8 ]:<br />
» v = [2 4 6 8]<br />
Lunghezza <strong>di</strong> un vettore:<br />
» l = length(v)<br />
Vettore trasposto (e ad elementi coniugati): » v’ ans = 2 4 68<br />
Sommare gli elementi:<br />
» sum(v) ans = 20<br />
Moltiplicare gli elementi:<br />
» prod(v) ans = 384<br />
Vettore simmetrico:<br />
» fliplr(v) ans = 8 6 4 2<br />
Attenzione: fliplr funziona per vettori riga. Per vettori colonna<br />
utilizzare flipud.<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 8 / 1
Istruzioni <strong>di</strong> base<br />
Vettori: operazioni <strong>di</strong> base - 2<br />
Sia v = [ 2 4 6 8 ]<br />
Estrarre elementi. Attenzione: gli in<strong>di</strong>ci in <strong>Matlab</strong> partono da 1:<br />
» a = v(3) ans = 6<br />
» v_2 = v(2:-1:1) ans = 4 2<br />
In<strong>di</strong>ci degli elementi che sod<strong>di</strong>sfano una con<strong>di</strong>zione:<br />
» find(v>5)<br />
ans =<br />
3 4<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 9 / 1
Istruzioni <strong>di</strong> base<br />
Matrici: operazioni <strong>di</strong> base - 1<br />
Definire la matrice M = [ 2 4<br />
6 8 ]:<br />
» M = [2 4 ; 6 8]<br />
Dimensioni <strong>di</strong> una matrice:<br />
» [num_righe,num_colonne] = size(M)<br />
Estrarre elementi.<br />
» a_12 = M(1,2) ans = 4<br />
» riga_1 = M(1,:) ans = 2 4<br />
» colonna_2 = M(:,2) ans = 4 8<br />
Autovalori e inversione:<br />
» eig(M) ans =<br />
» inv(M) ans =<br />
−0.7446<br />
10.7446<br />
−1.0000 0.5000<br />
0.7500 −0.2500<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 10 / 1
Istruzioni <strong>di</strong> base<br />
Matrici: operazioni <strong>di</strong> base - 2<br />
Sia C = <br />
2 3+i<br />
4 5−3i .<br />
Matrice trasposta e coniugata:<br />
2.0000 4.0000<br />
» C’ ans = 3.0000−1.0000i 5.0000+3.0000i<br />
Siano A = [ 1 2<br />
3 4 ], B = [ 6 7<br />
8 9 ].<br />
Somma <strong>di</strong> matrici: » A + B ans =<br />
7 9<br />
11 13<br />
Prodotto <strong>di</strong> matrici:<br />
» A * B ans = 22 25<br />
50 57<br />
Prodotto elemento per elemento » A .* B ans =<br />
6 14<br />
24 36<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 11 / 1
Polinomi -1<br />
Istruzioni <strong>di</strong> base<br />
In <strong>Matlab</strong> possiamo rappresentare i polinomi come vettori dei<br />
coefficienti a potenze decrescenti. Definiamo p(z) = 2z 3 + 7z − 5:<br />
» p = [2 0 7 -5]<br />
Per valutare il polinomio per z = 3:<br />
» p_in_3 = polyval(p,3)<br />
Per calcolare le ra<strong>di</strong>ci <strong>di</strong> p(z):<br />
» r = roots(p) ans = −0.3198+1.9511i<br />
−0.3198−1.9511i<br />
0.6395<br />
Per ottenere un polinomio monico le cui ra<strong>di</strong>ci siano 3, 2 ± 5i:<br />
» r2 = [3 2+5∗1i 2−5∗1i] ;<br />
» p2 = poly(r2)<br />
ans = 1 −7 41 −87<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 12 / 1
Polinomi - 2<br />
Istruzioni <strong>di</strong> base<br />
Siano p1(x) = x 2 − 3x − 4, p2(x) = 3x 2 − 3x + 8 e p3(x) = x + 4:<br />
p1=[ 1 −3 −4 ];<br />
p2=[ 3 −3 8 ];<br />
p3=[ 1 4 ];<br />
Per calcolare il prodotto <strong>di</strong> p1(x) con p3(x):<br />
» q1 = conv(p1,p3)<br />
ans = 1 1 −16 −16<br />
Per calcolare quoziente e resto nella <strong>di</strong>visione <strong>di</strong> p2(x) per p3(x):<br />
» [q2,r2] = deconv(p2,p3)<br />
q2 =<br />
r2 =<br />
3 −15<br />
0 0 68<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 13 / 1
Istruzioni logiche<br />
Istruzioni con<strong>di</strong>zionali e cicli iterativi<br />
<strong>Matlab</strong> può valutare proposizioni logiche. La convenzione è true = 1 e<br />
false = 0.<br />
Alcuni operatori logici: uguaglianza (==), and (&&), or (||),<br />
negazione (∼), >=, ∼=, . . .<br />
Esempi:<br />
>> ((a > 0) || (c > ((a > a =[2 6 41 7 10];<br />
>> a(a
Istruzioni con<strong>di</strong>zionali e cicli iterativi<br />
Istruzioni con<strong>di</strong>zionali<br />
if [con<strong>di</strong>zione]<br />
[istruzioni_1]<br />
else<br />
[istruzioni_2]<br />
end<br />
[con<strong>di</strong>zione] è un’espressione<br />
logica del tipo visto prima<br />
Attenzione a non confondere<br />
l’operatore che valuta<br />
l’uguaglianza (==) con il<br />
simbolo <strong>di</strong> assegnazione (=)<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 15 / 1
Cicli iterativi<br />
Istruzioni con<strong>di</strong>zionali e cicli iterativi<br />
Ciclo for:<br />
for s = 1.0:-0.1:0.0<br />
<strong>di</strong>sp(s)<br />
end<br />
Ciclo while:<br />
k = 1;<br />
while k==1<br />
if (a
Script e funzioni<br />
Script e funzioni<br />
Script : sequenza <strong>di</strong> istruzioni <strong>Matlab</strong>. Si lancia dalla command window :<br />
» nome_file esegue le istruzioni scritte in nome_file.m<br />
Funzione : Scriviamo il file dati_rettangolo.m:<br />
function [area,perimetro] = dati_rettangolo(a,b)<br />
% [area,perimetro] = dati_rettangolo(a,b)<br />
% Calcola l’area ed il perimetro <strong>di</strong> un rettangolo <strong>di</strong><br />
lati a e b<br />
area = a ∗ b;<br />
perimetro = 2 ∗ (a + b);<br />
» [area, perimetro] = dati_rettangolo(a,b)<br />
Le variabili area e perimetro vengono inizializzate con il valore<br />
dell’area e del perimetro <strong>di</strong> un rettangolo <strong>di</strong> lati a e b.<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 17 / 1
Script e funzioni<br />
Alcuni esempi <strong>di</strong> funzioni ed uso della guida<br />
Alcune funzioni utili: real, imag, eye, ones, sin, cos, exp,<br />
log, plot, stem, min, max, conv, deconv, abs, phase,. . .<br />
Per ottenere informazioni su una funzione possiamo invocare help<br />
(per la documentazione estesa, invocare helpwin):<br />
» help abs<br />
ABS Absolute value.<br />
ABS(X) is the absolute value of the elements of X.<br />
When X is complex, ABS(X) is the complex modulus<br />
(magnitude) of the elements of X.<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 18 / 1
Grafici - 1<br />
Grafici<br />
Rappresentiamo la funzione seno sull’intervallo [0, 2π], con intervallo<br />
<strong>di</strong> campionamento pari a T = 0.01:<br />
» T = 0.01;<br />
» x = 0:T:2*pi;<br />
» plot(x,sin(x))<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 19 / 1
Grafici - 2<br />
Grafici<br />
Ren<strong>di</strong>amo il grafico più informativo:<br />
» T = 0.01;<br />
» x = 0:T:2*pi;<br />
» plot(x,sin(x),’r -.’,...<br />
’LineWidth’,3)<br />
» grid<br />
» title(’Plot of sin(x)’)<br />
» xlabel(’x’)<br />
» ylabel(’sin(x)’)<br />
» axis([0 2*pi -1 1])<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 20 / 1
Grafici - 3<br />
Grafici<br />
E’ possibile rappresentare più elementi sullo stesso grafico tramite il<br />
comando hold on:<br />
>> figure<br />
>> x = 0:T:2*pi;<br />
>> y1 = sin(x);<br />
>> y2 = cos(x).^2;<br />
>> plot(x,y1,’r --’)<br />
>> hold on<br />
>> plot(x,y2,’b -.’)<br />
>> grid<br />
>> legend(’sin(x)’,’cos^2(x)’)<br />
>> axis([0 2*pi -1 1])<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 21 / 1
Grafici - 4<br />
Altri tipi <strong>di</strong> grafico:<br />
Grafici<br />
stem: in<strong>di</strong>cato per segnali campionati<br />
stairs: in<strong>di</strong>cato per segnali interpolati con zero-order hold<br />
Altri coman<strong>di</strong> utili per la creazione <strong>di</strong> grafici:<br />
semilogx: scala logaritmica (in base 10) per l’ascissa<br />
semilogy: scala logaritmica (in base 10) per l’or<strong>di</strong>nata<br />
loglog: scala logaritmica (in base 10) per entrambi gli assi<br />
Lanciare » doc plot sulla command window per accedere ad<br />
informazioni esaurienti sulle funzionalità grafiche <strong>di</strong> <strong>Matlab</strong><br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 22 / 1
Esempio riepilogativo<br />
Esempio riepilogativo<br />
% Script che calcola valore massimo e minimo, me<strong>di</strong>a e<br />
deviazione standard<br />
% <strong>di</strong> un vettore aleatorio con <strong>di</strong>stribuzione uniforme<br />
nell’intervallo [a,b].<br />
close all, clc<br />
lunghezza_vettore = 100;<br />
% Generazione casuale a partire da una <strong>di</strong>stribuzione<br />
uniforme tra a e b<br />
a = -6;<br />
b = 4;<br />
v = a + (b-a).*rand(lunghezza_vettore,1);<br />
% Calcoliamo il valore massimo e minimo del vettore<br />
[valore_min, i_min] = min(v);<br />
[valore_max, i_max] = max(v);<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 23 / 1
Esempio riepilogativo<br />
% Calcoliamo me<strong>di</strong>a e deviazione standard.<br />
me<strong>di</strong>a = mean(v);<br />
<strong>di</strong>ff = v - me<strong>di</strong>a;<br />
dev_std = sqrt(sum(<strong>di</strong>ff. ∧ 2)/length(v));<br />
<strong>di</strong>sp([’Me<strong>di</strong>a = ’,num2str(me<strong>di</strong>a)]);<br />
<strong>di</strong>sp([’Deviazione standard = ’,num2str(dev_std)]);<br />
% Produciamo il grafico richiesto<br />
figure<br />
stem(v);<br />
hold on<br />
stem(i_min,valore_min,’k x’,’MarkerSize’,8)<br />
stem(i_max,valore_max,’g s’,’MarkerSize’,8)<br />
valor_me<strong>di</strong>o = me<strong>di</strong>a*ones(lunghezza_vettore);<br />
plot(valor_me<strong>di</strong>o,’r–’)<br />
grid on<br />
legend(’v’,’valore minimo’,’valore massimo’,’valor me<strong>di</strong>o’)<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 24 / 1
Esercizio riepilogativo<br />
Esercizio riepilogativo<br />
Scrivere un programma <strong>Matlab</strong> che<br />
1 Calcoli la somma dei polinomi p = x 3 − 2x + 8 e q = 17x 2 − 5<br />
(attenzione alla corrispondenza tra coefficienti e grado dei monomi)<br />
2 Rappresenti sullo stesso grafico p, q e p + q sull’intervallo [−30, 30];<br />
Estensione: scrivere una funzione che sommi e rappresenti polinomi<br />
generici.<br />
C. Masiero (DEI - UniPD) <strong>Introduzione</strong> a <strong>Matlab</strong> 8 Maggio 2013 25 / 1