0% ont trouvé ce document utile (0 vote)
24 vues15 pages

TP1

Transféré par

Safae Ait madan
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
24 vues15 pages

TP1

Transféré par

Safae Ait madan
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

% TP : Commande basée sur un observateur d'état

clear; clc;

% === 1. Définition des matrices du système ===

A = [0 -1; 1 -1]; % Matrice dynamique

B = [1; 0]; % Matrice d'entrée

C = [0 1]; % Matrice de sortie

% === 2. Gain de l'observateur ===

% Les pôles souhaités pour l'observateur sont : -1 ± j*sqrt(3)

poles_obs = [-1 + 1i*sqrt(3), -1 - 1i*sqrt(3)];

L = place(A', C', poles_obs)'; % Calcul du gain de l'observateur

% Affichage du gain de l'observateur

disp('Gain de l''observateur :');

disp(L);

% === 3. Fonction de transfert du système avec observateur ===

% Modification de la matrice A pour inclure l'observateur

A_obs = A - L * C;

% Déterminant du système

syms p;

determinant = det(p * eye(2) - A_obs);

disp('Dénominateur de la fonction de transfert (polynôme caractéristique) :');

disp(determinant);

% Fonction de transfert H(p) = C * (pI - A_obs)^(-1) * B

H = simplify(C * inv(p * eye(2) - A_obs) * B);


disp('Fonction de transfert H(p) :');

disp(H);

% === 4. Simulation de la réponse indicielle ===

% Conversion de H(p) en une fonction de transfert MATLAB

num = [1]; % Numérateur : 1

den = [1 2 4]; % Dénominateur obtenu dans les calculs : p^2 + 2p + 4

sys = tf(num, den); % Fonction de transfert

% Réponse indicielle

figure;

step(sys);

title('Réponse indicielle du système');

xlabel('Temps (s)');

ylabel('Amplitude');

% === 5. Gain de retour d'état ===

% Les pôles souhaités pour le système bouclé sont : -0.5 ± j*sqrt(3)/2

poles_ctrl = [-0.5 + 1i*sqrt(3)/2, -0.5 - 1i*sqrt(3)/2];

K = place(A, B, poles_ctrl); % Calcul du gain de retour d'état

% Affichage du gain de retour d'état

disp('Gain de retour d''état :');

disp(K);

% === 6. Commande basée sur l'observateur ===

% Matrice augmentée pour la commande

A_cl = A - B * K - L * C;

% Fonction de transfert pour le système commandé


H_aug = simplify(C * inv(p * eye(2) - A_cl) * B);

disp('Fonction de transfert avec commande basée sur observateur H_aug(p) :');

disp(H_aug);

% Réponse indicielle du système observateur-commandé

sys_obs = tf(num, den); % Vous pouvez recalculer le numérateur/dénominateur pour ce système

figure;

step(sys_obs);

title('Réponse indicielle du système observateur-commandé');

xlabel('Temps (s)');

ylabel('Amplitude');

% === 7. Dépassement et amortissement ===

% Calcul des coefficients d'amortissement et pulsation naturelle

D_percent = 10; % Dépassement maximal en %

zeta = -log(D_percent/100) / sqrt(pi^2 + (log(D_percent/100))^2); % Coefficient d'amortissement

wn = sqrt(4) / zeta; % Pulsation propre du système

disp('Coefficient d''amortissement :');

disp(zeta);

disp('Pulsation propre du système :');

disp(wn);
% Script MATLAB - Atelier 2

% 1. Création du vecteur de temps Tsim

t0 = 0; t1 = 5; t2 = 30; t3 = 31; tmax = 80;

n_sim = 0.1; % Pas d'échantillonnage

Tsim = [t0:n_sim:t1, t1+n_sim:n_sim:t2, t2+n_sim:n_sim:t3, t3+n_sim:n_sim:tmax]';

% 2. Création du vecteur de la consigne d'entrée U_def

U = 10;
tol = 1e-6; % Tolérance pour comparaison

U_def = [U * ones(1, find(abs(Tsim - t1) < tol)), ... % Valeur U jusqu'à t1

0 * ones(1, find(abs(Tsim - t2) < tol) - find(abs(Tsim - t1) < tol)), ... % Défaut d'actionneur entre
t1 et t2

U * ones(1, find(abs(Tsim - t3) < tol) - find(abs(Tsim - t2) < tol)), ... % Valeur U restaurée jusqu'à
t3

0 * ones(1, length(Tsim) - find(abs(Tsim - t3) < tol))]'; % Défaut au-delà de t3

% 3. Création de la matrice de données Data

Data = [Tsim, U_def];

disp('Matrice Data :');

disp(Data);

