Corso di Teoria dei Sistemi
A.A. 2002/2003
Esercitazione Matlab n.1
Studio di un sistema massa – molla
Equazioni fisiche che descrivono il sistema
h
M
k
F
Molla………………………… Fm = − k ⋅ x
Pistone (smorzatore)………… Fp = − h ⋅ x&
Bilancio di forze…….. M ⋅ &x& = F + Fm + F p
x
Scelta delle variabili di stato e di ingresso
 x1

 x2
u

=
=
Riferimenti istruzioni e funzioni Matlab
definizione di variabili e matrici (e vettori)
M = 1;
k = 0.25;
h = 1;
A = [0 1; -k/M –h/M];
x
x&
= F
Equazioni differenziali
 x&1

 x&
 2
definizione di un modello state-space
sys = ss(A,B,C,D);
= x2
autovalori di una matrice
eig(A)
1
k
h
= − ⋅ x1 − ⋅ x2 + ⋅ u
M
M
M
Equazione di uscita
definizione di un vettore equispaziato
t = linspace(0,0.5,20);
t = 0:0.025:0.5;
y = x1
visualizzazione grafica del movimento libero
initial(sys,x)
Si vuole rappresentare il sistema come
visualizzazione grafica del movimento forzato
risposta ad impulso di ampiezza unitaria
impulse(sys)
 x& = A ⋅ x + B ⋅ u

y = C ⋅ x + D ⋅u
risposta a scalino di ampiezza unitaria
step(sys)
Nel caso in esame
salvataggio dei dati in vettori
(specificando il vettore tempo)
[yl,tl,xl] = initial(sys,x,t);
[yf,tf,xf] = impulse(sys,t);
 d  x1 
1   x1   0 
 0

=

k
h  ⋅   +  1  ⋅u
 dt  x2 
− M − M   x2   M 

 x1 
y
[
]
=
1
0
⋅
 x  + [0]⋅ u

 2

tracciamento di grafici (con griglia)
plot(t,yl+yf), grid on
ciclo for
for i=1:10
istruzioni del ciclo
end
Caso non lineare
 x&1


 x& 2
