Wie invertiere ich eine affine Matrix mit kleinen Werten?

7

Ich verwende eine affine Transformationsmatrix, um 2D-Koordinaten vom Bildschirm (Größe 10e3) in kleine Teile fraktaler Mengen (Größe nur 10e-15) zu transformieren.

Ich muss auch umgekehrt abbilden, also invertiere ich einfach die Matrix. Es funktioniert, wenn die Größen nicht zu weit voneinander entfernt sind, aber es schlägt fehl, wenn die Determinante zu nahe an Null kommt, um mit Standarddoppelzahlen dargestellt zu werden.

Die Matrizen, die ich benutze, haben folgende Form:

a c e
b d f
0 0 1

Und der Inversionsalgorithmus, den ich habe, ist:

var dt = a * d - b * c;
return new Matrix(d/dt, -b/dt, -c/dt, a/dt, (c * f - d * e) / dt, -(a * f - b * e) / dt);

Gibt es eine alternative Möglichkeit, die Matrix zu invertieren? Ich bin nicht sehr gut in Mathematik, daher würde ich eine einfache Lösung benötigen und eine, für die ich den Code oder einen Algorithmus finden könnte.

Ein Beispiel für eine solche Matrix:

 3.26091378894248e-9   -1.882689453850103e-9   -0.7172216437740687
-1.882689453814925e-9  -3.2609137888815494e-9  -0.23371832131832268
 0                      0                       1
Solendil
quelle
Ich sehe kein Problem, Doppel können Zahlen darstellen, die so klein wie 10 ^ -308 sind.
Yves Daoust
1
Möglicherweise liegt Ihr Problem in der Reihenfolge der Operationen in Ihrer Berechnung. Sie könnten so etwas wie (BigValue + SmallValue) - BigValue haben, und anstatt "SmalValue" zu bekommen, erhalten Sie 0.
Simon F
1
Mir ist gerade eingefallen, dass Sie tatsächlich eine Rotation R haben, gefolgt von einer Übersetzung T. Wenn Sie diese getrennt halten können, um Inverse (R * T) zu erhalten, können Sie einfach Inverse (T) * Inverse (R) ausführen. , die beide trivial sind. Würde das helfen?
Simon F
Simon, Sie haben Recht mit dem Problem, das sich aus der Multiplikation von Zahlen unterschiedlicher Größe ergibt. Die Matrix ist komplexer als ein R * T; Es ist auch eine Skala und kann eine Multiplikation jeder Affinität sein. Ich habe es geschafft, das Problem zu beheben, siehe unten. Danke für Ihre Hilfe.
Solendil
Sie sollten im Mathe-Forum fragen!
Fabrice NEYRET

Antworten:

7

Ich habe eine Lösung für mein spezifisches Problem gefunden. Anstatt die Determinante zu berechnen und die Präzisionswand zu treffen, verwende ich Schritt für Schritt die Gauß-Jordan-Methode.

In meinem speziellen Fall von affinen Transformationsmatrizen und dem von mir verwendeten Wertebereich stoße ich auf diese Weise auf kein Präzisionsproblem.

Solendil
quelle