Einmal Orthogonalize[]
anwenden:
Und jetzt zweimal:
%Vor%
Errr ... Warum?
Ich nahm auch an, dass es ein numerischer Fehler wäre, verstand aber nicht warum , also versuchte ich Gram-Schmidt-Orthogonalisierung selbst, in der Hoffnung, das Problem auf dem Weg zu verstehen:
%Vor%(nur zur Veranschaulichung enthalten, ich konnte einfach nicht herausfinden, was vor sich geht, bevor ich es selbst implementiert habe.)
Ein kritischer Schritt hier, den ich vorher nicht realisiert habe, ist zu entscheiden, ob ein Vektor, den wir erhalten, null ist oder nicht vor der Normalisierungsschritt (siehe Chop
in meinem Code). Sonst könnten wir etwas Winziges erhalten, möglicherweise einen bloßen numerischen Fehler, der dann wieder in einen großen Wert normalisiert wird.
Dies scheint von der Option Tolerance
von Orthogonalize
gesteuert zu werden, und in der Tat wird durch das Erhöhen der Toleranz und das Erzwingen, kleine Vektoren zu verwerfen, das von Ihnen beschriebene Problem behoben. Orthogonalize[ ... , Tolerance -> 1*^-10]
funktioniert in einem einzigen Schritt.
Ich denke, das erste Ergebnis ist auf einen numerischen Fehler zurückzuführen, indem
genommen wird %Vor% then MatrixRank@sys
gibt 2 zurück, daher ist das System selbst nur zweidimensional. Für mich bedeutet dies, dass die erste Instanz von Orthogonalize
einen numerischen Fehler erzeugt und die zweite Instanz den Fehler "out of plane" verwendet, um Ihnen Ihre drei Vektoren zu geben. Durch das Entfernen der Chop
-Bedingungen wird dies behoben,
Dabei ist N
erforderlich, um die angezeigten Root
-Begriffe loszuwerden. Dies gibt Ihnen ein zweidimensionales System, aber Sie können ein drittes erhalten, indem Sie das Kreuzprodukt nehmen.
Bearbeiten : Hier ist ein weiterer Beweis dafür, dass der numerische Fehler auf Chop
zurückzuführen ist.
Mit Chop
, FindInstance
gibt mir
Ohne Chop
, bekomme ich
was ein signifikanter Unterschied zwischen den beiden ist.
Tags und Links wolfram-mathematica