Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Die Inverse 4x4 Matrix berechnen


MrGTI - Di 29.05.07 20:20
Titel: Die Inverse 4x4 Matrix berechnen
Ich programmiere z.Z. ein Programm, dass mit Hilfe des Gauß Algorithmus die Inverse einer 4x4 Matrix bestimmen soll.

Bei dem Verfahren wird die Einheitsmatirx von der "rechten" Seite auf die "linke" verschoben.

Bsp:
Das Verfahren an einem Beispiel [http://www.arndt-bruenner.de/mathe/scripts/inversematrix.htm]

Mein Programm bekommt die Einheitsmatrix links raus, jedoch stimmt der rechte Teil nicht (Inverse Matrix).

Vielleicht sieht jemand von euch meinen Fehler und hat die Zeit mir zu antworten. Das wäre sehr nett.


Delphi-Quelltext
1:
2:
3:
4:
var
  Form1: TForm1;
  matrix, pmatrix : Array[1..4,1..8of real;
  art : integer; // real =0 bruch = 1



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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
procedure TForm1.rinverse;
var
  i,j, l, z : integer;
begin
  if check0 then
    begin
      Showmessage('Nicht inversierbar');
      exit;
    end;
  i := 0;
  while (matrix[1,1] = 0or (matrix[2,2] = 0)
        or (matrix[3,3] = 0or (matrix[4,4] = 0do
    begin
      inc(i);
      // Reihen tauschen
      rtauschv(1);  // vertikal tauschen
      rtauschv(2);
      rtauschv(3);
      rtauschv(4);
      rtauschh(1); // horizontal tauschen
      rtauschh(2);
      rtauschh(3);
      rtauschh(4);
      if i = 25 then
        begin
          Showmessage('Fehler bei der Ermittlung der Inversen Matrix');
          exit;
        end;
    end;
  //Verfahren
  for j := 1 to 4 do // j =vertikal
    begin
      if j = 1 then
        continue;
      for i := 1 to 8 do
        begin
          matrix[j,i] := matrix[j,i] * matrix[1,1] - matrix[1,i] * matrix[j,1];
        end;
    end;
  for j := 1 to 4 do // j =vertikal
    begin
      if j = 2 then
        continue;
      for i := 1 to 8 do
        begin
          matrix[j,i] := matrix[j,i] * matrix[2,2] - matrix[2,i] * matrix[j,2];
        end;
    end;
  for j := 1 to 4 do // j =vertikal
    begin
      if j = 3 then
        continue;
      for i := 1 to 8 do
        begin
          matrix[j,i] := matrix[j,i] * matrix[3,3] - matrix[3,i] * matrix[j,3];
        end;
    end;
  for j := 1 to 4 do // j =vertikal
    begin
      if j = 4 then
        continue;
      for i := 1 to 8 do
        begin
          matrix[j,i] := matrix[j,i] * matrix[4,4] - matrix[4,i] * matrix[j,4];
        end;
    end;

  for i := 1 to 4 do
    begin
      for l := 1 to 8 do
        begin
          matrix[i,l] := matrix[i,l] / matrix[i,i];
        end;
    end;
end;


Wonko - Mi 30.05.07 12:22

Hallo,

ich glaube der Fehler liegt darin, dass Du die Matrix veränderst. Zur Verdeutlichung ein kleines Beispiel:

Im zweiten Schritt verwendest Du das Ergebnis vom ersten Schritt; richtig wäre es, den Originalwert (2,1)<>0 zu verwenden!

Grüße.


MrGTI - Mi 30.05.07 15:24

Hi Wonko,

vielen vielen Dank für deine Antwort. Das hat mir extrem geholfen, ich hatte das vollkommen übersehen.

Gruß
MrGTI