Orthogonalize [] funktioniert nur wie erwartet, wenn es zweimal angewendet wird

8

Einmal Orthogonalize[] anwenden:

%Vor%

Und jetzt zweimal:

%Vor%

Errr ... Warum?

    
Dr. belisarius 17.11.2011, 12:21
quelle

3 Antworten

4

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.

    
Szabolcs 17.11.2011, 13:21
quelle
6

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,

%Vor%

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

%Vor%

Ohne Chop , bekomme ich

%Vor%

was ein signifikanter Unterschied zwischen den beiden ist.

    
rcollyer 17.11.2011 12:39
quelle
1

Vielleicht ist es ein Merkmal der Standardmethode von GramSchmidt?

Versuchen Sie: Method -> "Reorthogonalization" oder Method -> "Householder" .

    
Mr.Wizard 17.11.2011 12:34
quelle

Tags und Links