unit matrix: Berechnung der Inversen falsch?

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
lichtwicht
Beiträge: 10
Registriert: Di 16. Sep 2008, 20:17
OS, Lazarus, FPC: WinXPSP2-32bit (06-2009: SVN: L 0.9.27 FPC 2.2.4)
CPU-Target: AMD 64Bit (single)

unit matrix: Berechnung der Inversen falsch?

Beitrag von lichtwicht »

rtl-unit matrix (fpc 2.2.4 aus laza-svn: Lazarus-0.9.27-20212-fpc-2.2.4-20090526-win32.exe)


betrifft im speziellen die:
Tmatrix3_single.inverse(Tmatrix3_single.determinant);

wenn ich der folgende matrix gebe:
1 2 0
2 3 0
3 4 1

kommt (bei mir) folgendes heraus:
-3 2 1
2 -1 -2
-0 0 1

laut wiki sollte das das Ergebnis sein:
-3 2 0
2 -1 0
1 -2 1


wie man sieht, sind m02 mit m20 und m12 mit m21 vertauscht (allerhöchstwahrscheinlich auch m01 mit m10)...
d.h. die inverse-Routine ist noch transponiert(?)...also mit:
(Tmatrix3_single.inverse(Tmatrix3_single.determinant)).transpose;
komme ich auf das Ergebnis aus wiki...

Fehler? oder Absicht? (falls Absicht, nur so interessehalber, falls es jemand weiß, warum?)
(falls Fehler, ich habe grob gesucht(aber nichts gefunden), würde ich es mir ggf. genauer ansehen...)


gruß lichtwicht


übrigens, das mit minus Null ist Absicht, nehme ich an?
...Null(= 00 00 00 00)...minus Null(= 80 00 00 00)...
A programmer is just a tool which converts coffein into code!

Activating back-to-desktop service...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: unit matrix: Berechnung der Inversen falsch?

Beitrag von mschnell »

Mein Sohn und ich haben vor einiger Zeit 'mal eine Matrix Unit gebaut, die - wie ich glaube - sehr gut funktioniert und auch ganz ordentlich dokumentiert ist.

Funktioniert allerdings nicht mit Objekten, sondern mit dynamischen Arrays.

Wenn Du sie sehen willst, kann ich sie gerne Posten.

-Michael

lichtwicht
Beiträge: 10
Registriert: Di 16. Sep 2008, 20:17
OS, Lazarus, FPC: WinXPSP2-32bit (06-2009: SVN: L 0.9.27 FPC 2.2.4)
CPU-Target: AMD 64Bit (single)

Re: unit matrix: Berechnung der Inversen falsch?

Beitrag von lichtwicht »

du meinst das ?
aber mir ging es ja weniger darum etwas neues einzubinden, sondern ob ICH etwas falsch verstehe(was DURCHAUS möglich ist!) oder ob die Unit(wie ich meine) einen Fehler macht...
mschnell hat geschrieben:[...]Funktioniert allerdings nicht mit Objekten, sondern mit dynamischen Arrays.[...]

und schon muß ich mich wieder als "unwissend" outen!
ich wüßte da jetzt keinen (für mich relevanten) Unterschied...

ich habe die .pas aus dem verlinkten Fred (noch?) nicht geladen...habt ihr weiterentwickelt?
(kann sein, daß ich schon wieder Mist frage, aber das Thema steht bei mir (wohl LEIDER!) als nächstes auf dem Zettel...)
Kann eure Unit denn etwas mit "Permutationen" oder dem "Pivot Element"?

Mein Wissen bezüglich Matrizen ist alles andere als gut...noch dazu geht es bei meinem Problem um DirectX-Rotationsmatrizen...
(der "Vollständigkeit" halber...das:
[noparse]http://forum.worldofplayers.de/forum/showthread.php?t=636255[/noparse]
ist das "Projekt" an dem ich gerade "arbeite"...
(ich hoffe das gilt nicht als "Werbung", ansonsten die Bitte an die Mod's/Admin's: Link gleich löschen!))

gruß lichtwicht
A programmer is just a tool which converts coffein into code!

