Hello, please can you help me to solve the error in this code below!!!!
4 次查看(过去 30 天)
显示 更早的评论
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];'
0 个评论
回答(1 个)
Sam Chak
2024-2-21
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');
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Fuzzy Inference System Modeling 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!