Unten kann ein Gleichungssystem mit 3 Unbekannten gelöst werden, indem die Koeffizienten in die Felder eingetragen werden. Die entsprechende 3x4 Matrix wird dann vom JavaScript SolveLinEQ() so bearbeitet, dass in der letzten Spalte die Lösungen des Gleichungssystems stehen. Ein Anwendungsbeispiel findest du unter Anwendung.
Statt durch Klicken auf Lösen kann das Lösen des Gleichungssystems mit Schritt Schrittweise ausgeführt werden, wobei jeder Schritt beschrieben wird.
Der Gauß-Jordan-Algorithmus verwendet lediglich 3 Operationen:
Diese Schritte werden für jede Zeile ausgeführt bis die Diagonalelemente 1 und alle anderen Elemente ausser der letzten Spalte 0 sind:
Die Lösungen stehen in der letzten Spalte.
Es sollen die Koordinaten eines Schnittpunktes einer Geraden mit einer Ebene berechnet werden. Die Gleichungen für die Gerade und die Ebene lauten:
(1) |
|
Geradengleichung | ||||||||||||
(2) |
|
Ebenengleichung | ||||||||||||
wobei' |
|
Für den Schnittpunkt
(3) |
oder
(4) |
Setzen wir also Gleichung (1) gleich (2) und schreiben diese für jede Koordinate einzeln:
(5) |
für i = 1...3 |
Wir stellen die Gleichung (5) so um, dass alle Terme mit den Unbekannten a, b, c auf der linken Seite und alle anderen Terme auf der rechten Seite des Gleichheitszeichens stehen:
(6) | |
(7) | |
(8) |
Dieses lineare Gleichungssystem mit 3 Gleichungen für die 3 Unbekannten a, b, c können wir in Matrixschreibweise notieren:
(9) |
Alle Elemente in der Matrix und im Vektor rechts des Gleichheitszeichens sind bekannte Zahlenwerte. Um das Gleichungssystem mit dem Computer zu lösen, werden alle diese Zahlenwerte wiefolgt in eine 3x4 Matrix eingegeben:
(10) |
Nachdem die Werte im Rechner eingegeben wurden, kann auf Lösen geklickt werden. Die Matrix wird solange umgeformt, bis in der Diagonalen lauter 1 stehen und die restlichen Elemente ausser der letzten Spalte 0 sind. In der letzten Spalte stehen dann die Lösungen für a, b, c.
Das folgende JavaScript löst lineare Gleichungssysteme beliebiger Grösse. Die Koeffizientenmatrix m wird so neu berechnet, dass in der letzten Spalte schliesslich die Lösungen des Gleichungssystems stehen.
function SolveLinEQ( m ) { // solves linear equation of rank d with coefficients in m using Gauss Jordan algorithm // m: array[d][d+1] // returns solution in m[i][d+1] // returns false if no solution found // // usage: // // EQ 1: a * x + b * y = c // EQ 2: e * x + f * y = g // // var m = [ [ a, b, c ], [ e, f, g ] ]; // if ( SolveLinEQ( m ) ) { // x = m[0][2]; // y = m[1][2]; // } else { // no solution // } function findNotZeroRow( r ) { for ( var nzr = r + 1; nzr < d; nzr++ ) { if ( m[nzr][r] != 0 ) return nzr; } return -1; } function swapRows( r1, r2 ) { for ( var c = 0; c <= d; c++ ) { var tmp = m[r1][c]; m[r1][c] = m[r2][c]; m[r2][c] = tmp; } } function normRow( r ) { // require m[r][r] != 0 var a = m[r][r]; if ( a == 1 ) return; m[r][r] = 1; for ( var c = r + 1; c <= d; c++ ) { m[r][c] /= a; } } function zeroCell( zr, zc ) { var a = m[zr][zc]; if ( a == 0 ) return; m[zr][zc] = 0; for ( var c = zc + 1; c <= d; c++ ) { m[zr][c] -= a * m[zc][c]; } } var d = m.length; for ( var r = 0; r < d; r++ ) { if ( m[r][r] == 0 ) { var nzr = findNotZeroRow( r ); if ( nzr == -1 ) return false; swapRows( r, nzr ); } // assert m[r][r] != 0 normRow( r ); for ( var zr = 0; zr < d; zr++ ) { if ( zr != r ) { zeroCell( zr, r ); } } } return true; }
Laut Wikipedia kann obiger Algorithmus stabiler gemacht werden, indem beim Tauschen der Zeilen nicht die erstbeste Zeile verwendet wird, sondern die Zeile mit dem grössten Wert:
Hallo,
vielen Dank für die Darstellung des Algorithmus in Javascript.
Kombiniert mit dem Algorithmus für überbestimmte Gleichungssysteme
www.tm-mathe.de/Themen/html/uberbestimmte_gls_theorie.html
hoffe ich aus ungenauen Messdaten einigermaßen verlässliche bauphysikalische Kenngrößen (z.b. U-Wert) ableiten zu können. Falls Interesse: www.heicreation.de
Viele Grüße
Holger