Obliczenia na Liczbach Rozmytych (Fuzzy Numbers)
Projekt "odległość rozmyta granul" z przedmiotu NTwI
Program implementuje operacje na liczbach rozmytych (fuzzy numbers) reprezentowanych jako trójkątne funkcje przynależności. Liczby rozmyte są używane w logice rozmytej i teorii zbiorów rozmytych do reprezentowania nieprecyzyjnych wartości.
Reprezentacja liczby rozmytej
W tym projekcie liczba rozmyta jest reprezentowana przez trzy parametry:
- x1 (lewy punkt) - dolna granica nośnika funkcji przynależności
- m (środek) - wartość z maksymalną przynależnością (równą 1)
- x2 (prawy punkt) - górna granica nośnika funkcji przynależności
📁 Struktura projektu
/NTwI-obliczenia-ziarniste/
├── app.py
├── RozmytyZbior.py
└── README.md
Operacje na liczbach rozmytych
Wyświetlanie pojedynczej liczby rozmytej
Mnożenie liczby rozmytej przez liczbę rzeczywistą
Łańcuch operacji na wielu liczbach rozmytych
Wymagania
Instalacja: pip install numpy matplotlib
Uruchomienie: python app.py [argumenty]
Użycie programu
Program jest uruchamiany z linii poleceń z różnymi argumentami w zależności od operacji, którą chcemy wykonać.
Aby wyświetlić pojedynczą liczbę rozmytą, należy podać trzy parametry: lewy punkt, środek i prawy punkt.
python app.py x1 m x2
Przykład:
python app.py 2 3 4
Aby pomnożyć liczbę rozmytą przez liczbę rzeczywistą lub podnieść ją do potęgi, należy podać parametry liczby rozmytej, operator ("*" dla mnożenia lub "^" dla potęgowania) oraz liczbę rzeczywistą.
python app.py x1 m x2 operator liczba
Przykłady:
python app.py 2 3 4 * 2
python app.py 2 3 4 ^ 2
Aby wykonać operację na dwóch liczbach rozmytych (dodawanie, odejmowanie, mnożenie), należy podać parametry obu liczb rozmytych oraz operator ("+" dla dodawania, "-" dla odejmowania, "*" dla mnożenia).
python app.py x1_A m_A x2_A operator x1_B m_B x2_B
Przykłady:
python app.py 2 3 4 + 5 6 7
python app.py 2 3 4 - 1 2 3
python app.py 2 3 4 * 1 2 3
Program obsługuje również łańcuch operacji na wielu liczbach rozmytych. Wynik poprzedniej operacji jest używany jako pierwszy argument kolejnej operacji.
python app.py x1_A m_A x2_A operator1 x1_B m_B x2_B operator2 x1_C m_C x2_C ...
Przykład:
python app.py 2 3 4 + 5 6 7 - 1 2 3
Teoria zbiorów rozmytych
Zbiór rozmyty to zbiór, w którym każdy element należy do zbioru z pewnym stopniem przynależności z przedziału [0, 1]. W przeciwieństwie do klasycznej teorii zbiorów, gdzie element albo należy do zbioru (przynależność 1), albo nie należy (przynależność 0), w zbiorach rozmytych element może należeć do zbioru częściowo.
W projekcie zaimplementowano następujące operacje:
-
Dodawanie: Jeśli A i B są liczbami rozmytymi, to A + B jest liczbą rozmytą, której parametry są obliczane jako:
- m = m_A + m_B
- x1 i x2 są obliczane na podstawie odległości od środka
-
Odejmowanie: Jeśli A i B są liczbami rozmytymi, to A - B jest liczbą rozmytą, której parametry są obliczane jako:
- m = m_A - m_B
- x1 i x2 są obliczane na podstawie odległości od środka
-
Mnożenie przez liczbę rzeczywistą: Jeśli A jest liczbą rozmytą, a k jest liczbą rzeczywistą, to A * k jest liczbą rozmytą, której parametry są obliczane jako:
- m = m_A * k
- x1 i x2 są obliczane na podstawie odległości od środka
-
Potęgowanie: Jeśli A jest liczbą rozmytą, a n jest liczbą rzeczywistą, to A^n jest liczbą rozmytą, której parametry są obliczane jako:
- m = m_A^n
- x1 i x2 są obliczane na podstawie odległości od środka
-
Mnożenie dwóch liczb rozmytych: Jeśli A i B są liczbami rozmytymi, to A * B jest liczbą rozmytą, której parametry są obliczane jako:
- m = m_A * m_B
- x1 i x2 są obliczane na podstawie odległości od środka
Klasa RozmytyZbior implementuje zbiór rozmyty z trójkątną funkcją przynależności. Poniżej przedstawiono fragment kodu implementujący dodawanie dwóch zbiorów rozmytych:
def dodaj(self, inny_zbior):
"""
Dodaje dwa zbiory rozmyte.
:param inny_zbior: Inny zbiór rozmyty do dodania.
:return: Nowy zbiór rozmyty będący wynikiem dodawania.
"""
m = self.m + inny_zbior.m
x1=(m-abs(self.m-self.x1)+(m-abs(inny_zbior.m-inny_zbior.x1)))/2
x2=(m+abs(self.m-self.x2)+(m+abs(inny_zbior.m-inny_zbior.x2)))/2
return RozmytyZbior(x1, m, x2, np.arange(x1-0.2, x2+0.2, 0.01))