Autor Beitrag
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 06.11.04 16:00 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 06.11.04 16: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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Sa 06.11.04 16: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:

ausblenden volle Höhe 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
  //abbrechen, wenn Matrix leer
  if High(mat[0]) = 0 then Exit;
  
  Result := 0;
  vorzeichen := 1;
  ErmittleEntwicklungsStelle(n, reihe); //pass by reference

  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!

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 06.11.04 18:19 
Du kannst dir für eine Beispiel-Implementation ja mal die Omorphia-Bibliothek angucken.

Dort wird die Inverse über die Adjunkten-Matrix berechnet.

cvs.sourceforge.net/...hs/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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.