Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Gauß-Algorithmus/Musterloesung: Unterschied zwischen den Versionen

(Die Seite wurde neu angelegt: „==Beispiel-Lösung== ===Ausgabe der Zwischenschritte sind möglich=== <code> * @author Sebastian Peuser, c-line@mailbox.tu-berlin.de: public class G…“)
 
K (fix alignment)
 
Zeile 4: Zeile 4:
 
===Ausgabe der Zwischenschritte sind möglich===
 
===Ausgabe der Zwischenschritte sind möglich===
  
<code>
+
<pre>
/*
+
/*
  * @author Sebastian Peuser, c-line@mailbox.tu-berlin.de
+
* @author Sebastian Peuser <c-line AT mailbox.tu-berlin DOT de>
  */
+
*/
public class Gauss{
+
public class Gauss {
   
+
public static void main(String[] args) {
    public static void main(String[] args){
+
double[][] matrix = { { 1, 1, 1 }, { 43, 0, 31 }, { 4, 0, 7 } };
       
+
double[] vector = { 2, 4, 8 };
        double[][] matrix = {{1,1,1},{43,0,31},{4,0,7}};
+
 
        double [] vector = {2,4,8};
+
/*
       
+
* "true" oder "false" kann als dritter Parameter uebergeben werden.
        /* "true" oder "false" kann als dritter Parameter uebergeben werden.
+
* "true" -> Zwischenschritte werden auf der Konsole ausgegeben "false"
        * "true" -> Zwischenschritte werden auf der Konsole ausgegeben
+
* -> nichts wird ausgegeben
        * "false" -> nichts wird ausgegeben
+
*/
        */
+
printVector(getSolution(matrix, vector, false));
        printVector(getSolution(matrix,vector,false));
+
}
    }
+
 
+
/*
    /*
+
* Gauss-Jordan-Algorithmus nur fuer eindeutige Gleichungssysteme geeignet
    * Gauss-Jordan-Algorithmus nur fuer eindeutige Gleichungssysteme geeignet (andernfalls wird NULL zurueckgegeben)
+
* (andernfalls wird NULL zurueckgegeben) matrix[row][column]
    * matrix[row][column]
+
*/
    */
+
public static double[] getSolution(double[][] matrix, double[] vector, boolean printSteps) {
    public static double[] getSolution(double[][] matrix, double[] vector, boolean printSteps){
+
// Das Gleichungssystem hat keine eindeutige Loesung!
       
+
if (matrix.length < matrix[0].length) {
        //Das Gleichungssystem hat keine eindeutige Loesung!
+
System.out.println("Gleichungssystem nicht eindeutig loesbar!");
        if(matrix.length<matrix[0].length){
+
return null;
           
+
}
            System.out.println("Gleichungssystem nicht eindeutig loesbar!");
+
 
            return null;
+
// Merken der Spalte, welche eine Zahl ungleich null besitzt
        }
+
int tmpColumn = -1;
       
+
 
        //Merken der Spalte, welche eine Zahl ungleich null besitzt
+
// Alle Zeilen durchgehen: Ziel der for-Schleife -> Matrix in
        int tmpColumn = -1;
+
// Zeilenstufenform bringen!
       
+
// -> Alle Zahlen unterhalb der Diagonale sind null
        //Alle Zeilen durchgehen: Ziel der for-Schleife -> Matrix in Zeilenstufenform bringen!
+
for (int line = 0; line < matrix.length; line++) {
        //-> Alle Zahlen unterhalb der Diagonale sind null
+
tmpColumn = -1;
        for(int line=0;line<matrix.length;line++){
+
 
           
+
// Umformungsschritt 1: Finden einer Spalte mit einem Wert ungleich
            tmpColumn = -1;
+
// null
           
+
for (int column = 0; column < matrix[line].length; column++) {
            //Umformungsschritt 1: Finden einer Spalte mit einem Wert ungleich null
+
for (int row = line; row < matrix.length; row++) {
            for(int column=0;column<matrix[line].length;column++){
+
if (matrix[row][column] != 0) {
           
+
tmpColumn = column;
                for(int row=line;row<matrix.length;row++){
+
break;
               
+
}
                    if(matrix[row][column]!=0){
+
}
                        tmpColumn = column;
+
 
                        break;
+
// Abbruch, zahl ungleich null wurde gefunden
                    }
+
if (tmpColumn != -1) {
                }
+
break;
               
+
}
                //Abbruch, zahl ungleich null wurde gefunden
+
}
                if(tmpColumn!=-1){
+
 
                    break;
+
// NullZeile(n) entdeckt!
                }
+
if (tmpColumn == -1) {
            }
+
for (int row = line; row < matrix.length; row++) {
       
+
// Gleichungssystem hat keine Loesung!
            //NullZeile(n) entdeckt!
+
if (vector[line] != 0) {
            if(tmpColumn==-1){
+
// Wenn die Zwischenschritte ausgegeben werden sollen
               
+
if (printSteps) {
                for(int row=line;row<matrix.length;row++){
+
printStep(matrix, vector);
                   
+
}
                    //Gleichungssystem hat keine Loesung!
+
 
                    if(vector[line]!= 0){
+
System.out.println("Gleichungssystem besitzt keine Loesung!");
                       
+
return null;
                        //Wenn die Zwischenschritte ausgegeben werden sollen
+
}
                        if(printSteps){
+
}
                            printStep(matrix,vector);
+
// Nullzeile(n) vorhanden -> Ist das System noch eindeutig
                        }
+
// loesbar?
                       
+
if (matrix[0].length - 1 >= line) {
                        System.out.println("Gleichungssystem besitzt keine Loesung!");
+
// Wenn die Zwischenschritte ausgegeben werden sollen
                        return null;
+
if (printSteps) {
                    }
+
printStep(matrix, vector);
                }
+
}
                //Nullzeile(n) vorhanden -> Ist das System noch eindeutig loesbar?
+
 
                if(matrix[0].length-1>=line){
+
// System nicht eindeutig loesbar.
                   
+
System.out.println("Gleichungssystem nicht eindeutig loesbar!");
                    //Wenn die Zwischenschritte ausgegeben werden sollen
+
return null;
                    if(printSteps){
+
}
                        printStep(matrix,vector);
+
break;
                    }
+
}
                   
+
 
                    //System nicht eindeutig loesbar.
+
// Umformungsschritt 2: Die Zahl matrix[line][tmpColumn] soll
                    System.out.println("Gleichungssystem nicht eindeutig loesbar!");
+
// UNgleich null sein
                    return null;
+
if (matrix[line][tmpColumn] == 0) {
                }
+
for (int row = line + 1; row < matrix.length; row++) {
                break;
+
if (matrix[row][tmpColumn] != 0) {
            }
+
// Wenn die Zwischenschritte ausgegeben werden sollen
           
+
if (printSteps) {
            //Umformungsschritt 2: Die Zahl matrix[line][tmpColumn] soll UNgleich null sein
+
printStep(matrix, vector);
            if(matrix[line][tmpColumn]==0){
+
System.out.println("Zeile " + (line + 1) + " wird mit Zeile " + (row + 1) + " getauscht");
           
+
}
                for(int row=line+1;row<matrix.length;row++){
+
 
               
+
// Vertauschen von Zeilen -> matrix[line][tmpColumn]
                    if(matrix[row][tmpColumn]!=0){
+
// wird dann ungleich null
                       
+
swapTwoLines(line, row, matrix, vector);
                        //Wenn die Zwischenschritte ausgegeben werden sollen
+
break;
                        if(printSteps){
+
}
                            printStep(matrix,vector);
+
}
                            System.out.println("Zeile "+(line+1)+" wird mit Zeile "+(row+1)+" getauscht");
+
}
                        }
+
 
                       
+
// Umformungsschritt 3: matrix[line][tmpColumn] soll gleich 1 sein.
                        //Vertauschen von Zeilen -> matrix[line][tmpColumn] wird dann ungleich null
+
if (matrix[line][tmpColumn] != 0) {
                        swapTwoLines(line,row,matrix,vector);
+
// Wenn die Zwischenschritte ausgegeben werden sollen
                        break;
+
if (printSteps) {
                    }
+
printStep(matrix, vector);
                }
+
System.out.println("Zeile " + (line + 1) + " wird durch " + matrix[line][tmpColumn] + " geteilt");
            }
+
}
       
+
 
            //Umformungsschritt 3: matrix[line][tmpColumn] soll gleich 1 sein.
+
// Division der Zeile mit matrix[line][tmpColumn]
            if(matrix[line][tmpColumn]!=0){
+
divideLine(line, matrix[line][tmpColumn], matrix, vector);
               
+
}
                //Wenn die Zwischenschritte ausgegeben werden sollen
+
 
                if(printSteps){
+
// Wenn die Zwischenschritte ausgegeben werden sollen
                    printStep(matrix,vector);
+
if (printSteps) {
                    System.out.println("Zeile "+(line+1)+" wird durch "+matrix[line][tmpColumn]+" geteilt");
+
printStep(matrix, vector);
                }
+
}
               
+
 
                //Division der Zeile mit matrix[line][tmpColumn]
+
// Umformungsschritt 4: Alle Zahlen unter matrix[line][tmpColumn]
                divideLine(line,matrix[line][tmpColumn],matrix,vector);
+
// sollen null sein.
            }
+
for (int row = line + 1; row < matrix.length; row++) {
           
+
// Wenn die Zwischenschritte ausgegeben werden sollen
            //Wenn die Zwischenschritte ausgegeben werden sollen
+
if (printSteps) {
            if(printSteps){
+
System.out.println("Zu Zeile " + (row + 1) + " wird subtrahiert: " + matrix[row][tmpColumn] + " * Zeile " + (line + 1));
                printStep(matrix,vector);
+
}
            }
+
 
           
+
// Subtraktion damit unter der Zahl im Umformungsschritt 3 nur
            //Umformungsschritt 4: Alle Zahlen unter matrix[line][tmpColumn] sollen null sein.
+
// nullen stehen
            for(int row=line+1;row<matrix.length;row++){
+
removeRowLeadingNumber(matrix[row][tmpColumn], line, row, matrix, vector);
               
+
}
                //Wenn die Zwischenschritte ausgegeben werden sollen
+
}
                if(printSteps){
+
 
                    System.out.println("Zu Zeile "+(row+1)+" wird subtrahiert: "+matrix[row][tmpColumn]+" * Zeile "+(line+1));
+
// Umformungsschritt 6: Matrix in Normalform bringen (Zahlen oberhalb
                }
+
// der Diagonale werden ebenfalls zu null)
               
+
for (int column = matrix[0].length - 1; column > 0; column--) {
                //Subtraktion damit unter der Zahl im Umformungsschritt 3 nur nullen stehen
+
// Wenn die Zwischenschritte ausgegeben werden sollen
                removeRowLeadingNumber(matrix[row][tmpColumn],line,row,matrix,vector);
+
if (printSteps) {
            }
+
printStep(matrix, vector);
        }
+
}
       
+
 
        //Umformungsschritt 6: Matrix in Normalform bringen (Zahlen oberhalb der Diagonale werden ebenfalls zu null)
+
// Alle Werte oberhalb von "column" werden zu null
        for(int column=matrix[0].length-1;column>0;column--){
+
for (int row = column; row > 0; row--) {
           
+
// Wenn die Zwischenschritte ausgegeben werden sollen
            //Wenn die Zwischenschritte ausgegeben werden sollen
+
if (printSteps) {
            if(printSteps){
+
System.out.println("Zu Zeile " + (row) + " wird subtrahiert: " + matrix[row - 1][column] + " * Zeile " + (column + 1));
                printStep(matrix,vector);
+
}
            }
+
 
           
+
// Dazu wird Subtraktion angewandt
            //Alle Werte oberhalb von "column" werden zu null
+
removeRowLeadingNumber(matrix[row - 1][column], column, row - 1, matrix, vector);
            for(int row=column;row>0;row--){
+
}
               
+
}
                //Wenn die Zwischenschritte ausgegeben werden sollen
+
 
                if(printSteps){
+
// Wenn die Zwischenschritte ausgegeben werden sollen
                    System.out.println("Zu Zeile "+(row)+" wird subtrahiert: "+matrix[row-1][column]+" * Zeile "+(column+1));
+
if (printSteps) {
                }
+
printStep(matrix, vector);
               
+
}
                //Dazu wird Subtraktion angewandt
+
 
                removeRowLeadingNumber(matrix[row-1][column],column,row-1,matrix,vector);
+
// Unser ehemaliger Loesungsvektor ist jetzt zu unserem Zielvektor
            }
+
// geworden :)
        }
+
return vector;
       
+
}
        //Wenn die Zwischenschritte ausgegeben werden sollen
+
 
        if(printSteps){
+
/*
            printStep(matrix,vector);
+
* Hier werden einfach zwei Zeilen vertrauscht
        }
+
*/
       
+
private static void swapTwoLines(int rowOne, int rowTwo, double[][] matrix, double[] vector) {
        //Unser ehemaliger Loesungsvektor ist jetzt zu unserem Zielvektor geworden :)
+
double[] tmpLine;
        return vector;
+
double tmpVar;
    }
+
 
   
+
tmpLine = matrix[rowOne];
    /*
+
tmpVar = vector[rowOne];
    * Hier werden einfach zwei Zeilen vertrauscht
+
 
    */
+
matrix[rowOne] = matrix[rowTwo];
    private static void swapTwoLines(int rowOne, int rowTwo, double[][] matrix, double[] vector){
+
vector[rowOne] = vector[rowTwo];
       
+
 
        double[] tmpLine;
+
matrix[rowTwo] = tmpLine;
        double tmpVar;
+
vector[rowTwo] = tmpVar;
       
+
}
        tmpLine = matrix[rowOne];
+
 
        tmpVar = vector[rowOne];
+
/*
       
+
* eine Zeile wird durch "div" geteilt. "div" darf nicht null sein
        matrix[rowOne] = matrix[rowTwo];
+
*/
        vector[rowOne] = vector[rowTwo];
+
private static void divideLine(int row, double div, double[][] matrix, double[] vector) {
       
+
for (int column = 0; column < matrix[row].length; column++) {
        matrix[rowTwo] = tmpLine;
+
matrix[row][column] = matrix[row][column] / div;
        vector[rowTwo] = tmpVar;
+
}
    }
+
vector[row] = vector[row] / div;
   
+
}
    /*
+
 
    * eine Zeile wird durch "div" geteilt. "div" darf nicht null sein
+
/*
    */
+
* Eine Zeile (row) wird mit einem entsprechendem vielfachen (factor) von
    private static void divideLine(int row, double div, double[][] matrix, double[] vector){
+
* einer anderen Zeile (rowRoot) subtrahiert.
       
+
*/
        for(int column=0;column<matrix[row].length;column++){
+
private static void removeRowLeadingNumber(double factor, int rowRoot, int row, double[][] matrix, double[] vector) {
           
+
for (int column = 0; column < matrix[row].length; column++) {
            matrix[row][column] = matrix[row][column]/div;
+
matrix[row][column] = matrix[row][column] - factor * matrix[rowRoot][column];
        }
+
}
       
+
vector[row] = vector[row] - factor * vector[rowRoot];
        vector[row] = vector[row]/div;
+
}
    }
+
 
   
+
/*
    /*
+
* Ein Vector wird auf der Konsole ausgegeben (transponiert)
    * Eine Zeile (row) wird mit einem entsprechendem vielfachen (factor) von einer anderen Zeile (rowRoot) subtrahiert.
+
*/
    */
+
public static void printVector(double[] vector) {
    private static void removeRowLeadingNumber(double factor, int rowRoot, int row, double[][] matrix, double[] vector){
+
if (vector == null) {
       
+
return;
        for(int column=0;column<matrix[row].length;column++){
+
}
           
+
System.out.println();
            matrix[row][column] = matrix[row][column]-factor*matrix[rowRoot][column];
+
System.out.print("Loesungsvektor ist: (");
        }
+
for (int i = 0; i < vector.length; i++) {
       
+
if (i != 0) {
        vector[row] = vector[row]-factor*vector[rowRoot];
+
System.out.print(",");
    }
+
}
   
+
System.out.print(vector[i]);
    /*
+
}
    * Ein Vector wird auf der Konsole ausgegeben (transponiert)
+
System.out.println(")^T");
    */
+
}
    public static void printVector(double [] vector){
+
 
       
+
/*
        if(vector == null){
+
* Eine Matrix wird auf der Konsole ausgegeben matrix[row][column]
            return;
+
*/
        }
+
public static void printMatrix(double[][] matrix) {
       
+
if (matrix == null) {
        System.out.println();
+
return;
        System.out.print("Loesungsvektor ist: (");
+
}
       
+
for (int row = 0; row < matrix.length; row++) {
        for(int i=0;i<vector.length;i++){
+
System.out.print("(");
           
+
for (int column = 0; column < matrix[row].length; column++) {
            if(i != 0){
+
if (column != 0) {
                System.out.print(",");
+
System.out.print(",");
            }
+
}
            System.out.print(vector[i]);
+
System.out.print(matrix[row][column]);
        }
+
}
       
+
System.out.println(")");
        System.out.println(")^T");
+
}
    }
+
}
   
+
 
    /*
+
/*
    * Eine Matrix wird auf der Konsole ausgegeben
+
* Diese Methode zeigt die Zwischenschritte der Berechnung auf der Konsole
    * matrix[row][column]
+
* an. Fuer die Aufgabe nicht weiter relevant (unbekannte Konzepte werden
    */
+
* verwendet!)
    public static void printMatrix(double[][] matrix){
+
*/
       
+
private static void printStep(double[][] matrix, double[] vector) {
        if(matrix == null){
+
System.out.println();
            return;
+
 
        }
+
// Werte werden fuer die Ausgabe auf ein bestimmtes Format gebracht
       
+
// -> Damit die Ausgabe auch immer schick aussieht
        for(int row=0; row<matrix.length;row++){
+
java.text.DecimalFormat df = new java.text.DecimalFormat("0.00");
           
+
for (int row = 0; row < matrix.length; row++) {
            System.out.print("(");
+
for (int column = 0; column < matrix[row].length; column++) {
           
+
if (matrix[row][column] >= 0) {
            for(int column=0;column<matrix[row].length;column++){
+
System.out.print("+");
               
+
}
                if(column != 0){
+
System.out.print(df.format(matrix[row][column]) + "    ");
                    System.out.print(",");
+
}
                }
+
System.out.print("|    ");
                System.out.print(matrix[row][column]);
+
if (vector[row] >= 0) {
            }
+
System.out.print("+");
           
+
}
            System.out.println(")");
+
System.out.println(df.format(vector[row]));
        }
+
}
    }
+
}
   
+
}
    /*
+
</pre>
    * Diese Methode zeigt die Zwischenschritte der Berechnung auf der Konsole an.
 
    * Fuer die Aufgabe nicht weiter relevant (unbekannte Konzepte werden verwendet!)
 
    */
 
