In this article, we delve into the fascinating world of linear systems and their analysis through the powerful tool of MATLAB. A linear system is a fundamental concept in engineering, physics, and mathematics, playing a crucial role in understanding real-world phenomena. By harnessing the capabilities of MATLAB, we will embark on a journey to simulate and thoroughly analyze the behavior of linear systems, shedding light on their characteristics and applications.
Simulation and analysis of a linear system in MATLAB
1. Simulazione e analisi di un sistema lineare in MATLAB
Alessio Sechi
Università degli Studi di Roma "Tor Vergata"
alessio.sechi@students.uniroma2.eu
Abstract
Questo articolo presenta una simulazione di un sistema lineare utilizzando il software MATLAB. Il
sistema in oggetto è descritto da un'equazione differenziale lineare. Attraverso l'utilizzo di tecniche di
integrazione numerica, siamo stati in grado di ottenere e analizzare l'andamento delle variabili di stato
nel tempo. I risultati della simulazione mostrano come il sistema raggiunga uno stato stazionario nel
tempo, fornendo così una valutazione della sua stabilità. Il presente studio rappresenta un esempio di
come MATLAB possa essere utilizzato per simulare e analizzare sistemi lineari in diversi contesti.
Introduzione
La simulazione e l'analisi dei sistemi lineari sono ampiamente utilizzate nei campi dell'ingegneria, della
matematica applicata e della scienza dei controlli. In questo articolo, presentiamo una simulazione di un
sistema lineare utilizzando il noto software MATLAB. Il sistema in oggetto è descritto dalle equazioni
differenziali:
ẋ = Ax + Bu
y = Cx + Du
ove x rappresenta il vettore delle variabili di stato, u è il vettore d’ingresso e y è il vettore di uscita del
sistema. Le matrici A, B, C e D definiscono i parametri del sistema lineare.
L'obiettivo di questa simulazione è analizzare il comportamento del sistema in due differenti scenari:
• nel primo scenario, esamineremo il sistema partendo da uno stato iniziale non nullo, in
particolare, x0 = [1 0 1]′, ma con un ingresso identicamente nullo. Questo ci permetterà di
valutare il comportamento intrinseco del sistema e come le variabili di stato evolvono nel tempo
senza l'influenza di ingressi esterni;
• nel secondo scenario, investigheremo il sistema partendo da uno stato iniziale nullo, ma con un
ingresso variabile rappresentato da u(t) = [2 sin(3t) 1]′. Questo ci consentirà di osservare
l'effetto dell'ingresso variabile sulle variabili di stato e sull'uscita del sistema nel corso del
tempo.
La simulazione verrà condotta mediante l'utilizzo della funzione di integrazione numerica ode23, che
permette di ottenere una soluzione approssimata delle equazioni differenziali del sistema.
Attraverso questa analisi, intendiamo fornire una migliore comprensione del comportamento dei sistemi
lineari in diverse condizioni iniziali e di ingresso, e dimostrare l'utilità di MATLAB come strumento di
simulazione e analisi per tali sistemi.
Metodologia
Per simulare il sistema lineare descritto nelle equazioni differenziali sopra, abbiamo utilizzato la
funzione di integrazione numerica ode23. Questa funzione è appositamente progettata per risolvere
equazioni differenziali ordinarie (ODE) non rigide.
Il metodo ode23 utilizza un algoritmo a passo variabile (la lunghezza dei passi utilizzati per
approssimare la soluzione varia durante il processo di integrazione) basato su una combinazione di
metodi di ordine 2 e ordine 3 (combina due ordini di accuratezza). Questa strategia offre una buona
efficienza computazionale per ODE non rigide come quelle del nostro sistema lineare.
2. Abbiamo parametrizzato l’intervallo temporale di integrazione utilizzando le variabili t0 e tf, i cui
valori possono essere opportunamente assegnati.
Per il primo scenario, in cui lo stato iniziale x0 è non nullo, abbiamo impostato l'ingresso come una
funzione costante u(t) = 0. Ciò ci ha permesso di ottenere una simulazione del sistema nel tempo senza
alcun contributo dall'ingresso esterno.
Per il secondo scenario, in cui lo stato iniziale x0 è nullo e l'ingresso u è definito come u(t) =
[2 sin(3t) 1]′. Questo ci ha consentito di simulare il sistema con un ingresso variabile nel tempo.
Abbiamo utilizzato una funzione inline per definire l'ingresso u all'interno della chiamata della funzione
anonima passata a ode23.
Durante la simulazione, ode23 ha calcolato l'evoluzione delle variabili di stato x e, successivamente,
abbiamo calcolato l'uscita y.
Infine, abbiamo generato i grafici, in funzione del tempo, delle variabili di stato x, dell'ingresso u,
dell'uscita y, della relazione y1 rispetto a y2, e una rappresentazione tridimensionale dell'uscita y rispetto
al tempo.
Attraverso questa metodologia, siamo stati in grado di analizzare in dettaglio il comportamento del
sistema lineare nei due scenari specificati e ottenere una migliore comprensione delle sue dinamiche nel
tempo.
Matrici di coefficienti del sistema
A = [
−0.5 0 1
0 −2 0.2
0 −0.2 −2
] ; B = [
1 0
0 0
−1 1
]
C = [
1 0 0
0 1 −1
] ; D = [
0 0
0 0
]
Codice implementativo
%% Simulazione strutturata del sistema
%% Pulizia
clear all;
close all;
clc;
%% Scelta del caso di cui si vuole vedere la risposta del sistema
global scelta;
scelta = input('Inserisci 1 per simulare il primo caso o 2 per simulare il secondo caso: ');
while scelta ~= 1 && scelta ~= 2
disp('Input non valido. Devi inserire solo 1 o 2.');
scelta = input('Reinserisci 1 o 2: ');
end
%% Parametri e condizioni iniziali
if scelta == 1
x_0 = [1 0 1]';
elseif scelta == 2
x_0 = [0; 0; 0];
end
3. t0 = 0;
tf = 15;
%% Matrici del sistema
A=[-0.5 0 1; 0 -2 0.2; 0 -0.2 -2];
B=[1 0; 0 0; -1 1];
C=[1 0 0; 0 1 -1];
D=[0 0; 0 0];
%% Calcolo della soluzione
% Funzioni anonime
u = @(t,x) ingresso(t,x);
f = @(t,x) dinamica(t,x,u,A,B);
sol = ode23(f,[t0 tf],x_0);
%% Raffinamento e calcolo dell'uscita
% ode23 in generale da soluzioni con punti abbastanza sparsi, quindi
occorre raffinare la soluzione
Npunti = 300;
tempi = linspace(t0,tf,Npunti);
xFine = deval(sol,tempi);
% Calcolo di un valore dell'uscita per conoscere il numero di righe della matrice y
tt0 = tempi(1);
xx0 = xFine(:,1);
uu0 = u(tt0,xx0);
yTest = h(tt0,xx0,uu0,C,D);
Nuscite = size(yTest,1);
% Calcolo di un valore dell'ingresso per conoscere il numero di righe della matrice u
uTest = ingresso(tt0,xx0);
Ningressi = size(uTest,1);
% Calcolo dell'uscita y e dell'ingresso u
yFine = zeros(Nuscite,Npunti);
u_values = zeros(Ningressi,Npunti);
for hh = 1:Npunti
tt = tempi(hh);
xx = xFine(:,hh);
uu = u(tt,xx);
u_values(:,hh) = u(tt,xx);
yFine(:,hh) = h(tt,xx,uu,C,D);
end
%% Visualizzazione
% Visualizzazione grafico di x rispetto al tempo
figure(1);
plot(tempi,xFine);
xlabel("t");
4. ylabel("x");
title("Stato x vs tempo t");
% Visualizzazione grafico di u rispetto al tempo
figure(2);
plot(tempi,u_values);
xlabel("t");
ylabel("u");
title("Ingresso u vs Tempo t");
% Visualizzazione grafico di y rispetto al tempo
figure(3);
plot(tempi,yFine);
xlabel("t");
ylabel("y");
title("Uscita y vs Tempo t");
% Visualizzazione grafico di y1 rispetto a y2
figure(4);
plot(yFine(1,:),yFine(2,:));
xlabel("y_1");
ylabel("y_2");
title("y_1 vs y_2");
% Visualizzazione grafico di y rispetto al tempo in 3D
figure(5);
plot3(tempi,yFine(1,:),yFine(2,:));
xlabel("t");
ylabel("y_1");
zlabel("y_2");
title("Uscita y vs Tempo t");
%% Funzioni
% Dinamica del sistema
function dxdt=dinamica(t,x,u,A,B)
u = ingresso(t,x);
dxdt = A*x+B*u;
end
% Ingresso del sistema
function u=ingresso(t,x)
global scelta;
if scelta == 1
u = [0;0];
elseif scelta == 2
u = [2*sin(3*t); 1];
end
end
% Uscita del sistema
function y=h(t,x,u,C,D)
5. y = C*x+D*u;
end
Di seguito sono presentate alcune righe di codice che richiedono una breve spiegazione.
u = @(t,x) ingresso(t,x);
• u è il nome della variabile che contiene la funzione anonima;
• @ indica che si sta definendo una funzione anonima;
• t e x sono gli argomenti della funzione.
La funzione anonima u prende due valori, t e x, e restituisce il valore della funzione ingresso valutata
in t e x.
Le funzioni anonime sono funzioni definite in modo breve e conciso senza assegnare loro un nome.
Queste funzioni sono definite in linea (inline) e possono essere passate come argomenti ad altre funzioni
o salvate in variabili.
sol = ode23(f,[t0 tf],x_0);
• f è la funzione anonima definita in precedenza;
• [t0 tf] è l'intervallo temporale di integrazione;
• x_0 è il vettore delle condizioni iniziali che indicano i valori delle variabili al tempo iniziale t0.
tempi = linspace(t0,tf,Npunti);
La funzione linspace restituisce un vettore di Npunti equispaziati tra t0 e tf.
xFine = deval(sol,tempi);
• sol è la struttura contenente i risultati della soluzione delle equazioni differenziali;
• tempi è il vettore descritto sopra.
La funzione deval svolge l'interpolazione tra i punti temporali della soluzione sol per calcolare i valori
delle soluzioni nei tempi specificati in tempi. L'interpolazione permette di ottenere una stima precisa
delle soluzioni nei punti desiderati anche se questi tempi non corrispondono esattamente ai tempi discreti
usati durante la risoluzione numerica delle ODE.
xx0 = xFine(:,1);
La variabile xx0 viene impostata uguale alla prima colonna del vettore xFine. Questo rappresenta lo
stato iniziale delle variabili incognite del sistema.
uu0 = u(tt0,xx0);
uu0 contiene il valore dell'ingresso u nel primo istante di tempo e nella configurazione iniziale del
sistema.
Nuscite = size(yTest,1);
Nuscite contiene il numero di righe della matrice yTest.
Grafici
Seguono i grafici, relativi a ciascuna tipologia, con il primo grafico correlato al primo scenario e il
secondo al secondo scenario.
6. Grafici di x rispetto al tempo
Grafici di u rispetto al tempo
7. Grafici di y rispetto al tempo
Grafici di y1 rispetto a y2
9. Validazione incrociata attraverso Simulink
Simulink è un ambiente di sviluppo grafico e interattivo che fa parte del pacchetto di software MATLAB.
L'obiettivo principale della simulazione con Simulink è stato quello di verificare e convalidare la
correttezza e l'accuratezza dei grafici ottenuti nel progetto MATLAB. La simulazione ha fornito
un'opportunità per testare il comportamento del sistema modellato in un ambiente più dinamico e
realistico, consentendo di osservare come le componenti del sistema interagiscono tra loro nel tempo.
Modello del primo scenario
Modello del secondo scenario
10. Grafici risultanti per ogni scenario
Si mostrano di seguito i grafici di x, u e y rispetto al tempo, mostrati dallo stesso oscilloscopio.
12. Grafici di y rispetto al tempo in 3D
Dopo aver eseguito le simulazioni in MATLAB e Simulink, abbiamo analizzato attentamente i grafici
generati, osservando il comportamento dei segnali e verificando la sovrapposizione delle curve. Infine,
abbiamo determinato la concordanza dei risultati.
Discussioni
L'analisi dei risultati ottenuti dalla simulazione del sistema lineare ci ha fornito interessanti osservazioni
riguardo al comportamento del sistema in diverse condizioni iniziali e con diversi tipi di ingresso.
Nel primo scenario, in cui lo stato iniziale era non nullo e l'ingresso era nullo, abbiamo osservato che il
sistema ha raggiunto uno stato stazionario senza l'influenza di un ingresso esterno. Questo
comportamento era atteso poiché, in assenza di un ingresso, il sistema tende a conservare il suo stato
iniziale o raggiungere uno stato di equilibrio stabile. La simulazione ha confermato questa proprietà dei
sistemi lineari e dimostrato la stabilità del sistema nella condizione iniziale fornita.
Nel secondo scenario, in cui lo stato iniziale era nullo e l'ingresso era variabile, abbiamo osservato un
comportamento oscillatorio delle variabili di stato e dell'uscita del sistema. Questo andamento periodico
era coerente con l'ingresso variabile. La simulazione ha evidenziato come l'ingresso influenzasse le
variabili di stato e determinasse un'uscita oscillante in risposta a questa variazione temporale
dell'ingresso. Tale risultato è in linea con le aspettative di sistemi lineari che reagiscono in modo
proporzionale all'ingresso applicato.
13. Il confronto tra le componenti dell'uscita y1 e y2 ha dimostrato una relazione coerente e ben definita tra
queste due variabili. La matrice C di collegamento tra variabili di stato e uscita ha determinato il
comportamento delle variabili di uscita in funzione delle variabili di stato.
Conclusione
In conclusione, la simulazione del sistema lineare con la funzione ode23 di MATLAB ha fornito
un'analisi dettagliata e significativa del comportamento del sistema in due scenari differenti. La
simulazione ci ha permesso di comprendere come lo stato iniziale e l'ingresso influenzino il sistema,
determinando l'andamento delle variabili di stato e dell'uscita nel tempo.
I risultati ottenuti confermano l'efficacia di MATLAB come strumento di simulazione e analisi per
sistemi lineari. La capacità di esplorare e analizzare i comportamenti dinamici del sistema ha fornito
informazioni preziose per la comprensione del sistema e ha dimostrato come i sistemi lineari siano
ampiamente utilizzati in diverse applicazioni nell'ambito dell'ingegneria e delle scienze applicate.
La simulazione del sistema lineare ha inoltre evidenziato l'importanza dell'ingresso nel determinare
l'evoluzione del sistema nel tempo, sottolineando come il controllo degli ingressi sia cruciale per
influenzare e regolare il comportamento del sistema.
In conclusione, questa simulazione ha fornito una panoramica dettagliata delle dinamiche del sistema
lineare e ha dimostrato come le funzioni di integrazione numerica siano strumenti preziosi per lo studio
dei sistemi dinamici. Questo studio può essere esteso ad altre configurazioni di sistemi lineari o a sistemi
più complessi, contribuendo alla progettazione, ottimizzazione e comprensione di una vasta gamma di
processi e applicazioni.