Ich versuche, den Winkel zwischen einigen Vektoren in Python2.7 zu berechnen. Ich verwende die folgende Identität, um den Winkel zu finden.übergibt einen Float an eine Funktion mit einer begrenzten Domäne
theta = acos (v w/| v || w |.)
für eine bestimmte Instanz ist mein Code:
v = numpy.array([1.0, 1.0, 1.0])
w = numpy.array([1.0, 1.0, 1.0])
a = numpy.dot(v, w)/(numpy.linalg.norm(v) * numpy.linalg.norm(w))
theta = math.acos(a)
Als ich das laufen bekomme ich die Fehler ValueError: math domain error
Ich nehme an, dies ist, weil Acos nur auf der Domäne [-1,1] definiert ist und mein Wert 'a' ist ein Float, der sehr nahe bei 1 ist, aber tatsächlich ein bisschen größer. Ich kann dies mit print Decimal(a)
bestätigen und ich bekomme 1,0000000000000002220446 ...
Was ist der beste Weg, um dieses Problem zu umgehen?
Alles, was ich mir vorstellen kann, ist zu überprüfen, ob Werte von 'a' größer als 1 (oder kleiner als -1) sind und sie genau auf 1 runden. Das scheint eine klebrige Arbeit zu sein. Gibt es einen besseren/konventionellen Weg, um dieses Problem zu lösen?
Ich habe diese tan Lösung implementiert. Es funktioniert gut (danke), aber wie funktioniert es? Es sieht so aus, als würde es den Winkel zwischen der Projektion eines Vektors auf den anderen und einer Orthogonalen nehmen. – Jemma