3036 |
Gauss |
Inverse Matrix bestimmen (nach Gauss) |
Kategorie: | Mathematik |
Klasse: | schwer |
Eingabe: | siehe Spezifikation |
Ausgabe: | siehe Spezifikation |
|
Abzugebende Files: Gauss.txt, Gauss.java, *.java , 311.txt, 634.txt |
Kurzbeschreibung:
Eine nxn-Matrix soll mittels erweiterem Gauss'schem Eliminationsverfahren invertiert werden, wobei mit Bruchzahlen gerechnet werden soll.
Allgemeine Hinweise:
-
Sie haben Lösungen (und Spezifikationen) aus der 1. Runde von anderen Studenten erhalten,
die Ihnen Ihre Aufgabe erleichtern sollen. Wählen Sie eine Lösung aus, die Ihnen hinsichtlich Lesbarkeit, Programmierstil,
Korrektheit und Verwendbarkeit am besten erscheint. Verwenden Sie
diese Lösung in Ihrem Programm. Sie können auch die anderen Lösungen einsetzen.
- Merken Sie sich die Lösungsnummer des ausgewählten Beispieles für die Abgabe. Diese Nummer müssen Sie bei der Abgabe angeben. Geben Sie nur jene Lösungsnummer an, die Sie auch wirklich ausgewählt haben.
-
Erstellen Sie für alle Lösungen zu diesem Beispiel (siehe: "Abzugebende Files") ein File mit dem Namen <number>.txt. und schreiben in dieses File ein Review (=Kritik) zu der Lösung. Diese Reviews erhalten dann die TeilnehmerIn von dem/der die Lösung stammt. Beachten Sie das bitte bei der Form Ihrer Kritik.
-
Sie können für die Lösung der gewählten Aufgabe eine oder mehrere Klassen programmieren. Die Klasse Gauss.java muß aber die Methode main enthalten. Weiters müssen alle abgegebenen Klassenfiles in demselben Verzeichnis vorliegen, Pfadangaben sind nicht gestattet.
-
Achten Sie auf die korrekten Konventionen der Groß/Kleinschreibung bei
Klassen und Methoden!
[Wir tun das jetzt auch :-)]
-
Falls Ihre Lösung einen Exit Code zurueckliefert, so
achten Sie darauf, dass dieser den Wert 0 hat.
Bei allen anderen Werten können Probleme bei der Bewertung und in weiterer
Folge unbeabsichtigte Punkteabzüge auftreten.
- Ihre Lösung darf nur genau jene Ausgabedaten liefern, die in der
Spezifikation verlangt werden. Die Ausgaben Ihrer Lösung werden automatisch mit Referenzdaten verglichen; etwaige Abweichungen führen zu Punkteabzügen!
- Testen Sie Ihre Lösung vor der Abgabe mit der mitgelieferten Eingabedatei. Geben Sie Ihre Lösung erst ab, wenn die Ausgaben Ihrer Lösung mit der ebenfalls mitgelieferten Ausgabedatei übereinstimmen! Testen Sie Ihre Lösung auch mit anderen Eingabedaten.
-
Verwenden Sie nur das von uns mitgelieferten Package eprog
für Ihre Ein/Ausgaben. Klassen, die Packages oder Klassen ausserhalb der verwendeten Übungsumgebung (Java2, Standard Edition, Version 1.3.1_1) verwenden, können von uns
nicht getestet werden und werden daher mit 0 Punkten bewertet!
- Schreiben Sie Ihre Klasse(n) möglichst allgemein und kommentieren
Sie diese gut. Erstellen Sie weiters eine übersichtliche und
verständliche Dokumentation. Damit erhöhen Sie Ihre Chancen,
daß andere Studenten in der nächsten Runde Ihre Lösung
wählen und Ihnen damit zu Zusatzpunkten verhelfen!
Aufgabenstellung:
Lesen Sie zuerst die Dimension der Matrix (maximal 5) und dann die Elemente
ein. Speichern Sie die Elemente als Bruchzahlen. Die Zahl 0 soll als 0/1
gespeichert werden.
Ermitteln Sie die inverse Matrix durch das erweiterte Gauss'sche Eliminationsverfahren, wobei Sie wie folgt vorgehen:
Schreiben eine Einheitsmatrix neben die zu invertierende Matrix.
Bringen Sie die Matrix auf Diagonalform. Addieren Sie dazu zuerst ein Vielfaches der ersten Zeile zu allen
anderen, sodaß in der ersten Spalte nur noch
in der ersten Zeile ein Wert ungleich 0 steht. Beachten Sie, daß Sie immer
alle Elemente der jeweiligen Zeile mitziehen müssen. Der Faktor, mir dem Sie
die erste Zeile für diese Operation multiplizieren müssen, erhalten Sie durch
-Ai1/A11.
Addieren Sie danach ein Vielfaches der zweiten Zeile zu allen weiter unten
stehenden Zeile, sodaß Ai2 = 0 für i>2 wird. Dieses Verfahren wiederholen Sie,
bis unterhalb der Hauptdiagonale nur noch Nullen stehen. In der Diagonale
müssen Werte ungleich 0 stehen!
Wenn Sie das "Pech" haben, daß ein Element in der Hauptdiagonale 0 ist, dann
müssen Sie eine weiter unten stehende Zeile, die in dieser Spalte keine 0
stehen hat, zu dieser Zeile addieren und dann weiterrechnen. Führt dies nicht
zum Erfolg, dann ist die Matrix nicht invertierbar.
(Normalfall)
Jetzt haben Sie den schwierigsten Teil hinter sich. Nun bringen Sie die Matrix
in Diagonalform, d.h., auch oberhalb der Diagonale sollen nur noch Nullen
stehen. Dazu addieren sie ein Vielfaches der letzten Zeile zu allen weiter
oben stehenden, ein Vielfaches der vorletzten zu allen weiter oben stehenden
usw.
Zuletzt dividieren Sie jede Zeile durch das in der Hauptdiagonale stehende
Element.
Die Matrix (B11...B33) ist die gesuchte inverse Matrix zu A!
Eingabedaten:
Lesen Sie zuerst die Dimension der Matrix als Integer-Zahl ein. Diese darf
mindestens 1 und maximal 5 betragen.
Danach werden die Elemente der Matrix als Zahlen vom Typ INTEGER eingelesen,
wobei diese im Bereich [-100,100] (inklusive) liegen müssen.
Die Reihenfolge der Elemente ist A11, A12, ..., A1n, A21, ..., A2n, ..., An1,
..., Ann (zeilenweise von links nach rechts).
Ausgabedaten:
Bei korrekten Eingabedaten geben Sie die Elemente der Matrix in der selben
Reihenfolge wie bei den Eingabedaten aus, wobei Sie diese als gekürzte
Bruchzahlen ausgeben sollen.
Trennen Sie Zähler und Nenner durch einen Bruchstrich ("/") und schreiben Sie
ein eventuelles negatives Vorzeichen vor den Zähler. Die Zahl 0 soll nur als
"0" ausgegeben werden; alle anderen ganzen Zahlen werden als "z/1" (wobei z
klarerweise für die entsprechende Zahl steht) ausgegeben.
Trennen Sie die Elemente durch Leerzeichen und geben Sie nach jeder Zeile der
Matrix einen Zeilenvorschub aus.
Fehlerbehandlung:
Sämtliche Eingabedatensätze sind immer vollständig einzulesen. Falls aber die Dimensionseingabe bereits falsch war, so soll nach einer Fehlermeldung abgebrochen werden.
Generell wird bei fehlerhaften Eingabedatensätze nur eine einzige Fehlermeldung erzeugt, weitere Berechnungen werden nicht mehr durchgeführt.
Enthält der Eingabedatensatz einen ungültigen Datentyp, so soll einmal das Zeichen "?", gefolgt von einem Zeilenvorschub, ausgegeben werden.
Waren die Datentypen bei allen Eingaben richtig, die
eingegebenen Daten dann aber inhaltlich nicht korrekt (z.B. Dimension außerhalb des erlaubten Bereiches), so soll Ihr Programm "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.
Beispiele:
Eingabedaten
|
-1
3
1 2 0
0 1 2
2 0 2
|
Ausgabedaten
|
FALSCHE EINGABE
1/5 -2/5 2/5
2/5 1/5 -1/5
-1/5 2/5 1/10
|
Testen:
Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und
müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie
bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung
können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei
erzeugen:
java Gauss < Gauss.i1 > Gauss.out1
Das erzeugte File Gauss.out1 können Sie dann mit dem mitgelieferten Outputfile Gauss.o1 vergleichen.