| 3. Informatik: Realisierung des Analyseprogramms |
|
Vor Beginn der Entwicklung des Programms sind noch gewisse Vorüberlegungen zur Vorgehensweise notwendig.
Das Programm soll jedem Benutzer auf einfachem Wege zugänglich gemacht werden. Die Bedienung soll so einfach wie möglich sein; die Auswertung der Analyse erfolgt rechnerisch wie grafisch.
Mittel der Wahl, um das Programm einfach zugänglich zu halten, ist das Internet, damit also die Installation auf einem Webserver, im konkreten Fall auf einem Apache-Webserver auf einem Debian-Betriebssystem.
Die Analyse-Algorithmen bedienen sich der serverseitigen Scriptsprache PHP in Version 5.0.3 (cgi). Die grafische Ausgabe erfolgt mittels der JPGraph-PHP-Bibliothek in Version 2.0alpha für PHP 5. Um die Trennung von Design und Code (und damit eine einfache Pflege beider Teile) zu ermöglichen, wird auf das Templatesystem „HTML_TEMPLATE_IT“ aus PEAR („PHP Extension and Application Repository“) zurückgegriffen. Die Templates liegen als HTML-Dokumente vor; zur Formatierung werden CSS („Cascading Style Sheets“) verwendet.
| 3.3. Objektorientierung, Abstraktion, polymorphe Klassen |
|
Sämtlicher für die Analyse relevanter Code wird objekt-orientiert programmiert, so dass dieser öfters verwendet, leicht gepflegt und dokumentiert werden kann.
Die Klasse „Math_Calc“ enthält dabei grundlegende Algorithmen zur Differentialrechnung sowie Nullstellenberechnung von Polynomen. Der Zugriff auf diese Klasse wird über die Klasse „Math_Interface“ gesteuert, die mit „Math_Calc“ interagiert und die Datenstrukturen vereinfacht zurück gibt sowie eine einfache Übergabe der Parameter ermöglicht.
Die zweite grundlegende Klasse „BWL“ behandelt sämtliche kostentheoretische Problemstellungen. So werden hier die zur Analyse notwendigen Polynome errechnet. Die Lösungen der Polynome werden unter Verwendung von „Math_Interface“ berechnet; die Ergebnisse in der Datenstruktur der „BWL“-Klasse gespeichert.
Da zwei Modelle (linearer und ertragsgesetzlicher Kostenverlauf) analysiert werden müssen, die sich nur in der Definition der Kostenpunkte nicht aber in der Vorgehensweise der Analyse unterscheiden, bietet sich die Trennung dieser Modelle in separate Klassen an. So behandelt die Klasse „BWL_L“ das Modell mit linearem Kostenverlauf; die Klasse „BWL_S“ behandelt den ertragsgesetzlichen Kostenverlauf. Beide Klassen implementieren das Interface „BWL_Classes“, um sicherzustellen, dass dieselben Methoden (mit denselben Parametern) in beiden Klassen zur Verfügung stehen (polymorphe Klassen). Bei der Entwicklung wird auf eine identische Datenstruktur der Ergebnisse geachtet.
Das sog. „Fabrikmuster“ der Klasse „BWL“ entscheidet anhand der übergebenen Kostenfunktion, welches Kostenmodell analysiert werden soll und gibt ein Objekt der passenden Klasse („BWL_L“ bzw. „BWL_S“) zurück.
Die Klasse „BWL_Interface“ stellt analog zur Klasse „Math_Interface“ eine steuernde Klasse dar, über die der einfache Zugriff auf die Klasse „BWL“ ermöglicht wird.
Neben der „BWL_Interface“-Klasse existiert ein weiteres Interface „BWL_Graphic_Interface“, das die Klasse „BWL_Interface“ beerbt und zusätzlich Methoden zur Skalierung der Diagramme sowie Datenübergabe an JPGraph bereitstellt.
Die Klasse „Math_Output“ hält Funktionen zur Formatierung der Polynom-Zeichenketten bereit. „BWL_Output“ definiert die verwendeten Kürzel der Kostenpunkte und –funktionen und gibt deren Namen zurück.
| 3.4. Reduzierung einer Funktion auf Koeffizienten |
|
Da sämtliche Polynome auf Ihre Nullform gebracht werden können, bietet es sich an, nur ihre Koeffizienten zu verarbeiten, da für die Lösungsformel für lineare und quadratische Gleichungen sowie für die Cardanische Formel ausschließlich die Koeffizienten der Polynome in Nullform gebraucht werden.
So wird die Kostenfunktion (hier ertragsgesetzlicher Verlauf) in einem assoziativen Array gespeichert:
F(x) = ax³ + bx² + cx + d
Array("a" => $a, "b" => $b, "c" => $c, "d" => $d);
Dieses Prinzip soll an einem Beispiel veranschaulicht werden. Das Kostenoptimum liegt genau am Schnittpunkt zwischen der Grenzkostenkurve und der totalen Stückkostenkurve:
K’ = k
also 2ax³ + bx² + 0x – d = 0
Das entsprechende Array, das die Koeffizienten dieses Polynoms speichert, sieht wie folgt aus:
Array("a" => 2*$a, "b" => $b, "c" => 0, "d" => -$d);
Die Klasse “Math_Calc” berechnet aus diesem Array die Nullstellen.
| 3.5. Nullstellenberechnung |
|
Die Klasse „Math_Calc“ beinhaltet eine Methode zur Berechnung von Nullstellen für Polynome bis einschließlich dritten Grades. Sie entscheidet anhand des Grades des Polynoms, welcher Algorithmus verwendet wird. Zur Lösung der bekannten Lösungsformeln sind nur die Koeffizienten der zu berechnenden Funktion nötig.
Das Verfahren lässt sich am einfachsten Fall (Nullstellen einer linearen Funktion) leicht verdeutlichen. Es soll die Lösung der Funktion
ax + b = 0
berechnet werden. Dazu ist nur eine Umstellung „nach x“ erforderlich:
x = -b / a; a ≠0
Der entsprechende „Algorithmus“ dazu:
$aReturn[] = - $b / $a;
Analog dazu wird bei Polynomen zweiten und dritten Grades verfahren, mit dem Unterschied, dass die Algorithmen deutlich länger sind.
Die Klasse „Math_Calc“ berechnet die erste bis dritte Ableitung (sofern vorhanden) einer Funktion anhand der Koeffizienten der abzuleitenden Funktion, sowie deren Grades.
An einem Beispiel verdeutlicht heißt das:
F(x) = ax³ + bx² + cx + d
Array("a" => $a, "b" => $b, "c" => $c, "d" => $d);
1. Ableitung:
F’(x) = 3ax² + 2bx + c
Array("a" => 3*$a, "b" => 2*$b, "c" => $c, "d" => 0);
Die Ableitungsfunktionen bzw. deren Koeffizienten werden wiederum nach der oben beschriebenen Systematik in Arrays abgespeichert und zurückgegeben. Der Grad der jeweiligen Ableitungsfunktion wird ebenfalls bestimmt und separat abgespeichert.
Die grafische Ausgabe (Gesamt- und Stückbetrachtung) erfolgt mit Hilfe der objektorientierten PHP-Bibliothek JPGraph, die unter der QPL lizenziert ist (Open Source). Die Klasse „FuncGenerator“ nimmt eine Funktion als Zeichenkette entgegen und berechnet selbstständig eine große Anzahl von Koordinaten des Graphen. Eine Anpassung der Klasse stellt sicher, dass der Graph nicht im negativen Bereich angezeigt wird. Der Graph wird in einem Koordinatensystem als Bild ausgegeben, das mit Hilfe der GD-Library, einer PHP-Erweiterung zur Bearbeitung von Grafiken, erstellt wird.
Um das Koordinatensystem so zu skalieren, dass alle relevanten Punkte angezeigt werden, müssen Maximalwerte für die X- und Y-Achse bestimmt werden. Dies übernimmt die Klasse „BWL_Graphic_Interface“, die anhand der vorhandenen Kostenpunkte abschätzt, wie groß der Graph mindestens sein muss. Sind die zur Abschätzung verwendeten Kostenpunkte nicht berechenbar, ergeben sich hierbei Schwierigkeiten, die sich in einer zu großen Skalierung des Graphen zeigen. Beispielsweise werden bei ertragsgesetzlichem Kostenverlauf die Nutzengrenze betrachtet und anhand deren Koordinaten die Höhe und Breite des Koordinatensystems berechnet. Ist keine Nutzengrenze vorhanden, wird das Kostenoptimum betrachtet, das in etwa in der Mitte des Koordinatensystems liegen soll.
|