Ортогональный Вектор
От: Дон Рэба  
Дата: 27.05.06 19:10
Оценка:
Что-то туплю. Дан один трёхмерный вектор. К нему нужно найти ортогональный. Не получается придумать точный метод обходящийся без тригонометрии. В голову приходят только вариации нахождения произвольного второго вектора, но так нельзя обеспечить никакую точность.
Ce n'est que pour vous dire ce que je vous dis.
Re: Ортогональный Вектор
От: George Seryakov Россия  
Дата: 27.05.06 19:45
Оценка:
Здравствуйте, Дон Рэба, Вы писали:

ДР>Что-то туплю. Дан один трёхмерный вектор. К нему нужно найти ортогональный. Не получается придумать точный метод обходящийся без тригонометрии. В голову приходят только вариации нахождения произвольного второго вектора, но так нельзя обеспечить никакую точность.



если (x и y не равны оба нулю)
  вернуть (y, -x, 0)
иначе если (y и z не равны оба нулю)
  вернуть (0, z, -y)
иначе если (z и x не равны оба нулю)
  вернуть (-z, 0, x)
иначе
  плохой вектор
GS
Re[2]: Ортогональный Вектор
От: Дон Рэба  
Дата: 27.05.06 20:12
Оценка:
Спасибо, но это как раз из области нахождения произвольного второго вектора. Приведённый код ломается если x и y почти равны нулю. В продолжении той же идеи, можно просто брать произвольные векторы пока не попадётся один достаточно ортогональный, и взять cross product от него. Либо просто пока не попадётся ортогональный. Этот подход не позволяет гарантировать точность при разумных затратах.
Ce n'est que pour vous dire ce que je vous dis.
Re[3]: Ортогональный Вектор
От: George Seryakov Россия  
Дата: 27.05.06 20:17
Оценка:
Здравствуйте, Дон Рэба, Вы писали:

ДР>Спасибо, но это как раз из области нахождения произвольного второго вектора. Приведённый код ломается если x и y почти равны нулю.


Ну, посчитать все три вектора и взять c наибольшей нормой.

ДР>В продолжении той же идеи, можно просто брать произвольные векторы пока не попадётся один достаточно ортогональный, и взять cross product от него. Либо просто пока не попадётся ортогональный. Этот подход не позволяет гарантировать точность при разумных затратах.


Слово "достаточно" говорит о том, что есть какой-то критерий достаточности?
GS
Re[4]: Ортогональный Вектор
От: Дон Рэба  
Дата: 27.05.06 20:55
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS> Ну, посчитать все три вектора и взять c наибольшей нормой.

Пожалуй, примерно на этом и остановлюсь. Хотя, конечно, хочется чего нибудь более красивого.

GS>Слово "достаточно" говорит о том, что есть какой-то критерий достаточности?

С этим методом, точность очень зависит от выбора второго вектора. Слодовательно, имеет смысл задавать требуемую точность. Но продолжать думать в этом направлении скорее всего не стоит, в любом случае.
Ce n'est que pour vous dire ce que je vous dis.
Re[5]: Ортогональный Вектор
От: Octane Россия  
Дата: 28.05.06 05:43
Оценка:
Мне в своё время было необходимо искать пару векторов ортогональных друг другу и третьему(исходному).
Я поступил следующим образом:
1. Из трёх направляющих векторов (i,j,k) я нашёл "наиболее ортогональный" к исходному, т.е. тот скалярное произведение с которым по модулю меньше всех остальных.
2. Первый ортогональный вектор был векторным произведением исходного вектора и этого "наиболее ортогонального" к нему орта.
3. Второй ортогональный вектор был векторным произведением исходного вектора и вектора полученного на шаге 2.

Вот так это было реализовано на C#:
double min = Math.Abs(n * new Vector(1, 0, 0));
val = Math.Abs(n * new Vector(0, 1, 0));
if(val < min)
{
    min = val;
    imin = 1;
}
val = Math.Abs(n * new Vector(0, 0, 1));
if(val < min)
{
    min = val;
    imin = 2;
}
e2 = new Vector();
e2[imin] = 1;
e1 = n ^ e2;
e2 = n ^ e1;
Re: Ортогональный Вектор
От: FDSC Россия consp11.github.io блог
Дата: 28.05.06 07:13
Оценка:
Здравствуйте, Дон Рэба, Вы писали:

ДР>Что-то туплю. Дан один трёхмерный вектор. К нему нужно найти ортогональный. Не получается придумать точный метод обходящийся без тригонометрии. В голову приходят только вариации нахождения произвольного второго вектора, но так нельзя обеспечить никакую точность.


никакую точность никогда нельзя обеспечить.

Для генерации ортогонального некоторым данным m n-векторам вектора составляем систему уравнений вида

(r1, x) = 1
(r2, x) = 1
....
(rm, x) = 1
Остальные n-m уравнений выглядят x(m) = 1; x(m+1) = 1 ... x(n) = 1
Решаем систему уравнений и находим первые m чисел вектора x (остальные единицы)
Делим x на его норму и получаем m+1 ортогональный вектор