    private static void printStep(double[][] matrix, double[] vector){
 
       
 
        System.out.println();
 
       
 
        //Werte werden fuer die Ausgabe auf ein bestimmtes Format gebracht
 
        // -> Damit die Ausgabe auch immer schick aussieht
 
        java.text.DecimalFormat df = new java.text.DecimalFormat("0.00");
 
       
 
        for(int row=0;row<matrix.length;row++){
 
           
 
            for(int column=0;column<matrix[row].length;column++){
 
               
 
                if(matrix[row][column]>=0){
 
                   
 
                    System.out.print("+");
 
                }
 
               
 
                System.out.print(df.format(matrix[row][column])+"    ");
 
            }
 
           
 
            System.out.print("|    ");
 
           
 
            if(vector[row]>=0){
 
               
 
                System.out.print("+");
 
            }
 
           
 
            System.out.println(df.format(vector[row]));
 
        }
 
    }
 
}
 
</code>
 

Aktuelle Version vom 4. März 2013, 18:39 Uhr

Beispiel-Lösung

Ausgabe der Zwischenschritte sind möglich

/*
 * @author Sebastian Peuser <c-line AT mailbox.tu-berlin DOT de>
 */
public class Gauss {
	public static void main(String[] args) {
		double[][] matrix = { { 1, 1, 1 }, { 43, 0, 31 }, { 4, 0, 7 } };
		double[] vector = { 2, 4, 8 };

		/*
		 * "true" oder "false" kann als dritter Parameter uebergeben werden.
		 * "true" -> Zwischenschritte werden auf der Konsole ausgegeben "false"
		 * -> nichts wird ausgegeben
		 */
		printVector(getSolution(matrix, vector, false));
	}

