У меня возникли проблемы с поиском параллельных векторов из-за точности с плавающей запятой. Как я могу определить, параллельны ли векторы с некоторым допуском?
Мне также нужна проверка на ортогональность с допуском.
У меня возникли проблемы с поиском параллельных векторов из-за точности с плавающей запятой. Как я могу определить, параллельны ли векторы с некоторым допуском?
Мне также нужна проверка на ортогональность с допуском.
Для векторов v1
и v2
проверьте, ортогональны ли они по
abs(scalar_product(v1,v2)/(length(v1)*length(v2))) < epsilon
где epsilon
достаточно мало. Аналогично можно использовать
scalar_product(v1,v2)/(length(v1)*length(v2)) > 1 - epsilon
для теста на параллельность и
scalar_product(v1,v2)/(length(v1)*length(v2)) < -1 + epsilon
для антипараллельности.
abs(1-scalar_product/lengths)<epsilon
.
- person Howard; 27.09.2011
Если у вас есть 3D-векторы, ответ прост. Вычислите векторное произведение, и если оно близко к нулю, ваши векторы почти параллельны: http://mathworld.wolfram.com/ParallelVectors.html
Для 2d-векторов вы можете преобразовать их в 3D-векторы, просто добавив координату с нулем (1; 2) => (1; 2; 0), (4; 5,6) => (4; 5,6; 0) и т. д.
Два вектора ортогональны или перпендикулярны, если скалярное произведение равно нулю: http://mathworld.wolfram.com/CrossProduct.html
-редактировать http://mathworld.wolfram.com/Perpendicular.html
Если вы работаете с 3D-векторами, вы можете сделать это с помощью набора инструментов vg. Это легкий слой поверх numpy, который поддерживает одиночные значения и сложенные векторы.
import numpy as np
import vg
v1 = np.array([1.0, 2.0, 3.0])
v2 = np.array([-2.0, -4.0, -6.0])
vg.almost_collinear(v1, v2)
# True
Я создал библиотеку во время моего последнего стартапа, где она была мотивирована таким использованием: простые идеи, которые многословны или непрозрачны в NumPy.