Что-то туплю. Дан один трёхмерный вектор. К нему нужно найти ортогональный. Не получается придумать точный метод обходящийся без тригонометрии. В голову приходят только вариации нахождения произвольного второго вектора, но так нельзя обеспечить никакую точность.
Здравствуйте, Дон Рэба, Вы писали:
ДР>Что-то туплю. Дан один трёхмерный вектор. К нему нужно найти ортогональный. Не получается придумать точный метод обходящийся без тригонометрии. В голову приходят только вариации нахождения произвольного второго вектора, но так нельзя обеспечить никакую точность.
если (x и y не равны оба нулю)
вернуть (y, -x, 0)
иначе если (y и z не равны оба нулю)
вернуть (0, z, -y)
иначе если (z и x не равны оба нулю)
вернуть (-z, 0, x)
иначе
плохой вектор
Спасибо, но это как раз из области нахождения произвольного второго вектора. Приведённый код ломается если x и y почти равны нулю. В продолжении той же идеи, можно просто брать произвольные векторы пока не попадётся один достаточно ортогональный, и взять cross product от него. Либо просто пока не попадётся ортогональный. Этот подход не позволяет гарантировать точность при разумных затратах.
Здравствуйте, Дон Рэба, Вы писали:
ДР>Спасибо, но это как раз из области нахождения произвольного второго вектора. Приведённый код ломается если x и y почти равны нулю.
Ну, посчитать все три вектора и взять c наибольшей нормой.
ДР>В продолжении той же идеи, можно просто брать произвольные векторы пока не попадётся один достаточно ортогональный, и взять cross product от него. Либо просто пока не попадётся ортогональный. Этот подход не позволяет гарантировать точность при разумных затратах.
Слово "достаточно" говорит о том, что есть какой-то критерий достаточности?
Здравствуйте, George Seryakov, Вы писали:
GS> Ну, посчитать все три вектора и взять c наибольшей нормой.
Пожалуй, примерно на этом и остановлюсь. Хотя, конечно, хочется чего нибудь более красивого.
GS>Слово "достаточно" говорит о том, что есть какой-то критерий достаточности?
С этим методом, точность очень зависит от выбора второго вектора. Слодовательно, имеет смысл задавать требуемую точность. Но продолжать думать в этом направлении скорее всего не стоит, в любом случае.
Мне в своё время было необходимо искать пару векторов ортогональных друг другу и третьему(исходному).
Я поступил следующим образом:
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;
Здравствуйте, Дон Рэба, Вы писали:
ДР>Что-то туплю. Дан один трёхмерный вектор. К нему нужно найти ортогональный. Не получается придумать точный метод обходящийся без тригонометрии. В голову приходят только вариации нахождения произвольного второго вектора, но так нельзя обеспечить никакую точность.
никакую точность никогда нельзя обеспечить.
Для генерации ортогонального некоторым данным 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
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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
Переупорядочивание производится так:
Выбирается вектор i
Находится максимальное по модулю число вектора, если оно находится на позиции j > i (с учётом уже сделанных перестановок), то позиции i и j меняются местами (у всех векторов)
ПОСЛЕ этого числа, оказавшиеся на позициях больше m в векторе x приравниваются к 1, а остальные находятся из системы уравнений. Найденный x преобразуется в исходный обращением перестановок.
С учётом известных элементов x систему n уравнений можно свести к m
[Сумма от 1 до m rj(i)*x(i)] = -[сумма от m+1 до n rj(i)]
Здравствуйте, 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, а также то с чего я начинал сам. Меня интересовало не существует ли простой закрытой формулы которую можно было бы вычислить без тригонометри и без ветвлений. Видимо, не существует.