2016-03-18 10 views
2

Zum Beispiel, wenn I den folgenden Code verwenden, um den Winkel zwischen zwei Vektoren x und p zu berechnen:Warum bekomme ich eine komplexe Nummer mit acos?

x = [1 1 -1]; 
p = [-1 -1 1]; 

angle = acos(dot(x,p)/(norm(x) * norm(p))); 

es zeigt, dass angle = 3.141592653589793 - 0.000000021073424i, die eine komplexe Zahl ist.

Aber wir alle wissen, dass das Punktprodukt von x und p ist -3, und das Produkt der Normen x und p 3, so angle = acos(-3/3), so sollten Winkel genau Pi, 3.14159. Warum gibt MatLab eine komplexe Zahl, und wie mache ich das Ergebnis stattdessen zu einer reellen Zahl?

+1

ich nicht in der Nähe von MATLAB‘, aber können Sie prüfen, ob der Zwischenwert ist eigentlich -1 nicht etwas, ganz in der Nähe, aber außerhalb [-1,1] reichen aufgrund Gleitkomma Fehler? – Amro

+0

hier ist eine relevante Seite: http://www.mathworks.com/matlabcentral/answers/101590-how-can-i-determine-the-angle-between-two-vectors-in-matlab (siehe insbesondere den Vergleich zwischen 'acos' und' atan2' Genauigkeit. – Amro

Antwort

2

Ihr Problem beginnt mit der Normalisierung:

norm(x) * norm(p) 

Hier erhalten Sie einen Wert, der etwas abseits der 3 ist, die man erwarten würde:

> (norm(x) * norm(p))-3 
ans = -4.4409e-16 

Der Fehler propagiert wird und Sie am Ende mit a acos (x) wobei x leicht über 1 liegt.

sqrt ist eine Operation, die möglicherweise zu irrationalen Ergebnissen führt. Wenn Sie es mit Stift und Papier lösen, würden Sie die Quadratwurzel beibehalten und zuerst die Multiplikation durchführen. Rewrite es auf diese Weise für eine bessere numerische probabillities:

angle = acos(dot(x,p)/sqrt(sum(x.^2)*sum(p.^2))) 
+0

Danke, das ist eine brillante Lösung! – FalloutRanger