Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1) Uso delle funzioni ode23 e ode45 per l'integrazione di equazioni differenziali con Matlab
Sia dato da integrare una equazione differenziale scalare di ordine N del tipo:
dnx d n −1 x d n − 2 x
= f ( , ,...., x , t )
dt n dt n −1 dt n − 2
Associando ad ogni derivata un elemento di un vettore, tale equazione può essere riscritta come un sistema di N
equazioni del primo ordine (in cui si sottointende la variabile indipendente t), nel modo seguente:
x (1) = f ( x(1),..., x( N ))
x (2) = x (1)
...
î x( N ) = x( N − 1)
In pratica, alla grandezza non derivata si associerà la componente x(N), alla derivata prima x(N-1) e così via.
Si ottiene così un vettore x (che chiameremo "stato") di derivate successive della variabile x ed una rappresentazione
"compatta" del sistema di N equazioni del primo ordine è la seguente:
dx
= f (x , t )
dt
dove x è un vettore di stato, t la variabile indipendente (si considererà sempre il tempo) e f è una funzione che ritorna
la derivata (vettoriale) dello stato sulla base dei valori di x e t. Per trovare la soluzione di questa equazione
differenziale, si invoca la funzione Matlab ode23 o ode45:
dove:
xprime è un possibile nome di un m-file che definisce la funzione da integrare. La funzione deve calcolare il
vettore derivata dello stato x, dato lo stato e il tempo corrente. Deve perciò avere due argomenti di ingresso
(t ed x) e ritornare un vettore colonna delle derivate degli stati (lo si chiami, ad esempio, xdot):
dxi
xi =
dt
Il sistema di N equazioni visto sopra può perciò essere realizzato dalla seguente funzione, definita dal file xprime.m:
yprime = (1-y(1));
b) Si definiscono le condizioni iniziali, il tempo di inizio e fine simulazione e si richiama una delle due funzioni per
l'integrazione col metodo di Runge-Kutta (terzo o quinto ordine).
% file prova23.m %
T0=0;
TFIN=10;
Y0=0;
[T,Y]=ode23('yprimo',T0,TFIN,Y0,1e-5,1);
plot(T,Y)
% file prova45.m %
T0=0;
TFIN=10;
Y0=0;
[T,Y]=ode45('yprimo',T0,TFIN,Y0,1e-1,1);
plot(T,Y)
Il programma stabilit.m mostra come, in funzione della posizione dei poli di un sistema, la risposta impulsiva tenda a
zero in caso di poli tutti a parte reale negativa. Nel caso vi sia un polo nell'origine, la risposta a regime sarà diversa da
zero. Infine, se un polo ha parte reale positiva, la risposta diverge.
clc
clg
echo on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Si definiscono i poli e zeri del sistema da simulare %
% N.B. I poli sono tutti stabili %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
zeri=[-4
-1];
poli=[-6
-2
-10];
K=10;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Si converte la rappresentazione poli-zeri-guadagno in una razionale %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[num,den]=zp2tf(zeri,poli,K);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Si definisce il supporto temporale su cui si vuole fare la simulazione %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
t = 0:.01:10;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Si determina la risposta impulsiva %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
y = impulse(num,den,t);
pause;
% Si visualizza il risultato %
plot(t,y)
pause;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Si definiscono i poli e zeri del sistema da simulare %
% N.B. I poli sono tutti stabili e uno nell'origine %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
zeri=[-4
-1];
poli=[-6
0
-10];
K=10;
[num,den]=zp2tf(zeri,poli,K);
t = 0:.01:10;
y = impulse(num,den,t);
pause
plot(t,y)
pause
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Si definiscono i poli e zeri del sistema da simulare %
% N.B. I poli sono tutti stabili, tranne uno %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
zeri=[-4
-1];
poli=[-6
2
-10];
K=10;
[num,den]=zp2tf(zeri,poli,K);
t = 0:.01:10;
y = impulse(num,den,t);
pause
plot(t,y)
3) Determinazione del diagramma di Bode e Nyquist di una generica funzione di
trasferimento.
pause
pause
subplot(211);loglog(w,modulo); % disegna in due posizioni diverse
subplot(212);semilogx(w,fase); % i digrammi del modulo e delle fasi
pause
echo off
Scope
1
yout
2
M/k.s +B/k.s+1
Step Fcn To Workspace
Transfer Fcn
sec_ord.m
I dati M, B e k sono introdotti dalla command window di matlab. I dati di uscita sono visualizzati su un oscilloscopio
e scritti contemporaneamente sulla variabile matlab "yout". Si deve dimensionare questa variabile in modo adeguato,
perchè di default dà solo 1000 elementi.
5) Uso di Multiplexer
untitled.mat
To File
Sine Wave
selezion.m
Questo programma simulink consente di simulare la risposta di un sistema il cui ingresso è connesso fino ad un certo
istante ad una sinusoide e poi ad un generatore di segnali. L'uscita viene indirizzata sia all'oscilloscopio, sia ad una
variabiel matlab ed infine salvata su un file di estensione .mat.
6) Uso di Demultiplexer
Mux inout.mat
Mux To File1
untitled.mat Demux
Scope1
Sine Wave To File Demux
selmpx.m
Questo è un esempio di come si possano accorpare più variabili scalari in una vettoriale, mediante l'uso del blocco
multiplexer (mux) e, viceversa, sia possible estrarre una o piu' componenti scalari da una variabile vettoriale mediante
l'uso del blocco demultiplexer (demux). Si noti come nel file inout.mat vengano salvate sia l'ingresso che l'uscita del
sistema.
Si vada a verificare che è possibile cambiare l'istante in cui viene applicato il gradino. Inoltre, lasciando il passo di
integrazione variabile, si noti che il comando "plot(yout)" renda un grafico "strano" dell'uscita.
out
To Workspace1
+ 1
- 1
2
s +1.92s+5.76
Step Fcn Sum Gain Scope
Transfer Fcn
contsim.m
8) Simulazione della risposta al gradino di un sistema del secondo ordine controllato tramite
un regolatore PID.
+ 10
- PID yout
2
s +2s+2
Step Fcn Sum To Workspace
PID Controller Transfer Fcn
Scope
pid.m
Si veda come è possibile cambiare "al volo" (cioè in corso di simulazione) i parametri del regolatore.
+ -K- yout
-
Step Fcn Sum Gain To Workspace
Scope
algebrai.m
L'uscita del sistema dovrebbe portarsi istantaneamente al valore K/(1+K) e l'errore a 1/(1+K). La simulazione avviene
però come programma sequenziale, in cui l'uscita inizialmente viene posta a 0, l'errore viene calcolato pari a 1. A
questo punto, l'uscita vale K e viene confrontata con l'ingresso. C'è quindi un assestamento verso il valore vero
dell'uscita dopo un certo numero di passi di simulazione. A seconda della versione di simulink, gli anelli algebrici
vengono risolti automaticamente oppure vengono segnalati come illeciti e la simulazione si blocca.
E' possibile salvare sul vettore "time" l'insieme degli istanti della simulazione. Si ricordi di mantenere l'intervallo di
simulazione fisso e pari ad un sottomultiplo intero di quello di campionamento del sistema discreto.
+ 1 1
- z3 s+1
Step Input Sum
Discrete Zero Order Hold Transfer Fcn Scope
Transfer Fcn
Scope1
cmd
To Workspace
time
Clock To Workspace1
discrete.m