Règles d'entrées (Fuzzification) : ---------------------------------- Ces règles sont définies par rapport à la mesure sur l'écart de la température de l'eau des radiateurs par rapport à la température prévue. Soit : TeauC : Température de l'eau calculée TeauM : Température de l'eau mesurée Ecart : Ecart = TeauM - TeauC HysEau : Hystérésis choisi pour la t° de l'eau Si nous définissons des qualificatifs pour "Ecart" nous pouvons avoir : "Très Froid", "Froid", "Bon", "Chaud", "Très Chaud" Ce qui pourrait-être représenté par le graphe suivant : TeauM TeauM TeauM TeauM TeauM - 2X - | + + 2X HysEau HysEau | HysEau HysEau -------+----------+----------+----------+----------+------> TeauC Très | | | | | Très Froid | Froid | Bon | Chaud | Chaud Et ce qui est transcrit par les relations suivantes : Très Froid : Ecart <= (-2*HysEau) Froid : (-2*HysEau) < Ecart <= (-HysEau) Bon : (-HysEau) < Ecart <= HysEau Chaud : HysEau < Ecart <= (2*HysEau) Très Chaud : (2*HysEau) < Ecart Si nous voulons utiliser la logique floue, nous aurrons alors le graphique des ensembles flous suivant : Qualificatifs de l'écart ------------------------ Très Froid Froid Bon Chaud Très Chaud 100%------\ /\ /\ /\ /-------- \ / \ / \ / \ / \ / \ / \ / \ / 50% X X X X / \ / \ / \ / \ / \ / \ / \ / \ 0%------/-----\/-----\/-----\/-----\-------- -2 -1 0 +1 +2 Ecart exprimé en nombre d'hystérésis Comment lire ce graphique ? Si Ecart est par exemple égal à 0,34 HysEau, alors, nous pouvons affirmer que cet écart pourra être considéré comme étant à 66% "Bon" ET 34% "Chaud". Par contre, les états "Très Froid", "Froid" et "Très Chaud" aurront un résultat de 0%. Cette étape est la "Fuzzification" Règles de sorties (Défuzzification) : ------------------------------------- La sortie est içi définie comme le temps et la manière de commander la vanne à trois voies. Soit : TpsUnité : L'unité de temps de commande de la vanne TpsVanne : Le temps pendant lequel la vanne est commandée Si ce temps est positif, la vanne s'ouvre Si il est négatif, la vanne se ferme Si nous définnissons des qualificatifs pour la vanne nous pouvons avoir les valeurs suivantes : "Fermeture Longue", "Fermeture Courte", "Immobile", "Ouverture Courte" et "Ouverture Longue". Ce qui pourrait-être représenté par le graphe suivant : -2XTps -Tps 0 Tps 2XTps Unité Unité Unité Unité -------+----------+----------+----------+----------+------> TpsVanne Fermeture | Ouverture Longue | Courte | Immobile | Courte | Longue Et ce qui est transcrit par les relations suivantes : Fermeture Longue : TpsVanne <= (-2*TpsUnité) Fermeture Courte : (-2*TpsUnité) < TpsVanne <= (-TpsUnité) Immobilité : (-TpsUnité) < TpsVanne <= TpsUnité Ouverture Courte : TpsUnité < TpsVanne <= (2*TpsUnité) Ouverture Longue : (2*TpsUnité) < TpsVanne Et donc pour la logique floue, nous aurrons alors le graphique des ensembles flous suivant : Qualificatifs de la commande de vanne ------------------------------------- Fermeture Fermeture Immo Ouverture Ouverture Longue Courte bilité Courte Longue 100% /\ /\ /\ /\ /\ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ 50% / X X X X \ / / \ / \ / \ / \ \ / / \ / \ / \ / \ \ 0%------/-----\/-----\/-----\/-----\-------- -3 -2 -1 0 +1 +2 +3 TpsVanne exprimé en TpsUnité Comment lire ce graphique ? Içi, pour pouvoir lire le graphique nous avons besoin de savoir quelles sont les règles qui seront ignitialisées. Nous les décrirons dans le chapître suivant. Une des méthodes utilisée en logique floue consiste à calculer les centres de gravités des différentes figures déduites des règles. Içi, dans notre exemple les figures définies seront toujours des trapèzes. Supposont que "Fermeture Courte" est définie à 80%. Dans ce cas, l'intersection de 80% avec la triangle "Fermeture Courte" nous dessine un trapèze qui est en fait le triangle définit par "Fermeture Courte" et la ligne horizontale des 80%. Normalement, nous devrions calculer le centre de gravité de cette forme géométrique puis l'abaisser sur l'axe des "TpsUnité", et obtenir ainsi la valeur à donner à "TpsVanne". Dans l'exemple qui nous occupe, les "triangles" sont isocèles et donc leur centre de gravité se situe au centre, soit içi, -1 TpsUnité. Par contre, ce que nous aurrons besoin par la suite c'est de connaître la "hauteur" du centre de gravité. Cette hauteur est donnée par la formule suivante : H = (h*(a+2b)) / (3*(a+b)) avec : H - Hauteur du centre de gravité b - côté supérieur du trapèze a - côté inférieur du trapèze et h - la hauteur du trapèze Dans notre exemple, nous pouvons dire que grâce aux valeurs choisies dans les différents graphiques, nous aurrons toujours "a" qui sera égal à 2, et b qui sera ègal à 2*(1-h). Ce qui dans notre exemple nous donne : b=0,4 : a=2 : h=0,80 Soit H = (0,8*(2+0,8)) / (3*(2+0,4)) = 2,24 / 7,2 = 0,31 Nous pouvons noter içi, que dans notre exemple et avec les graphiques choisis, la valeur de a sera toujours égale à 2, et que la valeur de b sera toujours égale à 2*(1-h). Ce qui nous donne la formule : H = (h*(3-2*h))/(6-3*h) Si nous avons plusieurs valeurs initialisées, nous devrons déterminer la figure géométrique globale, puis en déterminer le centre de gravité. Cette étape est la "défuzzification". Règles d'inférence : -------------------- Ces règles sont exprimées comme pour la logique classique par des conditions "SI ALORS". Pour notre exemple nous aurrons les règles suivantes : SI Ecart = Très Froid ALORS Commande Vanne = Ouverture Longue SI Ecart = Froid ALORS Commande Vanne = Ouverture Courte SI Ecart = Bon ALORS Commande Vanne = Immobile SI Ecart = Chaud ALORS Commande Vanne = Fermeture Courte SI Ecart = Très Chaud ALORS Commande Vanne = Fermeture Longue Si nous reprenons notre exemple pour la fuzzification nous avons l'écart qui est 66% "Bon" ET 34% "Chaud" Nous pouvons alors dire que cela nous donne un degré d'applicabilité (DDA) de 0,66 pour "Immobile" et de 0,34 pour "Fermeture courte". Si nous reprenons ces données sur le graphique de sortie, nous obtenons : Fermeture Fermeture Immo Ouverture Ouverture Longue Courte bilité Courte Longue 100% 66% /----\ / \ 34% /------/ \ / \ 0%------/-------------------\--------------- -3 -2 -1 0 +1 +2 +3 TpsVanne exprimé en TpsUnité Nous voyons alors que cette forme peut-être décomposée en un trapèze (pour la valeur la plus haute) et un parallélogramme (pour la valeur la plus petite). Ce qui nous donne graphiquement : Fermeture Fermeture Immo Ouverture Ouverture Longue Courte bilité Courte Longue 100% 66% /----\ / \ 34% / -----/ \ / / \ 0%------/------/------------\--------------- -3 -2 -1 0 +1 +2 +3 TpsVanne exprimé en TpsUnité Nous pouvons donc calculer nos deux centre de gravité. Pour le premier, (le plus haut donc un trapèze), nous avons : TpsVanne1 = 0 * TpsUnité H1 = (h*(a+2b)) / (3*(a+b)) H1 = (h*(3-2*h))/(6-3*h) avec h = 0,66 = (0,66*1,68)/(6-1,98) = 1,1088 / 4,02 = 0,28 Pour le second, (le plus bas donc un parallélogramme) nous avons : H2 = h / 2 = 0,34 / 2 = 0,17 TpsVanne2 = (TpsUnité1 + TpsUnité2 + h) / 2 ou TpsUnitén représente les points de contact du parallélogramme sur l'axe horizontal. = (-2 + -1 + h) / 2 = -2,66 / 2 = -1,33 Il ne nous reste plus qu'à calculer le centre de gravité de l'ensemble. En fait, pour nous, seule la coordonnée horizontale, en fait celle qui donne le temps d'ouverture de la vanne, nous intéresse. Nous aurrons donc : TpsVanne = (TpsVanne1 + TpsVanne2) / 2 = (0 -1,33)/2 = -0,66 Au final, et pour le problème qui nous occupe, nous pouvons définir les éléments suivants : - Les règles d'entrées sont identiques en forme. - Les règles d'entrées ont une pente de 45°. Ce qui nous permet de dire que l'intersection d'une valeur (verticale) avec une courbe (à 45°), nous donne soit la valeur horizontale, soit la complémentaire à 1. Par exemple, pour une valeur d'entrée de -1,42, nous avons un intesection à 0,42 et une intersection à 0,58. - Les règles de sorties sont identiques en forme. - Les règles de sorties ont une pente de 45°. (Voir remarque pour les règles d'entrée). - La forme résultante dans le domaine de sortie est toujours composée d'un assemblage d'un trapèze (pour la grande valeur) et d'un parallélogramme (pour la petite valeur). - Le centre de gravité de la forme résultante peut-être calculée par la moyenne des deux centres de gravité des figures qui la compose. - Pour la valeur de sortie, seule les coordonnées horizontales (celles qui donnent le temps d'ouverture de la vanne) nous intéresse. - La coordonnée horizontale du centre de gravité du trapèze, est le centre de celui-çi, et donc pourra être calculé par la formule : Centre de gravité = (Limite1 + Limite2) / 2 - La coordonnée verticale du centre de gravité du parallélogramme peut-être calculé par la formule : Centre de gravité = (Limite3 + Limite4 + h) / 2 - La coordonnée du centre de gravité résultant peut-être défini comme la moyenne des deux centres de gravité calculés plus haut. Soit : Centre de gravité = ((Lim1+Lim2)/2 + (Lim3+Lim4+h)/2 ) / 2 ou encore : Centre de gravité = (Lim1+Lim2+Lim3+Lim4+h)/4 avec h qui est en fait la valeur d'entrée la plus basse. Nous allons voir maintenant comment simplifier la programmation. Revenons au graphique de Fuzzification. Si nous associons nos états d'entrée (Très Froid à Très Chaud) à une variable indicée à 5 éléments, nous pouvons définir : Fuz(0) => Très Froid Fuz(1) => Froid Fuz(2) => Bon Fuz(3) => Chaud Fuz(4) => Très Chaud et nous pouvons déssiner le graphique suivant ------------------------------------------------------- Fuz(0) Fuz(1) Fuz(2) Fuz(3) Fuz(4) 100%------\ /\ /\ /\ /-------- \ / \ / \ / \ / \ / \ / \ / \ / 50% X X X X / \ / \ / \ / \ / \ / \ / \ / \ 0%------/-----\/-----\/-----\/-----\-------- Ecart = -2 -1 0 +1 +2 EcA = 0 1 2 3 4 5 6 EcB = 0 | 1 | 2 | 3 | 4 | 5 ------------------------------------------------------- En plus de l'Ecart, nous définissons deux variables EcA et EcB qui sont en fait : EcA = Ecart + 3 & EcB = INT(EcA) Pour un écart inférieur à -2 et supérieur à +2, nous voyons que la valeur de EcA devra-être ajustée, et nous le ferons à l'aide de tests IF-THEN-ELSE-ENDIF Nous pouvons donc créer untableau qui vas reprendre les variables Ecart, EcA, EcB plus les valeurs décimales et complémentaires en %. Ce qui nous donne le tableau suivant : ------------------------------- Ecart | EcA | EcB | (A) | (B) ------+------+-----+-----+----- -3,10 | (0) | 0 | 100 | 0 -2,21 | (0) | 0 | 100 | 0 -2----+--(0)-+-----+-100-+---0- -1,32 | 1,68 | 1 | 32 | 68 -0,43 | 2,57 | 2 | 43 | 57 0----+------+-----+-----+----- 0,54 | 3,54 | 3 | 46 | 54 1,65 | 4,65 | 4 | 35 | 65 2----+(5,99)+-----+---1-+--99- 2,76 |(5,99)| 5 | 1 | 99 3,87 |(5,99)| 5 | 1 | 99 ------------------------------- (Où les valeurs de Ecart sont des exemples significatifs) A partir du tableau précédent, nous pouvons en déduire le tableau suivant qui vas reprendre les différentes valeurs de Fuz(n) en fonction de EcB : ------------------------------------------------------------ EcB |Fuz(0)|Fuz(1)|Fuz(2)|Fuz(3)|Fuz(4) ----+------+------+------+------+------ 0 | 100 | 0 | 0 | 0 | 0 (Très Froid) ----+------+------+------+------+------ 1 | (A) | (B) | 0 | 0 | 0 (Très Froid & Froid) 2 | 0 | (A) | (B) | 0 | 0 (Froid & Bon) ----+------+------+------+------+------ 3 | 0 | 0 | (A) | (B) | 0 (Bon & Chaud) 4 | 0 | 0 | 0 | (A) | (B) (Chaud & Très Chaud) ----+------+------+------+------+------ 5 | 0 | 0 | 0 | 0 | 99 (Très Chaud) ------------------------------------------------------------ Pour obtenir les différentes valeurs du tableau, il nous faudra écrire le petit bout de programme suivant : LET EcA = Ecart + 3 LET I = 0 DO WHILE I < 5 LET Fuz(I) = 0 LET I = I +1 ENDDO IF EcA <= 1 THEN LET EcA = 0 ENDIF IF EcA >= 5 THEN LET EcA = 5,99 ENDIF ENDIF LET EcB = INT(EcA) Fuz(EcB+1) = FRAC(EcA) Fuz(ECB) = 100 - Fuz(EcB+1) La valeur de 5,99 donnée à EcA est un valeur arbitraire qui nous permet d'obtenir les "bonnes" valeurs dans les variables Fuz(n) Une fois la réflexion sur la Fuzzification terminée, nous pouvons nous pencher sur les règles d'inférence et la Défuzzification. Comme pour la Fuzzification, nous allons essayer de simplifier la manière de calculer le temps d'ouverture ou de fermeture de la vanne à trois voies. Comme point de départ, nous avons le grapquique de commande de la vanne à trois voies. Qualificatifs de la commande de vanne ------------------------------------- Fermeture Fermeture Immo Ouverture Ouverture Longue Courte bilité Courte Longue 100% /\ /\ /\ /\ /\ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ 50% / X X X X \ / / \ / \ / \ / \ \ / / \ / \ / \ / \ \ 0%------/-----\/-----\/-----\/-----\-------- -3 -2 -1 0 +1 +2 +3 TpsVanne exprimé en TpsUnité Et après y avoir appliqué les règles d'inférence et appliquer les valeurs de Fuz(n), nous obtenons le graphique suivant. Fermeture Fermeture Immo Ouverture Ouverture Longue Courte bilité Courte Longue 100% Fuz(max) /----\ / \ Fuz(min) / -----/ \ / / \ 0%------/------/------------\--------------- -3 -2 -1 0 +1 +2 +3 TpsVanne exprimé en TpsUnité Nous avons vu plus haut, que pour calculer ce temps de commande, nous devions simplement avoir les 4 limites et la hauteur de la plus petite valeur de Fuz(n). En fait, les limites des "triangles" de Défuzzification sont égales à -3, -2, -1, 0, 1, 2, 3. et si nous reportons dans un tableau les différentes valeurs de EcB et des limites, nous obtenons en définissant Total = Lim1 + Lim2 + Lim3 + Lim4 : Limites ------- EcB | Lim1 | Lim2 | Lim3 | Lim4 | Total/4 0 | (-3) | (-3) | (-3) | (-3) | -3,00 ----+------+------+------+------+-------- 1 | -3 | -2 | -1 | 0 | -1,50 2 | -2 | -1 | 0 | 1 | -0,50 3 | -1 | 0 | 1 | 2 | 0,50 4 | 0 | 1 | 2 | 3 | 1,50 ----+------+------+------+------+-------- 5 | 3 | 3 | 3 | 3 | 3,00 En observant ce tableau, nous pouvons établir que, à part pour la première et la dernière ligne, la valeur de Total/4 peut-être calculée par la relation Total/4 = EcB - 2,5 et qu'il nous suffit d'y ajouter la valeur de Fuz(min)/4 pour obtenir la valeur du temps et du sens d'ouverture de la vanne. Tout ceci peut donc être transcrit dans le bout de code suivant : IF EcB = 0 THEN LET TpsVanne = -3 ELSE IF EcB = 5 THEN LET TpsVanne = 3 ELSE LET Fuzmin = Fuz(EcB) IF Fuz(EcB) > Fuz(EcB+1) THEN LET Fuzmin = Fuz(EcB+1) ENDIF LET TpsVanne = (EcB - 2,5) + (Fuzmin / 4) ENDIF ENDIF Et voili-voilà ! Ya plus qu'a retranscrire tout-çà en structurée..... Programmation structurée : -------------------------- ' Le but du programme sera de donner une valeur de sortie (Temps et sens ' d'ouverture de la vanne)en fonction d'une valeur d'entrée (Ecart de ' température en valeurs d'hystérésis). BEGIN ' Déclaration des variables ' ------------------------- DECLARE TeauC AS INTEGER ' En Millièmes - Température de l'eau calculée DECLARE TeauM AS INTEGER ' En Millièmes - Température de l'eau mesurée DECLARE Ecart AS INTEGER ' En Millièmes - Ecart = TeauM - TeauC ' mais exprimé en Hystérésis DECLARE HysEau AS WORD ' En Millièmes - Hystérésis choisi pour la t° de l'eau DECLARE EcA AS INTEGER ' Ecart plus 3 "retravaillé" dans les limites DECLARE EcB AS NIBBLE ' Partie entière de EcA DECLARE Fuz(4) AS BYTE ' Valeurs "fuzzifiées" dans les 4 domaines DECLARE Fuzmin AS BYTE ' Plus petite valeur de Fuz(n) DECLARE I AS BYTE ' Variable de travail DECLARE TpsVanne AS INTEGER ' Temps d'ouverture de la vanne DECLARE SensVan AS BIT ' Sens de commande (0=Fermeture, 1=Ouverture) ' Etape de Fuzzification ' ---------------------- LET Ecart = (TeauM - TeauC) / HysEau ' Calcul de l'écart entre mesure et calcul LET EcA = Ecart + 3 ' Calcul "brut" de EcA LET I = 0 ' Initialisation d'une boucle "for-next" DO WHILE I < 5 ' Comptage jusque 4 LET Fuz(I) = 0 ' Mise à zéro des variables Fuz(i) LET I = I +1 ' Incrémentation du compteur ENDDO ' Fin de la boucle "for-next" IF EcA <= 1 THEN ' Test du cas particulier si Ecart est plus LET EcA = 0 ' petit que -3. Alors EcA est fixé à zéro ENDIF ' Fin du test IF EcA >= 5 THEN ' Test du cas particulier si Ecart est plus LET EcA = 5,99 ' grand que 3. Alors Eca est fixé à 5,99 ENDIF ' Fin du test LET EcB = INT(EcA) ' Calcul de EcB (partie entière de EcA) Fuz(EcB+1) = FRAC(EcA) ' Calcul des deux valeurs Fuz(n), la première Fuz(ECB) = 100 - Fuz(EcB+1) ' est égale à la partie fractionnaire de EcA ' Exprimée en %, et la seconde est la ' complémentaire de la première ' Etape de Défuzzification ' ------------------------ IF EcB = 0 THEN ' Cas particulier où le temps de commande LET TpsVanne = -3 ' de la vanne est inférieur à -3. ELSE ' Sinon IF EcB = 5 THEN ' Cas particulier où le temps de commande LET TpsVanne = 3 ' de la vanne est supérieur à 3 ELSE ' Si TpsVanne est compris entre -3 et 3 LET Fuzmin = Fuz(EcB) ' Mise à jour "arbitraire" de Fuzmin IF Fuz(EcB) > Fuz(EcB+1) THEN ' Par contre, Fuz(EcB) n'est pas la LET Fuzmin = Fuz(EcB+1) ' plus petite, alors, Fuzmin est mis à jour ENDIF ' avec la valeur de Fuz(ECB+1) LET TpsVanne = (EcB-2,5)+(Fuzmin/4)' Calcul du temps de commande ENDIF ' Fin du test de TpsVanne > 3 ENDIF ' Fin du test de TpsVanne < -3 LET SensVan = 1 ' Le sens de commande est mis en ouverture IF TpsVanne < 0 THEN ' Si le tps de commande de vanne est négatif LET Sensvan = 0 ' Le sens de commande est mis en "Fermeture" ENDIF ' Fin du test de sens de commande LET TpsVanne = ABS(TpsVanne) ' Calcul du tempsVanne en valeur positive END ' Fin du Programme