%% Exercice 10 - Prédicteur de Smith Numérique clear; clc; close all; %% 1. Paramètres de simulation N = 50; % Nombre de pas de simulation Kp = 10; % Gain du régulateur P % Consigne en échelon unité w = ones(1, N); %% 2. SIMULATION 1 : Sans Prédicteur de Smith (Boucle P classique) y_sans = zeros(1, N); u_sans = zeros(1, N); for k = 4:N-1 % Calcul de l'erreur classique e = w(k) - y_sans(k); % Commande P u_sans(k) = Kp * e; % Équation du procédé : y(k+1) = 0.9512*y(k) + 0.04877*u(k-2) y_sans(k+1) = 0.9512 * y_sans(k) + 0.04877 * u_sans(k-2); end %% 3. SIMULATION 2 : Avec Prédicteur de Smith y_avec = zeros(1, N); u_avec = zeros(1, N); Up = zeros(1, N); % Variables de stockage d'états Up_old = 0; U_old1 = 0; U_old2 = 0; U_old3 = 0; for k = 4:N-1 % Calcul du signal du prédicteur de Smith Up(k) = 0.9512 * Up_old + 0.04877 * U_old1 - 0.04877 * U_old3; % Erreur de réglage corrigée par le prédicteur e = w(k) - y_avec(k) - Up(k); % Commande du régulateur P u_avec(k) = Kp * e; % Équation du procédé réel y_avec(k+1) = 0.9512 * y_avec(k) + 0.04877 * u_avec(k-2); % Mise à jour des registres de retard Up_old = Up(k); U_old3 = U_old2; U_old2 = U_old1; U_old1 = u_avec(k); end %% 4. Affichage des résultats figure('Name', 'Prédicteur de Smith'); subplot(2,1,1); stairs(1:N, y_sans, 'r--', 'LineWidth', 1.5); hold on; stairs(1:N, y_avec, 'b-', 'LineWidth', 1.5); stairs(1:N, w, 'k:', 'LineWidth', 1.2); grid on; ylabel('Sortie y(k)'); legend('Sans Prédicteur de Smith', 'Avec Prédicteur de Smith', 'Consigne w(k)'); title('Comparaison de la réponse indicielle (Kp = 10)'); subplot(2,1,2); stairs(1:N, u_sans, 'r--', 'LineWidth', 1.5); hold on; stairs(1:N, u_avec, 'b-', 'LineWidth', 1.5); grid on; xlabel('Temps [pas k]'); ylabel('Commande u(k)'); legend('Commande sans Smith', 'Commande avec Smith');