Sei sulla pagina 1di 7

Esempi di uso e applicazioni di Matlab e simulink

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:

ode23('xprime', t0, tfinal, x0);


ode45('xprime', t0, tfinal, x0);

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

t0 è il tempo di inizio integrazione


tfinal è il tempo di fine integrazione
x0 è il vettore delle condizioni iniziali su x(1)...x(N)

Il sistema di N equazioni visto sopra può perciò essere realizzato dalla seguente funzione, definita dal file xprime.m:

function xdot = xprime(t,x)


xdot = [f(x(1)...x(N)); x(2); .... ; x(N-1)]

Si ricorda che xprime, xdot, t0, tfinal e x0 sono nomi di fantasia.


Viene ora dato un esempio di uso delle funzioni ode23 e ode45 (si noti la sintassi lievemente diversa, spiegata
nell'help di Matlab). In particolare, si voglia vedere l'andamento della soluzione dell'equazione del primo ordine:
y (t ) = 1 − y ( t )


a) si definisce il sistema di equazioni differenziali nel file yprimo.m %

function yprime = yprimo(t,y);

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)

2) Studio della risposta impulsiva di sistemi stabili e instabili con Matlab

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.

clc % pulisce la finestra di testo


echo on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% Determinazione del diagramma di Bode %
% di una generica funzione di trasferimento %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clg % pulisce la finestra grafica

csi=0.1; % definizione dei parametri del sistema del II ordine


Wn=10;

den=[1 2*csi*Wn Wn^2]; % Definizione della funzione di trasferimento


num=[1]; % Coefficenti discendenti dei polinomi di num e den

pause

w=logspace(0,2,1000); % definizione delle frequenze a cui calcolare


% modulo e fase della f.d.t. Provare a cambiare
% il numero di elementi a 50 ...

[modulo,fase]=bode(num,den,w); % calcolo di modulo e fase

pause
subplot(211);loglog(w,modulo); % disegna in due posizioni diverse
subplot(212);semilogx(w,fase); % i digrammi del modulo e delle fasi
pause

subplot(111); % rimette la finestra grafica singola

[Re,Im]=nyquist(num,den,w); % calcola le componenti del diagramma

plot(Re,Im) % disegna il diagramma di Nyquist

echo off

4) Simulazione della risposta al gradino di un sistema del secondo ordine.

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

Signal Gen. Scope


1
yout
s+1 To Workspace
Step Fcn Switch f.d.t

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

Signal Gen. Scope


1
yout
s+1 To Workspace
step Switch f.d.t.

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.

7) Versione simulink del programma contdig.m.

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.

9) Simulazione di un sistema con un anello algebrico.

+ -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.

10) Simulazione di un sistema discreto che comanda uno continuo.

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