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