Regulator rozmyty

Ireneusz Dominik KAP AGH

Rys. 1. Regulator rozmyty

a) fuzzyfikacja

ZawWE: 2,5 – 2 = 0,5

u (SV)

zero (1)

SzerPrzedz: 4-2=2

1

Przyn_SV[0] =2,5mm in FP niska: 1-(0,5/2)=3/4

3/4

Przyn_SV[1] =2,5mm in FP srednia: 1-3/4=1/4

niska (2)

srednia (3)

1/4

0 2 4

[mm]

2,5

Rys.2. Rozkład funkcji przynależności dla1-go wejścia SV

1

u (e)

6/7

Duzy_m

Maly_m

zero

Maly_p

1/7

(A)

(B)

(C)

(D)

0

- 0.5 - 0.3 - 0.2 0 0.1

0.8

[mm]

0,7

Rys.2. Rozkład funkcji przynależności dla 2-go wejścia e b) wyliczanie wartości wyjściowej dla danych: SV =2,5 [mm], PV= 1,8 [mm], obliczone e = 0,7 [mm], output MV=?

e - rror e

aly_m

aly_p

V

e S

lu

-0.5 (A) Duzy_m - 0.3 (B) M -0.2÷0.1 (C) zero 0.8 (D) M

a

(1) 0 10

15

20

25

!"#$% (2) 2 (30

40

50

60+

set v

#&!"% (3) 4 70

75

80

85

Fig. 4. Baza reguł

MV = ¾ *1/7*50 + ¾*6/7*60 + ¼*1/7* 80 + ¼*6/7*85 =

3/28*50 + 18/28*60 + 1/28*80 + 6/28*85 = 65 [A]

(* Wprowadzanie parametrow bazy reguł *) (*

X := 0;*)

Sing[0] := 10;

Sing[1] := 30;

Sing[2] := 70;

(*

X := 1;*)

Sing[3] := 15;

Sing[4] := 40;

Sing[5] := 75;

(*

X := 2;*)

Sing[6] := 20;

Sing[7] := 50;

Sing[8] := 80;

(*

X := 3;*)

Sing[9] := 25;

Sing[10] := 60;

Sing[11] := 85;

(* Położenie granic FP dla wybranych wejść*) (* Granice FP dla wejścia 1 - dla uchybu*) We[0] := e_Duzy_m; (* A -0,5*)

We[1] := e_Maly_m; (* B -0,3*)

We[2] := e_Zero_m; (* C -0,2*)

We[3] := e_Zero_p; (* C 0,1*)

We[4] := e_Maly_p; (* D 0,8*)

(* Granice FP dla wejścia 2 - dla wartości zadanej*) We[5] := INT_TO_REAL(SV_Zero); (* 1 +0*) We[6] := INT_TO_REAL(SV_Niska); (* 2 +2*) We[7] := INT_TO_REAL(SV_Srednia); (* 3 +4*) (* Rozmywanie e *)

if e > We[0] then

if e < We[1] then

ZawWE := e - We[0];

SzerPrzedz := We[1] - We[0];

Przyn_e[1] := ZawWE / SzerPrzedz;

Przyn_e[0] := 1,0 - Przyn_e[1];

X := 0;

elsif e < We[2] then

ZawWE := e - We[1];

SzerPrzedz := We[2] - We[1];

Przyn_e[1] := ZawWE / SzerPrzedz;

Przyn_e[0] := 1,0 - Przyn_e[1];

X := 1;

elsif e <= We[3] then

Przyn_e[0] := 1,0;

Przyn_e[1] := 0,0;

X := 2;

elsif e < We[4] then

ZawWE := e - We[3];

SzerPrzedz := We[4] - We[3];

Przyn_e[1] := ZawWE / SzerPrzedz;

Przyn_e[0] := 1,0 - Przyn_e[1];

X := 2;

else

Przyn_e[0] := 1,0;

Przyn_e[1] := 0,0;

X := 3;

end_if;

else

Przyn_e[0] := 1,0;

Przyn_e[1] := 0,0;

X := 0;

end_if;

(* Rozmywanie SV *)

if SV > We[5] then

if SV < We[6] then

ZawWE := SV - We[5];

SzerPrzedz := We[6] - We[5];

Przyn_SV[1] := ZawWE / SzerPrzedz;

Przyn_SV[0] := 1,0 - Przyn_SV[1];

Y := 0;

elsif SV < We[7] then

ZawWE := SV - We[6];

SzerPrzedz := We[7] - We[6];

Przyn_SV[1] := ZawWE / SzerPrzedz;

Przyn_SV[0] := 1,0 - Przyn_SV[1];

Y := 1;

else

Przyn_SV[1] := 0,0;

Przyn_SV[0] := 1,0;

Y := 2;

end_if;

else

Przyn_SV[0] := 1,0;

Przyn_SV[1] := 0,0;

Y := 0;

end_if;

(* Wnioskowanie i wyostrzanie (wyznaczanie wartości wyjściowej *) out := Przyn_e[0] * Przyn_SV[0] * INT_TO_REAL(Sing[Y + 3 * X])

+ Przyn_e[0] * Przyn_SV[1] * INT_TO_REAL(Sing[Y + 1 + 3 * X])

+ Przyn_e[1] * Przyn_SV[0] * INT_TO_REAL(Sing[Y + 3* (X + 1)])

+ Przyn_e[1] * Przyn_SV[1] * INT_TO_REAL(Sing[Y + 1 + 3 * (X + 1)]);