	/*
	 * Gauss-Jordan-Algorithmus nur fuer eindeutige Gleichungssysteme geeignet
	 * (andernfalls wird NULL zurueckgegeben) matrix[row][column]
	 */
	public static double[] getSolution(double[][] matrix, double[] vector, boolean printSteps) {
		// Das Gleichungssystem hat keine eindeutige Loesung!
		if (matrix.length < matrix[0].length) {
			System.out.println("Gleichungssystem nicht eindeutig loesbar!");
			return null;
		}

		// Merken der Spalte, welche eine Zahl ungleich null besitzt
		int tmpColumn = -1;

		// Alle Zeilen durchgehen: Ziel der for-Schleife -> Matrix in
		// Zeilenstufenform bringen!
		// -> Alle Zahlen unterhalb der Diagonale sind null
		for (int line = 0; line < matrix.length; line++) {
			tmpColumn = -1;

			// Umformungsschritt 1: Finden einer Spalte mit einem Wert ungleich
			// null
			for (int column = 0; column < matrix[line].length; column++) {
				for (int row = line; row < matrix.length; row++) {
					if (matrix[row][column] != 0) {
						tmpColumn = column;
						break;
					}
				}

				// Abbruch, zahl ungleich null wurde gefunden
				if (tmpColumn != -1) {
					break;
				}
			}

			// NullZeile(n) entdeckt!
			if (tmpColumn == -1) {
				for (int row = line; row < matrix.length; row++) {
					// Gleichungssystem hat keine Loesung!
					if (vector[line] != 0) {
						// Wenn die Zwischenschritte ausgegeben werden sollen
						if (printSteps) {
							printStep(matrix, vector);
						}

						System.out.println("Gleichungssystem besitzt keine Loesung!");
						return null;
					}
				}
				// Nullzeile(n) vorhanden -> Ist das System noch eindeutig
				// loesbar?
				if (matrix[0].length - 1 >= line) {
					// Wenn die Zwischenschritte ausgegeben werden sollen
					if (printSteps) {
						printStep(matrix, vector);
					}

					// System nicht eindeutig loesbar.
					System.out.println("Gleichungssystem nicht eindeutig loesbar!");
					return null;
				}
				break;
			}

			// Umformungsschritt 2: Die Zahl matrix[line][tmpColumn] soll
			// UNgleich null sein
			if (matrix[line][tmpColumn] == 0) {
				for (int row = line + 1; row < matrix.length; row++) {
					if (matrix[row][tmpColumn] != 0) {
						// Wenn die Zwischenschritte ausgegeben werden sollen
						if (printSteps) {
							printStep(matrix, vector);
							System.out.println("Zeile " + (line + 1) + " wird mit Zeile " + (row + 1) + " getauscht");
						}

						// Vertauschen von Zeilen -> matrix[line][tmpColumn]
						// wird dann ungleich null
						swapTwoLines(line, row, matrix, vector);
						break;
					}
				}
			}

			// Umformungsschritt 3: matrix[line][tmpColumn] soll gleich 1 sein.
			if (matrix[line][tmpColumn] != 0) {
				// Wenn die Zwischenschritte ausgegeben werden sollen
				if (printSteps) {
					printStep(matrix, vector);
					System.out.println("Zeile " + (line + 1) + " wird durch " + matrix[line][tmpColumn] + " geteilt");
				}

				// Division der Zeile mit matrix[line][tmpColumn]
				divideLine(line, matrix[line][tmpColumn], matrix, vector);
			}

			// Wenn die Zwischenschritte ausgegeben werden sollen
			if (printSteps) {
				printStep(matrix, vector);
			}

			// Umformungsschritt 4: Alle Zahlen unter matrix[line][tmpColumn]
			// sollen null sein.
			for (int row = line + 1; row < matrix.length; row++) {
				// Wenn die Zwischenschritte ausgegeben werden sollen
				if (printSteps) {
					System.out.println("Zu Zeile " + (row + 1) + " wird subtrahiert: " + matrix[row][tmpColumn] + " * Zeile " + (line + 1));
				}

				// Subtraktion damit unter der Zahl im Umformungsschritt 3 nur
				// nullen stehen
				removeRowLeadingNumber(matrix[row][tmpColumn], line, row, matrix, vector);
			}
		}

		// Umformungsschritt 6: Matrix in Normalform bringen (Zahlen oberhalb
		// der Diagonale werden ebenfalls zu null)
		for (int column = matrix[0].length - 1; column > 0; column--) {
			// Wenn die Zwischenschritte ausgegeben werden sollen
			if (printSteps) {
				printStep(matrix, vector);
			}

			// Alle Werte oberhalb von "column" werden zu null
			for (int row = column; row > 0; row--) {
				// Wenn die Zwischenschritte ausgegeben werden sollen
				if (printSteps) {
					System.out.println("Zu Zeile " + (row) + " wird subtrahiert: " + matrix[row - 1][column] + " * Zeile " + (column + 1));
				}

				// Dazu wird Subtraktion angewandt
				removeRowLeadingNumber(matrix[row - 1][column], column, row - 1, matrix, vector);
			}
		}

		// Wenn die Zwischenschritte ausgegeben werden sollen
		if (printSteps) {
			printStep(matrix, vector);
		}

		// Unser ehemaliger Loesungsvektor ist jetzt zu unserem Zielvektor
		// geworden :)
		return vector;
	}