Перед составлением системы уравнений необходимо переупорядочить элементы имеющихся векторов r так, что бы во всех векторах хотя бы один из первых m элементов был ненулевой. Это возможно, если r ортогональны друг другу.



Проблемы с точностью не идут от выбора вектора, фактически точность определяется только первым вектором. Если точность не устраивает, нужно брать удвоенную точность. Вообще, с трудом представляю себе где точность может не устраивать.


Есть процесс ортогонализации Грамма-Шмидта, который берёт n n-векторов и ортогонализует их.
Ортогональных к заданному вектору сущетвует столько же, сколько элементов в R.
Re[5]: Ортогональный Вектор
От: Аноним  
Дата: 28.05.06 07:17
Оценка:
Здравствуйте, Дон Рэба, Вы писали:

GS>>Слово "достаточно" говорит о том, что есть какой-то критерий достаточности?

ДР>С этим методом, точность очень зависит от выбора второго вектора. Слодовательно, имеет смысл задавать требуемую точность. Но продолжать думать в этом направлении скорее всего не стоит, в любом случае.

Приведи пример, где тебя точность не утраивает
Re[2]: Ортогональный Вектор
От: Аноним  
Дата: 28.05.06 07:21
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Для генерации ортогонального некоторым данным m n-векторам вектора составляем систему уравнений вида


FDS>(r1, x) = 1

FDS>(r2, x) = 1
FDS>....
FDS>(rm, x) = 1
FDS>Остальные n-m уравнений выглядят x(m) = 1; x(m+1) = 1 ... x(n) = 1
FDS>Решаем систему уравнений и находим первые m чисел вектора x (остальные единицы)
FDS>Делим x на его норму и получаем m+1 ортогональный вектор

FDS>Перед составлением системы уравнений необходимо переупорядочить элементы имеющихся векторов r так, что бы во всех векторах хотя бы один из первых m элементов был ненулевой. Это возможно, если r ортогональны друг другу.


Ага, причём желательно выбирать при переупорядочивании не просто ненулевое число, а число не меньшее квадратного корня из n
Re[3]: Ортогональный Вектор
От: FDSC Россия consp11.github.io блог
Дата: 28.05.06 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, FDSC, Вы писали:


FDS>>Для генерации ортогонального некоторым данным m n-векторам вектора составляем систему уравнений вида


FDS>>(r1, x) = 1

FDS>>(r2, x) = 1
FDS>>....
FDS>>(rm, x) = 1
FDS>>Остальные n-m уравнений выглядят x(m) = 1; x(m+1) = 1 ... x(n) = 1
FDS>>Решаем систему уравнений и находим первые m чисел вектора x (остальные единицы)
FDS>>Делим x на его норму и получаем m+1 ортогональный вектор

Ошибка

FDS>>(r1, x) = 0
FDS>>(r2, x) = 0
FDS>>....
FDS>>(rm, x) = 0



FDS>>Перед составлением системы уравнений необходимо переупорядочить элементы имеющихся векторов r так, что бы во всех векторах хотя бы один из первых m элементов был ненулевой. Это возможно, если r ортогональны друг другу.


А>Ага, причём желательно выбирать при переупорядочивании не просто ненулевое число, а число не меньшее квадратного корня из n


Переупорядочивание производится так:
Выбирается вектор i
Находится максимальное по модулю число вектора, если оно находится на позиции j > i (с учётом уже сделанных перестановок), то позиции i и j меняются местами (у всех векторов)
ПОСЛЕ этого числа, оказавшиеся на позициях больше m в векторе x приравниваются к 1, а остальные находятся из системы уравнений. Найденный x преобразуется в исходный обращением перестановок.

С учётом известных элементов x систему n уравнений можно свести к m
[Сумма от 1 до m rj(i)*x(i)] = -[сумма от m+1 до n rj(i)]
Re[2]: Ортогональный Вектор
От: Дон Рэба  
Дата: 28.05.06 09:15
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>никакую точность никогда нельзя обеспечить.

Это к чему?

FDS>Для генерации ортогонального некоторым данным m n-векторам вектора составляем систему уравнений вида


FDS>(r1, x) = 1

FDS>(r2, x) = 1
FDS>....
FDS>(rm, x) = 1
FDS>Остальные n-m уравнений выглядят x(m) = 1; x(m+1) = 1 ... x(n) = 1
FDS>Решаем систему уравнений и находим первые m чисел вектора x (остальные единицы)
FDS>Делим x на его норму и получаем m+1 ортогональный вектор

FDS>Перед составлением системы уравнений необходимо переупорядочить элементы имеющихся векторов r так, что бы во всех векторах хотя бы один из первых m элементов был ненулевой. Это возможно, если r ортогональны друг другу.

Спасибо, но это по сути то же, что предложили George Seryakov и Octane, а также то с чего я начинал сам. Меня интересовало не существует ли простой закрытой формулы которую можно было бы вычислить без тригонометри и без ветвлений. Видимо, не существует.
Ce n'est que pour vous dire ce que je vous dis.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.