Перекрестное произведение не возвращает ортогональный вектор

Я использую перекрестное произведение в numpy для генерации третьего вектора, ортогонального двум ортогональным векторам. В приведенном ниже фрагменте кода первая операция (перекрестное произведение) показывает мою проблему: взятие перекрестного произведения двух векторов дает мне только отрицание одного из входных векторов, а не третий вектор, ортогональный обоим.

Следующая операция показывает, что мои два вектора действительно ортогональны, но это не имеет значения. Что тут происходит?

np.cross([ 0.36195593,  0.93219521,  0.        ],[ 0.65916161, -0.25594151, -0.70710672])
Out[94]: array([-0.6591615 ,  0.25594147, -0.70710684])

np.dot([ 0.36195593,  0.93219521,  0.        ],[ 0.65916161, -0.25594151, -0.70710672])
Out[95]: 3.905680168170278e-09

1 ответ

Решение

Во-первых, это не совсем отрицание. Последний член имеет тот же знак. Совершенно случайно, так получилось, что он близок к отрицанию одного из исходных векторов.

Во-вторых, это правильный перекрестный продукт. Вместо того, чтобы делать это вручную, я обращусь к тому факту, что перекрестное произведение геометрически определяется как вектор, который должен быть ортогональным к его двум исходным входным данным. Тот факт, что два входа являются ортогональными (в значительной степени) не имеет значения.

In [11]: first = [ 0.36195593,  0.93219521,  0.]

In [12]: second = [ 0.65916161, -0.25594151, -0.70710672]

In [13]: third = np.cross(first, second)

In [14]: third
Out[14]: array([-0.6591615 ,  0.25594147, -0.70710684])

In [15]: np.dot(first, third)
Out[15]: 0.0

In [17]: np.dot(second, third)
Out[17]: 1.1102230246251565e-16

In [18]: np.isclose( np.dot(second, third), 0)
Out[18]: True

НТН.

Другие вопросы по тегам