Lineares Gleichungssystem nach Gauß-Jordan lösen?

-horn-

Bekanntes Mitglied
moien,

ich versuche gerade einen Aglorithmus für das Gauß-Jordan Verfahren zur Lösung von linearen Gleichungssystemen zu bauen. Zur Kontrolle nutze ich dann Lösen linearer Gleichungssysteme
Aber das Ganze will irgendwie nicht und ich wollte fragen, ob Ihr vielleicht was fertiges dazu habt? Google spuckt mir dazu leider keine Library aus, die ich nutzen kann oder ich nachvollziehen kann.

Würde mich freuen,

Andreas
 
moien,

wie dynamisch möchtest du es denn machen? Du hast da auf jedenfall eine Aufgabe vor dir -.-
ich brauche das erstmal für eine 3x4 matrix weil ich das für eine positionsbestimmung brauche, aber ich würde es gerne so allgemein haben wollen, dass das auch für größere matrizen geht. aber sollte auf jedenfall für die 3x4er gehen. und sie sollte auch prüfen, wenn mal eine zeile der matrix komplett null enthält, denn dann lässt sich der spass ja nicht lösen, oder auf eine 2x3 matrix reduzieren.

Da hatte mal jemand was gebastelt, was ich dann nach JCuda portiert hatte: jcuda.org - Samples - der verwendet AFAIR Gauß-Jordan ... da ist auch 'n PDF verlinkt, vielleicht hilft's :bahnhof:
gucke ich mir gleich mal an. cuda ist ne coole sache, kann ich aber auf meinem laptop "noch" nicht nutzen. erst der neue wird es können 🙂.

Andreas
 
moien,

ich habe mir was für ein 3x4 system ausgedacht, was bis jetzt immer richtig lag, aber wenn ich es auf 4x5 und mehr erweitere, dann stimmt mein gedöns nicht mehr.
ich würde also gerne wissen wollen, wie zb Lösen linearer Gleichungssysteme das macht? hab mich versucht durch das JS script zu hangeln, aber ich fand das mehr kryptisch als hilfreich.

ich werd ja sicherlich nicht der aller erste sein, der das braucht 🙂.

Andreas
 
Natürlich nicht, das wird sehr oft benötigt, aber wenn man es "echt" braucht, sucht man sich eine Lib, die das gut kann (und nicht notwendigerweise eine, bei der man gut nachvollziehen kann, wie sie programmiert ist). Jedenfalls sollte der Algorithmus an sich für alle Matrixgrößen gleich sein - vorausgesetzt, das GLS ist nicht unter- oder überbestimmt. Poste am besten mal den aktuellen Code, oder versuch' die Frage zu präzisieren.
 
moien,

was noch fehlt ist eine sortierung, damit auch immer auf der diagonale eine zahl ungleich 0 steht.
kann mir da jemand fürs vorsrotieren einen tipp geben?

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package positioning;

/**
 *
 * @author Andreas
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        //http://mathrefresher.blogspot.com/2007/04/gauss-jordan-elimination.html
        //http://www.arndt-bruenner.de/mathe/scripts/gaussjordan.htm
        double[][] mat = {{1, 2, 3, 0, 15}, {0,2, -3, 0, 14 },{ 2, 0, 3, 5, 0}, {0,0, 0, 1, 14 }};


        mat = lineareq.gaussjordan(mat);

        for(int i=0; i<mat.length; i++){
            for(int j=0; j<mat[i].length; j++){
                System.out.print(mat[i][j]+";");
            }
            System.out.println();
        }

    }

}

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package positioning;

/**
 *
 * @author Andreas
 */
public class lineareq {
    public static double[][] gaussjordan(double[][] mat){
        //http://people.richland.edu/james/lecture/m116/matrices/pivot.html

        double factor1 =0;
        double factor2 =0;


        for(int i=0; i<mat.length; i++){
            
            factor1 = mat[i][i];
            if(factor1!=0){
                for(int j=0; j<mat.length; j++){
                    factor2 = mat[j][i];
                    if(i!=j && factor2!=0){
                        System.out.println(factor1+";"+factor2);
                        for(int k=0; k<mat.length+1; k++){
                            mat[j][k] = factor1*mat[j][k]-factor2*mat[i][k];
                        }
                    }
                }
            }
        }

        for(int i=0; i<mat.length; i++){
            factor1=mat[i][i];
            if(mat[i][i]!=0){
                for(int j=0; j<mat.length+1; j++){
                    if(mat[i][j]!=0){
                        mat[i][j]=mat[i][j]/factor1;
                    }
                }
            }
        }

        return mat;
    }

}
 
