Autor Beitrag
MrGTI
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 29.05.07 20:20 
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

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.

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


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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 69



BeitragVerfasst: Mi 30.05.07 12:22 
Hallo,

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

    j=2 u. i=1 --> (2,1)=(2,1)*(1,1)-(1,1)*(2,1)=0
    j=2 u. i=2 --> (2,2)=(2,2)*(1,1)-(1,2)*(2,1)

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

Grüße.
MrGTI Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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