feat: Add plots for analytical solution
This commit is contained in:
113
Lab01.m
113
Lab01.m
@@ -4,73 +4,78 @@ s = tf('s');
|
|||||||
A = [0 -1 5; 0 0 3; 0 0 -2];
|
A = [0 -1 5; 0 0 3; 0 0 -2];
|
||||||
B = [1 1 1]';
|
B = [1 1 1]';
|
||||||
C = [0 0 5];
|
C = [0 0 5];
|
||||||
|
D = 0;
|
||||||
|
|
||||||
Al = inv(s*eye(3)-A);
|
W = minreal(zpk(inv(s*eye(size(A))-A)));
|
||||||
|
% Nota: valutare sempre che faccia le cancellazioni
|
||||||
|
% se no inserire una tolleranza
|
||||||
|
|
||||||
|
% Definizione t
|
||||||
|
t = linspace(0,4,100);
|
||||||
|
|
||||||
%% Punto 1
|
%% Punto 1
|
||||||
%%% Stabilità interna
|
%%% Stabilità interna
|
||||||
E = real(eig(A))
|
E = real(eig(A))
|
||||||
|
% Il -2 appare con molteplicità singola -> OK
|
||||||
% Lo zero appare con molteplicità doppia, dobbiamo valutare il polinomio minimo
|
% Lo zero appare con molteplicità doppia, dobbiamo valutare il polinomio minimo
|
||||||
|
|
||||||
% Calcolo diretto con matlab
|
% Calcolo diretto delle radici del polinomio minimo con MATLAB
|
||||||
roots(minpoly(A))
|
E_min = roots(minpoly(A))
|
||||||
|
|
||||||
% Alternativa calcolando a mano il mcm (ovvero il polinomio caratteristico)
|
% Alternativa calcolando il polinomio minimo identificando il lcm della matrice Af
|
||||||
% Al = minreal(zpk(Al));
|
% Per semplificare numeratore / denominatore prima fattorizzo con zpk e poi chiamo minreal
|
||||||
|
Af = W;
|
||||||
|
% il polinomio minimo è
|
||||||
|
p_min = s^2*(s+2);
|
||||||
|
|
||||||
% Lo 0 appare con molteplicità due, pertanto il sistema è instabile
|
% Lo 0 appare con molteplicità due, pertanto il sistema è instabile
|
||||||
|
|
||||||
%%% Stabilità BIBO
|
%%% Stabilità BIBO
|
||||||
H = C*Al*B;
|
H = C*W*B;
|
||||||
p = pole(H)
|
p = pole(H)
|
||||||
|
|
||||||
% Il polo è -2 (negativo), quindi è stabile BIBO
|
% Tutti i poli devono essere negativi
|
||||||
|
% L'unico polo è -2 (negativo), quindi è BIBO stabile
|
||||||
|
|
||||||
%% Punto 2
|
%% Punto 2
|
||||||
% Calcolo risposta forzata con u(t) = 9 g(t)
|
% Calcolo risposta forzata con u(t) = 9 epsilon(t)
|
||||||
U = 9/s;
|
U = 9/s; % Trasformata dell'ingresso
|
||||||
Yf = minreal(zpk(C*Al*B*U));
|
Yf = minreal(zpk(H*U));
|
||||||
% In alternativa Yf = H*U;
|
|
||||||
|
|
||||||
[num_Xf,den_Xf]=tfdata(Yf,'v');
|
[num_Xf,den_Xf] = tfdata(Yf,'v');
|
||||||
[r1,p1]=residue(num_Xf,den_Xf)
|
[r1,p1] = residue(num_Xf,den_Xf)
|
||||||
% Yt = 22.5 - 22.5 * e^(-2t)
|
% Ys = 22.5/s - 22.5/(s+2)
|
||||||
|
Ytf = 22.5 - 22.5 * exp(-2*t);
|
||||||
|
|
||||||
%% Punto 3
|
%% Punto 3
|
||||||
% Calcolo risposta libera (dati 1)
|
% Calcolo risposta libera (dati 1)
|
||||||
Xz1 = [1 5 0]';
|
Xz1 = [1 5 0]';
|
||||||
Yf = minreal(zpk(C*Al*Xz1));
|
Yf = minreal(zpk(C*W*Xz1));
|
||||||
|
|
||||||
[num_Xf,den_Xf]=tfdata(Yf,'v');
|
[num_Xf,den_Xf] = tfdata(Yf,'v');
|
||||||
[r1,p1]=residue(num_Xf,den_Xf)
|
[r1,p1] = residue(num_Xf,den_Xf)
|
||||||
% Yt = 0
|
Yt1 = 0*t;
|
||||||
|
% Perché X(3) dipende solo da se stesso e dall'ingresso (e non da X(1) e X(2))
|
||||||
|
|
||||||
%% Punto 4
|
%% Punto 4
|
||||||
% Calcolo risposta libera (dati 2)
|
% Calcolo risposta libera (dati 2)
|
||||||
Xz1 = [0 0 3]';
|
Xz1 = [0 0 3]';
|
||||||
Yf = minreal(zpk(C*Al*Xz1));
|
Yf = minreal(zpk(C*W*Xz1));
|
||||||
|
|
||||||
[num_Xf,den_Xf]=tfdata(Yf,'v');
|
[num_Xf,den_Xf] = tfdata(Yf,'v');
|
||||||
[r1,p1]=residue(num_Xf,den_Xf)
|
[r1,p1] = residue(num_Xf,den_Xf)
|
||||||
% Yt = 15 * e^(-2t)
|
Yt2 = 15 * exp(-2*t);
|
||||||
|
|
||||||
%% Punto 5
|
%% Punto 5
|
||||||
% Calcoli dei punti 2 3 4 usando ss()
|
% Calcoli dei punti 2 3 4 usando ss()
|
||||||
|
|
||||||
% Definizione t
|
% Calcolo risposta forzata con u(t) = 9 epsilon(t)
|
||||||
t = linspace(0,10,100);
|
S = ss(A,B,C,D);
|
||||||
|
% Nota: possiamo anche calcolare la funzione di trasferimento con
|
||||||
% Calcolo risposta forzata con u(t) = 9 heaviside(t)
|
H1 = tf(S);
|
||||||
S = ss(A,B,C,0);
|
H2 = zpk(S);
|
||||||
Yf = step(9*S,t);
|
Yf = step(9*S,t);
|
||||||
|
|
||||||
% Plot risposta forzata
|
|
||||||
figure
|
|
||||||
plot(t,Yf);
|
|
||||||
title("Risposta forzata")
|
|
||||||
xlabel('t')
|
|
||||||
ylabel('Y_f')
|
|
||||||
|
|
||||||
% Calcolo risposta libera (dati 1)
|
% Calcolo risposta libera (dati 1)
|
||||||
Xi1 = [1 5 0]';
|
Xi1 = [1 5 0]';
|
||||||
Y1 = initial(S, Xi1, t);
|
Y1 = initial(S, Xi1, t);
|
||||||
@@ -79,21 +84,37 @@ Y1 = initial(S, Xi1, t);
|
|||||||
Xi2 = [0 0 3]';
|
Xi2 = [0 0 3]';
|
||||||
Y2 = initial(S, Xi2, t);
|
Y2 = initial(S, Xi2, t);
|
||||||
|
|
||||||
% Plot due risposte
|
% Plot risposta forzata
|
||||||
|
figure
|
||||||
|
hold on;
|
||||||
|
plot(t,Yf, 'b');
|
||||||
|
plot(t,Ytf, '.r');
|
||||||
|
title("Risposta forzata")
|
||||||
|
xlabel('Tempo (secondi)')
|
||||||
|
ylabel('Ampiezza')
|
||||||
|
grid
|
||||||
|
|
||||||
|
% Plot due risposte libere
|
||||||
figure
|
figure
|
||||||
tiledlayout(2,1)
|
tiledlayout(2,1)
|
||||||
|
|
||||||
nexttile
|
nexttile
|
||||||
plot(t,Y1);
|
hold on
|
||||||
|
plot(t,Y1, 'b');
|
||||||
|
plot(t,Yt1, '.r');
|
||||||
title("Risposta libera X(0) = [1 5 0]'")
|
title("Risposta libera X(0) = [1 5 0]'")
|
||||||
xlabel('t')
|
xlabel('Tempo (secondi)')
|
||||||
ylabel('Y_1')
|
ylabel('Ampiezza')
|
||||||
|
grid
|
||||||
|
|
||||||
nexttile;
|
nexttile;
|
||||||
plot(t,Y2);
|
hold on
|
||||||
|
plot(t,Y2, 'b');
|
||||||
|
plot(t,Yt2, '.r');
|
||||||
title("Risposta libera X(0) = [0 0 3]'")
|
title("Risposta libera X(0) = [0 0 3]'")
|
||||||
xlabel('t')
|
xlabel('Tempo (secondi)')
|
||||||
ylabel('Y_2')
|
ylabel('Ampiezza')
|
||||||
|
grid
|
||||||
|
|
||||||
%% Punto bonus: somma risposta forzata con risposte libere
|
%% Punto bonus: somma risposta forzata con risposte libere
|
||||||
figure
|
figure
|
||||||
@@ -102,11 +123,13 @@ tiledlayout(2,1)
|
|||||||
nexttile
|
nexttile
|
||||||
plot(t,Y1+Yf);
|
plot(t,Y1+Yf);
|
||||||
title("Risposta libera X(0) = [1 5 0]' con risposta forzata")
|
title("Risposta libera X(0) = [1 5 0]' con risposta forzata")
|
||||||
xlabel('t')
|
xlabel('Tempo (secondi)')
|
||||||
ylabel('Y_1f')
|
ylabel('Ampiezza')
|
||||||
|
grid
|
||||||
|
|
||||||
nexttile;
|
nexttile;
|
||||||
plot(t,Y2+Yf);
|
plot(t,Y2+Yf);
|
||||||
title("Risposta libera X(0) = [0 0 3]' con risposta forzata")
|
title("Risposta libera X(0) = [0 0 3]' con risposta forzata")
|
||||||
xlabel('t')
|
xlabel('Tempo (secondi)')
|
||||||
ylabel('Y_2f')
|
ylabel('Ampiezza')
|
||||||
|
grid
|
||||||
|
|||||||
Reference in New Issue
Block a user