Как узнать, параллельны ли два вектора

У меня возникли проблемы с поиском параллельных векторов из-за точности с плавающей запятой. Как я могу определить, параллельны ли векторы с некоторым допуском?

Мне также нужна проверка на ортогональность с допуском.


person Josh C.    schedule 27.09.2011    source источник
comment
Какой язык программирования вы используете и как вы кодируете свои векторы на этом языке   -  person yunzen    schedule 27.09.2011
comment
Я предполагаю, что мне просто нужно округлить компоненты до желаемой точности   -  person Josh C.    schedule 27.09.2011
comment
Это С#, и вектор записывается с помощью x и y.   -  person Josh C.    schedule 27.09.2011


Ответы (3)


Для векторов 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

для антипараллельности.

person Howard    schedule 27.09.2011
comment
Правильно, и чтобы проверить параллельность, вы должны проверить, равно ли левое выражение 1,0, а не 0,0. То есть вы бы увидели, была ли разница с 1.0 меньше, чем эпсилон. В общем, вы сравниваете это выражение с косинусом желаемого угла, поскольку это выражение является косинусом угла между векторами. - person Sean Owen; 27.09.2011
comment
Чтобы проверить параллельность, используя scalar_product(v1,v2)/(length(v1)*length(v2)) › 1 - эпсилон, должен ли я взять абс левой стороны? - person Josh C.; 27.09.2011
comment
@ДжошС. Это зависит. Если вы возьмете абсолютное значение, то векторы, направленные точно в противоположные стороны, будут считаться параллельными. Тогда вместо этого вы также можете написать abs(1-scalar_product/lengths)<epsilon. - person Howard; 27.09.2011
comment
@Howard Как я могу узнать, находятся ли два отрезка прямой на одной прямой? - person Josh C.; 11.04.2012
comment
@Howard: Разве скалярного произведения недостаточно, чтобы проверить, ортогональны ли они? Также для случая параллельности ||v1 x v2|| › 0 достаточно. Разделение не нужно в обоих случаях. - person legends2k; 25.05.2013
comment
@ legends2k абсолютно отрицательно, вам нужно cos (тета) или грех (тета), а не норма (v) * норма (w) * cos (тета) или норма (v) * норма (w) * грех (тета), вот почему мы исключаем норму (v) * норму (w) путем деления, также поскольку определение параллельности заключается в том, что векторы линейно зависимы, два вектора, указывающие в противоположных направлениях, также считаются параллельными - person Pooria; 12.08.2014
comment
@Pooria Я думаю, вы не понимаете оптимизацию здесь; скажем, если два вектора линейно зависимы, каковы возможные углы между ними 0, π, 2π и т. д. sin (nπ) = 0 : ∀ n ∈ ℤ, таким образом, ‖v1 ⨯ v2‖ = 0 * ‖v1‖ * ‖v2 ‖ = 0, поэтому нет необходимости делить на ‖v1‖ * ‖v2‖, чтобы найти фактическое значение синуса. Аналогичный аргумент справедлив и для ортогональности. - person legends2k; 12.08.2014
comment
@ legends2k математически правильно, но при работе с вычислениями с плавающей запятой из-за ошибок округления неправильно - person Pooria; 17.08.2014

Если у вас есть 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

person yunzen    schedule 27.09.2011

Если вы работаете с 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.

person paulmelnikow    schedule 04.04.2019