Hello, please can you help me to solve the error in this code below!!!!

3 views (last 30 days)
This is the code:
% Paramètres du système
xi = 0.5; % Coefficient d'amortissement
omega_n = 1; % Fréquence naturelle
Kp = 1; % Gain de contrôle
theta = 1; % Retard de temps
% Définition des ensembles flous d'entrée
erreur_floue = [-3 -2 -1 0 1 2 3]; % Erreur de température floue
derivative_floue = [-2 -1 0 1 2]; % Dérivée de l'erreur floue
% Définition des fonctions d'appartenance pour les ensembles flous
erreur_froide = gaussmf(erreur_floue, [1 -2]);
erreur_modere = gaussmf(erreur_floue, [1 0]);
erreur_chaude = gaussmf(erreur_floue, [1 2]);
derivative_basse = gaussmf(derivative_floue, [1 -1]);
derivative_nulle = gaussmf(derivative_floue, [1 0]);
derivative_haute = gaussmf(derivative_floue, [1 1]);
% Création des règles floues
regles = [
1 1 1 1 2; % Si erreur est froide ET dérivée est basse, alors action est modérée
1 2 2 1 1; % Si erreur est froide ET dérivée est nulle, alors action est modérée
1 3 3 2 1; % Si erreur est froide ET dérivée est haute, alors action est modérée
2 1 1 1 1; % Si erreur est modérée ET dérivée est basse, alors action est modérée
2 2 2 1 1; % Si erreur est modérée ET dérivée est nulle, alors action est modérée
2 3 3 2 1; % Si erreur est modérée ET dérivée est haute, alors action est modérée
3 1 1 2 1; % Si erreur est chaude ET dérivée est basse, alors action est modérée
3 2 2 2 1; % Si erreur est chaude ET dérivée est nulle, alors action est modérée
3 3 3 1 2; % Si erreur est chaude ET dérivée est haute, alors action est forte
];
% Simulation
t = 0:0.1:10; % Temps de simulation
u = zeros(size(t)); % Entrée (erreur de température)
y = zeros(size(t)); % Sortie (température)
for i = 3:length(t)
% Calcul de l'erreur de température avec retard
erreur = sin(t(i)) - sin(t(i-1) - theta);
% Calcul de la dérivée de l'erreur
derivative = erreur - (sin(t(i-1)) - sin(t(i-2))) / 0.1;
% Calcul des degrés d'appartenance
erreur_degrees = [evalfis([erreur erreur derivative], regles)'; 0 0 0];
% Calcul de la sortie du Contrôleur Flou de Type 1 TS
sortie = sum(erreur_degrees .* [erreur_modere; erreur_froide; erreur_chaude]);
% Calcul de la sortie du système
y(i) = -2*xi*omega_n*y(i-1) - omega_n^2*y(i-2) + Kp*sortie;
end
% Affichage des résultats
plot(t, y);
xlabel('Temps');
ylabel('Température');
title('Simulation du système à retard d''ordre 2 avec Contrôleur Flou de Type 1 TS');
This is the error 'Error using evalfis (line 51)
The second argument must be a FIS structure.
Error in Chauffage (line 44)
erreur_degrees = [evalfis([erreur erreur derivative], regles)'; 0 0 0];'

Answers (1)

Sam Chak
Sam Chak on 21 Feb 2024
I'm not entirely certain about the purpose of your code since some lines appear to deviate from the strict rules and syntax outlined in the MATLAB documentation. As a result, I can only partially make adjustments to the code, specifically in the Fuzzy Logic section. Since the fuzzy system type and the fuzzy output were not specified, I assumed the Sugeno type and designed the fuzzy output to produce nonlinear action within the range of -1 to 1.
% 9-Rule FIS
fis = sugfis('Name', "FuzzyTemp");
% Fuzzy Input #1
fis = addInput(fis, [-3 +3], 'Name', 'E');
fis = addMF(fis, 'E', 'gaussmf', [1 -2], 'Name', 'froide');
fis = addMF(fis, 'E', 'gaussmf', [1 0], 'Name', 'modere');
fis = addMF(fis, 'E', 'gaussmf', [1 2], 'Name', 'chaude');
% Fuzzy Input #2
fis = addInput(fis, [-2 +2], 'Name', 'D');
fis = addMF(fis, 'D', 'gaussmf', [1 -1], 'Name', 'basse');
fis = addMF(fis, 'D', 'gaussmf', [1 0], 'Name', 'nulle');
fis = addMF(fis, 'D', 'gaussmf', [1 1], 'Name', 'haute');
% Plot membership functions for inputs
figure(1)
subplot(2,1,1)
plotmf(fis, 'input', 1), grid on, title('Erreur')
subplot(2,1,2)
plotmf(fis, 'input', 2), grid on, title('Dérivée d''erreur')
% Fuzzy Output (This part is entirely made up by me. Modify to suit your application)
a = 0.57;
fis = addOutput(fis, [-2*a +2*a], 'Name', 'U');
fis = addMF(fis, 'U', 'constant', -2.0*a, 'Name', 'NG'); % Négatif Grand
fis = addMF(fis, 'U', 'constant', -1.8*a, 'Name', 'NM'); % Négatif Moyen
fis = addMF(fis, 'U', 'constant', 0, 'Name', 'ZR'); % Zéro
fis = addMF(fis, 'U', 'constant', +1.8*a, 'Name', 'PM'); % Positif Moyen
fis = addMF(fis, 'U', 'constant', +2.0*a, 'Name', 'PG'); % Positif Grand
% Rules (9 rules are maintained, but action follows the Fuzzy Output)
regles = [...
"E==froide & D==basse => U=NG"; % Si erreur est froide ET dérivée est basse, alors action est Négatif Grand
"E==froide & D==nulle => U=NM"; % Si erreur est froide ET dérivée est nulle, alors action est Négatif Moyen
"E==froide & D==haute => U=ZR"; % Si erreur est froide ET dérivée est haute, alors action est Zéro
"E==modere & D==basse => U=NM"; % Si erreur est modérée ET dérivée est basse, alors action est Négatif Moyen
"E==modere & D==nulle => U=ZR"; % Si erreur est modérée ET dérivée est nulle, alors action est Zéro
"E==modere & D==haute => U=PM"; % Si erreur est modérée ET dérivée est haute, alors action est Positif Moyen
"E==chaude & D==basse => U=ZR"; % Si erreur est chaude ET dérivée est basse, alors action est Zéro
"E==chaude & D==nulle => U=PM"; % Si erreur est chaude ET dérivée est nulle, alors action est Positif Moyen
"E==chaude & D==haute => U=PG"; % Si erreur est chaude ET dérivée est haute, alors action est Positif Grand
];
fis = addRule(fis, regles);
figure(2)
opt = gensurfOptions('NumGridPoints', 41);
gensurf(fis, opt);
xlabel('Erreur'), ylabel('Dérivée d''erreur'), zlabel('Action');
title('Action Surface');

Categories

Find more on Fuzzy Logic Toolbox in Help Center and File Exchange

Products


Release

R2014a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!