CD Matlab
CD Matlab
L’ambiente di lavoro,
le istruzioni fondamentali
L’interfaccia di Matlab
• Interfaccia utente:
– la Command
Window dà
accesso diretto
all’interprete
– scrittura diretta “Command window”
di comandi.
Workspace
&
Launchpad
Command window
Definizione di variabili
• Esempio:
» a=4; b=2;
» a*b
ans =
8
• Per cancellare una variabile (es. a):
» clear a
Il Workspace
Quindi...
• Moltiplicazione a*b
» FirstClassHolders = 72;
» Coach = 121;
» Crew = 8;
» TotalPeopleOnPlane = FirstClassHolders + Coach...
+ Crew
TotalPeopleOnPlane =
201
Il formato di visualizzazione
Il formato di visualizzazione
»format long
» x = 3 + 11/16 + 2^1.2
x = 5.98489670999407
» format short
» x = 3 + 11/16 + 2^1.2
x = 5.9849
» abs( 2+3*i )
ans = Unità immaginaria
3.6056
• Calcolare
Inf e NaN
• Esempi:
» 5/0 » 0/0
Warning: Divide by zero. Warning: Divide by zero.
ans = ans =
Inf NaN
Definizione di matrici
» A = [ 1, 2; 3, 4 ]
A=
1 2
3 4
La wildcard :
Selezionare sottomatrici
• Se definiamo
» B=[ 1, 2, 3; 4, 5, 6 ]
B=
1 2 3
4 5 6
Sottomatrice di interesse
• scrivendo
» B( 1:2 , 2:3 )
ans =
2 3
5 6
» A = [ 1 2; 3 4 ]; B = [ 5 6; 7 8 ] » A*B
» A+B ans =
ans = 19 22
6 8 43 50
10 12
» A^2
» B-A ans =
ans = 7 10
4 4 15 22
4 4
» A = [ 1 2; 3 4 ]; B = [ 5 6; 7 8 ];
» A.*B
ans =
5 12
21 32
» A.^B
ans =
1 64
2187 65536
Operazioni (elementari)
Altre operazioni
• Altre operazioni:
– rank -> calcolo del rango di una matrice
– trace -> calcolo della traccia di una matrice
– norm -> calcolo della norma di una matrice
Vettori
• » v=(0:10)
v=
0 1 2 3 4 5 6 7 8 9 10
Passo
Valore iniziale
»v=[3617]
v=
3 6 1 7
» pol = [ 3 2 1 ]
pol =
3 2 1
» roots( pol )
ans =
-0.3333 + 0.4714i
-0.3333 - 0.4714i
» polyval( pol, 0 )
ans =
1
» pol1 = [ 1 1 ]; pol2 = [ 1 1 ];
» polprod = conv( pol1, pol2 )
polprod =
1 2 1
Rappresentazione grafica
• Grafici 2D:
Esempio
• Grafici sovrapposti
» t=(0:0.01:5);
» y1=sin(t);
» y2=cos(2*t-pi/3);
» figure;
» plot(t,y1,'r',t,y2,'g');
» grid on;
» t1 = [1 :10];
» t2 = [ 20:-1:11];
» t3=[t1, t2];
» help reshape
» t3bis = reshape(t3,2,10);
» disp(t3bis);
» t3bis(:,4:6)=[];
» disp(t3bis);
» whos
» disp(t3bis)
» t3bis(1,4:6)=-3;
» whos
» t1 = 'A‘
» t2 = 'BCDE‘
» t3 = [t1,t2]
» t4 = [t3,' are the first 5 ';...
'characters in the alphabet.']
• A volte e’ necessario convertire un numero in testo e viceversa:
vedere le istruzioni str2num, num2str, int2str e simili.
» x = pi
x=
Questo non e’ un test,
3.1416 ma una assegnazione!
» x ~= 3, x ~= pi
ans =
1
ans =
Questi sono test logici.
0
Cicli “while”
» S = 1; n = 1;
» while S+ (n+1)^2 < 100
n = n+1; S = S + n^2;
end
» [n, S]
Un esempio
% risolvi x= cos(x)
% metodo 1
% spreca memoria, memorizza anche passi intermedi
x = zeros(1,20); x(1) = pi/4;
n = 1; d = 1;
while d > 0.001
n = n+1; x(n) = cos(x(n-1));
d = abs( x(n) - x(n-1) );
end
n,x
% metodo 2
% migliore memorizza solo l'ultimo dato
xold = pi/4; n = 1; d = 1;
while d > 0.001 & n < 20
n = n+1; xnew = cos(xold);
d = abs( xnew - xold );
xold = xnew;
end
[n, xnew, d]
Matlab function
Alcuni esempi
– Vale la formula
» Area = area(10,15,20)
Area =
72.6184
– non assegnando la variabile d’uscita
» area(10,15,20)
ans =
72.6184
• Calcolare la sequenza:
F(1) = 0; F(2) = 1;
% inizializzazione
for i = 3:20
F(i) = F(i-1) + F(i-2);
end
% calcolo della sequenza
% grafici
plot(1:19, F(1:19)./F(2:20),'o' )
hold on, xlabel('n')
plot(1:19, F(1:19)./F(2:20),'-' )
legend('rapporto dei termini f_{n-1}/f_n')
plot([0 20], (sqrt(5)-1)/2*[1,1],'--')
Vettorializzare i cicli
• Quanto si guadagna?
risultati
primo ciclo
7.6309e-005
secondo ciclo Incremento di velocità del 25% circa
5.6040e-005
% test_ciclo
% script che serve a eseguire il timing su due cicli,
% uno vettorializzato e l'altro no.
%
tic;
i = 0;
for t = 0:.01:10
i = i + 1;
y(i) = sin(t);
end
tempo1 = toc;
% secondo ciclo
clear t y
tic;
t = 0:.01:10;
y = sin(t);
tempo2 = toc;
% risultato
messaggio = sprintf('ecco il risultato: primo ciclo %f secondo ciclo
%f',tempo1, tempo2);
disp(messaggio);
Vettorializzazione di algoritmi
function d = minDistance(x,y,z)
% trova in un insieme di punti di R^3
% quello a distanza minima dall’origine e restituisce la distanza min
nPoints = length(x);
d = zeros(nPoints,1); % prealloca (ottimizzazione tempo di calcolo)
for k = 1:nPoints % calcola la distanza per ogni punto
d(k) = sqrt(x(k)ˆ2 + y(k)ˆ2 + z(k)ˆ2);
end
d = min(d); % trova la distanza minima
function d = minDistance(x,y,z)
% trova la distanza minima dall’origine in R^3
d = sqrt(x.ˆ2 + y.ˆ2 + z.ˆ2); % calcola la distanza per ogni punto
d = min(d); % trova la distanza minima
Analisi e simulazione
di sistemi dinamici LTI
in ambiente Matlab
Definizioni
Proprietà
Esempi (3)
• Definizione del sistema
tramite la funzione di
trasferimento
» num = [ 1 1 ]; den = [ 1 3 16 ];
» sistema = tf( num, den )
Transfer function:
s+1
--------------
s^2 + 3 s + 16
Esempi (4)
• Definizione del sistema
tramite la funzione di
trasferimento
» num = [ 1 1 ]; den = [ 1 3 16 ];
» sistema = tf( num, den,-1 )
Transfer function:
z+1
--------------
z^2 + 3 z + 16
– assegnare i vettori degli zeri, dei poli ed il guadagno del sistema nel
workspace (nel seguito vettori Z, P e K);
Esempi (5)
» Z = [ 1 ]; P = [ -1]; K = [-5]
» sistema = zpk( Z,P,K )
» Zero/pole/gain:
-5 (s-1)
--------
(s+1)
Esempi (6)
• Sintassi:
» [y,t]=step(sistema);
» [y,t]=step(sistema,t);
Vettore dei tempi
Vettore d’uscita
Vettore sequenza d’ingresso
» [y,x]=lsim(sistema,u,t);
» a=[-1 ,0;3,-4];
» b=[2;1];c=[1,2];d=0;
» sistema=ss(a,b,c,d);
» t=(0:0.01:5);
» u=2*sin(2*pi*2*t);
» y=lsim(sistema,u,t);
» plot(t,y);
» a=[-1 ,0;3,-4];
» b=[2;1];c=[1,2];d=0;
» sistema=ss(a,b,c,d);
» t=(0:0.01:5);
» u=2*sin(2*pi*2*t);
» lsim(sistema,u,t);
» step(sistema);
• Interagendo tramite il mouse nella finestra che visualizza
l’andamento della risposta allo scalino è possibile ottenere
informazioni relative a
– Sovraelongazione della risposta
– Valore di regime
– Tempo di salita (rise time)
– Tempo di assestamento (settling time)
Esempio:
risposta del
sistema a
tempo
continuo.
Esempio:
risposta del
sistema a
tempo
discreto.
Considerazioni riassuntive
Interconnessione di sistemi
– + connessione in parallelo;
– * connessione in serie;
sys2 y2
• Connessione serie
u v y
sys1 sys2
• Trasposizione
Esempio di connessione
u G1 G2 y
-
G3
SYS 2
Sintassi completa
v z
SYS 1
u + y
SYS 2
• Ulteriori passi
– Assemblaggio di tutti i sottosistemi in un’unica entità, tramite
l’istruzione append (NB sono ancora sistemi non
interconnessi, ma ora sono ordinati!), creando così il sistema
ausiliario SYS
– Creazione della matrice di connessione Q, secondo lo
schema:
Indice dell’ingresso
ad un sottosistema
(nell’ordine imposto
Indice delle uscite di altri sottosistemi,
dall’operazione di da connettere a quell’ingresso.
assemblaggio).
Dott. Gianfranco Fenu Controllo digitale
Intro a Matlab per sistemi LTI, 110
• Svantaggi:
– macchinosa procedura di descrizione delle interconnessioni.
• Vantaggi:
– possibilità di ottenere la realizzazione del sistema complessivo
nella forma desiderata (l’ordine di comparizione delle varie
variabili di stato è scelto nella fase di “aggregazione” dei
sottosistemi con l’istruzione append).
Analisi della
risposta in frequenza
Grafici della
risposta in frequenza
• Comandi Matlab
• Comandi Matlab
» num = [0.5]
» den=[1 -0.5];
» fdt1=tf(num,den,-1);
» num = [0.9]
» den=[1 -0.2];
» fdt2=tf(num,den,-1);
» num = [0.1]
» den=[1 -0.9];
» fdt3=tf(num,den,-1);
» figure;bode(fdt1,fdt2,fdt3)
» num1=1
» den1=[1 2 1]
» figure;
» nyquist(tf(num1,den1))
Verso di percorrenza
sul diagramma
Diagrammi di Nyquist:
casi particolari
Diagrammi di Nyquist:
casi particolari
Dovrà essere
F(jω) ! 0
per ω ! 2.
» figure; nyquist(fdt);
Polo doppio in 0
Comportamento per ω ! 2
ed anche per ω ! 1
(si vede ancora poco …)
» figure;
» omega = linspace(1.5,200,10000);
» nyquist(fdt1,omega);
» axis([-0.1 0.4 -.4 0.4]);
» % cambia la visualizzazione
» num=[10 20];
» den=conv([1 0 4],[1 1]);
» fdt2=tf(num,den)
Transfer function:
10 s + 20
-------------------
s^3 + s^2 + 4 s + 4
» zpk(fdt2)
Zero/pole/gain:
10 (s+2)
----------------
(s+1) (s^2 + 4) Poli immaginari puri e di molteplicità pari a 1:
la curva presenta un asintoto per ω ! 2
» num=[10 20];
» den=conv([1 0 4],[1 1]);
» fdt2=tf(num,den)
» figure;nyquist(num,den)
NB! 1015
» num=[10 20];
» den=conv([1 0 4],[1 1]);
» fdt2=tf(num,den)
» figure;
»nyquist(num,den, …
linspace(0,1.95,1000))
» num=[10 20];
den=conv([1 0 4],[1 1]);
fdt2=tf(num,den)
figure;
nyquist(num,den,linspace(2.8,100.1000))
In evidenza il ramo
corrispondente a pulsazioni ω ¸ 0
In evidenza il punto –1+j0
» num = [0.5]
» den=[1 -0.5];
» fdt1=tf(num,den,-1);
» num = [0.9]
» den=[1 -0.2];
» fdt2=tf(num,den,-1);
» num = [0.1]
» den=[1 -0.9];
» fdt3=tf(num,den,-1);
» figure;bode(fdt1,fdt2,fdt3)
» figure;nyquist(fdt1,fdt2,fdt3);
Luoghi caratteristici in s e
corrispondenti in z
Ed in Matlab?
• Tramite le istruzioni sgrid e zgrid è possibile disegnare,
rispettivamente nel piano s di una FdT F(s) oppure nel piano z
di una FdT F(z), un insieme di curve dei luoghi a smorzamento
costante/a pulsazione naturale costante.
Esempi
Esempi
• Un secondo esempio
per un sistema a tempo
discreto descritto da
una FdT:
Esempi
» H = tf( [1 -1], [1 4 5] );
» Hd = c2d( H, 0.1 );
» step( H, '-', Hd, '--‘ )
Ancora esempi
Esempio
» % sistema LTI a tempo continuo
» H = 10*tf( [1 1], [1 4 5] );
»
» % periodo di campionamento: 0.1
» % metodo di conversione: standard, con ZOH
» Ts = 0.1; % intervallo di campionamento
» Hdzoh = c2d( H, Ts,'zoh');
»
» Hdtustin = c2d( H, Ts,'tustin');
» % discretizzato con la trasformazione bilineare di Tustin
»
» Wc = 9.752; % pulsazione critica
» % e' la pulsazione in cui il sistema continuo ha margine di fase 108 deg
» % (si provi l'istruzione margin )
» Hdwarp = c2d(H, Ts, 'prewarp',Wc);
» % discretizzazione con la trasformazione bilineare di Tustin predistorta
Esempio (continua …)
Risposta
allo
scalino
Risposta in
frequenza:
diagrammi
di Bode
» % la stabilita'
» [GmH, PmH, WcgH, WcpH ] = margin(H);
» [GmHdzoh, PmHdzoh, WcgHdzoh, WcpHdzoh ] = margin(Hdzoh);
» [GmHdtustin, PmHdtustin, WcgHdtustin, WcpHdtustin ] =
margin(Hdtustin);
» [GmHdwarp, PmHdwarp, WcgHdwarp, WcpHdwarp ] =
margin(Hdwarp );
»
»
» disp('margine di guadagno [dB] pulsazione margine di fase
pulsazione')
» disp('sistema a tempo continuo')
» disp([GmH, WcgH, PmH, WcpH]);
»
» disp('sistema con ZOH');
» disp([GmHdzoh, WcgHdzoh, PmHdzoh, WcpHdzoh ]);
» % notare la perdita di margine di guadagno e di fase
»
» disp('sistema con TUSTIN');
» disp([GmHdtustin, WcgHdtustin, PmHdtustin, WcpHdtustin ]);
» % piccole differenze col sistema a tempo continuo
»
» disp('TUSTIN con predistorsione');
» disp([GmHdwarp, WcgHdwarp, PmHdwarp, WcpHdwarp ]);
» % ancora minori differenze
Dott. Gianfranco Fenu Controllo digitale
Intro a Matlab per sistemi LTI, 178