Извините, что вмешиваюсь, но тут с математической точки зрения какая-то чушь написана. Во-первых в трёхмерном пространстве, если задан вектор C, то у него есть бесконечное множество перпендикулярных ему пар векторов A и B (представьте, что берёте один перпендикулярный вектор A и вращаете его вокруг оси, заданной вектором C, а B -- это нормаль к плоскости, заданной векторами A и C). Если у Вас заданы два вектора, скажем C и А, то третий, перпендикулярный обоим легко находится через векторное произведение [C×А]. Собственно говоря, алгоритм построения максимального ортогонального базисного набора из некотрого произвольного набора векторов тоже хорошо известен, это про ортогонализация Грамма-Шмидта.Vit Nhoc писал(а): ↑Ср окт 25, 2023 8:02 amКак я понимаю, вы тоже не знаете алгоритм, по которому можно по вектору C найти также перпендикулярные ему вектора A и B. Я спрашивал об этом алгоритме на научных форумах (mattermodeling.stackexchange.com, physicsforums.com), ответа тоже не получил, а один написал что вопрос давний и до конца не ясный.
Миллеровские индексы в кристаллографии
- madschumacher
- Сообщения: 883
- Зарегистрирован: Ср авг 05, 2015 4:30 pm
Re: Миллеровские индексы в кристаллографии
И да узрел Охламон, что сие есть круть несусветная!
Re: Миллеровские индексы в кристаллографии
Не извиняйтесь, мы вас пять страниц ждали.
Конечно найти _какой-нибудь_ перпендикулярный вектор несложно, но как найти такой, чтобы описывался целыми числами? Если C описан целыми числами.но тут с математической точки зрения какая-то чушь написана. Во-первых в трёхмерном пространстве, если задан вектор C, то у него есть бесконечное множество перпендикулярных ему пар векторов A и B (представьте, что берёте один перпендикулярный вектор A и вращаете его вокруг оси, заданной вектором C, а B -- это нормаль к плоскости, заданной векторами A и C). Если у Вас заданы два вектора, скажем C и А, то третий, перпендикулярный обоим легко находится через векторное произведение [C×А]. Собственно говоря, алгоритм построения максимального ортогонального базисного набора из некотрого произвольного набора векторов тоже хорошо известен, это про ортогонализация Грамма-Шмидта.
Повторю свой пример, если C=(1;1;1) то возможен например такой вариант:
A 0 1 -1
B -1 1 0
C 1 1 1
Здесь A перпендикулярен C и B перпендикулярен C, но A не перпендикулярен B. Возможно, если мы построили вначале A=(0 1 -1), мы можем найти вектор B с целыми значениями, перпендикулярный обоим; но я полагаю, что такой набор A B C будет включать слишком большие векторы A/B и поэтому не передаст как следует PBC, т.е. часть информации о симметрии будет потеряна.
Поэтому я полагаю, что надо тупо перебрать все варианты A и B, чтобы найти решение. Вопрос Гесс-у: нужно ли стремиться, чтобы угол между A и B был как можно ближе к 90 градусам? Я подозреваю если не соблюдать это условие, а выбрать только условие чтобы площадь параллелограмма AB была минимальной, часто программа будет находить A и B с маленькими углами между ними (хотя нулевой угол понятно надо отбраковывать алгоритмом).
- madschumacher
- Сообщения: 883
- Зарегистрирован: Ср авг 05, 2015 4:30 pm
Re: Миллеровские индексы в кристаллографии
Ну собственно, не факт, что такой существует. И нормировка на 1 не нужна? Тогда можно такое сделать: при заданном C выбрать единичный вектор n, перпендикулярный ему, и начать вращать его вокруг C. Для каждого из этих "повёрнутых" ориентаций вектора n искать, например, диофантово приближение каждого из значений рациональным числом. Ну а как вектор из рациональных чисел превратить в целочисленный уже мозгов не надо (просто надо найти наименьший общий знаменатель). При найденном целочисленном A далее появляется третий ортогональный вектор B=[A,C], и для него надо сделать аналогичную процедуру преобразования в целочисленный. Ну и поскольку это приближённая процедура, то упираться она будет в реальные критерии отсечки точности рационального (или в данном случае, целочисленного) приближения, степень неортогональности полученной тройки векторов, длину полученных векторов и прочих мелочей. Ну а поскольку я не читал эту тему (для меня кристаллы -- это нечто жуткое), то только такие общие советы могу давать. Но это (и аналогичные штуки) реализуемо алгоритмически.
И да узрел Охламон, что сие есть круть несусветная!
Re: Миллеровские индексы в кристаллографии
А нужно хотя бы один какой-нибудь набор? Если да, то вот, например
(x, y, z)
(y, -x, 0)
(xz, yz, -x^2-y^2)
Или с целочисленным параметром t:
(x, y, z)
(y, -x-zt, yt)
(xz+(y^2+z^2)t, y(z-tx), -x(x+zt)-y^2)
Если нужны все варианты (конечно, с ограничением на макс. число), то, вы правы, перебор. для чисел до 10 перебор практически мгновенный. Например, для вектора (1,1,1) ему будут перпендикулярны следующие перпендикулярные друг другу вектора с компонентами не больше 6:
0 1 -1
2 -1 -1
1 -1 0
1 1 -2
1 0 -1
1 -2 1
1 -3 2
5 -1 -4
1 2 -3
5 -4 -1
2 -3 1
4 1 -5
2 1 -3
4 -5 1
3 -2 -1
1 4 -5
3 -1 -2
1 -5 4
Не так уж и много (среди параллельных брался только один).
Re: Миллеровские индексы в кристаллографии
В этих примерах у вас C-третий вектор? Т.е. если C равен например (1;1;1), то этой формулой особо не воспользуешься. Правильно я понял?
Re: Миллеровские индексы в кристаллографии
В такой записи С - первый вектор, конечно. Вектора же можно как угодно переставлять.
Кстати, эти формулы мне не очень нравятся, так как могут давать большие числа. В этом отношении брутфорс лучше.
Кстати, эти формулы мне не очень нравятся, так как могут давать большие числа. В этом отношении брутфорс лучше.
Re: Миллеровские индексы в кристаллографии
Интересно получается. Значил для миллеровского индекса 1 1 1, можем иметь два варианта redefine lattice:
1)
A 0 1 -1
B -1 1 0
C 1 1 1
2)
1 -1 0
1 1 -2
1 1 1
Наверно лучше первый, раз он без двойки?
И заодно вопрос по Chemcraft, кто пользуется - пора сделать редактирование стиля вектора и надписи на нём? Я всё думаю, как это сделать чтобы потом не пришлось переделывать. Можно например добавить пункты меню Edit the style of latest aded vector и Edit the style of all added vectors.
1)
A 0 1 -1
B -1 1 0
C 1 1 1
2)
1 -1 0
1 1 -2
1 1 1
Наверно лучше первый, раз он без двойки?
И заодно вопрос по Chemcraft, кто пользуется - пора сделать редактирование стиля вектора и надписи на нём? Я всё думаю, как это сделать чтобы потом не пришлось переделывать. Можно например добавить пункты меню Edit the style of latest aded vector и Edit the style of all added vectors.
Re: Миллеровские индексы в кристаллографии
До кучи, может, пригодится. Привожу системы ортогональных векторов, задаваемые маленькими целыми числами (не больше 2).
Вроде бы, эти пять систем - это все возможные уникальные варианты с числом не более 2 (уникальность - по отношению к простым операциям, сохраняющим ортогональность, таким как перестановка строк/столбцов и умножение вектора (строки) на -1).
Код: Выделить всё
0 1 0 0 1 1 0 2 1 2 -1 -1 2 1 -2
0 0 1 0 1 -1 0 1 -2 0 1 -1 2 -2 1
1 0 0 1 0 0 1 0 0 1 1 1 1 2 2
Re: Миллеровские индексы в кристаллографии
Ну вот, я кажется сделал:
https://chemcraftprog.com/files/Chemcra ... _win64.zip
Просьба скачать и протестировать.
Сейчас у меня такой алгоритм выбора латтисных векторов по миллеровским индексам (вектору C):
1) Перебираются все варианты векторов A и B в целых числах;
2) Определяются варианты векторов A и B, такие что они оба перпендикулярны C, и не параллельны друг другу;
3) Программа всегда старается найти варианты A и B такие, чтобы максимальная цифра x,y,z в них по модулю была как можно меньше;
4) Если эта цифра одинаковая, программа старается найти такие варианты A и B, при которых площадь параллелограмма AB минимальная;
5) Если площади одинаковые, программа также пытается найти вектора A и B с углами между ними, максимально близкими к прямому.
Может быть, надо добавить опцию поменять варианты латтисных векторов, и может быть показать список вариантов, которые нашла программа?
https://chemcraftprog.com/files/Chemcra ... _win64.zip
Просьба скачать и протестировать.
Сейчас у меня такой алгоритм выбора латтисных векторов по миллеровским индексам (вектору C):
1) Перебираются все варианты векторов A и B в целых числах;
2) Определяются варианты векторов A и B, такие что они оба перпендикулярны C, и не параллельны друг другу;
3) Программа всегда старается найти варианты A и B такие, чтобы максимальная цифра x,y,z в них по модулю была как можно меньше;
4) Если эта цифра одинаковая, программа старается найти такие варианты A и B, при которых площадь параллелограмма AB минимальная;
5) Если площади одинаковые, программа также пытается найти вектора A и B с углами между ними, максимально близкими к прямому.
Может быть, надо добавить опцию поменять варианты латтисных векторов, и может быть показать список вариантов, которые нашла программа?
Re: Миллеровские индексы в кристаллографии
Гесс, вы тут? Ответьте пожалуйста на пару вопросов, осталось совсем немного:
1) Нужно ли добавить возможность ввести кастомные латисные векторы, если определённые автоматом оказались не самими подходящими?
2) Если да, нужно ли ещё показывать список возможных векторов A и B, перпендикулярных C?
3) Правильно ли я понимаю, что если в миллеровских индексах есть ровно один ноль, то процедура построение латтисных векторов несколько другая - нельзя просто сделать миллеровские индексы вектором C?
1) Нужно ли добавить возможность ввести кастомные латисные векторы, если определённые автоматом оказались не самими подходящими?
2) Если да, нужно ли ещё показывать список возможных векторов A и B, перпендикулярных C?
3) Правильно ли я понимаю, что если в миллеровских индексах есть ровно один ноль, то процедура построение латтисных векторов несколько другая - нельзя просто сделать миллеровские индексы вектором C?
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей