Objektorientierte Implementierung einer Fuzzygröße
fuzzy_cpp.zip - Klassen Fuzzygroesse, Eingangsfuzzyset, Ausgangsfuzzyset.
|
Bild 0-1: Varianten bei einer Fuzzy-Größe
|
class Fuzzygroesse
{
public:
double p[3];
bool links_unbegrenzt, rechts_unbegrenzt;
Fuzzygroesse(double p0, double p1, double p2,
bool links_unbegrenzt=false, bool rechts_unbegrenzt=false)
{
this->p[0] = p0;
this->p[1] = p1;
this->p[2] = p2;
this->links_unbegrenzt = links_unbegrenzt;
this->rechts_unbegrenzt = rechts_unbegrenzt;
//Sinnvolle Festlegung von p0 und p2 bei teilweise unbegrenzten Funktionen,
//damit die Fallunterscheidung unten richtig funktioniert:
if(links_unbegrenzt == true)
p[0]=p[1]-1.0;
if(rechts_unbegrenzt == true)
p[2]=p[1]+1.0;
}
double berechneZugehoerigkeitswert(double x)
{
//Behandlung der trivialen Fälle:
if(links_unbegrenzt==true && x<=p[1])
return 1.0;
if(rechts_unbegrenzt==true && x>=p[1])
return 1.0;
if(x<=p[0])
return 0.0;
if(x>=p[2])
return 0.0;
if(x<p[1]) //steigende Gerade
return (x-p[0])/(p[1]-p[0]);
else //fallende Gerade
return (x-p[2])/(p[1]-p[2]);
}
double berechneSchwerpunkt(double aktivierung)
{
if(aktivierung==0.0) //Division durch Null vermeiden.
return 0.0;
//Schnittpunkte mit y=aktivierung bestimmen:
double x1 = p[0] + aktivierung*(p[1]-p[0]);
double x2 = p[2] + aktivierung*(p[1]-p[2]);
//Flächen von erstem Dreieck, Rechteck und zweitem Dreieck bestimmen:
double A0 = 0.5*(x1-p[0])*aktivierung;
double A1 = (x2-x1)*aktivierung;
double A2 = 0.5*(p[2]-x2)*aktivierung;
//Schwerpunkte von erstem Dreieck, Rechteck und zweitem Dreieck bestimmen:
double s0 = p[0]+(2.0/3.0)*(x1-p[0]);
double s1 = 0.5*(x1+x2);
double s2 = p[2]-(2.0/3.0)*(p[2]-x2);
return (s0*A0+s1*A1+s2*A2)/(A0+A1+A2);
}
double berechneFlaeche(double aktivierung)
{
//Schnittpunkte mit y=aktivierung bestimmen:
double x1 = p[0] + aktivierung*(p[1]-p[0]);
double x2 = p[2] + aktivierung*(p[1]-p[2]);
//Flächen von erstem Dreieck, Rechteck und zweitem Dreieck bestimmen:
double A0 = 0.5*(x1-p[0])*aktivierung;
double A1 = (x2-x1)*aktivierung;
double A2 = 0.5*(p[2]-x2)*aktivierung;
return A0+A1+A2;
}
};
Code 0-1: Quellcode der Klasse Fuzzygroesse in der Datei Fuzzygroesse.h
Übungsaufgabe a): Schreiben Sie ein Testprogramm "TestFuzzygroesse.cpp" für obige Klasse, das alle Fuzzygrößen der Übung9 erzeugt und die Zugehörigkeitswerte zu den Eingangsgrößen berechnet.
R=7 und T=12.5, => Rkalt = 0.6 Rmittel = 0.4 Rwarm = 0 Tkalt = 0.5 Twarm = 0.5 R=5 und T=7, => Rkalt = 1 Rmittel = 0 Rwarm = 0 Tkalt = 0.866667 Twarm = 0.133333
Code 0-2: Ihr Programm sollte obige Ausgabe liefern.