POLITECHNIKA CZSTOCHOWSKA
WYDZIAA INŻYNIERI MECHANICZNEJ I INFORMATYKI
MAGISTERSKIE STUDIA UZUPEAANIAJCE
KIERUNEK INFORMATYKA
Specjalność: Sieci komputerowe
PRACA DYPLOMOWA
Tytuł:
Wykorzystanie metod teorii zbiorów rozmytych oraz arytmetyki
przedziałowej dla oceny parametrów finansowych inwestycji rzeczowych.
Autor:
Piotr Perka
Promotor:
Prof. dr hab. inż. Paweł Sewastjanow
Recenzent:
& & & & & & & & & & & & & & &
CZSTOCHOWA 2003
Spis treści:
1 Cel pracy. ...........................................................................................................2
2 Wstęp .................................................................................................................2
3 Podstawowe pojęcia i parametry finansowe związane z inwestycjami.................3
3.1 Rodzaje inwestycji......................................................................................3
3.2 Dyskontowane parametry finansowe inwestycji. .........................................3
3.3 Analiza wskazników finansowych w warunkach niepewności.....................6
4 Wykorzystanie teorii zbiorów rozmytych w ocenie parametrów finansowych.....8
4.1 Nieokreśloność parametrów a obliczenia.....................................................8
4.2 Zbiory rozmyte. ..........................................................................................8
4.3 Własności zbiorów rozmytych. .................................................................14
4.4 Liczby rozmyte.........................................................................................15
4.5 Operacje na liczbach rozmytych................................................................16
4.6 Reprezentacja zbiorów rozmytych za pomocą ą-przekrojów.....................20
4.7 Operacje na ostrych przedziałach..............................................................22
4.8 Zastosowana metoda porównań przedziałów ostrych i rozmytych. ............23
5 Stworzenie oprogramowania do oceny inwestycji.............................................27
5.1 Założenia. .................................................................................................27
5.2 Oprogramowanie umożliwiające operowanie na zwykłych przedziałach. ..30
5.3 Oprogramowanie umożliwiające działania na przedziałach rozmytych......33
5.4 Funkcje pozwalające na obliczenie parametrów finansowych....................38
5.5 Program do obliczania parametrów inwestycji. .........................................40
5.6 Przykład obliczeń wykonanych przy pomocy programu............................44
6 Wnioski............................................................................................................46
7 Literatura..........................................................................................................47
8 Dodatek A: oprogramowanie. ...........................................................................48
- 1 -
1 Cel pracy.
Celem podstawowym pracy jest opracowanie systemu informatycznego do
wspomagania podejmowania decyzji finansowych przy inwestowaniu w aktywa
rzeczywiste w warunkach niepewności.
Celem szczegółowym było stworzenie w ramach systemu informatycznego
oprogramowania realizującego możliwości teorii zbiorów rozmytych i arytmetyki
przedziałowej w obliczeniach parametrów finansowych w warunkach niepewności, w tym
o charakterze subiektywnym. Parametry do obliczeń wybrano wskazniki finansowe
zalecane przez Europejski Bank Odbudowy i Rozwoju. Są to wartość bieżąca netto (NPV),
wewnętrzna stopa zwrotu (IRR), okres zwrotu inwestycji i rentowność.
2 Wstęp
Wielokrotnie w języku potocznym spotykamy się nieprecyzyjnymi, często
przybliżonymi stwierdzeniami dotyczącymi różnych wartości. Na przykład na pytanie o
zarobki wielu z nas odpowiada wartościami przybliżonymi (np. około 1000zł gdy jest to
1003zł). Im na wartość tę ma wpływ więcej czynników np. koniunktura na towary które
produkuje nasza firma, poziom cen itp., a nasza pensja jest uzależniona od tych czynników
tym trudniej jest nam określić wartości przyszłe naszych zarobków.
Podobnie rzecz się ma z planowaniem różnego rodzaju przedsięwzięć finansowych.
Zwłaszcza jeśli plany te obejmują wiele lat. Nie jesteśmy wtedy w stanie określić
precyzyjnie wielu parametrów takich jak np. oprocentowanie kredytów, przyszłe
przychody czy koniunktura w gospodarce. Często zwracamy się wówczas o pomoc do
ekspertów. Uzyskane od kilku ekspertów odpowiedzi często różnią się od siebie. Biorąc je
wszystkie pod uwagÄ™ nie uzyskamy jednoznacznej ostrej odpowiedzi.
Jeśli skupimy się na odpowiedzi jednego eksperta istnieje ryzyko że może się on
mylić. Jeśli natomiast wezmiemy pod uwagę odpowiedzi wielu ekspertów, otrzymamy
pewien przedział.
Aby uwzględnić w uzyskanej w ten sposób odpowiedzi nie tylko przedział wartości
ale również informację o przedziale w którym mieści się największa liczba otrzymanych
odpowiedzi, należy do opisu takich wartości zastosować liczby rozmyte.
Teoria zbiorów rozmytych została sformułowana przez L. A. Zadeha i opublikowana
w 1965r. Idea budowania zbiorów rozmytych pojawiła się już wcześniej w pracach E
Borela w1959r, ale dopiero L. A. Zade nadał jej sformalizowaną matematyczną postać.
Zbiór rozmyty możemy określić jako zbiór obiektów który deklaruje stopień
przynależności obiektu do niego od całkowitej do jej braku. Bez wyznaczania ścisłej
granicy między obiektami które do niego wchodzą lub nie.
Przykładem takich zbiorów mogą być stosowane w życiu codziennym pojęcia zimno,
ciepło. Czy temperaturę powietrza 100C należy uznać za ciepło czy zimno, na pewno nasza
odpowiedz będzie różna w zależności od pory roku. Kolejnym przykładem może być
wzrost, np. czy 170cm należy uznać za wzrost wysoki czy niski , i tu nasza odpowiedz
może należeć do obu zbiorów w zależności od środowiska w jakim żyjemy.
Obecnie teoria zbiorów rozmytych jest szeroko stosowana do modelowania i
sterowania w różnych systemach m.in. sterowania silnikami samochodowymi, procesami
produkcyjnymi, systemami chłodniczymi, piecami do spalania śmieci, systemami
spawalniczymi itp.
Teoria zborów rozmytych znajduje również swe zastosowanie w ekonomi i
sterowaniu przedsiębiorstwami.
- 2 -
3 Podstawowe pojęcia i parametry finansowe związane z
inwestycjami.
3.1 Rodzaje inwestycji.
Inwestycją możemy nazwać operacje związane z wydatkowaniem środków
finansowych przedsiębiorstwa, na realizację projektów które mają przynieść w przyszłości
zyski. Należy podkreślić iż nie każde wydatkowanie pieniędzy jest inwestowaniem.
Inwestycja (w odróżnieniu od działalności operacyjnej) charakteryzuje się: długim
okresem zaangażowania środków finansowych oraz dużymi nakładami finansowymi.
Otrzymane w przyszłości zyski z inwestycji mają zwiększyć efektywność i
konkurencyjność przedsiębiorstwa. Kolejną charakterystyczną cechą inwestycji jest to że
nakłady finansowe na inwestycję są znane a spodziewane zyski są jedynie możliwe a wiec
niepewne.
Rozróżniamy trzy rodzaje inwestycji:
- inwestycje w aktywa rzeczowe,
- inwestycje w aktywa finansowe, (w tym w papiery wartościowe),
- inwestycje w aktywa niematerialne.
Jako aktywa rzeczowe rozumiemy obiekty produkcyjne, budynki i budowle, a także
maszyny i urządzenia dla których przewidywany okres użytkowania jest dłuższy od roku.
Często inwestycje w aktywa rzeczowe określa się mianem inwestycji w realne aktywa.
Pod pojęciem aktywów finansowych rozumiemy prawa do otrzymania sum pieniężnych od
innych podmiotów, na przykład depozyty bankowe, akcje, obligacje itd.
Do aktywów niematerialnych zaliczamy: wartości, nabyte przez firmę poprzez
przekwalifikowanie lub podwyższenie kwalifikacji personelu, znaki handlowe, zakupu
licencji, praw itp.
Inwestycje w aktywa rzeczowe można podzielić na:
- inwestycje w celu podwyższenia efektywności zrealizowane mogą być w wyniku
zmiany technologii, maszyn, urządzeń, szkolenia personelu albo przemieszczenia
mocy produkcyjnych do obszarów o wyższej zyskowności produkcji;
- inwestycje w celu rozszerzenia produkcji celem takiego inwestowania może być
zwiększenie mocy produkcyjnych dla zaspokojenia wcześniej opanowanych
rynków zbytu;
- inwestycje w celu stworzenia nowej produkcji - zabezpieczajÄ… one realizacjÄ™
nowych przedsięwzięć, które to pozwolą na produkcję nowych wyrobów albo
stworzą możliwości wyjścia z dotychczasowymi produktami na nowe rynki zbytu;
- inwestycje w celu zaspokojenia wymagań władz państwowych mają one na celu
dostosowanie przedsiębiorstwa do wymagań określonych przepisami prawa np.:
spełnianie norm ekologicznych, bezpieczeństwa pracy itp.
3.2 Dyskontowane parametry finansowe inwestycji.
Do oceny rezultatów planowanych inwestycji finansowych stosuje się obecnie
dyskontowane parametry efektywności, takie jak: czysty dochód, wewnętrzną stopę
zwrotu, okres zwrotu podstawowych wkładów kapitałowych, rentowność projektu.
Charakteryzują one zależności pomiędzy przepływami finansowymi, czyli wydatkami
inwestycyjnymi i dochodami jakie projektowana inwestycja może przynieść. Do
najczęściej stosowanych wskazników należą: wartość bieżąca netto (Net Present Value
NPV) i wewnętrzny stopa zwrotu (Internal Rate of Return IRR).
- 3 -
Tabela 3.1Częstość wykorzystywania wskazników finansowych (dane badań 103 większych kompanii
naftowych USA w 1983 roku).
Wskaznik Typ zastosowania
efektywności Podstawowy wskaznik Pomocniczy wskaznik
IRR 69% 14%
NPV 32% 39%
Inne wskazniki 12% 21%
Wartość bieżący netto (NPV) stanowi różnicę pomiędzy dochodami i nakładami
kapitałowych zdyskontowanych na określony moment czasowy (np. rok początku
realizacji projektu).
Równanie na obliczenie wartości bieżącej netto (NPV) ma postać:
T
Pt tc KVt
NPV = -
" "
t t
(1 + d) (1 + d)
t=tn t=0
gdzie:
d- wielkość oprocentowania pożyczek, albo stopa dyskontowa, %;
tn- rok rozpoczęcia produkcji;
tc- rok zakończenia budowy według projektu;
KVt- wydatki inwestycyjne (wkłady kapitałowe) w roku t;
Pt- strumień wpływów pieniężnych w roku t,
T- czas realizacji inwestycji w latach.
Powyższy wzór zakłada istnienie idealnego rynku kapitałowego, w którym istnieje
jednolita stawka procentowa. Często więc jako d przyjmuje się średnią bankowej stopię
dyskontową, lub inną wartość, odpowiadającą stopie dochodu od lokaty kapitału w inne
projekty lub papiery wartościowe.Przy ocenie wydatków inwestycyjnych najważniejsze
jest uwzględnienie zródeł środków finansowych, które wykorzystano przy wydatkach.
Kolejnym parametrem jest wewnętrzna stopa zwrotu (IRR). Alternatywą dla
inwestowania środków finansowych w projekt jest umieszczenie ich na lokacie bankowej.
Otrzymywane w trakcie realizacji projektu dochody, również zostają umieszczone na
rachunku depozytowym. Jeżeli rynkowa stopa oprocentowania, jest równa IRR, to
inwestowanie środków w projekt przyniesie taki sam dochód, co umieszczenie ich na
lokacie bankowej. A więc obie alternatywy ulokowania środków finansowych są
równoznaczne. Jeżeli stopa oprocentowania pożyczek jest niższa od IRR projektu,
inwestowanie w niego środków jest korzystne, Natomiast jeżeli IRR jest niższe od
oprocentowania pożyczek oznacza to nieefektywność projektu względem lokaty bankowej.
Tak więc wewnętrzna stopa zwrotu IRR powala na określenie efektywności projektów
przy zadanej stopie oprocentowania pożyczek. Wartość IRR można określić rozwiązując
poniższe równanie nieliniowe względem d
T
Pt tc KVt
- = 0
" "
t t
(1 + d ) (1 + d)
t=tn t=0
Zależność wartości bieżącej netto od stopy procentowej ma postać przedstawioną na
poniższym rysunku , pod warunkiem że nadwyżka dochodów nad wypłatami w całym
planowanym okresie przeznaczona jest wyłącznie na spłacenie oprocentowania według
- 4 -
wewnętrznej stopy zwrotu oraz na amortyzację włożonego kapitału.
NPV1
IRR
0
d
Rys. 3.1 Zależność wartości bieżącej netto od wartości stopy procentowej.
Kolejnym szeroko stosowanym parametrem jest okres zwrotu inwestycji (Payback
Period, PB).Określa się go jako okres czasu, w ciągu którego suma przychodów,
zdyskontowanych na chwilę zakończenia inwestycji równa się sumie wydatków
inwestycyjnych. Równanie dla okresu zwrotu inwestycji można więc zapisać w postaci
h
Pt
= KV
"
t
(1 + d)
t=0
gdzie h okres zwrotu, KV suma nakładów kapitałowych na projekt.
W tym równaniu t=0 odpowiada chwili zakończenia budowy. Wielkość h określa się na
drodze kolejnego sumowania członów szeregu dyskontowanych dochodów do chwili,
otrzymania sumy, równej poziomowi inwestycji albo wyższa.
Jeżeli wprowadzimy pomocniczy parametr:
m
Pt
Sm =
"
t
(1 + d)
t=0
przy czym Sm
Wtedy okres zwrotu jest w przybliżeniu równy
KV - Sm
m+1
h = m + (1 + d)
Pm + 1
Oprócz intensywności wpływów, na wielkość okresu zwrotu, istotny wpływ ma stosowana
norma dyskontowania wpływów. W praktyce okres zwrotu może być równy
nieskończoności.
Kolejnym ważnym parametrem w ocenie inwestycji jest dyskontowana rentowność.
Rentowność (Benefit Cost Ratio), albo indeks dochodowości (Profitability Index, PI)
projektu inwestycyjnego stanowi stosunek dyskontowanych dochodów do
zdyskontowanych wydatków inwestycyjnych
T
Pt
"
t
(1 + d)
t=tn
R =
tc
KVt
"
t
(1 + d)
t=0
- 5 -
Jeżeli norma dyskontowania, jest mniejsza od IRR, rentowność jest większa od 1. Wyższa
od jedności rentowność projektu oznacza jego dochodowość przy rozpatrywanym
poziomie oprocentowania. Jeżeli rentowność projektu jest mniejsza od jedności, oznacza to
jego nieefektywność przy danym poziomie oprocentowania.
Istnieje wiele różnych wskazników finansowych pozwalających na analizę
inwestycji, my jednak skupimy się na czterech powyższych wskaznikach akceptowanych
przez Europejski Bank Odbudowy i Rozwoju.
3.3 Analiza wskazników finansowych w warunkach niepewności.
Tradycyjne podejście do obliczania parametrów finansowych inwestycji takich jak
NPV czy IRR, nie uwzględnia jednakże tego iż parametry takie jak: wartość przyszłych
dochodów Pt, wydatków KV czy stóp procentowych d są w rzeczywistości wartościami
trudnymi do jednoznacznego określenia, można powiedzieć nieokreślonymi.
PodejmujÄ…c siÄ™ inwestowania, inwestor bÄ…dz pracujÄ…cy dla niego eksperci nie sÄ… w
stanie wyznaczyć ostrych wartości parametrów finansowych, ale jedynie podać przedziały
w jakich wartości te mogą się znajdować, oraz przedział w którym znajdują się najbardziej
prawdopodobne wartości.
Uwzględnienie niepewności w obliczeniach oprócz trudności w metodyce obliczeń,
wymaga również określenia stopnia ryzyka inwestycji.
Ryzyko finansowe można rozpatrywać jako stopień określoności strat z powodu:
- możliwości nie osiągnięcia postawionego celu,
- nieokreśloności prognozowanego rezultatu,
- obiektywności oceny prognozowanego rezultatu.
Innym podejściem jest interpretowanie ryzyka jako stopnia zmienności dochodu w
wyniku zarządzania aktywami. Rozliczne metody ilościowej oceny ryzyka opierają się
głównie na analizie wrażliwości koniunktury, lub analizie prawdopodobnego rozkładu
dochodowości.
Na przykład Bank Światowy do analizy inwestycji proponuje następujące trzy
metody:
- analiza wrażliwości, przy której bada się wpływ określonych (5%, 10% i inne)
wariacji najważniejszych dla projektu parametrów wejściowych (rozmiary
inwestycji, dynamika przychodów i wydatków, normy dyskontowania i inne) na
stabilność ocen efektywności projektu,
- metoda badań statystycznych, przy której wartości niedeterminowanych
kluczowych parametrów wejściowych wybiera się losowo według znanej
procedury typu Monte-Carlo (przy pomocy generatora liczb losowych),
- metoda scenariuszy, kiedy doświadczeni eksperci opracowują kilka typowych
wariantów rozwoju wydarzeń odnośnie wartości dynamiki produkcji, przychodów i
wydatków itd.
Istota pierwszej metody na przykładzie parametru NPV polega na wyliczeniu
rozrzutu wariacji NPV, wychodzÄ…c od pesymistycznej (n), poprzez najbardziej
prawdopodobną (b) do optymistycznej (o) oceny parametrów). Otrzymujemy rozrzut
wariacji R = NPVo - NPVn jako miarÄ™ ryzyka, zwiÄ…zanÄ… z danym projektem
inwestycyjnym.
Druga metoda polega na dokonanej przez ekspertów ocenie prawdopodobieństw
pojawienia się prognozowanych wartości dochodów i wydatków inwestycyjnych. Wartość
NPV oblicza siÄ™ ze zdefiniowanego w poprzednim podrozdziale wzoru na NPV, przy czym
wartości Pt i KVt zamienione zostają na Ppt * Pt i Pkvt * KVt , gdzie Ppt i Pkvt - to
podane przez ekspertów prawdopodobieństwa pojawienia się odpowiednich dochodów i
- 6 -
wydatków w roku t. Zgodnie z zastosowanymi wzorami na Pt i KVt wartość NPV powinna
maleć wraz ze wzrostem ryzyka. Jednak może się zdarzyć że różnica w danym okresie
czasowym t między PPt*Pt a Pkvt*KVt może być większa od różnicy między Pt i KVt ,w
wypadku gdy prawdopodobieństwo zaistnienia dochodów PPt będzie większe od
prawdopodobieństwa zaistnienia wydatków Pkvt, co może doprowadzić do wzrostu
wartości NPV pomimo wzrostu ryzyka.
Kolejnym błędem tej metody może być to iż uwzględnia ona tylko ściśle określone
wartości np. dochody Pt i ich prawdopodobieństwo PPt nie uwzględniając innych wartości
parametru Pt chociażby były one większe.
Aby otrzymać bardziej realny obraz przyszłych parametrów należy znać
prawdopodobieństwa (o charakterze częstotliwościowym lub subiektywnym) przyszłych
parametrów.
Przy zastosowaniu powyższej metody bardziej uzasadnione ekonomicznie od
poszukiwania wartości NPV jest dokonanie oceny ryzyka związanego z inwestycją. Polega
ono na zbudowaniu prawdopodobnego rozkładu dochodów, wyliczeniu odchylenia
standardowego od dochodu średniego i współczynnika wariacji, który to przyjmuje się
jako stopień ryzyka, związanego z danym aktywem. Im wyższy współczynnik wariacji tym
większe ryzyko finansowe związane z inwestycją.
Wykonanie takiej oceny może przebiegać następującego:
- określamy prognozowane wartości dochodów Ki oraz prawdopodobieństwa ich
realizacji Pi (podane przez ekspertów),
- obliczamy najbardziej prawdopodobny dochód Kb
Kb = Pi
"Ki
i
- obliczamy odchylenie standardowe
2
Oc = - Kb ) Pi
"(Ki
i
- obliczamy współczynnik wariacji
Oc
V =
Kb
Wartość Kb jest najbardziej prawdopodobną wartością dochodowości pod
warunkiem że rozkład prawdopodobieństwa Pi jest symetryczny. W przeciwnym wypadku
wartość dochodowości traci sens ekonomiczny i staje się jedynie matematyczną abstrakcją.
W przypadku niesymetrycznego rozkładu prawdopodobieństwa sens mają jedynie
przedziały ufności i rozkłady prawdopodobieństwa. Kolejnym problemem jest kwestia
obróbki takich przedziałów a także ich rozkładów, oraz wykonywanie na nich nawet
podstawowych operacji arytmetycznych.
Brak aparatu matematycznego pozwalającego na przeprowadzanie obliczeń na
wartościach nieokreślonych spowodował powstanie wielu nowych dyscyplin naukowych
takich jak: matematyka przedziałów, teorii zbiorów rozmytych i teorii możliwości.
Zastosowanie metod teorii zbiorów rozmytych pozwala rozwiązać szereg problemów
praktycznie nierozwiązywalnych metodami klasycznej teorii prawdopodobieństwa, a także
pozwala na wykonywanie bezpośrednio operacji na parametrach w postaci liczb i
przedziałów rozmytych, co jest niemożliwe przy ich opisie w formie rozkładu losowego.
Kolejną zaletą stosowania teorii zbiorów rozmytych jest możliwość opisania
nieokreśloności, mających subiektywny charakter, co jest wyjątkowo ważnym w
prognozowaniu przyszłości.
- 7 -
4 Wykorzystanie teorii zbiorów rozmytych w ocenie
parametrów finansowych.
4.1 Nieokreśloność parametrów a obliczenia.
W klasycznym podejściu do obliczeń parametrów finansowych, wymagane jest
podawanie parametrów dokładnych i z góry określonych. W wielu wypadkach niezbędne
jest podanie wartości przyszłych które dziś nie są znane i bardzo często trudne do ścisłego
określenia za pomocą jakiejś ostrej wartości. W takich wypadkach zwracamy się po pomoc
do ekspertów. Oni jednakże również nie są w stanie dokładnie (punktowo) określić tych
wartości, a jedyną odpowiedzią może być przedział wartości w jakich powinien się mieścić
przewidywany parametr. Może on określić nie tylko przedział wartości w których ten
parametr powinien oscylować, ale także przedział w którym wartość ta jest najbardziej
prawdopodobna.
Z podobnymi nie do końca sprecyzowanymi parametrami możemy również spotkać
się w życiu codziennym. Na przykład wzrost, czy człowieka o wzroście 175cm należy
uznać za wysokiego. Nasza odpowiedz może być różna np. pigmej zaliczy taką osobę do
osób wysokich, natomiast gracz koszykówki do osób wysokich kogoś takiego nie zaliczy.
Kolejnym przykładem mogą być pojęcia zimno , ciepło . Temperatura 150C może być
zaliczona do obu tych pojęć w zależności od położenia geograficznego bądz też pory roku.
Następnym przykładem może być pojęcie tanio . Wezmy na przykład ceny nowych
samochodów, jako tanie możemy zaliczyć samochody kosztujące od 20 tys. zł do 30 tys. zł
natomiast w mniejszym stopniu będzie można zaliczyć te które kształtują się w przedziale
od 30 tys. zł do 40 tys. zł. Ocena taka może również zależeć od wielu innych parametrów
takich jak zasobność portfela przyszłego nabywcy.
Oczywistym jest że wykorzystanie takich wartości (pojęć) w klasycznych operacjach
arytmetycznych jest niemożliwe ze względu na ich nieokreśloność.
Najbardziej obiecującą metodą opisu takich parametrów jest teoria zbiorów
rozmytych i matematyka przedziałowa.
4.2 Zbiory rozmyte.
Teoria zbiorów rozmytych sformułowana została przez L. A. Zade w 1965r. Należy
zaznaczyć iż wstępna idea budowania zbiorów rozmytych pojawiła się już wcześniej w
pracach E. Borela w 1959r. Jednak dopiero dzięki L. A. Zade teoria ta uzyskała
matematyczną sformalizowaną postać.
Zbiór rozmyty możemy zdefiniować w następujący sposób. Niech X={x} będzie
niepustym zbiorem. Wtedy zbiór rozmyty A w X scharakteryzowany jest funkcją
przynależności do zbioru rozmytego:
µA(x): X [0, 1]
Funkcja ta przypisuje elementowi x jego stopień przynależności do zbioru rozmytego A i
przyjmuje wartości z przedziału [0, 1]. Stopień przynależności informuje w jakim stopniu
element x należy do zbioru rozmytego A.
Tak sformułowaną definicję możemy zapisać jako zbiór par :
A = {(x, µ (x)): x " X , µ (x)"[0,1]},
A A
- 8 -
Funkcja przynależnoÅ›ci µ (x) jest uogólnieniem pojÄ™cia funkcji charakterystycznej
A
zwykłego zbioru. Funkcja charakterystyczna definiuje czy dany element należy do niej czy
też nie. Funkcja przynależności przechodzi w funkcję charakterystyczną w przypadku
granicznym, kiedy zawiera tylko dwie wartości 0 i 1. Natomiast zbiór rozmyty A jest
uogólnieniem zbioru zwykłego.
Istnieje wiele sposobów definiowania funkcji przynależności. Miedzy innymi może
być wyrażona w postaci:
- diagramu (ciągłego lub dyskretnego)
- wzoru matematycznego,
- tabeli,
- wektora przynależności,
- za pomocą tzw. ą-przekrojów.
Przykłady funkcji przynależności:
µ(x)
1
1
0,5
0 1 2 3
x
Rys. 4.1Ciągła graficzna funkcji przynależności liczby rozmytej około 2
µ(x)
1
1
0,5
0 1 2 3
x
Rys. 4.2 Dyskretna graficzna forma funkcji przynależności liczby rozmytej około 2
Przykład funkcji przynależności w postaci tabelarycznej:
Tabela 4.1Tabelaryczna funkcja reprezentacji zmiennej
0 0,5 1 1,5 2 2,5 3 3,5 4
XÅ‚X
0 0,25 0,5 0,75 1 0,75 0,5 0,25 0
µA(x)
Funkcję przynależności można również przedstawić w postaci wzoru [1], dobrze jest
uprzednio wprowadzić zmienną logiczną informującą o poziomie zmiennej x:
- 9 -
1 dla - a d" x d" a
Å„Å‚
w =
òÅ‚
ół0 dla pozostalych
Wówczas funkcja przynależności do liczby rozmytej około 0 ma postać:
a- | x |
µ(x) = wëÅ‚ öÅ‚
ìÅ‚ ÷Å‚
a
íÅ‚ Å‚Å‚
Przykład zbiorów rozmytych odnoszących się do prędkości jazdy samochodem:
µ(v)
powoli szybko bardzo szybko
1
0 60 70 80 90 v(km/h)
Rys. 4.3 Przykłady zbiorów rozmytych odnoszących się do prędkości samochodu.
Istnieje kilka rodzajów funkcji przynależności określonych na zbiorze liczb
rzeczywistych R które są stosowane w praktyce np.:
Funkcje klasy “:
Å„Å‚ 0 dla x d" a
ôÅ‚ x - a
“a,b (x) = dla a < x d" b
òÅ‚
ôÅ‚b - a
1 dla x > b
ół
µ(x)
1
1
0,5
a b x
Rys. 4.4 Funkcje klasy “
“.
“
“
- 10 -
Funkcje klasy L:
Å„Å‚ 0 dla x d" a
ôÅ‚b - x
La,b (x) = dla a < x d" b
òÅ‚
ôÅ‚b - a
1 dla x > b
ół
µ(x)
1
1
0,5
a b x
Rys. 4.5 Funkcja klasy L
Funkcje klasy ›:
Å„Å‚
ôÅ‚
0 dla x d" a (" x e" c
ôÅ‚
x
ôÅ‚ - a
›a,b,c (x) = dla a < x d" b
òÅ‚
ôÅ‚b - a
ôÅ‚c - x dla b < x < c
ôÅ‚
ół c - b
µ(x)
1
1
0,5
a b c x
Rys. 4.6 Funkcja klasy ›.
›
›
›
- 11 -
Funkcje klasy :
0 dla x d" a (" x e" d
Å„Å‚
x
ôÅ‚ - a
ôÅ‚b - a dla a < x d" b
ôÅ‚
a,b,c,d (x) =
òÅ‚
1 dla b < x d" c
ôÅ‚
ôÅ‚d - x dla c < x < d
ôÅ‚d - c
ół
µ(x)
1
1
0,5
a b c d x
Rys. 4.7 Funkcja klasy .
Funkcje klasy s:
0 dla x d" a
Å„Å‚
2
ôÅ‚
x
ëÅ‚ - a a + b
öÅ‚
2 Å" dla a < x d"
ìÅ‚ ÷Å‚
ôÅ‚
b - a 2
íÅ‚ Å‚Å‚
ôÅ‚
sa,b (x) = 2
òÅ‚
x
ëÅ‚ - b a + b
öÅ‚
ôÅ‚
1- 2 Å" dla < x < b
ìÅ‚ ÷Å‚
b - a 2
ôÅ‚ íÅ‚ Å‚Å‚
ôÅ‚1 dla x e" b
ół
µ(x)
1
1
0,5
a b
x
(a+b)/2
Rys. 4.8 Funkcja klasy s.
- 12 -
Funkcje klasy Ä„:
sc-b,c (x) dla x < c
Å„Å‚
Ä„ (x) =
òÅ‚1- sc,c+b (x) dla x e" c
b,c
ół
µ(x)
1
1
b
0,5
c-b c c+b
x
Rys. 4.9 Funkcja klasy Ä„.
Ä„
Ä„
Ä„
Rozmyty singleton:
1 dla x = x0
Å„Å‚
µ (x, x0 ) =
òÅ‚0 dla x `" x0
A
ół
Jądrem zbioru rozmytego A nazywamy zbiór ostry elementów przestrzeni które w
pełni należą do A (ich funkcja przynależności przyjmuje wartość 1). Zbiór ten oznaczamy
jako ker(A). Jeżeli jądro zbioru rozmytego jest jednoelementowe, to element ten
nazywamy wartością szczytową zbioru. Jądro zbioru rozmytego możemy opisać
równaniem:
ker(A) = {x " R : µA(x) = 1}
Nośnikiem (support) nazywamy taki zbiór ostry złożony z takich elementów
przestrzeni które należą do tego zbioru w jakimkolwiek stopniu większym od 0, co
możemy zapisać:
A = supp(A) = {x: µA(x) > 0}
µ(x)
JÄ…dro
1
(kernel)
1
Nośnik
(support)
a b c d
x
Rys. 4.10 Jądro i nośnik zbioru rozmytego.
Popularnym sposobem zapisu zbiorów rozmytych jest zapisywanie ich przy pomocy
par stopień przynależności, element przestrzeni na której tenże zbiór jest określony. Pary te
zapisywane są za pomocą ułamków z kreską poziomą, pionową lub ukośną. Zbiory
- 13 -
rozmyte określone na skończonych przestrzeniach zapisywane są jako pary oddzielone
symbolem dodawania (+). Dla odróżnienia zbiorów rozmytych od konwencjonalnych
używa się symboli sumy lub całki (dla zbiorów określonych na przestrzeniach
nieskończonych).Skończony zbiór rozmyty A i nieskończony zbiór rozmyty B mogą być
zapisane w następujący sposób:
A = µ (x1) | x1 + µ (x2 ) | x2 + ... + µ (xn ) | xn =
A A A
n
µ1 | x1 + µ2 | x2 + ... + µn | xn = | xi
"µi
i=1
B = µB (x) | x = (x) | x
"µB
+"
X
x"X
4.3 Własności zbiorów rozmytych.
Na zbiorach rozmytych można określić trzy następujące klasyczne operacje
mnogościowe: sumę, różnicę i dopełnienie zbiorów rozmytych.
Sumą zbiorów rozmytych A i B (union) na przestrzeni X jest zbiór rozmyty A*"B
określony funkcją przynależności:
µ (x) = max(µ (x), µB (x))
A*"B A
Iloczynem zbiorów rozmytych A i B (intersection) na tej samej przestrzeni X jest
zbiór rozmyty A)"B określony funkcją przynależności:
µA*"B (x) = min(µA (x), µB (x))
Dopełnieniem zbioru rozmytego A (complement) określonego na przestrzeni X
nazywamy zbiór ŹA określony funkcją przynależności:
µÅ¹A (x) = 1- µ (x)
A
Kolejnymi własnościami odnoszącymi się do zbiorów liczb rozmytych określonych
na przestrzeni liczb rzeczywistych, są wypukłość i wklęsłość. Można je określić
następująco:
Zbiór rozmyty A na rzeczywistej przestrzeni X nazywamy wypukłym (convex),
jeżeli dla dowolnych elementów przestrzeni x1 i x2 oraz dowolnej liczby rozmytej "[0,1]
spełniona jest nierówność:
µ [x1 + (1- )x2]e" min{µ (x1), µ (x2 )}
A A A
Zbiór rozmyty A na rzeczywistej przestrzeni X nazywamy wklęsłym (concave),
jeżeli dla dowolnych elementów przestrzeni x1 i x2 oraz dowolnej liczby rozmytej "[0,1]
spełniona jest nierówność:
µA[x1 + (1- )x2]d" max{µA(x1), µ (x2 )}
A
Odpowiednio funkcje przynależności wypukłych zbiorów rozmytych nazywamy
wypukłymi a zbiorów wklęsłych funkcjami wklęsłymi.
- 14 -
Własności równości i inkluzji (zawierania się) mogą być zdefiniowane jako
następujące własności ostre:
Zbiory rozmyte A i B określone na tej samej przestrzeni X są równe (A=B) jeżeli dla
wszystkich x elementów przestrzeni X zachodzi:
µA = µB
Dla zbiorów rozmytych A i B określonych na przestrzeni X możemy powiedzieć że
zbiór A zawiera siÄ™ w B (A ‚" B) jeżeli zachodzi
µA d" µB,
dla wszystkich x z przestrzeni X.
Dla ostrych i skończonych zbiorów rozmytych mocą nazywamy ilość elementów
należących do takiego zbioru. W przypadku zbiorów rozmytych jako moc rozumiemy
sumę wartości funkcji przynależności tegoż zbioru. Moc zbioru rozmytego (zwana również
liczbą kardynalną) określonego na przestrzeni X możemy określić jako:
A = (x)
"µ A
x"S ( A)
gdzie jako S(A) rozumiemy nośnik zbioru rozmytego.
W przypadku zbioru ciągłego jego moc określa się jako:
A = (x)dx
A
+"µ
x"S ( A)
Względną (relatywną) moc rozmytego zbioru dyskretnego określamy jako stosunek mocy
bezwzględnej przypadającej na jeden element przestrzeni rozważań X.
(x)
"µ A
x"X
A =
X
N
gdzie N jest ilością elementów w przestrzeni rozważań zbioru.
Dla zbioru ciągłego moc względna ma wyraża się wzorem:
A
+"µ (x)dx
x"X
A =
X
+"dx
x"X
Jeśli przestrzeń rozważań zbioru jest nieskończona to sumowanie lub całkowanie może
być przeprowadzone po nośniku zbioru.
4.4 Liczby rozmyte.
W naukach technicznych często spotykamy się z danymi uzyskiwanymi z urządzeń
pomiarowych które są niepewne (nieprecyzyjne i obarczone pewnym błędem). Często
również musimy wykonywać na takich danych obliczenia. Z podobnymi problemami
możemy się spotkać w finansach gdy nie jesteśmy w stanie precyzyjnie określić przyszłych
- 15 -
parametrów które mają wpływ na obliczenia. W wielu przypadkach taką nieprecyzyjną
wartość możemy reprezentować jako przedział domknięty i na nim wykonywać
odpowiednie operacje arytmetyczne.
Jeśli natomiast niepewność danych ma naturę rozmytą (gdy interesujące nas wartości
nie mają ostrych granic), niepewne wartości rzeczywiste można reprezentować jako liczby
bądz przedziały rozmyte. Stosując ten rodzaj reprezentacji możemy nie tylko w pełni
możliwe wartości danej czy też wartości zupełnie niemożliwe ale również wartości
możliwe w różnych stopniach.
Pojęcie liczby rozmytej jest różnie definiowane przez różnych autorów. Jedno z
podejść definiuje liczbę rozmytą jako zbiory o jądrze jednoelementowym (właściwe liczby
rozmyte), jak i zbiory o jądrze w postaci przedziału (przedziały rozmyte). Inne propozycje
dotyczą osobnej definicji dla obu tych pojęć. Najczęściej spotykaną w literaturze [2]
definicjÄ… liczby rozmytej jest:
Liczbą rozmytą nazywamy zbiór rozmyty określony na uniwersum (przestrzeni)
rzeczywistym R, normalny, wypukły, o funkcji przynależności przedziałami ciągłej.
Powyższą definicję możemy zapisać również w postaci:
Zbiór rozmyty A określony na zbiorze liczb rzeczywistych, A ą" R , którego funkcja
przynależności
µ : R [0,1]
A
spełnia warunki:
1. sup(A) = sup(µ (x)) = 1, tzn. zbiór rozmyty A jest normalny,
A
x"R x"R
2. µ [x1 + (1- )x2]e" min{µ (x1), µ (x2 )}, tzn. zbiór A jest wypukÅ‚y,
A A A
3. µ (x) jest funkcjÄ… przedziaÅ‚ami ciÄ…gÅ‚Ä…,
A
nazywamy przedziałem rozmytym.
Przy czym, zgodnie z warunkiem 1, jeÅ›li ker(A) = {x " R : µA(x) = 1}, to ker(A) e" 1.
Liczby rozmyte możemy podzielić na właściwe liczby rozmyte oraz płaskie liczby
(przedziały) rozmyte. Liczba rozmyta właściwa jest zbiorem którego jądro jest
jednoelementowe, Jeżeli natomiast jądro stanowi przedział ograniczony liczbę taką
nazywamy przedziałem rozmytym.
Kolejnym podziałem liczb rozmytych może być podział ze względu na ich położenie
względem zera. Rozróżniamy między innymi liczby rozmyte dodatnie, ujemne oraz
mieszane.
Liczba rozmyta AÄ…"R jest dodatnia jeżeli µA(x)=0 dla wszystkich x<0, natomiast
liczba rozmyta AÄ…"R jest ujemna jeżeli µA(x)=0 dla wszystkich x>0. Liczba rozmytÄ…
mieszaną nazywamy liczbę która nie jest ani dodatnia ani ujemna (zawiera w swym
nośniku zero). Jednym z przypadków liczby mieszanej jest liczba która zawiera w swej
wartości szczytowej zero, nazywana jest często liczbą zerową.
4.5 Operacje na liczbach rozmytych.
Operacje arytmetyczne (+,-,*,/) wykonywane na liczbach rzeczywistych można
rozszerzyć na liczby (przedziały) rozmyte. Mówiąca o tym zasada rozszerzania [2]
pozwala na rozszerzenie operacji arytmetycznych wykonywanych na zwykłych liczbach i
zbiorach na zbiory i liczby rozmyte. Możemy ją zdefiniować następująco: mamy pewne
nierozmyte odwzorowanie f przestrzeni X w przestrzeń Y.
f : X Y
- 16 -
To zbiór rozmyty B indukowany przez odwzorowanie f jest postaci:
B = µB ( y) | y
+"
Y
gdzie:
-1
Å„Å‚
supx" f ( y) µ (x) dla f (y) `" "
-1
A
µB (y) =
òÅ‚
-1
0 dla f (y) = "
ół
przy czym f-1(y)={x : f(x) = y}.
Jeżeli odwzorowanie f jest wzajemnie jednoznaczne, to istnieje funkcja g odwrotna
do f, i wtedy µB(x) = µA(g(y)) = µA(x). Wówczas zbiór rozmyty B indukowany przez f jest
postaci:
B = f (A) = µ (g( y)) | y = µA (x) | f (x)
A
+" +"
Y X
Jeśli X jest skończone powyższą równość możemy zapisać w postaci
B = f (A) = µ (x1) | f (x1) + ... + µ (xn ) | f (xn )
A A
Dla rozszerzenia operacji arytmetycznych na liczby rozmyte przydatną jest poniższa
zasada.
Niech X bÄ™dzie iloczynem kartezjaÅ„skim zbiorów nierozmytych X1×X2×...×Xn jeżeli
mamy pewne nierozmyte odwzorowanie:
f : X1×X2×...×Xn Y
oraz pewne zbiory rozmyte Aą"X1, Aą"X2,..., Aą"Xn, to zasada rozszerzania mówi że:
B = µB ( y) | y
+"
Y
przy czym:
-1
Å„Å‚
sup( x1 ,x2 ,...xn )" f ( y) min[µ (x1), µ (x2 ),..., µ (xn )] dla f (y) `" "
-1
A1 A2 An
µB (y) =
òÅ‚
-1
0 dla f (y) = "
ół
Podstawowe operacje arytmetyczne na liczbach rozmytych A1,A2ą"R możemy
określić następująco:
Dodawanie dwu liczb rozmytych A1,A2 oznaczamy:
def
A1 + A2 = B
- 17 -
przy czym funkcja przynależności zbioru B ma postać:
µB (y) = sup min[µ (x1), µ (x2 )]
A1 A2
x1,x2
y=x1+ x2
Różnicę dwu liczb rozmytych A1,A2 oznaczamy:
def
A1 - A2 = B
przy czym funkcja przynależności zbioru B ma postać:
µB (y) = sup min[µ (x1), µ (x2 )]
A1 A2
x1,x2
y=x1-x2
Mnożenie dwu liczb rozmytych A1,A2 oznaczamy:
def
A1 Å" A2 = B
przy czym funkcja przynależności zbioru B ma postać:
µB (y) = sup min[µ (x1), µ (x2 )]
A1 A2
x1,x2
y=x1" x2
Dzielenie dwu liczb rozmytych A1,A2 oznaczamy:
def
A1 : A2 = B
przy czym funkcja przynależności zbioru B ma postać:
µB (y) = sup min[µ (x1), µ (x2 )]
A1 A2
x1,x2
y=x1:x2
Poprawność definicji operacji dwuargumentowych zapewnia następujące twierdzenie
Dubois-Prade[3]:
Jeżeli liczby rozmyte A1,A2 mają ciągłe funkcje przynależności to wynikiem operacji
arytmetycznych: dodawania, odejmowania, mnożenia i dzielenia są liczby rozmyte.
Oprócz operacji dwuargumentowych na liczbach rozmytych można również
wykonywać operacje jednoargumentowe takie jak operacje zmiany znaku, odwrotności,
skalowania, eksponent i wartości bezwzględnej.
W wyniku operacji zmiany znaku f(x)=-x otrzymujemy liczbÄ™ rozmytÄ… przeciwnÄ… do
liczby rozmytej Aą"X, liczbę taką oznaczamy -Aą"X. Funkcja przynależności jest postaci:
µ- A (x) = µ (-x)
A
Liczby rozmyte A i A są do siebie symetryczne względem osi x=0.
- 18 -
W wyniku operacji odwrotności f(x)=x-1 otrzymujemy liczbę rozmytą odwrotną do
liczby rozmytej Aą"X, liczbę taką oznaczamy A-1ą"X. Funkcja przynależności ma postać:
µ (x) = µ (x-1)
A-1 A
Liczba rozmyta A nie powinna być liczbą mieszaną. Jeżeli operacja odwrotności
przeprowadzana jest na liczbie mieszanej to wynikiem nie jest zbiór wypukły a więc wynik
nie jest liczbÄ… rozmytÄ….
W wyniku operacji skalowania f(x)=x otrzymujemy liczbÄ™ rozmytÄ… przeskalowanÄ…
w stosunku do liczby rozmytej AÄ…"X, liczbÄ™ takÄ… oznaczamy AÄ…"X. Funkcja
przynależności ma postać:
µA (x) = µ (x-1)
A
W wyniku operacji eksponent f(x)=ex , przy czym x>0, otrzymujemy potęgę liczby
rozmytej Aą"X, liczbę taką oznaczamy eAą"X, a jej funkcja przynależności jest równa:
µ (log x) dla x > 0
Å„Å‚
A
µe (x) =
A
òÅ‚
0 dla x < 0
ół
Otrzymana w wyniku liczba rozmyta jest liczbÄ… dodatniÄ….
W wyniku operacji wartości bezwzględnej otrzymujemy wartość bezwzględną liczby
rozmytej Aą"X, liczbę taką oznaczamy |A|ą"X. Funkcja przynależności ma postać:
min[µ (x), µ (-x)] dla x e" 0
Å„Å‚
A A
µ|A| (x) =
òÅ‚
0 dla x < 0
ół
Wynikiem powyższej operacji jest wartość dodatnia.
Dwuargumentowe działania na liczbach rozmytych zdefiniowane powyżej, a
zawierające operację supremum wymagają policzenia każdego stopnia przynależności
liczby wynikowej.
Operacja taka wymaga wykonania nieskończenie wielu operacji na stopniach
przynależności argumentów. Zastąpienie nośników nieskończonych skończonymi pozwala
na algorytmizację powyższych działań. Wciąż jednak operacje takie nastręczają
poważnych trudności obliczeniowych.
Liczby rozmyte mogą być prezentowane jako liczby bądz przedziały rozmyte L-R.
Liczba rozmyta jest to zbiór rozmyty A określony na uniwersum rzeczywistym, o
następującej funkcji przynależności:
Å„Å‚ m - x
ëÅ‚ öÅ‚
ôÅ‚LìÅ‚ Ä… ÷Å‚ dla x < m
íÅ‚ Å‚Å‚
ôÅ‚
µ (x) = 1 dla x = m
òÅ‚
A
ëÅ‚ öÅ‚
ôÅ‚ x - m
ôÅ‚RìÅ‚ ² ÷Å‚ dla x > m
ìÅ‚ ÷Å‚
íÅ‚ Å‚Å‚
ół
gdzie Ä…,²>0 sÄ… ustalonymi wartoÅ›ciami rozrzutu lewo i prawo stronnego, natomiast m jest
- 19 -
ustaloną wartością średnią, zaś L i R to ustalone funkcje odniesienia. Liczbę rozmytą
zapisujemy w postaci (m,Ä…,²)LR.
µ(x)
1
L=max(0,1-x) R=max(0,1-x2)
1
0,75
0,5
0,25
1 6
x
Rys. 4.11 Liczba typu L-R.
Natomiast przedział rozmyty jest to zbiór rozmyty A określony na uniwersum
rzeczywistym, o następującej funkcji przynależności:
Å„Å‚ m - x
ëÅ‚ öÅ‚
ôÅ‚LìÅ‚ Ä… ÷Å‚ dla x < m
íÅ‚ Å‚Å‚
ôÅ‚
µ (x) = 1 dla m d" x d" n
òÅ‚
A
ëÅ‚ öÅ‚
ôÅ‚ x - n
ôÅ‚RìÅ‚ ² ÷Å‚ dla x > n
ìÅ‚ ÷Å‚
íÅ‚ Å‚Å‚
ół
gdzie Ä…,²,m,n"R takie że Ä…,²>0, mrozmyty zapisujemy w postaci (m,n,Ä…,²)LR.
Tylko w kilku szczególnych przypadkach działania na liczbach rozmytych
sprowadzają się do operacji na końcach przedziałów. W innych przypadkach działania te
możemy przybliżać prostymi operacjami na parametrach. Natomiast w pozostałych
przypadkach musimy posługiwać się poprzednio zdefiniowanymi wzorami z operacją
supremum.
Liczby rozmyte typu L-R charakteryzujÄ… siÄ™ elegancjÄ… opisu matematycznego, co
odbywa się kosztem podstawowych operacji arytmetycznych takich jak mnożenie czy
dzielenie, wynikiem niejednokrotnie jest zbiór przybliżony lub o silnie zdeformowanej
funkcji przynależności.
Istnieje wiele podejść do sformułowania operacji na liczbach rozmytych, ale do celu
implementacji informatycznej najbardziej odpowiedniÄ… wydaje siÄ™ metoda reprezentacji
liczby rozmytej jako zbioru ą-przekrojów.
4.6 Reprezentacja zbiorów rozmytych za pomocą ą
ą-przekrojów.
Ä…
Ä…
Ze względu na skomplikowanie operacji arytmetycznych wygodnym jest
przedstawienie ich w postaci zbioru ą-przekrojów. A następnie wykonywanie operacji
arytmetycznych na ą-przekrojach które są zwykłymi przedziałami.
Jako ą-przekrój zbioru rozmytego A rozumiemy przedział wartości zbioru
rozmytego A który zawiera w sobie wszystkie wartości tego zbioru dla których funkcja
przynależnoÅ›ci µ ma wartość wiÄ™kszÄ… bÄ…dz równÄ… Ä….
- 20 -
Stosowane definicje ą-przekrojów to m.in.:
A>Ä… = {x : x " X , µ (x) > Ä… }
A
A>Ä… = {x : x " X , µ (x) e" Ä… }
A
zasadę podziału zbioru rozmytego na jego ą-przekroje nazywamy zasadą dekompozycji.
µ(x)
1
1
0,75
ą-przekrój na
0,5
poziomie 0,25
0,25
0
a b c d
x
Rys. 4.12 Dekompozycja zbioru na a-przekroje.
Wykorzystując odpowiednią ilość ą-przekrojów możemy odtworzyć z żądaną
dokładnością funkcję przynależności zbioru rozmytego. Korzystając z tak zdefiniowanych
ą-przekrojów zbiór rozmyta A możemy zdefiniować jako sumę zbiorową jego ą-
przekrojów:
A = AÄ…
Ä…
Znając przynależność przestrzeni rozważań do poszczególnych ą-przekrojów
możemy określić przybliżoną wartość funkcji przynależności do zbioru rozmytego A:
µ* (x) = sup(Ä… Å" µ (x))
A
A>0
"[0,1]
lub:
µ* (x) = sup(Ä… Å" µ (x))
A
Ae"0
"[0,1]
Dekompozycja zbioru rozmytego pozwala na wykonywanie operacji arytmetycznych
na zwykłych przedziałach jakimi są ą-przekroje. Po dokonaniu operacji arytmetycznych na
odpowiadających sobie ą-przekrojach otrzymamy zwykłe przedziały z których możemy
złożyć (przybliżyć) wynikowy zbiór rozmyty. Dokładność operacji na zbiorach rozmytych
możemy regulować ilością ą-przekrojów.
Przekrój o poziomie ą zbioru rozmytego możemy zapisać w postaci:
AÄ… = [AÄ… , AÄ… ]
gdzie odpowiednio Aą , Aą są odpowiednio początkiem i końcem zbioru.
- 21 -
Z ą-przekrojami zbioru rozmytego związana jest także kolejna definicja wypukłości
zbioru rozmytego. Jeśli przestrzeń X jest rzeczywista i określony na niej zbiór rozmyty jest
wypukły, to wszystkie jego ą-przekroje są wypukłe, oraz jeżeli A jest wklęsły to wszystkie
jego ą-przekroje są wklęsłe.
4.7 Operacje na ostrych przedziałach
Operacje arytmetyczne na ą-przekrojach które są zwykłymi (ostrymi) przedziałami
możemy uprościć do wykonywania działań na ich końcach.
Najprostszy sposób operacji arytmetycznych na zwykłych przedziałach możemy
określić następująco:
Niech @ bÄ™dzie dowolnÄ… operacjÄ… arytmetycznÄ… oraz X¸ Y, Z bÄ™dÄ… ostrymi przedziaÅ‚ami,
wtedy:
Z = X @Y = {z = x @ y, x " X '" y "Y}.
Wówczas odpowiednią operację arytmetyczną możemy zdefiniować jako operacje na
końcach przedziałów:
Z = X @Y = [min{x@ y, x@ y, x @ y, x @ y}, max{x@ y, x@ y, x @ y, x @ y}].
Gdzie odpowiednio x, y to początki przedziałów X i Y a x, y ich końce.
Po uproszczeniu podstawowe operacje arytmetyczne (+, -, *, /) na przedziałach
rozmytych możemy przedstawić następująco.
Operacja dodawania:
X + Y = [x + y, x + y]
Operacja odejmowania:
X - Y = [x - y, x - y]
Operacja mnożenia:
X Å"Y = [min{x Å" y, x Å" y, x Å" y, x Å" y}, max{x Å" y, x Å" y, x Å" y, x Å" y}]
Dzielenie:
îÅ‚ Å‚Å‚
X 1 1
= [x, x]Å" , .
ïÅ‚ śł
Y y y
ïÅ‚ śł
ðÅ‚ ûÅ‚
Pewną nieprzyjemnym elementem zastosowanej metody działań na przedziałów jest
wzrost szerokości przedziału w miarę zwiększania ilości operacji arytmetycznych. Istnieje
wiele metod które pozwalają na zmniejszenie tego zjawiska, na przykład arytmetyka
przedziałowa z niestandardowym odejmowaniem i dzieleniem, uogólniona arytmetyka
przedziałowa, matematyka segmentowa. Jedną z zasad operacji na przedziałach jest
maksymalne upraszczanie wszystkich wzorów zawierających przedziały lub liczby
- 22 -
rozmyte. Wzrost szerokości przedziału jest zgodny ze sformułowaną przez Zadeha zasadą
wzrostu niepewności wraz ze wzrostem skomplikowania układu.
Jeśli do układu wprowadzimy operacje które wzajemnie się kompensują dla liczb
rzeczywistych to dla wartości rozmytych kompensacja występuje jedynie dla wartości
średnich, natomiast szerokość przedziału wzrasta. Wzrost szerokości przedziału zwiększa
niepewność a co za tym idzie wpływa na zniekształcenie informacji dotyczącej wyniku
takiej operacji.
Użycie operacji zdefiniowanych w rozdziale (4.6) mogą prowadzić do wyników
które będą pozbawione sensu. W ich wyniku możemy otrzymać zbiory o bardzo
postrzępionych funkcjach przynależności. Aby tego uniknąć stosować należy
dekompozycję wartości rozmytych na ich ą-przekroje. Wynik operacji sumowania dwu
trapezoidalnych przedziałów rozmytych A=[1, 2, 3, 4] i B=[7, 8, 8.5, 9] przy użyciu obu
zdefiniowanych powyżej podejść jest pokazany na poniższych rysunkach.
µ(x)
1
A B
1
0,75
0,5
0,25
1 3 4 5 7 8 9
x
Rys. 4.13 Dodawane przedziały.
Rys. 4.14 Wynik sumowania.
Zaznaczona na rysunku postrzępiona linia jest wynikiem sumowania metodą
zdefiniowaną w rozdziale 4.6, natomiast trapezoidalny kształt jest wynikiem operacji na ą-
przekrojach argumentów sumowania A i B.
4.8 Zastosowana metoda porównań przedziałów ostrych i
rozmytych.
Ważnym elementem dla wykonywania obliczeń na wartościach rozmytych jest
możliwość ich porównywania. Dokonanie podczas obliczeń dekompozycji zbiorów
rozmytych na ą-przekroje powoduje iż logicznym wydaje się stosowanie metody
polegającej na porównywaniu odpowiadających sobie ą-przekrojów. Ponieważ
- 23 -
ą-przekroje są zwykłymi przedziałami należy tutaj zastosować metodę porównywania
zwykłych przedziałów.
Wykorzystana probabilistyczna metoda porównywania zwykłych przedziałów [4,5]
uwzględnia jednocześnie położenie jak i szerokość porównywanych przedziałów w
wyniku dając wartość rzeczywistą z przedziału [0,1].
Jeżeli mamy dwa niezależne przedziały A=[a1, a2] i B=[b1, b2] oraz dwie losowe
wartości w tych przedziałach a"[a1, a2], b"[b1, b2] to dla następującego wzajemnego
położenia tych dwu przedziałów można określić zdarzenie losowe polegające na trafieniu
wartości a i b do następujących przedziałów [a1, b1], [b1, a2], [a2, b2].
B
A
a1 b1 a2 b2
A1 B1 B2
A2
Jeżeli zdefiniujemy zdarzenia Hk: a"Ai, b"Bj gdzie Ai oraz Bj są pewnymi
podprzedziałami przedziałów A i B , oraz P(Hk) będzie prawdopodobieństwem zdarzenia
Hk oraz P(B>A/Hk) będzie warunkowym prawdopodobieństwem, że B>A. Wówczas
prawdopodobieństwo że B>A będzie mieć postać:
n
P(B > A) = ) Å" P(B > A H )
"P(H k k
k
Dla przedstawionego powyżej rysunku będziemy mieć zbór czterech następujących
zdarzeń:
H1 : a" [a1, b1] i b" [b1, a2], H2 : a" [a1, b1] i b" [a2, b2],
H3 : a" [b1, a2] i b" [b1, a2], H4 : a" [b1, a2] i b" [a2, b2].
Których prawdopodobieństwa będą wynosić odpowiednio:
b1 - a1 a2 - a1 b1 - a1 b2 - a2
P(H1) = Å" P(H2 ) = Å"
a2 - a1 b2 - b1 a2 - a1 b2 - b1
a2 - b1 a2 - b1 a2 - b1 b2 - a2
P(H3) = Å" P(H1) = Å"
a2 - a1 b2 - b1 a2 - a1 b2 - b1
A odpowiednie prawdopodobieństwa warunkowe będą wynosiły:
1
P(B > A H1) = 1 P(B > A H2 ) = 1 P(B > A H3) = P(B > A H4 ) = 1
2
Po odpowiednich podstawieniach prawdopodobieństwo że zbiór B>A będzie wynosiło:
2
1 (a2 - b1)
P(B > A) = 1- Å"
2 (a2 - a1)(b2 - b1)
- 24 -
W poniższej tabeli znajdują się wzory dla pozostałych przypadków oraz dla równości
A=B:
Przypadki P(B>A) P(A=B)
1. a1 > b1 , a1 < b2
B
b2 - a1
0
A
b2 - b1
b1 a1 = a2 b2 x
2. b1 > a1, b1 < a2
A
b1 - a1
0
B
a2 - a1
a1 b1 = b2 a2 x
3. b1 e" a1 , b2 d" a2
A
b1 - a1 1 b2 - b1 b2 - b1
+ Å"
B
a2 - a1 2 a2 - a1 a2 - a1
a1 b1 b2 a2 x
4. a1 e" b1 , a2 d" b2
B
b2-a2 1 a2-a1 a2 - a1
+ Å"
A
b2-b1 2 b2-b1 b2 - b1
b1 a1 a2 b2 x
5. b1 e" a1 , b2 e" a2 , b1 d" a2
B
1
( a2 - b1 )2
( a2 - b1 )2
1 -
A
( a2 - a1 )( b2 - b1 )
2 - a1 )( b2 - b1 )
( a2
a1 b1 a2 b2 x
6. a1 e" b1 , a2 e" b2 , a1 d" b2
A
1 ( b2 - a1 )2 ( b2 - a1 )2
B Å"
2 ( a2 - a1 )( b2 - b1 ) - a1 )(b2 - b1 )
( a2
b1 a1 b2 a2 x
Dla znalezienia prawdopodobieństwa dla porównywanych przedziałów i liczb
rozmytych zastosowane zostało następujące wyostrzenie:
"Ä… Å" PÄ… (BÄ… > AÄ… )
Ä…
P(B > A) =
"Ä…
Ä…
- 25 -
Jak można zauważyć na wartość prawdopodobieństwa że rozmyty przedział (liczba) B>A
ma wpływ nie tylko prawdopodobieństwo będące wynikiem porównania odpowiednich
ą-przekrojów ale również wartość poziomu ą.
- 26 -
5 Stworzenie oprogramowania do oceny inwestycji.
5.1 Założenia.
Oprogramowanie zostało stworzone w jeżyku C++ z wykorzystaniem technik
programowania obiektowego. Jedną z nich było tzw. przeciążanie operatorów pozwalające
na wykonywanie działań na przedziałach i liczbach rozmytych jakby były one
wbudowanymi typami języka C++.
Zbudowano dwie podstawowe klasy umożliwiające wykonywanie działań na
zwykłych przedziałach i modelowanych przez nie liczbach rozmytych.
Pierwsza z nich interval pozwala na inicjalizacjÄ™ i wykonywanie operacji
arytmetycznych na zwykłych ostrych przedziałach. Druga fuzzy pozwala na konstruowanie
rozmytych przedziałów z obiektów klasy interval oraz na wykonywanie na nich operacji
arytmetycznych.
fuzzy
interval
Rys. 5.1 Diagram klas.
Kolejnym elementem jest zestaw funkcji umożliwiających wykorzystanie wcześniej
stworzonych klas do obliczeń parametrów finansowych.
Funkcje te mają na celu policzenie czterech parametrów zalecanych przez Europejski Bank
Odbudowy i Rozwoju dla oceny inwestycji. Przypomnijmy, są to wartość przepływów
netto (NPV), wewnętrzna stopa zwrotu (IRR), okres zwrotu inwestycji oraz rentowność.
Ponieważ efektem ubocznym wykonywania operacji na ostrych przedziałach jest wzrost
ich szerokości, należy wykonać pewne zabiegi które ograniczą to zjawisko. Istnieje wiele
sposobów na ograniczenie tego zjawiska, ale najprostszym jest ograniczenie ilości operacji
na rozmytych przedziałach do niezbędnego minimum. Koniecznym więc stało się
zmodyfikowanie wzorów na obliczanie parametrów finansowych inwestycji. Dla
uproszczenia działań na liczbach (przedziałach) rozmytych wzór na bieżącą wartość netto
(NPV) został uproszczony do następującej postaci:
n-1
ki
NPV =
"(1+ d)i
t=0
gdzie ki przepływ pieniężny w i-tym okresie a d stopa dyskontowa.
Ponieważ parametry niezbędne do obliczenia wewnętrznej stopy zwrotu są
wartościami rozmytymi należało by się również spodziewać iż będzie to również wartość
rozmyta. Jednak warunkiem koniecznym znalezienia wartości IRR jest aby suma
przepływów pieniężnych zdyskontowanych na jeden moment czasowy (z normą
dyskontowania równą IRR) była równa 0 (była przedziałem o zerowej szerokości). Jest to
- 27 -
możliwe tylko dla wartości ostrych, natomiast dla wartości będących przedziałami nie jest
możliwe uzyskanie przedziału o zerowej szerokości. Co jest zgodne z zasadą zwiększania
szerokości przedziału wraz ze wzrostem ilości operacji arytmetycznych. Wyjściem z tej
sytuacji jest porównywanie wartości zero z centrum otrzymanego przedziału. Jeśli
wartości są równe otrzymujemy wówczas wartość średnią IRR. Ponieważ stosujemy
zasadę dekompozycji wartości rozmytych na ą-przekroje, logicznym wydaje się aby
poszukiwać jej dla każdego ą-przekroju. Otrzymujemy wówczas wektor (tablicę)
informującą o wartości IRR dla poszczególnych ą-przekrojów. Algorytm polega na
obliczeniu poniższego równania względem d dla każdego ą-przekroju.
n-1
ki
= 0
"
(1+ d)i
t=0
Znalezioną wartość trudno zinterpretować jako wartość rozmytą. Nośnik tak otrzymanego
zbioru może leżeć gdzie indziej niż jego jądro co jest niezgodne z definicją zbioru
rozmytego. Dlatego też zastosowano kilka parametrów wyostrzających wartość IRR.
Parametr IRRavg będący średnią wartością parametru IRR:
n
"IRRi
i=0
IRR =
avg
n +1
Wartość IRRmax podająca najbardziej oczekiwaną wartość IRR
n
Ä…i
"IRRi
i=0
IRRmax =
n
"Ä…i
i=0
Im większa wartość funkcji przynależności przedziału ą tym większy wpływ na wartość
zwracanÄ… przez funkcjÄ™.
Parametr IRRmin podający najmniej oczekiwaną wartość IRR:
n
(NPV - NPV )
i
"IRRi i
i=0
IRRmin =
n
(NPV - NPV )
i
" i
i=0
Na parametr ten wpływ ma szerokość przedziału, a więc większy wpływ mają wartości o
mniejszym stopniu przynależności do zbioru rozmytego.
Parametr IRRlr zwraca wartość IRR dla poziomu ą=0: Natomiast IRRmr zwraca
wartość IRR dla poziomu ą=1
Kolejnym parametrem charakteryzujÄ…cym inwestycjÄ™ jest okres zwrotu inwestycji.
Przypomnijmy że jest to okres czasu, w ciągu którego suma przychodów,
zdyskontowanych na chwilę zakończenia inwestycji równa się sumie wydatków
inwestycyjnych. Określa się go również wzorem:
h
Pt
= KV
"
t
(1 + d)
t=0
- 28 -
Przy jego pomocy możemy określić przybliżony, średni okres zwrotu po jakim nastąpi
zwrot wkładów inwestycyjnych. Wartość jest przybliżona ponieważ trudno wymagać aby
rozmyte wartości sumy wydatków i przychodów były jednakowe pod względem
ilościowym, a także szerokości przedziałów rozmytych. Otrzymana w wyniku wartość jest
liczbą całkowitą aby otrzymać przybliżoną wartość która jest liczbą rzeczywistą należy
zastosować wzór:
KV - Sm
m+1
h = m + (1 + d)
Pm + 1
gdzie m jest równe pomniejszonej o jeden wartości otrzymanej z poprzedniego wzoru a
Sm jest zdyskontowaną wartością przychodów dla m okresów. Obliczenia wykonywane są
na wartościach rozmytych aby uniknąć strat informacji jakie niesie ze sobą przedział
rozmyty. Otrzymana w wyniku wartość rozmyta zostaje wyostrzona ponieważ ze względu
na różną szerokość przedziałów wydatków i przychodów otrzymany wynik może być
przedziałem częściowo ujemnym, co jest błędne. Błąd wynika również z tego iż brana do
obliczeń wartość m okresów jest już przybliżona i nie niesie ze sobą żadnej informacji o
rozmytości (niepewności).
Ostatnim obliczanym parametrem jest dyskontowana rentowność, jak została ona
przedstawiona wcześniej (rozdział 3.2) stanowi ona stosunek dyskontowanych dochodów
do zdyskontowanych wydatków inwestycyjnych. Ponieważ zastosowane w obliczeniach
parametry są wartościami rozmytymi (liczbami i przedziałami) wynikiem jest również
wartość rozmyta. W klasycznym podejściu gdy obliczenia wykonywane są na wartościach
rzeczywistych wynikiem jest również wartość rzeczywista którą możemy łatwo porównać
z wartością 1. Jeżeli jest ona większa od 1 oznacza to że inwestycja jest korzystna, jeśli
natomiast nie jest większa od jedności oznacza to nieefektywność inwestycji. W praktyce
przy zastosowaniu w obliczeniach wartości rozmytych, wartość wynikowa może zachodzić
na wartość jeden co może oznaczać, trudności w porównywaniu tych wartości z
wartością 1. Jeżeli jednak zastosujemy porównywanie wartości wyostrzonej z jedynką
otrzymamy przybliżony wynik mówiący nam o efektywności inwestycji. Zachodzenie
rozmytej wartości rentowności na wartość 1 może oznaczać ryzyko nieefektywności
przedsięwzięcia.
Stosowane w programie wyostrzenie, czyli zamiana wartości rozmytych na ostre
wartości liczbowe, to modyfikacja metody środka ciężkości zbioru rozmytego [2] (COG,
center of gravity). Modyfikacja ta polega na dostosowaniu dla potrzeb zbiorów rozmytych
reprezentowanych w formie ą-przekrojów. Odpowiedni wzór ma postać:
n
ëÅ‚
Di + Di öÅ‚
÷Å‚Ä…i
"ìÅ‚
ìÅ‚ ÷Å‚
2
i=0
íÅ‚ Å‚Å‚
d =
n
"Ä…i
i=0
gdzie przedział D to ą-przekrój na poziomie ą a n to ilość ą-przekrojów na jakie zbiór
rozmyty został podzielony. Jak można zauważyć na wartość wyostrzonego parametru ma
wpływ nie tylko środek ą-przekroju ale również wartość jego poziomu ą.
- 29 -
5.2 Oprogramowanie umożliwiające operowanie na zwykłych
przedziałach.
Jako oprogramowanie umożliwiające wykonywanie operacji arytmetycznych na
przedziałach została stworzona klasa interval. Jej definicja ma postać:
#include
#include
#include
#include
class interval
{
private:
double a;
double b;
public:
interval(void);
interval(double);
interval(double,double);
interval(const std::string &);
interval(const interval&);
interval& operator=(const interval &);
double begin();
double end();
interval operator-() const;
interval& operator+=(const interval&);
interval& operator-=(const interval&);
interval& operator*=(const interval&);
interval& operator/=(const interval&);
std::string getStr();
};
Gdzie odpowiednio a jest początkiem przedziału a b jest końcem zwykłego przedziału.
Kolejnymi elementami tej klasy sÄ… metody:
interval(void);
Jest to konstruktor domyślny klasy, tworzy przedział , a właściwie punkt w którym a=b=0.
interval(double);
Konstruktor tworzący przedział o zerowej szerokości w punkcie podanym przez parametr
wywołana.
interval(double,double);
Konstruktor tworzący ostry przedział [a,b] gdzie odpowiednio a i b są parametrami
wywołana.
- 30 -
interval(const std::string &);
Konstruktor tworzący ostry przedział [a,b] o zerowej lub nie szerokości z łańcucha
znakowego. Aańcuch może być postaci [1] dla zwykłego punktu bądz [1,2] dla
przedziału.
interval(const interval&);
Konstruktor kopiujący tworzący ostry przedział [a,b] będącego kopią innego obiektu klasy
interval.
interval& operator=(const interval &);
Operator kopiowania.
double begin();
Funkcja zwracająca początek przedziału.
double end();
Funkcja zwaracająca koniec przedziału.
interval operator-() const;
Funkcja operatora zmiany znaku.
interval& operator+=(const interval&);
Funkcja operatora dodaj i przypisz (+=).
interval& operator-=(const interval&);
Funkcja operatora odejmij i przypisz (-=).
interval& operator*=(const interval&);
Funkcja operatora pomnóż i przypisz.
interval& operator/=(const interval&);
Operator podziel i przypisz (/=).
std::string getStr();
Funkcja zwracająca przedział w postaci łańcucha znakowego np. [1,2] dla przedziału
[1,2] i [1] dla zwykłego punktu 1.
Oprócz zadeklarowanych powyżej funkcji składowych klasy stworzone zostały
funkcje nie będące elementami klasy, ale umożliwiające działania na obiektach tej klasy.
Są to między innymi:
- 31 -
ostream& operator<<(ostream &wyj, const interval &prz)
Operator zapisu do strumienia.
istream& operator>>(istream &s,interval &prz)
Operator pobierający przedział ze strumienia znakowego.
bool stringIsInterval(const std::string &lancuch)
Funkcja zwraca wartość true jeżeli łańcuch zawiera ciąg znaków który może być
zinterpretowany jako przedział.
interval operator+(const interval prz1, const interval prz2)
Operator dodawania dwu przedziałów.
interval operator-(const interval &prz1, const interval &prz2)
Operator różnicy dwu przedziałów.
interval operator*(const interval &prz1, const interval &prz2)
Operator mnożenia dwu przedziałów.
interval operator/(const interval &prz1, const interval &prz2)
Operator dzielenia dwu przedziałów.
interval pow(const interval &przedzial, double pot)
Funkcja zwracający przedział podniesiony do potęgi rzeczywistej pot.
interval pow(const interval &prz1, const interval &prz2)
Funkcja zwracający przedział podniesiony do potęgi przedziałowej prz2.
double wieksze(interval &prz1, interval &prz2)/*b>a*/
Funkcja zwracająca prawdopodobieństwo że prz2>prz1.
double mniej(interval &prz1, interval &prz2) /*bFunkcja zwracająca prawdopodobieństwo że prz2double eq(interval &prz1, interval &prz2)
Funkcja zwracająca prawdopodobieństwo że prz1=prz2.
- 32 -
double neq(interval &prz1, interval &prz2)
Funkcja zwracająca prawdopodobieństwo że prz1!=prz2.
bool operator>(interval &prz1,interval &prz2)
Operator większe zwraca true jeżeli prawdopodobieństwo że przedział prz1>prz2 jest
większe od 0.5.
bool operator<(interval &prz1,interval &prz2)
Operator mniejsze zwraca true jeżeli prawdopodobieństwo że przedział prz1większe od 0.5.
bool operator==(interval &prz1,interval &prz2)
Operator równe zwraca true jeżeli prawdopodobieństwo że przedział prz1=prz2 jest
większe od 0.5.
bool operator!=(interval &prz1,interval &prz2)
Operator różne zwraca true jeżeli prawdopodobieństwo że przedział prz1!=prz2 jest
większe od 0.5.
bool haszero(interval &prz)
Funkcja zwraca true jeżeli przedział zawiera w sobie wartość 0 .
double mid(interval &prz)
Funkcja zwraca wartość będąca środkiem przedziału prz.
double width(interval &prz)
Funkcja zwraca szerokość przedziału prz.
interval abs(interval &prz)
Funkcja zwraca przedział będący wynikiem wykonania operacji wartości bezwzględnej na
przedziale prz.
5.3 Oprogramowanie umożliwiające działania na przedziałach
rozmytych.
Jako oprogramowanie umożliwiające na wykonywanie operacji na przedziałach i
liczbach rozmytych stworzona została klasa fuzzy. Klasa ta pozwala na przedstawienie
rozmytych liczb i przedziałów jako zbioru ą-przekrojów. Wykonywanie dowolnych
operacji na obiektach klasy fuzzy polega na wykonywaniu tychże operacji na
odpowiadajÄ…cych sobie Ä…-przekrojach. Przekroje Ä… zbioru rozmytego sÄ…
zaimplementowane jako tablica elementów klasy interval. Dekompozycji liczb bądz
- 33 -
przedziałów rozmytych na ą-przekroje możemy dokonywać z dowolną dokładnością
zadaną przez stałą NUMLEV.
Deklaracja klasy fuzzy ma postać:
#include
#include
const int NUMLEV = 11;
class fuzzy
{
private:
interval levels[NUMLEV];
public:
fuzzy();
fuzzy(double, double, double, double);
fuzzy(double, double, double);
fuzzy(double, double);
fuzzy(double);
fuzzy(interval*);
fuzzy(const interval &);
fuzzy(const std::string &);
fuzzy(const fuzzy &, const fuzzy &, double);
fuzzy(double, double, const fuzzy &);
fuzzy(const fuzzy&);
fuzzy& operator=(const fuzzy&);
fuzzy operator-() const;
fuzzy& operator+=(const fuzzy&);
fuzzy& operator-=(const fuzzy&);
fuzzy& operator*=(const fuzzy&);
fuzzy& operator/=(const fuzzy&);
std::string getStr();
interval getLevel(int) const;
};
fuzzy()
Konstruktor domyślny tworzący rozmyty singleton [0].
fuzzy(interval wekt[])
Konstruktor tworzący przedział rozmyty na podstawie tablicy ą-przekrojów. Rozmiar
tablicy jest równy NUMLEV.
fuzzy(double l)
Konstruktor tworzący liczbę rozmytą o szerokości 0.
fuzzy(double l,double p)
Konstruktor tworzący przedział rozmyty będący zwykłym przedziałem. To znaczy że jądro
- 34 -
i nośnik tego zbioru są identyczne.
fuzzy(double a,double b,double c)
Konstruktor tworzący trójkątną liczbę rozmytą postaci [a,b,c]. Gdzie b stanowi jądro
zbioru a przedział [a,c] jest jego podstawą.
fuzzy(double a,double b,double c,double d)
Konstruktor tworzący trapezoidalny przedział rozmyty postaci [a,b,c,d]. Gdzie przedział
[b,c] stanowi jądro zbioru a przedział [a,d] jest jego podstawą.
fuzzy(const interval & przedz)
Konstruktor tworzący przedział rozmyty ze zwykłego przedziału będącego obiektem klasy
interval.
fuzzy(const fuzzy& rozm)
Konsruktor kopiujący tworzący przedział rozmyty z innego obiektu klasy fuzzy.
fuzzy(const std::string &lancuch)
Konstruktor tworzący przedział rozmyty z łańcucha znakowego. Aańcuch może być
postaci [1] dla zwykłego punktu, bądz [1,2] dla ostrego przedziału, [1,2,3] dla
rozmytej liczby lub [1,2,3,4] dla rozmytego przedziału.
fuzzy& operator=(const fuzzy& rozm)
Operator podstawienia (=).
fuzzy operator-() const
Fnkcja operatora zmiany znaku (-).
fuzzy& operator+=(const fuzzy& rozm)
Funkcja operatora dodaj i przypisz (+=).
fuzzy& operator-=(const fuzzy& rozm)
Funkcja operatora odejmij i przypisz (-=).
fuzzy& operator*=(const fuzzy& rozm)
Funkcja operatora pomnóż i przypisz (*=).
fuzzy& operator/=(const fuzzy& rozm)
Operator podziel i przypisz (/=).
- 35 -
interval getLevel(int poziom) const
Funkcja zwracająca przedział o poziomie ą równym poziom/(NUMLEV-1).
std::string getStr()
Funkcja zwracająca przedział rozmyty w postaci łańcucha znakowego.
Oprócz zadeklarowanych powyżej funkcji składowych klasy stworzone zostały
funkcje nie będące elementami klasy, ale umożliwiające działania na obiektach tej klasy.
Są to między innymi:
ostream& operator<<(ostream &wyj, const fuzzy &prz)
Operator zapisu do strumienia.
istream& operator>>(istream& s, fuzzy &prz)
Operator pobierający przedział rozmyty ze strumienia znakowego.
bool stringIsfuzzy(const std::string &lancuch)
Funkcja zwracająca wartość true jeśli łańcuch zawiera ciąg znaków który może zostać
zinterpretowany jako przedział rozmyty postaci [a] ,[a,b], [a,b,c], [a,b,c,d]. Oraz
sprawdzająca zależność a d" b d" c d" d.
fuzzy operator+(const fuzzy &prz1, const fuzzy &prz2)
Operator sumowania dwu przedziałów rozmytych.
fuzzy operator-(const fuzzy &prz1, const fuzzy &prz2)
Operator odejmowania dwu przedziałów rozmytych.
fuzzy operator*(const fuzzy &prz1, const fuzzy &prz2)
Operator mnożenia du przedziałów rozmytych.
fuzzy operator/(const fuzzy &prz1, const fuzzy &prz2)
Operator dzielenia dwu przedziałów rozmytych.
fuzzy pow(const fuzzy &przedzial, double pot)
Funkcja zwracająca przedział rozmyty podniesiony do potęgi rzeczywistej pot.
fuzzy pow(const fuzzy &przedzial1, const fuzzy &przedzial2)
Funkcja zwracająca przedział rozmyty podniesiony do potęgi rozmytej.
- 36 -
fuzzy wieksze(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca rozmyte prawdopodobieństwo że prz1>prz2.
fuzzy mniej(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca rozmyte prawdopodobieństwo że prz1fuzzy eq(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca rozmyte prawdopodobieństwo że prz1=prz2.
fuzzy neq(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca rozmyte prawdopodobieństwo że prz1!=prz2.
bool operator>(fuzzy &prz1, fuzzy &prz2)
Operator większe zwraca true jeżeli prawdopodobieństwo że przedział prz1>prz2 jest
większe od 0.5.
bool operator<(fuzzy &prz1, fuzzy &prz2)
Operator mniejsze zwraca true jeżeli prawdopodobieństwo że przedział prz1większe od 0.5.
bool operator==(fuzzy &prz1, fuzzy &prz2)
Operator równe zwraca true jeżeli prawdopodobieństwo że przedział prz1=prz2 jest
większe od 0.5.
bool operator!=(fuzzy &prz1, fuzzy &prz2)
Operator różne zwraca true jeżeli prawdopodobieństwo że przedział prz1!=prz2 jest
większe od 0.5.
bool haszero(fuzzy &prz)
Funkcja zwraca true jeżeli przedział (nośnik przedziału) zawiera w sobie wartość 0 .
fuzzy abs(fuzzy &prz)
Funkcja zwraca przedział rozmyty będący wynikiem wykonania operacji wartości
bezwzględnej na przedziale rozmytym prz.
double ostrz(fuzzy &przedz)
Funkcja zwraca wartość wyostrzoną przedziału rozmytego metodą środka ciężkości.
- 37 -
double dwieksze(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca prawdopodobieństwo że prz1>prz2.
double dmniej(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca prawdopodobieństwo że prz1double deq(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca prawdopodobieństwo że prz1=prz2.
double dneq(fuzzy &prz1, fuzzy &prz2)
Funkcja zwracająca prawdopodobieństwo że prz1!=prz2.
5.4 Funkcje pozwalające na obliczenie parametrów finansowych.
Zastosowane w programie funkcje pozwalają na obliczenie parametrów
finansowych. Funkcje te wykorzystują do obliczeń dekompozycję wartości rozmytych
(przedziałów i liczb) na ą-przekroje. Do implementacji obliczeń wykorzystywane są klasy
fuzzy i interval oraz przeładowane operatory arytmetyczne(+,-,/,*,=) oraz logiczne
(>,<,==,!=) pozwalajÄ…ce na operowanie na obiektach tych klas. Podstawowymi
parametrami niezbędnymi do wykonania obliczeń są przepływy finansowe oraz stopa
dyskontowa lub oprocentowanie lokaty bankowej konkurencyjnej dla przedsięwzięcia.
Parametry te zadeklarowane zostały jako obiekty klasy fuzzy. Definicja ich ma następującą
postać:
fuzzy *k,d;
gdzie d jest rozmytą wartością stopy dyskontowej, a *k wskaznikiem do dynamicznie
alokowanej tablicy zawierającej rozmyte wartości przepływów. Tablica taka może być
stworzona następującą instrukcją:
k=new fuzzy[i];
gdzie i jest długością tablicy.
Do obliczenia bieżącej wartości netto (NPV) służy funkcja:
fuzzy npw(fuzzy c[],fuzzy &d,int l)
gdzie c[] jest tablicą przepływów pieniężnych, d rozmytą wartością stopy dyskontowej a l
stanowi wielkość tablicy c[].Dzięki przeładowaniu funkcji operatorów arytmetycznych
pojedynczy element sumy możemy zaimplementować:
np+=c[i]/pow((p+d),i);
Do obliczenia wartości wewnętrznej stopy zwrotu IRR służy funkcja:
fuzzy irr(fuzzy t[],int dl);
- 38 -
funkcja ta zwraca rozmytą wartość. Nie należy jej traktować jako rozmytego przedziału
bądz liczby, ale jako wektor (tablicę) informującą o wartości IRR dla poszczególnych
ą-przekrojów.
Otrzymaną w wyniku działania powyższej funkcji wartość trudno zinterpretować jako
wartość rozmytą. Nośnik tak otrzymanego zbioru może leżeć gdzie indziej niż jego jądro
co jest niezgodne z definicją zbioru rozmytego. Dlatego też zastosowano kilka funkcji
wyostrzających wartość IRR.
Funkcja irravg obliczająca średnią wartość parametru IRR:
double irravg(fuzzy &irr)
Funkcja irrmax obliczająca najbardziej oczekiwaną wartość IRR
double irrmax(fuzzy &irr)
Im większa wartość funkcji przynależności przedziału ą tym większy wpływ IRR tego
ą-poziomu na wartość zwracaną przez funkcję.
Funkcja irrmin obliczająca najmniej oczekiwaną wartość IRR:
double irrmin(fuzzy t[],fuzzy &irr,int l)
gdzie t[] tablica przepływów finansowych, irr rozmyty parametr IRR, l wielkość
tablicy t. Na parametr ten wpływ ma szerokość przedziału, a więc większy wpływ mają
wartości o mniejszym stopniu przynależności do zbioru rozmytego.
Funkcja irrlr zwraca wartość IRR dla poziomu ą=0:
double irrlr(fuzzy &irr)
Funkcja irrmr zwraca wartość IRR dla poziomu ą=1:
double irrmr(fuzzy &irr);
Funkcja okres_zw3 zwraca całkowitą ilość okresów po których przychody pokrywają
wydatki inwestycyjne (okres zwrotu):
int okres_zw3(fuzzy c[],fuzzy &d,int l)
Funkcja :
fuzzy okres_zw2(fuzzy c[],fuzzy &d,int l)
zwraca rozmyty przybliżony okres zwrotu inwestycji.
Funkcja :
fuzzy rent(fuzzy c[],fuzzy &d,int l)
zwraca rozmytą wartość rentowności inwestycji, czyli stosunku przychodów do wydatków
zdyskontowanych na jeden moment czasowy.
- 39 -
5.5 Program do obliczania parametrów inwestycji.
Program stworzony został za pomocą pakietu Borland C++ Builder 3. Wymaga
systemu Windows w wersji od 95 wzwyż.
Instalacja programu polega na przekopiowaniu zawartości katalogu Rozmyte z
nośnika na dysk twardy na przykład do katalogu C:\Inwestycja\ ,lub dowolnego innego.
Aby ułatwić uruchamianie programu należy stworzyć na Pulpicie systemu Windows skrót
do pliku wykonywalnego inwestycja.exe .
Po uruchomieniu programu ukaże się okno główne programu. W menu głównym
znajdują się dwie opcje Obliczenia i Pomoc. Po wybraniu opcji Obliczenia ukaże nam się
podmenu z opcjami Nowe, Otwórz i Koniec. Opcji Koniec nie trzeba specjalnie opisywać
ponieważ umożliwia ona wyjście z programu.
Rys. 5.2 Główne okno programu
Opcja Nowe powoduje otwarcie następnego okna programu Edytor parametrów
które pozwala na wprowadzanie rozmytych parametrów charakteryzujących inwestycję. Są
to między innymi wartości przepływów pieniężnych w poszczególnych okresach jak
również wartość stopy dyskontowej z którą to porównujemy planowaną inwestycję.
- 40 -
Rys. 5.3 Okno edycji parametrów.
W oknie tym znajdują się dwa pola edycyjne służące do wprowadzania parametrów.
Pole przepływy pieniężne służy do wprowadzania wartości przepływów pieniężnych, na
listę która najduje się pod nim. Aby wpisać wartość na listę należy wpisywać ją w postaci
od jednej do czterech liczb oddzielonych przecinkami (do wpisywania wartości po
przecinku należy stosować kropkę . dziesiętną). Wpisywany ciąg należy ograniczyć z
lewej i prawej strony nawiasami kwadratowymi, odpowiednio [ i ] . Wpisywać
możemy pojedyncze wartości na przykład [1] co będzie oznaczać rozmyty singleton o
wartości 1 . Możliwe jest również zapis [1,2] który oznacza zwykły nierozmyty
przedział [1,2] dla którego jądro i nośnik są jednakowe. Zapis np. [1, 2, 3] oznacza
rozmytą liczbę około dwa dla której jądro zbioru rozmytego jest jednoelementowym
zbiorem o wartości 2, oraz klasyczny przedział [1,3] oznacza podstawę (support) tejże
liczby rozmytej. Natomiast zapis np. [1 ,2 ,3 ,4] będzie oznaczać rozmyty przedział o
jądrze [2,3] i podstawie (support) [1,4]. Aby wpisany ciąg przenieść na listę przepływów
należy kliknąć przycisk Dalej lub po prostu wcisnąć klawisz Enter. Jeżeli przy wypełnianiu
pola edycyjnego popełnimy jakiś błąd to zostaniemy poinformowani o tym pojawiającym
się okienkiem z komunikatem. Należy pamiętać o zasadzie że wydatki inwestycyjne należy
zapisywać w postaci rozmytych przedziałów lub liczb ujemnych np. [-2.55,-2,-1,-0.45] .
Wprowadzone wartości zostają umieszczone liście poniżej. Kliknięcie na
którymkolwiek elemencie listy spowoduje przeniesienie jego zawartości do pola
edycyjnego. Podobny efekt można uzyskać przechodząc do listy klawiszem Tab
i wciśnięciu klawisza Enter po uprzednim wybraniu klawiszami strzałek odpowiedniego
elementu. Po wybraniu jednym z dwu powyższych sposobów któregoś z elementów listy
przycisk Dodaj staje się nieaktywny. Aktywne natomiast stają się przyciski Zmień i Usuń.
Wciskając klawisz Esc możemy powrócić do poprzedniego stanu. Jeśli nie wciśniemy
klawisza Esc to możemy albo poprawić wybraną przez nas wartość w polu edycyjnym
- 41 -
i kliknąć na przycisk Zmień co spowoduje że wartość na liście zostanie zmieniona.
Klikając natomiast przycisk Usuń spowodujemy usunięcie wybranej przez nas wartości z
listy.
Wybranie jednej z dwu wymienionych powyżej opcji spowoduje że przyciski Zmień
i Usuń staną się nieaktywne, natomiast aktywny stanie się przycisk Dodaj i możliwe będzie
wprowadzanie nowych wartości na koniec listy.
Pod listą przepływów pieniężnych znajduje się pole edycyjne Oprocentowanie
lokaty bankowej : do którego wprowadzić możemy rozmyte wartości stopy dyskontowej
bądz oprocentowania lokaty bankowej która jest konkurencyjna opcją wobec planowanej
inwestycji. Przy wprowadzaniu wartości oprocentowania obowiązują podobne zasady
zapisu wartości rozmytych jak przy wypełnianiu listy przepływów finansowych. Należy
jednak uwzględnić że musi być to wartość większa od zera, oraz przy zapisie nie należy
używać znaku % lecz zapisywać wartości w postaci ułamkowej. Na przykład chcąc zapisać
wartość oprocentowania 10% jako wartość rozmytą, należy do pola edycyjnego wpisać
wartość [0.10] . Po zakończeniu wpisywania wartości oprocentowania możemy nacisnąć
klawisz Enter co spowoduje że wpisany ciąg zostanie sprawdzony. Jeżeli wpisywany ciąg
nie jest wartością rozmytą to na ekranie pojawi się okienko informujące o błędzie.
Rys. 5.4 Wybór nazwy i miejsca do zapiasania danych.
Oprócz wymienionych wcześniej pól edycyjnych i przycisków w oknie Edytor
parametrów znajdują się również inne przyciski. Jednym z nich jest Zapisz do pliku... ,
pozwala on na zapisanie rozmytych wartości przepływów finansowych oraz stopy
dyskontowej do pliku z rozszerzeniem *.txt. Umożliwiać to będzie pózniejsze ich
wykorzystanie na przykład przy następnych uruchomieniach programu. Po wybraniu tego
przycisku na ekranie pojawi siÄ™ standardowe okienko dialogowe systemu Windows
umożliwiające zapisanie parametrów do pliku o wybranej przez nas nazwie i w wybranym
przez nas katalogu. Rozmyte wartości parametrów zapisane zostają w pliku w postaci
tekstowej i formacie takim jaki służy do zapisywania ich w polach edycyjnych.
Przykładowa zawartość takiego pliku może mieć postać:
[0.21, 0.23, 0.25, 0.27]
[-8.00, -7.05, -6.95, -6.95]
[4.95, 4.95, 5.05, 6.00]
[3.95, 3.95, 4.05, 5.00]
[1.95, 1.95, 2.05, 3.00]
Przy czym jako pierwszy element zostaje zapisana wartość stopy dyskontowej
- 42 -
a w następnych wierszach zapisane zostają wartości kolejnych przepływów finansowych.
Wybranie przycisku Zamknij powoduje zamknięcie okna Edytor parametrów .
Ostatnim nieopisanym przyciskiem okna Edytor parametrów jest przycisk NPV i
IRR. Jego wybranie powoduje sprawdzenie wprowadzonych danych, zamianę łańcuchów
znakowych reprezentujących rozmyte wartości na obiekty klasy fuzzy i wykonanie
obliczenia parametrów NPV, IRR, IRRmin, IRRmax, IRRavg, IRRmr, IRRlr, okresu
zwrotu inwestycji oraz rentowności inwestycji. Obliczone wartości zostają następnie
przedstawione w postaci rozmytej oraz wyostrzonej w oknie Wyniki. Po obejrzeniu
wyników możemy nacisnąć przycisk Zamknij i w ten sposób powrócić do okna Edytor
parametrów , i albo pozmieniać wartości i powtórzyć obliczenia, lub zamknąć okno i
wrócić do głównego okna aplikacji.
Rys. 5.5 Okno z wynikami obliczeń.
W celu otworzenia wcześniej zapisanych danych, to jest stopy dyskontowej i
strumienia przepływów pieniężnych, należy z menu głównego programu Inwestycja
wybrać opcję Obliczenia a następnie z menu rozwijalnego pozycję Otwórz. Pojawia się
okno dialogowe pozwalajÄ…ce na wybranie pliku z danymi i jego otwarcie.
- 43 -
Rys. 5.6 Otwieranie pliku z danymi.
Po wybraniu interesującego nas pliku i naciśnięciu przycisku Otwórz pojawi się
znane już nam z opcji Nowe okno Edytor parametrów z wprowadzonymi już
parametrami przepływów pieniężnych i oprocentowania. Oprócz ponownego wykonania
obliczeń parametrów finansowych możemy zmodyfikować listę przepływów finansowych
lub wartość stopy dyskontowej. Dokonać ponownych obliczeń na zmodyfikowanych
parametrach a także zapisać je do pliku.
Kolejnym elementem głównego menu programu jest opcja Pomoc która posiada
podmenu z opcją O programie która to wyświetla okno informacyjne o programie.
5.6 Przykład obliczeń wykonanych przy pomocy programu.
Przykładowe obliczenia wykonane zostały dla następujących wartości przepływów
pieniężnych:
[-8.00, -7.05, -6.95, -6.00]
[4.90, 4.95, 5.05, 6.00]
[3.90, 3.95, 4.05, 5.00]
[1.90, 1.95, 2.05, 3.00]
oraz dla następującej wartości stopy dyskontowej:
[0.10, 0.11, 0.13, 0.15]
W wyniku otrzymano rozmyte parametry charakteryzujące inwestycję wśród nich między
innymi wartość bieżąca netto: rozmyty przedział NPV ma następującą postać [ 0.459111,
1.77541, 2.38556, 5.84072 ] wartość wyostrzona tego przedziału wynosi 2.39729.
Przedział ten jest w większy od zera co pozwala oczekiwać iż przy zadanej stopie
dyskontowej zainwestowany kapitał da zysk.
Parametry charakteryzujące wewnętrzną stopę zwrotu IRRmin= 0.376838,
IRRmax=0.342557, IRRavg= 0.361098, IRRmr= 0.314405, IRRlr= 0.407123 są większe
od przedziału charakteryzującego rozmytą stopę dyskontową co również pozwala na
pozytywną ocenę inwestycji. Jeżeli IRR jest większe od stopy dyskontowej lub
oprocentowania lokaty bankowej to oznacza iż inwestycja przyniesie zysk, w porównaniu
z umieszczeniem zainwestowanych pieniędzy w banku.
Przybliżony okres zwrotu inwestycji może nastąpić po 2 okresach (np. latach)
- 44 -
przybliżony rozmyty okres zwrotu jest przedziałem [ 1.132, 1.73027, 1.86295, 2.26795 ]
wartość ostra wynosi 1.75617.
Rentowność inwestycji: wartość rozmyta jest przedziałem [ 1.05739, 1.25183,
1.34325, 1.97345 ] wyostrzona wartość tego przedziału wynosi 1.3536. Oznacza to iż
inwestycja może być korzystniejsza od ulokowania pieniędzy w banku.
- 45 -
6 Wnioski.
W klasycznym podejściu obliczenie parametrów finansowych inwestycji rzeczowych
bazuje na wartościach ostrych i pewnych. Obliczenie parametrów finansowych takich jak
wartość przepływów netto (NPV), wewnętrzna stopa zwrotu (IRR), okres zwrotu
inwestycji oraz rentowność, wymaga znajomości wartości przepływów pieniężnych
(wydatków i przychodów) w czasie oraz stopy dyskontowej lub też oprocentowania lokaty
bankowej którą to rozpatrujemy jako konkurencyjną wobec naszego projektu. Jeżeli
wartość wydatków inwestycyjnych jest dla nas znana i pewna to wartość przyszłych
dochodów z inwestycji nie jest zawsze znana i pewna. Podobnie ma się sprawa ze stopą
dyskontową czy też oprocentowaniem kredytów bądz lokat bankowych, nie zawsze są one
znane a im dalej w przyszłość tym trudniej określić nam ich wartość. Bardziej naturalnym
wydaje się określenie przedziału wartości wśród których poszukiwana przez nas wartość
może się znajdować. Zwracając się o pomoc do eksperta również możemy uzyskać
odpowiedz która będzie zawierać przedział wartości lub też sformułowania typu liczba
około pięciu procent .
Jako sposób reprezentacji takich wartości wybrana została opracowana w 1956r
przez L. A. Zade teoria zbiorów rozmytych. Nieznane wartości przedstawione zostały jako
liczby oraz przedziały rozmyte. Problemem pozostało wykonywanie operacji
arytmetycznych na liczbach rozmytych. Reprezentacja wartości rozmytych w postaci liczb
typu L-R charakteryzujÄ… siÄ™ elegancjÄ… opisu matematycznego, co odbywa siÄ™ kosztem
podstawowych operacji arytmetycznych takich jak mnożenie czy dzielenie, wynikiem
niejednokrotnie jest zbiór przybliżony lub o silnie zdeformowanej funkcji przynależności.
Jako reprezentacja liczb rozmytych została wybrana więc metoda podziału zbioru
rozmytego na ą-przekroje. Umożliwiło to uproszczenie operacji wykonywanych na
wartościach rozmytych do wykonywania operacji na zwykłych przedziałach jakimi są
ą-przekroje, a właściwie na ich końcach. Po wykonaniu operacji na poszczególnych
ą-przekrojach można je z powrotem skleić w wynikowy zbiór rozmyty. Podejście takie
nie jest szczególnie eleganckie z matematycznego punktu widzenia, ale pozwala na łatwe
zaimplementowanie w formie programu komputerowego.
Niektóre z parametrów finansowych mogą w wyniku dawać wartości rozmyte np.
NPV i rentowność natomiast inne jak IRR czy też okres zwrotu trudno przedstawić lub
obliczyć jako wartości rozmyte.
W przypadku IRR trudność polega na niemożności porównywania wartości
rozmytych ze zwykłą liczbą jaką jest 0 . A zwłaszcza przy dekompozycji zboru
rozmytego na ą-przekroje, które są zwykłymi ostrymi przedziałami. Najbardziej
adekwatnym wydaje się być porównywanie środka ostrego przedziału z wartością 0 .
Otrzymane w wyniku porównań dla każdego ą-przekroju wartości IRR składają się
ponownie w zbiór którego jednak nie możemy uznać z zbiór rozmyty, ponieważ jego
podstawa może znajdować się w innym miejscu niż pozostałe wartości co jest niezgodne z
definicjÄ… zbioru rozmytego.
Obliczanie okresu zwrotu również nie daje wartości rozmytych ponieważ rozmyte
wartości sumy wydatków i przychodów nie zawsze są jednakowe pod względem
ilościowym, a także szerokości przedziałów rozmytych. Aatwiejszym jest porównywanie
wartości wyostrzonych które w wyniku dają wartości całkowite lub rzeczywiste.
Zastosowanie wartości rozmytych w obliczeniach pozwala na zachowanie jak
największej ilości informacji o niepewności przyszłych parametrów w obliczeniach.
- 46 -
7 Literatura.
1. Piegat A. Modelowanie i sterowanie rozmyte
2. Andrzej Aachwa Rozmyty świat zbiorów, liczb, relacji, faktów, reguł i decyzji.
Akademicka Oficyna Wydawnicza EXIT Warszawa 2001.
3. D. Rutkowska, M Piliński, L Rutkowski Sieci neuronowe, algorytmy genetyczne
i systemy rozmyte Aódz 1999.
4. Paweł Róg The method of intervals ordering based on the probabilistic approach
Informatyka teoretyczna i stosowana rocznik 1 nr1 Politechnika Częstochowska
2001.
5. Pavel Sevastjanow, Paweł Róg Fuzzy optimization using direct crisp and fuzzy
interval comparison . Procedings of the sixth International Conference on Neural
Networks and Soft Computing Zakopane, Poland, June 11-15,2002.
6. http://zeb.iele.polsl.gliwice.pl/fuzzy/fs_dok3.pdf
7. Bradford D. Jordan, Randolph W. Westerfield, Stephen A. Ross, Finanse
przedsiębiorstw Oficyna Ekonomiczna Kraków 1999
- 47 -
8 Dodatek A: oprogramowanie.
Plik przedz.cpp zawierający definicję klasy interval i funkcji nań operujących:
#include
#include
#include
#include
class interval
{
private:
double a;
double b;
public:
interval(void);
interval(double);
interval(double,double);
interval(const std::string &);
interval(const interval&);
interval& operator=(const interval &);
double begin();
double end();
interval operator-() const;
interval& operator+=(const interval&);
interval& operator-=(const interval&);
interval& operator*=(const interval&);
interval& operator/=(const interval&);
std::string getStr();
};
interval::interval(void)
{
a=0;
b=0;
}
interval::interval(double l)
{
a=l;
b=l;
}
interval::interval(double l,double r)
{
a=l;
b=r;
}
interval::interval(const interval &przedzial)
{
a=przedzial.a;
b=przedzial.b;
}
interval::interval(const std::string &lancuch)
{double a1,b1;
char znak,ciag[80];
for(int i=0;i<80;i++)
- 48 -
{ciag[i]=lancuch[i];
if(ciag[i]==0)break;
}
cout< istrstream s(ciag,80);
s>>znak>>a1>>znak;
if(znak==',')
{s>>b1>>znak;
if(s)
{if(a1<=b1)
{a=a1;b=b1;}
}
}
else
if(s)
{a=a1;
b=b1;
}
}
interval& interval::operator=(const interval &przedz)
{
a=przedz.a;
b=przedz.b;
return *this;
}
interval& interval::operator+=(const interval &przedz)
{
a+=przedz.a;
b+=przedz.b;
return *this;
}
interval& interval::operator-=(const interval &przedz)
{
a-=przedz.b;
b-=przedz.a;
return *this;
}
interval& interval::operator*=(const interval &przedz)
{double min,max,c;
min=max=a*przedz.a;
c=a*przedz.b;
if(c if(c>max)max=c;
c=b*przedz.a;
if(c if(c>max)max=c;
c=b*przedz.b;
if(c if(c>max)max=c;
a=min;
b=max;
return *this;
}
interval& interval::operator/=(const interval &przedz)
{
double min,max,c;
- 49 -
min=max=a/przedz.a;
c=a/przedz.b;
if(c if(c>max)max=c;
c=b/przedz.a;
if(c if(c>max)max=c;
c=b/przedz.b;
if(c if(c>max)max=c;
a=min;
b=max;
return *this;
}
interval interval::operator-() const
{interval wynik;
double c=a;
wynik.a=-b;
wynik.b=-c;
return wynik;
}
double interval::begin()
{return(a);}
double interval::end()
{return(b);}
std::string interval::getStr()
{char tekst[80];
if(a==b)
{ostrstream(tekst,80)<<"["< else
ostrstream(tekst,80)<<"["< return string(tekst);
}
ostream& operator<<(ostream &wyj, const interval &prz)
{interval prz2=prz;
if(prz2.begin()==prz2.end())
{wyj<<"["< else
wyj<<"["< return wyj;
}
istream& operator>>(istream &s,interval &prz)
{double a,b;
char znak;
s>>znak>>a>>znak;
if(znak==',')
{s>>b>>znak;
if(s)
{if(a<=b) prz=interval(a,b);
else s.clear(s.rdstate()|ios::failbit);
}
}
else
if(s){prz=interval(a);}
return s;
- 50 -
}
bool stringIsInterval(const std::string &lancuch)
{bool wynik=false;
double a,b;
char ciag[80];
for(int i=0;i<80;i++)
{ciag[i]=lancuch[i];
if(ciag[i]==0)break;
}
istrstream s(ciag,80);
char znak;
s>>znak>>a>>znak;
if(znak==',')
{s>>b>>znak;
if(s){if(a<=b){wynik=true;}}
}
else
if(s){wynik=true;}
return wynik;
}
interval operator+(const interval prz1, const interval prz2)
{interval wynik=prz1;
wynik+=prz2;
return wynik;
}
interval operator-(const interval &prz1, const interval &prz2)
{interval wynik=prz1;
wynik-=prz2;
return wynik;
}
interval operator*(const interval &prz1, const interval &prz2)
{interval wynik=prz1;
wynik*=prz2;
return wynik;
}
interval operator/(const interval &prz1, const interval &prz2)
{interval wynik=prz1;
wynik/=prz2;
return wynik;
}
interval pow(const interval &przedzial, double pot)
{interval prz=przedzial;
double min,max,c,a=prz.begin(),b=prz.end();
min=max=pow(a,pot);
c=pow(b,pot);
if(c<=min)min=c;
if(c>max)max=c;
prz=interval(min,max);
return prz;
}
interval pow(const interval &prz1, const interval &prz2)
{interval prz=prz1,pot=prz2;
double
min,max,c,a=prz.begin(),b=prz.end(),pota=pot.begin(),potb=pot.end();
- 51 -
min=max=pow(a,pota);
c=pow(a,potb);
if(c if(c>max)max=c;
c=pow(b,pota);
if(c if(c>max)max=c;
c=pow(b,potb);
if(c if(c>max)max=c;
prz=interval(min,max);
return prz;
}
double wieksze(interval &prz1, interval &prz2)/*b>a*/
{double a1,a2,b1,b2,wynik=0;
a1=prz1.begin();a2=prz1.end();
b1=prz2.begin();b2=prz2.end();
if((b1==b2)&&(a1==a2))
{
if(b1>a1) {wynik=1;}
else wynik=0;
}
else{
if((a1>b1)&&(a1 {
wynik=(b2-a1)/(b2-b1);
}
if((b1>a1)&&(b1 {
wynik=(b1-a1)/(a2-a1);
}
if((b1>=a1)&&(b2<=a2))
{
wynik=(b1-a1)/(a2-a1)+(b2-b1)/(2*(a2-a1));
}
if((a1>=b1)&&(a2<=b2))
{
wynik=(b2-a2)/(b2-b1)+(a2-a1)/(2*(b2-b1));
}
if((b1>=a1)&&(b2>=a2)&&(b1<=a2))
{
if(a1==a2)
{wynik=1;}
else{
wynik=1-((a2-b1)*(a2-b1)/(2*(a2-a1)*(b2-b1)));
}
}
if((a1>=b1)&&(a2>=b2)&&(a1<=b2))
{
if(b1==b2)
{wynik=0;}
else{
wynik=(b2-a1)*(b2-a1)/(2*(a2-a1)*(b2-b1));
}
}
if((b1>=a2)&&(b2>a1)){wynik=1; }
if(b1>a2){wynik=1;}
}
return wynik;
}
- 52 -
double mniej(interval &prz1, interval &prz2) /*b{double a1,a2,b1,b2,wynik=0;
a1=prz2.begin();a2=prz2.end();
b1=prz1.begin();b2=prz1.end();
if((b1==b2)&&(a1==a2))
{
if(b1>a1) {wynik=1;}
else wynik=0;
}
else{
if((a1>b1)&&(a1 {
wynik=(b2-a1)/(b2-b1);
}
if((b1>a1)&&(b1 {
wynik=(b1-a1)/(a2-a1);
}
if((b1>=a1)&&(b2<=a2))
{
wynik=(b1-a1)/(a2-a1)+(b2-b1)/(2*(a2-a1));
}
if((a1>=b1)&&(a2<=b2))
{
wynik=(b2-a2)/(b2-b1)+(a2-a1)/(2*(b2-b1));
}
if((b1>=a1)&&(b2>=a2)&&(b1<=a2))
{
if(a1==a2) //błąd dzielenia przez zero
{wynik=1;}
else{
wynik=1-((a2-b1)*(a2-b1)/(2*(a2-a1)*(b2-b1)));
}
}
if((a1>=b1)&&(a2>=b2)&&(a1<=b2))
{
if(b1==b2)
{wynik=0;}
else{
wynik=(b2-a1)*(b2-a1)/(2*(a2-a1)*(b2-b1));
}
}
if(b1>=a2){wynik=1;}
}
return wynik;
}
double eq(interval &prz1, interval &prz2)
{
double a1,a2,b1,b2,wynik=0;
a1=prz1.begin();a2=prz1.end();
b1=prz2.begin();b2=prz2.end();
if((b1==b2)&&(a1==a2))
{
if(b1==a1) {wynik=1;}
else wynik=0;
}
else{
if((a1>b1)&&(a1 {
- 53 -
wynik=0;
}
if((b1>a1)&&(b1 {
wynik=0;
}
if((b1>=a1)&&(b2<=a2))
{
wynik=(b2-b1)/(a2-a1);
}
if((a1>=b1)&&(a2<=b2))
{
wynik=(a2-a1)/(b2-b1);
}
if((b1>=a1)&&(b2>=a2)&&(b1<=a2))
{
if(a1==a2) //błąd dzielenia przez zero
{wynik=0;}
else{
wynik=(a2-b1)*(a2-b1)/((a2-a1)*(b2-b1));
}
}
if((a1>=b1)&&(a2>=b2)&&(a1<=b2))
{
if(b1==b2)
{wynik=0;}
else{
wynik=(b2-a1)*(b2-a1)/((a2-a1)*(b2-b1));
}
}
if((b1==a1)&&(b2==a2)){wynik=1;}
}
return wynik;
}
double neq(interval &prz1, interval &prz2)
{double wynik;
interval p1=prz1,p2=prz2;
wynik=1-eq(p1,p2);
return wynik;
}
bool operator>(interval &prz1,interval &prz2)
{bool wynik;
double w;
w=wieksze(prz2,prz1);
if(w>0.5) wynik=1;
else wynik=0;
return wynik;
}
bool operator<(interval &prz1,interval &prz2)
{bool wynik;
double w;
w=mniej(prz2,prz1);
if(w>0.5) wynik=1;
else wynik=0;
return wynik;
}
bool operator==(interval &prz1,interval &prz2)
- 54 -
{bool wynik;
double w;
w=eq(prz1,prz2);
if(w>0.5) wynik=1;
else wynik=0;
return wynik;
}
bool operator!=(interval &prz1,interval &prz2)
{bool wynik;
double w;
w=neq(prz1,prz2);
if(w>0.5) wynik=1;
else wynik=0;
return wynik;
}
bool haszero(interval &prz)
{
bool wynik;
if((prz.begin()*prz.end())>0) wynik=false;
else wynik=true;
return wynik;
}
double mid(interval &prz)
{
return ((prz.begin()+prz.end())/2);
}
double width(interval &prz)
{
return (prz.end()-prz.begin());
}
interval abs(interval &prz)
{double a=prz.begin(),b=prz.end(),min,max;
interval wynik;
a=fabs(a);b=fabs(b);
if(a {min=a;max=b;}
else
{min=b;max=a;}
wynik=interval(min,max);
return wynik;
}
- 55 -
Plik rozmyte.cpp zawierający definicję klasy fuzzy i funkcji nań operujących:
#include
#include
const int NUMLEV = 11;
class fuzzy
{
private:
interval levels[NUMLEV];
public:
fuzzy();
fuzzy(double, double, double, double);
fuzzy(double, double, double);
fuzzy(double, double);
fuzzy(double);
fuzzy(interval*);
fuzzy(const interval &);
fuzzy(const std::string &);
fuzzy(const fuzzy &, const fuzzy &, double);
fuzzy(double, double, const fuzzy &);
fuzzy(const fuzzy&);
fuzzy& operator=(const fuzzy&);
fuzzy operator-() const;
fuzzy& operator+=(const fuzzy&);
fuzzy& operator-=(const fuzzy&);
fuzzy& operator*=(const fuzzy&);
fuzzy& operator/=(const fuzzy&);
std::string getStr();
interval getLevel(int) const;
};
fuzzy::fuzzy()
{interval a;
for(int i=0; i {
levels[i]=a;
}
}
fuzzy::fuzzy(interval wekt[])
{
for(int i=0;i levels[i]=wekt[i];
}
fuzzy::fuzzy(double l)
{interval a(l);
for(int i=0; i {
levels[i]=a;
}
}
fuzzy::fuzzy(double l,double p)
{interval a(l,p);
for(int i=0; i {
levels[i]=a;
- 56 -
}
}
fuzzy::fuzzy(double a,double b,double c)
{double skok;
skok=NUMLEV-1;
skok=1/skok;
for(int i=0; i {
levels[i]=interval(a+((b-a)*skok*i),c-((c-b)*skok*i));
}
}
fuzzy::fuzzy(double a,double b,double c,double d)
{double skok;
skok=NUMLEV-1;
skok=1/skok;
for(int i=0; i {
levels[i]=interval((a+((b-a)*skok*i)),(d-((d-c)*skok*i)));
}
}
fuzzy::fuzzy(const interval & przedz)
{
for(int i=0; i {
levels[i]=przedz;
}
}
fuzzy::fuzzy(const fuzzy& rozm)
{
for(int i=0; i {
levels[i]=rozm.levels[i];
}
}
fuzzy::fuzzy(const std::string &lancuch)
{interval a;
double skok;
skok=NUMLEV-1;
skok=1/skok;
double a1,b1,c1,d1;
char ciag[80];
for(int i=0;i<80;i++)
{ciag[i]=lancuch[i];
if(ciag[i]==0)break;
}
cout< istrstream s(ciag,80);
char znak;
s>>znak>>a1>>znak;
if(znak==',')
{s>>b1>>znak;
if(znak==',')
{s>>c1>>znak;
if(znak==',')
{s>>d1>>znak;
if(s)
- 57 -
{if((a1<=b1)&&(b1<=c1)&&(c1<=d1))
for(int i=0; i {
levels[i]=interval((a1+((b1-a1)*skok*i)),(d1-((d1-
c1)*skok*i)));
}
}
}
else
if(s)
{if((a1<=b1)&&(b1<=c1))
for(int i=0; i {
levels[i]=interval(a1+((b1-a1)*skok*i),c1-((c1-b1)*skok*i));
}
}
}
else
if(s)
{if(a1<=b1){
a=interval(a1,b1);
for(int i=0; i {
levels[i]=a;
}
}
}
}
else
if(s){
a=interval(a1);
for(int i=0; i {
levels[i]=a;
}
}
}
fuzzy& fuzzy::operator=(const fuzzy& rozm)
{
for(int i=0; i {
levels[i]=rozm.levels[i];
}
return *this;
}
fuzzy fuzzy::operator-() const
{fuzzy wynik;
for(int i=0; i {
wynik.levels[i]=-levels[i];
}
return wynik;
}
fuzzy& fuzzy::operator+=(const fuzzy& rozm)
{
for(int i=0; i {
levels[i]+=rozm.levels[i];
- 58 -
}
return *this;
}
fuzzy& fuzzy::operator-=(const fuzzy& rozm)
{
for(int i=0; i {
levels[i]-=rozm.levels[i];
}
return *this;
}
fuzzy& fuzzy::operator*=(const fuzzy& rozm)
{
for(int i=0; i {
levels[i]*=rozm.levels[i];
}
return *this;
}
fuzzy& fuzzy::operator/=(const fuzzy& rozm)
{
for(int i=0; i {
levels[i]/=rozm.levels[i];
}
return *this;
}
interval fuzzy::getLevel(int poziom) const
{interval a;
a=levels[poziom];
return a;
}
std::string fuzzy::getStr()
{char tekst[80];
ostrstream(tekst,80)<<"[ "<1].begin()
<<", "< return string(tekst);
}
ostream& operator<<(ostream &wyj, const fuzzy &prz)
{interval g,d;
g=prz.getLevel(10);
d=prz.getLevel(0);
if((d.begin()==g.begin())&&(g.begin()==g.end())&&(g.end()==d.end()))
{wyj<<"[ "< else{
if(g.begin()==g.end())
{
wyj<<"[ "< }
else
wyj<<"[ "<]";
}
return wyj;
- 59 -
}
istream& operator>>(istream& s, fuzzy &prz)
{double a,b,c,d;
char znak;
s>>znak>>a>>znak;
if(znak==',')
{s>>b>>znak;
if(znak==',')
{s>>c>>znak;
if(znak==',')
{s>>d>>znak;
if(s)
{if((a<=b)&&(b<=c)&&(c<=d)) prz=fuzzy(a,b,c,d);
else s.clear(s.rdstate()|ios::failbit);
}
}
else
if(s)
{if((a<=b)&&(b<=c))prz=fuzzy(a,b,c);
else s.clear(s.rdstate()|ios::failbit);
}
}
else
if(s)
{if(a<=b) prz=fuzzy(a,b);
else s.clear(s.rdstate()|ios::failbit);
}
}
else
if(s){prz=fuzzy(a);}
return s;
}
bool stringIsfuzzy(const std::string &lancuch)
{bool wynik=false;
double a,b,c,d;
char ciag[80];
for(int i=0;i<80;i++)
{ciag[i]=lancuch[i];
if(ciag[i]==NULL)break; //tu zmieniłem 0 na NULL
}
istrstream s(ciag,80);
char znak;
s>>znak;
if(znak=='['){
s>>a>>znak;
if(znak==',')
{s>>b>>znak;
if(znak==',')
{s>>c>>znak;
if(znak==',')
{s>>d>>znak;
if(s&&(znak==']')){if((a<=b)&&(b<=c)&&(c<=d)){wynik=true;}}
}
else
if(s&&(znak==']')){if((a<=b)&&(b<=c)){wynik=true;}}
}
else
if(s&&(znak==']')){if(a<=b){wynik=true;}}
}
- 60 -
else
if(s&&(znak==']')){wynik=true;}
}
return wynik;
}
fuzzy operator+(const fuzzy &prz1, const fuzzy &prz2)
{fuzzy wynik=prz1;
wynik+=prz2;
return wynik;
}
fuzzy operator-(const fuzzy &prz1, const fuzzy &prz2)
{fuzzy wynik=prz1;
wynik-=prz2;
return wynik;
}
fuzzy operator*(const fuzzy &prz1, const fuzzy &prz2)
{fuzzy wynik=prz1;
wynik*=prz2;
return wynik;
}
fuzzy operator/(const fuzzy &prz1, const fuzzy &prz2)
{fuzzy wynik=prz1;
wynik/=prz2;
return wynik;
}
fuzzy pow(const fuzzy &przedzial, double pot)
{fuzzy prz=przedzial;
interval wekt[NUMLEV];
for(int i=0;i {
wekt[i]=pow(prz.getLevel(i),pot);
}
prz=wekt;
return prz;
}
fuzzy pow(const fuzzy &przedzial1, const fuzzy &przedzial2)
{fuzzy prz1=przedzial1,prz2=przedzial2;
interval wekt[NUMLEV];
for(int i=0;i {
wekt[i]=pow(prz1.getLevel(i),prz2.getLevel(i));
}
prz1=wekt;
return prz1;
}
fuzzy wieksze(fuzzy &prz1, fuzzy &prz2)
{fuzzy wynik,a=prz1,b=prz2;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
y=b.getLevel(i);
wekt[i]=interval(wieksze(x,y));
- 61 -
}
wynik=wekt;
return wynik;
}
fuzzy mniej(fuzzy &prz1, fuzzy &prz2)
{fuzzy wynik,a=prz1,b=prz2;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
y=b.getLevel(i);
wekt[i]=interval(mniej(x,y));
}
wynik=wekt;
return wynik;
}
fuzzy eq(fuzzy &prz1, fuzzy &prz2)
{fuzzy wynik,a=prz1,b=prz2;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
y=b.getLevel(i);
wekt[i]=interval(eq(x,y));
}
wynik=wekt;
return wynik;
}
fuzzy neq(fuzzy &prz1, fuzzy &prz2)
{fuzzy wynik,a=prz1,b=prz2;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
y=b.getLevel(i);
wekt[i]=interval(neq(x,y));
}
wynik=wekt;
return wynik;
}
double ostrz(fuzzy &przedz)
{double wyn=0.0,alfa,m=0.0;
interval poziom;
for(int i=0;i {poziom=przedz.getLevel(i);
alfa=double(i)/double(NUMLEV-1);
wyn+=mid(poziom)*alfa;
m+=alfa;
- 62 -
}
wyn/=m;
return wyn;
}
bool operator>(fuzzy &prz1, fuzzy &prz2)
{fuzzy y;
bool wynik=false;
double w=0;
y=wieksze(prz2,prz1);
w=ostrz(y);
if(w>0.5) wynik=true;
return wynik;
}
bool operator<(fuzzy &prz1, fuzzy &prz2)
{fuzzy y;
bool wynik=false;
double w=0;
y=mniej(prz2,prz1);
w=ostrz(y);
if(w>0.5) wynik=true;
return wynik;
}
bool operator==(fuzzy &prz1, fuzzy &prz2)
{fuzzy y;
bool wynik=false;
double w=0;
y=eq(prz1,prz2);
w=ostrz(y);
if(w>0.5) wynik=true;
return wynik;
}
bool operator!=(fuzzy &prz1, fuzzy &prz2)
{fuzzy y;
bool wynik=false;
double w=0;
y=neq(prz1,prz2);
w=ostrz(y);
if(w>0.5) wynik=true;
return wynik;
}
bool haszero(fuzzy &prz)
{interval a;
bool wyn=false;
for(int i=0;i {a=prz.getLevel(i);
if(haszero(a)) wyn=true;
}
return wyn;
}
fuzzy abs(fuzzy &prz)
- 63 -
{interval a,w[NUMLEV];
for(int i=0;i {a=prz.getLevel(i);
w[i]=abs(a);
}
return fuzzy(w);
}
double dwieksze(fuzzy &prz1, fuzzy &prz2)
{fuzzy a=prz1,b=prz2;
double wynik=0.0;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
y=b.getLevel(i);
wynik+=wieksze(x,y);
}
wynik/=double(NUMLEV);
return wynik;
}
double dmniej(fuzzy &prz1, fuzzy &prz2)
{fuzzy a=prz1,b=prz2;
double wynik=0.0;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
y=b.getLevel(i);
wynik+=mniej(x,y);
}
wynik/=double(NUMLEV);
return wynik;
}
double deq(fuzzy &prz1, fuzzy &prz2)
{fuzzy a=prz1,b=prz2;
double wynik=0.0;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
y=b.getLevel(i);
wynik+=eq(x,y);
}
wynik/=double(NUMLEV);
return wynik;
}
double dneq(fuzzy &prz1, fuzzy &prz2)
{fuzzy a=prz1,b=prz2;
double wynik=0.0;
interval x,y;
interval wekt[NUMLEV];
for(int i=0;i {
x=a.getLevel(i);
- 64 -
y=b.getLevel(i);
wynik+=neq(x,y);
}
wynik/=double(NUMLEV);
return wynik;
}
Plik potegi.cpp zawierajÄ…cy definicjÄ™ funkcji obliczajÄ…cych parametry finasowe:
#include
#include
#include
#include "przedz.cpp"
#include "rozmyte.cpp"
fuzzy irr(fuzzy t[],int dl)
{fuzzy wyn;
int skok=0;
double l=-1,r=1,s;
interval npvl,npvs,npvr;
interval x,ze(0);
interval wekt[NUMLEV];
for(int i=0;i { l=-10;r=10;
skok=0;
do
{
skok+=1;
npvl=ze;
npvr=ze;
npvs=ze;
s=(l+r)/2;
for(int j=0;j {
x=t[j].getLevel(i);
npvs+=x/interval(pow((1+s),j));
}
if(mid(npvs)<=0) r=s;
else l=s;
if(skok>5000)break;
}
while(fabs(mid(npvs)-0.0)>=1e-9);
wekt[i]=interval(s);
}
wyn=wekt;
return wyn;
}
double irrmin(fuzzy t[],fuzzy &irr,int l)
{double ir=0,alfa,m=0;
interval poziom,x;
fuzzy npv(0.0);
for(int j=0;j {
npv+=t[j]/pow((fuzzy(1)+irr),j);
}
for(int i=0;i {poziom=irr.getLevel(i);
- 65 -
x=npv.getLevel(i);
alfa=width(x);
ir+=poziom.begin()*alfa;
m+=alfa;
}
if(m>0){
ir/=m;}
else {poziom=irr.getLevel(0);
ir=poziom.begin();}
return ir;
}
double irrmax(fuzzy &irr)
{double ir=0,alfa,m=0;
interval poziom;
for(int i=0;i {poziom=irr.getLevel(i);
alfa=double(i)/double(NUMLEV-1);
ir+=poziom.begin()*alfa;
m+=alfa;
}
ir/=m;
return ir;
}
double irravg(fuzzy &irr)
{double ir=0;
interval poziom;
for(int i=0;i {poziom=irr.getLevel(i);
ir+=poziom.begin();
}
ir/=NUMLEV;
return ir;
}
double irrmr(fuzzy &irr)
{double ir;
interval poziom=irr.getLevel(NUMLEV-1);
ir=poziom.begin();
return ir;
}
double irrlr(fuzzy &irr)
{double ir;
interval poziom=irr.getLevel(0);
ir=poziom.begin();
return ir;
}
fuzzy npw(fuzzy c[],fuzzy &d,int l)
{
fuzzy np(0.0),p(1);
for(int i=0;i {
np+=c[i]/pow((p+d),i);
}
return np;
}
- 66 -
fuzzy okres_zw2(fuzzy c[],fuzzy &d,int l)
{int okres=0;
fuzzy sn(0.0),p(1),stare(0.0),zero(0.0),kv(0.0),h;
for(int i=0;i {
if(mid(c[i].getLevel(0))<0)
{
kv+=c[i]/pow((p+d),i);
}
}
kv=abs(kv);
for(int i=0;i {
if(mid(c[i].getLevel(0))>0)
sn+=c[i]/pow((p+d),i);
if(width(kv.getLevel(0))>0)
{
if((starekv))
{sn=stare;
okres=i-1;
break;
}
}
else
{if((starekv))
{sn=stare;
okres=i-1;
break;
}
}
stare=sn;
}
h=fuzzy(okres)+((kv-sn)/(c[okres+1]))*pow(p+d,okres+1);
return h;
}
int okres_zw3(fuzzy c[],fuzzy &d,int l)
{int okres=-1;
fuzzy sn(0.0),p(1),stare(0.0),zero(0.0),kv(0.0);
for(int i=0;i {
if(mid(c[i].getLevel(0))<0)
{
kv+=c[i]/pow((p+d),i);
}
}
kv=abs(kv);
for(int i=0;i {
if(mid(c[i].getLevel(0))>0)
sn+=c[i]/pow((p+d),i);
if(width(kv.getLevel(0))>0)
{
if((starekv))
{
okres=i;
break;
}
}
else
- 67 -
{if((ostrz(stare)=ostrz(kv)))
{
okres=i;
break;
}
}
stare=sn;
}
return okres;
}
fuzzy rent(fuzzy c[],fuzzy &d,int l)
{
fuzzy pt(0.0),kv(0.0),p(1),r,z(0.0);
for(int i=0;i {
if(c[i] {
kv+=c[i]/pow((p+d),i);
}
else
{
pt+=c[i]/pow((p+d),i);
}
}
kv=abs(kv);
if(haszero(kv)){return fuzzy(-1.0);}
r=pt/kv;
return r;
}
- 68 -
Wyszukiwarka
Podobne podstrony:
Optymalizacja niezawodnościowa płaskich układów kratowych za pomocą zbiorów rozmytych
Zagadnienia do zajec labor z Elem Teorii Maszyn i Mechan oraz Drgan AiR wiecz inz s5
Analiza porównawcza śladów zębów i cech zębów z wykorzystaniem metod 2D i 3D
Węgrzyn Wykorzystanie metod cybernetyki w praktyce decyzyjnej
Zabawy z marcową pogodą scenariusz zajęcia z wykorzystaniem metod aktywizujących w pracy z dziećmi
Zabawy z marcową pogodą scenariusz zajęcia z wykorzystaniem metod aktywizujących w pracy z dziećmi
Protetyczne leczenie pacjentów z wykorzystaniem metod diagnostycznego nawoskowania
Część II Wykorzystanie metod entomologicznych do oceny czasu zgonu – opis przypadków
Część I Wykorzystanie metod entomologicznych do oceny czasu zgonu – opis przypadków
Nietypowe rodziny O parach lesbijek i gejów oraz ich dzieciach z perspektywy teorii przywiązania
311[10] Z1 07 Wykorzystywanie teorii błędów do opracowywania pomiarów geodezyjnych
WYKORZYSTANIE STANDARDOW SERII ISO ORAZ OGC DLA POTRZEB BUDOWY INFRASTRUKTURY DANYCH PRZESTRZENNYCH
DETEKCJA WODORU Z WYKORZYSTANIEM PALLADU ORAZ TLENKÓW NIKLU
Zakres nowelizacji norm cementowych PN EN Analiza wymagań oraz warunków wykorzystania w technol
więcej podobnych podstron