	/*
	 * Hier werden einfach zwei Zeilen vertrauscht
	 */
	private static void swapTwoLines(int rowOne, int rowTwo, double[][] matrix, double[] vector) {
		double[] tmpLine;
		double tmpVar;

		tmpLine = matrix[rowOne];
		tmpVar = vector[rowOne];

		matrix[rowOne] = matrix[rowTwo];
		vector[rowOne] = vector[rowTwo];

		matrix[rowTwo] = tmpLine;
		vector[rowTwo] = tmpVar;
	}

	/*
	 * eine Zeile wird durch "div" geteilt. "div" darf nicht null sein
	 */
	private static void divideLine(int row, double div, double[][] matrix, double[] vector) {
		for (int column = 0; column < matrix[row].length; column++) {
			matrix[row][column] = matrix[row][column] / div;
		}
		vector[row] = vector[row] / div;
	}

	/*
	 * Eine Zeile (row) wird mit einem entsprechendem vielfachen (factor) von
	 * einer anderen Zeile (rowRoot) subtrahiert.
	 */
	private static void removeRowLeadingNumber(double factor, int rowRoot, int row, double[][] matrix, double[] vector) {
		for (int column = 0; column < matrix[row].length; column++) {
			matrix[row][column] = matrix[row][column] - factor * matrix[rowRoot][column];
		}
		vector[row] = vector[row] - factor * vector[rowRoot];
	}