% 4. Création de la matrice X0 et de la matrice Nsim

X0 = [0; 0; 0; 0];

Nsim = [0:n_sim:tmax]';

% 5. Utilisation de ode45 pour résoudre une équation différentielle

% Exemple d'une équation différentielle x' = A*x + B*u

global A B C L U_ob Data

A = [0 1 0 0; 0 0 1 0; 0 0 0 1; -1 -2 -3 -4]; % Exemple de matrice A

B = [0; 0; 0; 1]; % Exemple de matrice B

C = [1 0 0 0]; % Exemple de matrice C

L = 1; % Exemple de gain L

U_ob = 10; % Exemple d'entrée observée

% Résolution avec ode45

tspan = [0 tmax];

[t, y] = ode45(@(t, x) adfunc(t, x), tspan, X0);

% 6. Affichage des résultats

figure;
subplot(2, 1, 1);

plot(Tsim, U_def, 'r', 'LineWidth', 1.5);

xlabel('Temps (s)');

ylabel('Entrée U\_def');

title('Consigne d''entrée');

grid on;

subplot(2, 1, 2);

plot(t, y, 'b', 'LineWidth', 1.5);

xlabel('Temps (s)');

ylabel('État du système');

title('Réponse du système');

grid on;

% Fonction utilisée par ode45

function dx = adfunc(t, x)

global A B U_ob Data

u = interp1(Data(:, 1), Data(:, 2), t); % Interpolation de l'entrée à l'instant t

dx = A * x + B * u; % Équation différentielle

end
% Initialisation des paramètres

t0 = 0; t1 = 5; t2 = 30; t3 = 31; tmax = 80; n_sim = 0.1;

Tsim = [t0; t1; t1 + n_sim; t2; t2 + n_sim; t3; t3 + n_sim; tmax]; % Colonne

u = 10; fd = 0; u_def = u + fd; u_obs = 10;

U_def = [u; u; u; u; u_def; u_def; u_def; u_def]; % Colonne

Data = [Tsim, U_def];

x0 = [0; 0; 0; 0]; % Conditions initiales

Nsim = 0:n_sim:tmax; % Plage de simulation

global A B C L u_obs Data

% Définition des matrices système


A = [-1, 0; 1, -1];

B = [1; 0];

C = [0, 1];

L = [3; 0];

% Résolution du système différentiel

[T, X] = ode45(@Sys_mode, Nsim, x0);

% Extraction des variables d'état

x1 = X(:, 1);

x2 = X(:, 2);

x1_obs = X(:, 3);

x2_obs = X(:, 4);

% Calcul des résidus

r1 = x1 - x1_obs;

r2 = x2 - x2_obs;

% Affichage des résultats

figure;

plot(T, x1, 'b-', T, x1_obs, 'g--');

xlabel('Temps (s)');

title('Evolution de x1 et x1_{obs}');

legend('x1', 'x1_{obs}');

figure;

plot(T, x2, 'r-', T, x2_obs, 'y--');

xlabel('Temps (s)');

title('Evolution de x2 et x2_{obs}');

legend('x2', 'x2_{obs}');
figure;

plot(T, r1, 'm-', T, r2, 'k--');

xlabel('Temps (s)');

title('Evolution des residus r1 et r2');

legend('r1', 'r2');

% Simulation des sorties

Cdef = 0.2;

fd1 = 0;

C_def = [Cdef, Cdef + fd1];

y_sys = zeros(size(T)); % Préallocation

y_obs = zeros(size(T)); % Préallocation

for i = 1:length(T)

if T(i) < max(T)/2

y_sys(i) = C * [X(i, 1); X(i, 2)];

else

y_sys(i) = C_def * [X(i, 1); X(i, 2)];

end

y_obs(i) = C * [X(i, 3); X(i, 4)];

end

% Affichage des sorties et des résidus

figure;

plot(T, y_sys, 'b-', T, y_obs, 'g--');

title('y_{sys} et y_{obs}');

xlabel('Temps (s)');

legend('y_{sys}', 'y_{obs}');

rs = y_sys - y_obs;

figure;
plot(T, rs, 'b-');

title('Residus rs');

xlabel('Temps (s)');

% Fonction de définition du système

function dx = Sys_mode(t, x)

global A B C L u_obs Data

% Lecture des données de commande

u = interp1(Data(:,1), Data(:,2), t, 'linear', 'extrap');

% Etat observateur

x_obs = x(3:4);

x_real = x(1:2);

% Modèle système avec observateur

dx_real = A * x_real + B * u;

dx_obs = A * x_obs + B * u + L * (C * x_real - C * x_obs);

% Concaténation

dx = [dx_real; dx_obs];

end

Vous aimerez peut-être aussi