Activating back-to-desktop service...

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: unit matrix: Berechnung der Inversen falsch?

Beitrag von monta »

Der FPC rechnet richtig, die inverse Matrix entspricht dem, was FPC ausgibt, da ist das Wiki wohl falsch:

det A kann man nach der Regel von Sarrus ausrechnen, demnach ergibt sich dafür:

det A = 1*3*1 + 2*0*3 + 0*2*4 - 1*0*4 - 2*2*1 - 0*3*3
= 3 - 4 = -1

Die Inverse Matrix A^(-1) ergibt sich aus 1/(det A) (Aadj)

Die Elemente von Aadj ergeben sich aus den Determinanten der Restmatrix (bei Streichung der jeweiligen Zeile und Spalte des gesuchten Elementes), wobei die errechnete Determinante noch mit -1^(i+j) [Schachbrettmuster] multipliziert werden muss.

Da die Restmatrix eine 2x2-Matrix ist, lässt sich das noch recht gut ausrechnen.

Aadj = ((-1)^(i+j) * det Aij)

somit ergibt sich für Aadj folgende Matrix:

Aadj=
(3*1-0*4) (-1 * (2*1-0*3)) (2*4-3*3)
(-1 * (2*1-0*4)) (1*1-0*3) ((-1 * 1*4-2*3))
(2*0-0*3) ((-1 * 1*0-0*2)) (1*3-2*2)
=
3 -2 -1
-2 1 2
0 0 -1

Das ganze multipliziert mit det A / 1 also mit -1 ergibt exakt die Matrix des FPC als korrekte inverse Matrix zu deinem Beispiel.
Johannes

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: unit matrix: Berechnung der Inversen falsch?

Beitrag von mschnell »

lichtwicht hat geschrieben:du meinst das ?
Kann eure Unit denn etwas mit "Permutationen" oder dem "Pivot Element"?
Klar. Ohne Pivot-Suche kann man keine vernünftige Lösung einer linearen Gleichung erwarten.

-Michael

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: unit matrix: Berechnung der Inversen falsch?

Beitrag von indianer-frank »

monta hat geschrieben:Der FPC rechnet richtig, die inverse Matrix entspricht dem, was FPC ausgibt, da ist das Wiki wohl falsch:

...

Das ganze multipliziert mit det A / 1 also mit -1 ergibt exakt die Matrix des FPC als korrekte inverse Matrix zu deinem Beispiel.


Es ist zwar richtig, daß dabei die FPC Matrix rauskommt, davon wird das Ergebnis aber auch nicht richtig (Motto: alle rechnen falsch nur FPC rechnet richtig und monta kann's bestätigen). Leider hast Du nämlich übersehen (Fehler? oder Absicht?), daß A^-1 = Transponiert(AAdj)/det(A) ist. Wenn man das berücksichtigt, kommt natürlich wieder das richtige Wiki-Ergebnis raus, das übrigens auch von meinen HP 48GX und von Maple bestätigt wird:

Code: Alles auswählen

> A:=linalg[matrix](3,3,[[1, 2, 0], [2, 3, 0], [3, 4 ,1]]);
 
                               [1    2    0]
                               [           ]
                          A := [2    3    0]
                               [           ]
                               [3    4    1]
 
> evalm(1/A);
 
                           [-3     2    0]
                           [             ]
                           [ 2    -1    0]
                           [             ]
                           [ 1    -2    1]

Daß das Ergebnis nicht

-3 2 1
2 -1 -2
0 0 1

lauten kann, sieht man doch auch sofort am 33-Wert von X = (A*A^-1), der
X33 = [1 -2 1]*[3 4 1] = 3 -8 + 1 = -4 lautet würde.


Frank

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: unit matrix: Berechnung der Inversen falsch?

Beitrag von monta »

Leider hast Du nämlich übersehen (Fehler? oder Absicht?)

Fehler ;) Hab ich übersehen, aber der Rest sollte stimmen :lol:


Da wäre das wohl in den Bugs besser aufgehoben und du solltest wohl einen Bugreport machen.
Johannes

Antworten