Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Matrizen invertieren
AXMD - Sa 06.11.04 15:00
Titel: Matrizen invertieren
Hi!
Eine Frage: wir machen in IMAT gerade Matrizenrechnung durch und sind gerade bei "Matrizeninvertierung". Also M^-1 unter der Bedingung, dass die Matrix 1. nicht singulär und 2. quadratisch ist.
Jetzt würde ich mir zur Kontrolle meiner HÜ gerne ein Programm schreiben, das eine Matrix invertiert - mit dem kleinen Zusatz, dass es oben angegebene Bedingungen berücksichtigt. Die zweite ist sehr einfach zu lösen, doch die erste bereitet mir bereits Probleme: 2x2 bzw. 3x3-Matrizen sind zwar einfach zu lösen (Hauptdiagonalprodukt - Nebendiagonalprodukt bzw. (3x3) nach SARRUS); doch was ist mit größeren Matrizen; das Verfahren nach LAPLACE ist zwar für einen Menschen äußerst einfach zu rechnen (nach der Zeile/Spalte mit den meisten Nullen entwickeln), aber wie schaffe ich es, dass ich über Delphi herausfinde, wie ich das mache (bisherige Versuche sind gescheitert, aber wahrscheinlich denke ich einfach zu kompliziert)?
Das eigentliche Invertieren stellt mich ohnehin vor ein noch viel größeres Problem. Wir haben zwei Verfahren gelernt, doch "elementare" Umforumungen zu programmieren,... Wahrscheinlich denk ich wirklich zu kompiliziert; kann mir vielleicht irgendjemand einen Ansatz geben, wie ich diese Probleme löse?
Thx AXMD
AXMD - Sa 06.11.04 15:03
Mist. Noch was vergessen. Ich hab einen Satz ausgelassen (EDIT :x ). Natürlich fehlt der Satz, dass die Determinante Null sein muss, damit die Matrix singulär ist - und das kann man dann nach LAPLACE rechnen...
AXMD
UC-Chewie - Sa 06.11.04 15:18
Die Entwicklung nach einer Reihe oder Spalte lässt sich sehr leicht rekursiv lösen. In einem Pseudocode würde das in etwa so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| type TMatrix = Array of Array of Extended; function det(mat: TMatrix): Extended; var i, n: Integer; reihe: Boolean; mat2: TMatrix; vorzeichen: Integer; begin if High(mat[0]) = 0 then Exit; Result := 0; vorzeichen := 1; ErmittleEntwicklungsStelle(n, reihe); if reihe then begin for i := 0 to High(mat[0]) do begin mat2 := MatrixEntwickeln(mat, n, i); Result := Result + vorzeichen * det(mat2); vorzeichen := -vorzeichen; end; end else begin for i := 0 to High(mat[0]) do begin mat2 := MatrixEntwickeln(mat, i, n); Result := Result + vorzeichen * det(mat2); vorzeichen := -vorzeichen; end; end; end; |
Du kannst das ja mal als Ansatz nehmen. Ich hab mir das eben nur schnell überlegt, es gibt also keine Garantie auf Korrektheit!
BenBE - Sa 06.11.04 17:19
Du kannst dir für eine Beispiel-Implementation ja mal die Omorphia-Bibliothek angucken.
Dort wird die Inverse über die Adjunkten-Matrix berechnet.
http://cvs.sourceforge.net/viewcvs.py/omorphia/omorphia/maths/OMathGeometry.pas
Das ist bisher aber das einzige, was ich finden konnte, zu dem Thema. Allerdings sind einige Vereinfachungen noch nicht eingebaut, weshalb die MatrixInverse-Funktion etwas langsam ist.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!