moien,

schon klar, aber ich würd es gerne selber können.
dinge nehmen ist immer schön, aber ich würde es gerne auch selber umsetzen. vorallem, weil ich gerade nur mit java rumspiele und das später auf nem mikrocontroler packen will. dafür muss es ja java unabhängig sein.

grüße, Andreas
 
Mein Versuch: Determinantenformel.
Zusammenfassung:
A*x=y <=> x=A^-1*Y
Matrix A:
1. Determinante nach Laplace’schem Entwicklungssatz Det()
2. Kofaktormatrix C
3. Kofaktormatrix transponieren C‘
4. Inverse mit A^-1=C‘*1/Det()
5. Inverse an Lösungsvektor y linksseitig anmultiplizieren.
 
ich würde also gerne wissen wollen, wie zb Lösen linearer Gleichungssysteme das macht? hab mich versucht durch das JS script zu hangeln, aber ich fand das mehr kryptisch als hilfreich.
Du meinst 3x3 nicht 3x4. Gauß Jordan setzt eine quadratische Matrix voraus. In der Darstellung haben wir hier eine 3x4 bzw. 3x5 Matrix. Bei der letzten Spalte handelt es sich aber um den Lösungsvektor.

Mathematisch wird das so gemacht.
Du hast ein quadratisch Matrix A. Und einen Ergebnisvektor b und einen Lösungsvektor x. Wobei die Dimensionen von b und x der Dimension von A entspricht. Was bedeuten soll wenn A 3 Spalten und 3 Zeilen hat haben b und x eine 3 Zeilen und 1 Spalte (Vektoren) .
Daraus ergibt sich folgende Gleichung.
A * x = b
Um diese zu lösen suchst du dann die inverse Matrix von A. Wir nennen sie im Folgenden A'
Wir multiplizieren die Gleichung mit der Inversen Matrix.
A * x = b | *A'
A' * A * x = A' *b


Eine Matrix mit ihrer Inversen Matrix multipliziert ergibt die Einheitsmatrix.
Das ist eine Matrix von derselben Dimension wie A gefüllt mit 0. Außer die Diagonale von links nach rechts besteht aus 1.
Also bei der Dimension 3x3
100
010
001

Wir bezeichnen die Einheitsmatrix im Folgenden mit ID.
So bekommen wir x freigestellt.
ID * x = A' *b -->
x = A' * b.
Das ist der mathematisch Hintergrund, um lineare Gleichungssystem so zu lösen.
Wie berechnet man jetzt die inverse Matrix ?
Dazu musst du zuerst die Determinante von A bestimmen. Wird diese 0 --> Es gibt es keine Lösung.
Zum weiter Rechen brauchst dann die Einheitsmatrix.
Wir setzen vor die Matrix A die Einheitsmatrix ID
A ID

wir formen die Zeilenvektoren mittels Addition, Multiplikation usw. solange um bis wir auf die Form
ID A'
z.B. Dimension 2x2
ab
cd = A

ab 10
cd 01

-->
10 ef
01 gh

ef
gh = A'


https://studyflix.de/mathematik/inverse-matrix-berechnen-2432
Für Dimension 2x2 ist die Inverse leicht zu berechnen.
1708186709650.png
Wenn der Ausdruck ad-bc Null wird, dann gibt es keine Lösung.
Für die Bestimmung der Determinante bis Dimension 3 x 3 kann man die Regel von Sarrus verwenden.
https://de.wikipedia.org/wiki/Regel_von_Sarrus

Für größer Dimensionen benutzt man dann Unterdeterminanten. Ich habe das für einen mathematischen Compiler den ich zu meiner Studienzeit gemacht habe verwendet. Das Ganze wird dann aber eher Komplex.

Aber das ist ein möglicher Weg wie so etwas gemacht wird.
😉
 
Zuletzt bearbeitet:

Zurück
Oben