= x2
Utilizzo della DEE in Simulink
dee
(da riga di comando Matlab)
k ⋅ e − x1
h
1
= − 0
⋅ x1 −
⋅ x2 +
⋅u
M
M
M
1
Codice Matlab
% TEORIA DEI SISTEMI N.O.
% Esercitazione Matlab n. 1 – 11/13.03.2003
% ======================================================================
%
%
%
%
Matlab è un interprete di comandi. Gli stessi comandi che si possono
digitare dal prompt possono essere editati in un file con estensione
.m: tutte le istruzioni vengono interpretate ed eseguite in sequenza
digitando il nome del file dal prompt (senza estensione .m).
% N.B. NON ASSEGNARE MAI AD UN FILE O AD UNA VARIABILE UN NOME CHE
% INIZI CON UN CARATTERE NUMERICO!!!
% Il simbolo "%" indica i commenti
% L'istruzione per pulire il workspace cancellando tutte le variabili
% in memoria è la seguente
clear all
% SISTEMA DINAMICO RAPPRESENTATO COME "STATE-SPACE"
% ======================================================================
% Inseriamo (definiamo) le variabili (il ";" a fine riga impedisce la
% visualizzazione).
% In questo caso si tratta dei parametri del sistema in esame
M = 1.0;
k = 0.25;
h = 0.5;
% kg
% N/m
% N*s/m
% Inseriamo poi le matrici del sistema dinamico in esame: ogni
% sequenza di valori separata da un ";" rappresenta una riga della
% matrice (ad es. B è un vettore colonna, mentre C è un vettore riga)
A
B
C
D
=
=
=
=
[0 1; -k/M -h/M];
[0; 1/M];
[1 0];
[0];
%
%
%
%
%
%
%
Definiamo poi il sistema dinamico studiato come una "variabile" qui
denominata "sys". "ss" è una funzione Matlab ("state space").
Per una completa descrizione dell'utilizzo di ciascuna funzione
si digiti "help nomedellafunzione". "help" da solo restituisce un
elenco di tutti i "toolbox" (insiemi di istruzioni e funzioni)
disponibili -> "help nometoolbox" offre un elenco delle istruzioni
e funzioni del singolo toolbox
sys = ss(A,B,C,D);
% Si provi ora a lanciare "sys" dal prompt.
% MOVIMENTO LIBERO
% ======================================================================
% Visualizziamo graficamente l'andamento dell'uscita del sistema
% conseguente ad una perturbazione dello stato ("movimento libero").
% Il sistema massa - molla è all'equilibrio in x = [0 0], u = 0.
initial(sys,[1 0])
% Come specificato dall'help ("help initial"), è possibile far
2
%
%
%
%
%
%
%
%
%
%
%
calcolare alla funzione i valori dell'andamento di stato e uscita,
anziché tracciarli graficamente. Questo si può fare successivamente
con la funzione "plot".
Salviamo gli andamenti di stato e uscita, più il vettore tempo,
in Y,T,X (la sequenza delle uscite dipende da come è stata scritta
la funzione initial).
In questo esempio si pone x1 = 1, x2 = 0 (è come se il carrello
venisse spostato in x1 = 1, e poi rilasciato con velocità iniziale
nulla).
[Y,T,X] = initial(sys,[1 0]);
% si può anche specificare l'istante di tempo finale (tf)
tf = 40;
[Y,T,X] = initial(sys,[1 0],tf);
% oppure tutto il vettore tempo: equispaziato fra 0 e 40 secondi,
% e di 1000 elementi
t = linspace(0,40,1000);
[Y,T,X] = initial(sys,[1 0],t);
% (in questo caso T coinciderà con t);
% Tracciamo ora i grafici:
% 1) andamento dell'uscita (Y)
plot(T,Y), grid on
% (ascisse = tempo; ordinate = spostamento)
% ("grid on" è un'opzione che fa tracciare una griglia sul grafico)
% 2) andamento dei due stati
%
(X è una matrice con due vettori colonna corrispondenti agli
%
andamenti dei due stati x1 e x2)
plot(T,X), grid on
% (ascisse = tempo; ordinate = spostamento e velocità)
% - movimento dello stato nello spazio delle variabili
plot(X(:,1),X(:,2)), grid on
% (ascisse e ordinate = variabili di stato x1 e x2)
plot(X(:,1),X(:,2)), grid on, axis([-1 1 –1 1])
% (“axis” consente di fissare la scala della figura).
% N.B. Sia V una matrice di tot righe e colonne.
% - V(i,j) seleziona l'elemento sulla riga i e colonna j di V;
% - V(:,j) seleziona tutta la colonna j-esima;
% - V(i,:) seleziona tutta la riga i-esima;
% - V(i,end) seleziona l'ultimo elemento della riga i;
% - V(end,j) seleziona l'ultimo elemento della colonna j;
% - V(:,end) seleziona tutta l'ultima colonna;
% - V(end,:) seleziona tutta l'ultima riga.
%
%
%
%
Si provi ora a ripetere la stessa prova ponendo nei dati iniziali
del sistema h=0 (modificando il file .m e rilanciandolo; N.B. le
modifiche risultano attive dopo che il file è stato salvato).
Si noti che le oscillazioni scompaiono per valori di h >= 1.
% Per aprire più figure
figure(1)
plot(T,X), grid on
figure(2)
3
plot(X(:,1),X(:,2)), grid on
% CICLO FOR
% ======================================================================
% Ripetiamo ora quanto visto in precedenza in un ciclo for in cui
% facciamo variare il valore di h, assegnandogli di volta in volta
% un valore preso da un vettore H che definiamo
H = [0 0.25 0.5 0.75 1];
% Ad ogni esecuzione del ciclo, cambiando h andrà ridefinita la
% matrice A ed il sistema sys
for i = 1:5
h = H(i);
A = [0 1; -k/M -h/M];
sys = ss(A,B,C,D);
[Y,T,X] = initial(sys,[1 0],t);
figure(1)
plot(T,Y), grid on, hold on
figure(2)
plot(X(:,1),X(:,2)), grid on, hold on
pause
end
%
%
%
%
- il comando "hold on" consente di sovrascrivere un grafico senza
cancellare il contenuto già presente;
- il comando "pause" attende che l'utente dia "invio" per proseguire.
(N.B. "invio" va dato con Matlab finestra attiva)
% RISPOSTA AD IMPULSO (MOVIMENTO FORZATO)
% ======================================================================
% Ripristino del sistema iniziale
h = 0.5;
A = [0 1; -k/M -h/M];
sys = ss(A,B,C,D);
% Risposta ad impulso di ampiezza unitaria
impulse(sys)
% oppure
[Y,T,X] = impulse(sys,t);
%
%
%
%
%
Come nel caso precedente, tracciare gli andamenti di Y e di X.
Si noti che la risposta ad impulso tracciata coincide con quella
che si ottiene studiando il movimento libero dello stato con
condizione iniziale [0 1].
% TRENO DI IMPULSI
% ======================================================================
%
%
%
%
%
%
%
%
%
Supponiamo di sollecitare il sistema con un treno di impulsi dati
con frequenza preimpostata (ad. es uno al secondo). Inizialmente il
sistema sarà all'equilibrio, con x = [0 0]. Se dopo un secondo dal
primo impulso ricevuto lo stato si troverà in un punto differente,
conseguentemente al secondo impulso la sua evoluzione nel tempo sarà
data dalla somma di due contributi (essendo il sistema lineare, vale
il principio di sovrapposizione degli effetti):
- il movimento libero (che si calcola con la initial);
- il movimento forzato (che si calcola con la impulse);
4
%
% Si tratterà di calcolare di volta in volta gli andamenti di stato e
% uscita del sistema, concatenando i risultati in vettori Y, X e T.
t = linspace(0,1,20);
x = [0 0];
Y = [];
X = [];
T = [];
for i = 1:15
[yl,tl,xl] = initial(sys,x,t);
[yf,tf,xf] = impulse(sys,t);
Y = [Y; yl+yf];
X = [X; xl+xf];
T = [T t+(i-1)];
end
x = xf(end,:) + xl(end,:);
% N.B. t è un vettore riga, yl, yf, xl ed xf sono vettori colonna.
%
% DOMANDA: nel codice c'è un elemento ridondante che potrebbe essere
% portato fuori dal ciclo for: quale?
figure(1)
plot(T,Y), grid on
figure(2)
plot(T,X), grid on
figure(3)
plot(X(:,1),X(:,2)), grid on
% "close all" chiude tutte le figure
5
Scarica

Corso di Teoria dei Sistemi – Esercitazione Matlab n.1