私はpython2.7でいくつかのベクトルの間の角度を計算しようとしています。 私は以下のアイデンティティーを使って角度を見つけています。は、有界のドメインを持つ関数にfloatを渡します。
シータ= ACOS(w/vで| V || W |)
特定のインスタンスのために私のコードは次のとおりです。
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)
私はこれを実行すると、私はエラーにValueError: math domain error
これは、acosはドメイン[-1,1]上でのみ定義されており、私の値 'a'は1に非常に近いが実際は少し大きいfloatであるためです。私はこれをprint Decimal(a)
と確認でき、1.00000000000002220446 ...
この問題を回避する最も良い方法は何ですか?
私は、 'a'の値が1より大きい(または-1より小さい)かどうかをチェックし、正確に1に丸めると考えることができます。この問題を解決するために、従来の/もっと一般的な方法がありますか?あなたは数学に
を再整理し、acos
と1 + eps
トラブルを避けるために、私のtheta = atan2(b,a)
製剤で修飾し、あなたのコードで使用することができれば
私はこのtanソリューションを実装しました。それはうまくいく(ありがとう)が、どのように機能するのですか?あるベクトルのもう一方のベクトルへの投影と直交する間の角度をとるように見えます。 – Jemma