	/*
	 * Ein Vector wird auf der Konsole ausgegeben (transponiert)
	 */
	public static void printVector(double[] vector) {
		if (vector == null) {
			return;
		}
		System.out.println();
		System.out.print("Loesungsvektor ist: (");
		for (int i = 0; i < vector.length; i++) {
			if (i != 0) {
				System.out.print(",");
			}
			System.out.print(vector[i]);
		}
		System.out.println(")^T");
	}

	/*
	 * Eine Matrix wird auf der Konsole ausgegeben matrix[row][column]
	 */
	public static void printMatrix(double[][] matrix) {
		if (matrix == null) {
			return;
		}
		for (int row = 0; row < matrix.length; row++) {
			System.out.print("(");
			for (int column = 0; column < matrix[row].length; column++) {
				if (column != 0) {
					System.out.print(",");
				}
				System.out.print(matrix[row][column]);
			}
			System.out.println(")");
		}
	}

	/*
	 * Diese Methode zeigt die Zwischenschritte der Berechnung auf der Konsole
	 * an. Fuer die Aufgabe nicht weiter relevant (unbekannte Konzepte werden
	 * verwendet!)
	 */
	private static void printStep(double[][] matrix, double[] vector) {
		System.out.println();

		// Werte werden fuer die Ausgabe auf ein bestimmtes Format gebracht
		// -> Damit die Ausgabe auch immer schick aussieht
		java.text.DecimalFormat df = new java.text.DecimalFormat("0.00");
		for (int row = 0; row < matrix.length; row++) {
			for (int column = 0; column < matrix[row].length; column++) {
				if (matrix[row][column] >= 0) {
					System.out.print("+");
				}
				System.out.print(df.format(matrix[row][column]) + "    ");
			}
			System.out.print("|    ");
			if (vector[row] >= 0) {
				System.out.print("+");
			}
			System.out.println(df.format(vector[row]));
		}
	}
}