2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Матрица поворота для молекулы
Сообщение11.06.2009, 20:23 
Даже стыдно совет спрашивать - задачка вроде как ерундовая, да вот никак не получается.
В математической постановке задача звучит на редкость примитивно: численно задан трехмерный вектор своими проекциями {x,y,z}, где x,y,z - известные мне числа. Нужно найти унитарную матрицу поворота 3х3, которая бы укладывала этот вектор на ось Х. Т.е. его коодинаты после такого поворота должны стать {r,0,0}, где r - длина вектора.
Для двумерного случая я задачу легко решил. Если вектор нормирован на единицу, то такая матрица будет выглядеть так: m=[x, y; -y, x] (MatLab-нотация). А для трехмерного случая ну никак...
Я понимаю, что в трехмерном варианте такая матрица однозначно не определена, поскольку решению задачи будут удовлетворять любые последующие вращения вокруг оси X. Но мне бы хоть какое-нибудь решение получить, т.к. случай у меня чисто практический - надо биомолекулу (полипептид), расположение которой задано координатами всех атомов, развернуть так, чтобы известный мне атом лег на одну из осей координат X. Т.е. надо перейти посредством вращения (начало коодинат я не трогаю) в такую систему координат, чтобы этот избранный атом на оси Y и Z не проецировался. Если при этом вокруг оси X молекула повернется, то для меня это не страшно.
Ну а верхом удовольствия было бы такое вращение, чтобы мой атом (вектор {x,y,z}) переместился по самой короткой дуге, т.е. совершил свое движение в плоскости, образованной этим вектором и осью X. В этом случае решение, очевидно, единственное. Однако, повторяю, что мне годится любая матрица вращения, укладывающая вектор {x,y,z} на ось Х и не нарушающая межатомных расстояний (т.е. унитарная).

P.S. Верхняя строка трехмерной матрицы поворота, по-видимому, будет выглядеть как [x, y, z], иначе не пролучится радиус по X-координате. А вот что должно быть в остальных двух строках - дело темное.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение11.06.2009, 20:31 
Сделайте сначала поворот вокруг оси $OX$, который уложит Ваш вектор на плоскость $XOY$. Потом поверните там.

Влад.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение11.06.2009, 21:30 
Ещё вариант:
Алексей К. в сообщении #85650 писал(а):
Матрица поворота на угол $\theta$ вокруг оси с направляющим вектором ${\mathbf n}=(t_1,t_2,t_3)$ ($t_1^2+t_2^2+t_3^2=1$, ось проходит через начало координат) имеет вид
$$ R({\mathbf n},\theta) = \left|
\begin{array}{ccc}
            &\strut&\\
             c+d t_1^2  &  -s t_3+d t_1 t_2  &   s t_2+d t_1 t_3\\&&\\
                st_3+d t_1 t_2 &     c+d t_2^2 &   -s t_1+d t_2 t_3\\&&\\
               -st_2+d t_1 t_3 &  s t_1+d t_2 t_3 &      c+d t_3^2 \\
            &\strut&
\end{array}
\right|,\quad\mbox{где}\quad s=\sin\theta,\quad c=\cos\theta, \quad d=1-c.
$$

Сейчас дополню другими соображениями.

-- 11 июн 2009, 22:41 --

Вам нужно найти поворот, совмещающий вектора $V_1=(x,y,z)\;\mbox{и}\;V_2=(\sqrt{x^2+y^2+z^2},0,0)=(r,0,0)$. Определите угол $\theta$ между этими векторами. Определите ось поворота как векторное произведение $V_1\times V_2$. Примените указанную формулу. Угол определяется из скалярного произведения:
$$\cos\theta=\frac{V_1\cdot V_2}{|V_1|\, |V_2|}=\frac x r,\quad 
\sin\theta=+\sqrt{1-\cos^2\theta};\qquad
V_1\times V_2=\left(0,\frac{z}{\sqrt{z^2+y^2}},\frac{-y}{\sqrt{z^2+y^2}}\right).$$
Проверьте на каком-нибудь очевидном примере (имею обыкновение ошибаться).
Сама матрица при подстановке этих конкретных значений должна бы упроститься.

-- 12 июн 2009, 00:29 --

Если вектор (x,y,z) нормирован на 1, то получаем
$$\left|
\begin{array}{ccc}
            &\strut&\\
                x &  y                             &   z\\&&\\
               -y &  1-\dfrac{y^2}{1+x} & \dfrac{-yz}{1+x} \\&&\\
               -z &  \dfrac{-yz}{1+x}      &   1-\dfrac{z^2}{1+x}  \\
            &\strut&
\end{array}
\right|$$

 
 
 
 Re: Матрица поворота для молекулы
Сообщение12.06.2009, 03:21 
Алексей К., предложенная вами матрица действительно кладет вектор на ось X, однако для моих целей она не годится, поскольку она не унитарная (дело не в нормировке, а в наличии внедиагональных членов в произведении самой на себя транспонированную). Т.е. умножение на нее вызовет деформацию пространства, а в таком деформированном пространстве мои дальнейшие расчеты невозможны. Требование унитарности я оговаривал в условии задачи.

Мне только что удалось методом тыка с помощью MatLab подобрать вроде бы подходящую матрицу, однако это чистый подбор, а не решение. Вот что у меня получилось:

Обозначаю
>> syms x y z определяю символьные переменные
>> v = [x;y;z] это вектор
>> r = (x^2+y^2+z^2)^(1/2) это его радиус
>> d = (x^2+z^2)^(1/2) непонятно что, но нужно

А вот это сама матрица:
Код:
>> m = [x/r   y/r   z/r;   -x*y/d/r   d/r   -y*z/d/r;   -z/d   0   x/d]

Проверяю на унитарность:
>> simplify(m*transpose(m))
ans =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]
здесь и далее приходится явно вызывать функцию simplify(), чтобы упростить выражение. Без нее MatLab не может привести подобные члены.

Умножаю матрицу на вектор
>> simplify(m*v)

ans =
(x^2+y^2+z^2)^(1/2)
0
0

Это то же самое, что и
ans =
r
0
0

Вроде бы получилось то, что нужно, но как не знаю.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение12.06.2009, 07:27 
Аватара пользователя
Oam в сообщении #221452 писал(а):
Для двумерного случая я задачу легко решил.


Ну тогда перейдите сначала к новой системе координат, в которой ось $Ox$ и Ваш вектор лежат в плоскости $Oxy$, после чего поворачивайте вокруг оси $Oz$ так, как уже умеете. Чтобы новая система координат была ортонормированной, примените процесс ортогонализации Грама-Шмидта. Тогда после домножений на матрицу перехода вся нужная ортогональность/унитарность сохранится.

Можно, безусловно, проделать всё это на бумажке и выписать готовую формулу. Но большого смысла в этом не вижу. Все вычисления довольно легко программируются и без неё, а Вам ведь именно для практических целей нужно, а не для решения учебной задачи.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение12.06.2009, 10:21 
Алексей К. в сообщении #221464 писал(а):
\fbox{Если вектор (x,y,z) нормирован на 1}, то получаем
$$\left|
\begin{array}{ccc}
            &\strut&\\
                x &  y                             &   z\\&&\\
               -y &  1-\dfrac{y^2}{1+x} & \dfrac{-yz}{1+x} \\&&\\
               -z &  \dfrac{-yz}{1+x}      &   1-\dfrac{z^2}{1+x}  \\
            &\strut&
\end{array}
\right|$$

Матрица унитарна на 100%.
Похоже, Вы просто не сумели преобразовать, а именно упростить члены типа $x^2-1+y^2+z^2$. Если вектор (x,y,z) нормирован на 1, то $x^2-1+y^2+z^2=$0. Или, например, $1-x^2=y^2+z^2$.
Например, элемент (3,3) произведения $R\times R^T$ равен
$$\frac{z^2x^2-z^2+y^2z^2+x^2+2x+1+z^4}{(x+1)^2}=
   \frac{z^2(x^2-1+y^2+z^2)+x^2+2x+1}{(x+1)^2}=
\frac{z^2\cdot 0+(x+1)^2}{(x+1)^2}=1.$$

 
 
 
 Re: Матрица поворота для молекулы
Сообщение12.06.2009, 12:44 
Алексей К. в сообщении #221530 писал(а):
Похоже, Вы просто не сумели преобразовать, а именно упростить члены...

Умножение на самосопряженную и упрощение выражений я поручал MatLab'у, который с вашей матрицей видимо не справился.
Скажите, а что будет при x=-1? В вашей матрице при этом появляются нули в знаменателе, в то время как вектор с такой координатой является допустимым объектом для поворота. Меня это смущает тем, что в моей макромолекуле много атомов, и я не могу заранее исключить возможность того, что у нужного мне атома не окажется x=-1. Координаты атомов выбираются из данных рентгеноструктурного анализа, в которых начало координат чаще всего выбираются, как "центр тяжести" макромолекулы. Т.е. отрицательные значения координат в такой сетке присуствуют на общих правах. И мне в своих расчетах изменять начало координат непозволительно, т.к. эта точка как раз и считается за местоположение молекулы.
У мною найденной матрицы тоже еcть подобная проблема, т.к. векторы типа {0,y,0} порождают деление на нуль. В то время как из общих представлений очевидно, что поворот возможен всегда при ненулевой длине вектора. Возможно ли в принципе построить такую матрицу поворота, чтобы ее элементы были определены для любого ненулевого вектора?
И еще один вопрос, косвенно связанный с первым. Не подскажете ли метод, как попроще определить, не выворачивает ли матрица преобразования пространство на изнанку? Дело в том, что если поменять знак у одной из координаты, то пространственный объект становится зеркальным. Матрица, допускающая зеркальную трансформацию, может оставаться унитарной и правильно класть вектор на ось Х. Математики на этот вопрос внимания не обращают, но для меня это очень важно. Дело в том, что молекула полипептида состоит из звеньев природных аминокислот, которые, как известно, имеют L-форму (левую). А если вдруг матрица трансформации вывернет эту левую перчатку в правую, то у меня возникнут огромные проблемы. Ведь по оси Х к моей молекуле приближается другая, а моя задача найти оптимальное положение "стыковки". Если моя молекула вывернется наизнанку (превратиться из левой формы в правую), то стыковка вообще окажется невозможной, как невозможно накрутить гайку с левой резьбой на винт с правой. Короче говоря, если у меня имеется абстрактная унитарная матрица габарита 3x3, то как проверить, выворачивает ли она пространство зеркально или нет? Предполагаю, что ее надо натравить на какой-то примитивный примерчик, для которого результат очевиден. Только никак не могу сообразить, какой пример тут нужен.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение12.06.2009, 13:13 
Oam в сообщении #221549 писал(а):
, как попроще определить, не выворачивает ли матрица преобразования пространство на изнанку?

Посчитать определитель. Если получится плюс единица, то это чистый поворот, если минус единица -- то с отражением.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение12.06.2009, 14:38 
Oam в сообщении #221549 писал(а):
Умножение на самосопряженную и упрощение выражений я поручал MatLab'у, который с вашей матрицей видимо не справился.
Этого не может быть с современными пакетами. Просто ему надо было явно указать, что $z^2=(1-x^2-y^2)$ и, возможно, $z^4=(1-x^2-y^2)^2$. Сам он до этого, действительно, не додумается.

Oam писал(а):
Скажите, а что будет при x=-1? В вашей матрице при этом появляются нули в знаменателе, в то время как вектор с такой координатой является допустимым объектом для поворота. Меня это смущает тем, что в моей макромолекуле много атомов, и я не могу заранее исключить возможность того, что у нужного мне атома не окажется x=-1.
В этом случае неопределена ось поворота (векторное произведение равно нулю).
$x=-1$ означает $y=z=0$, а $x=-1+\varepsilon$ влечёт что-то вроде $y,z\lesssim \sqrt\varepsilon$, и в пределе матрица принимает вид $\begin{vmatrix} -1&0&0\\0&0&-1\\0&-1&0\end{vmatrix}$, вполне законный.
Как этот предел реализовать в программировании пока не думал, но приёмы стандартны.
Навскидку, иметь код типа
Код:
if x>=0 {этот вариант} else {некий второй вариант} end if
(Так делают даже в казалось бы простом случае решения квадратного уравнения, когда заботятся о точности вычислений.)Недодуманное удалено.
Oam писал(а):
Возможно ли в принципе построить такую матрицу поворота, чтобы ее элементы были определены для любого ненулевого вектора?

Не знаю. Боюсь, другие предложенные здесь методы упрутся в ту же проблему. Так, в варианте сначала уложить вектор горизонтально потребуется IF он строго вертикален с аналогичными проблемами.

Oam писал(а):
Математики на этот вопрос внимания не обращают.
Глубоко неверное утверждение. Ответ даден ewertом.

-- 12 июн 2009, 15:58 --

В конце концов, Вы можете написать
Код:
if x=-1 {предельная матрица } else {общая матрица } end if
, понимая, что рискуете потерять точность при x=-0.999999 (ибо при x=-0.999 компьютер Вас всё же, видимо, выручит).

Или при $x<0$ совершить предварительно простой поворот всей системы с указанной предельной матрицей, после чего смело применять предложенное преобразование.
(Это, видимо, и есть предложенный выше "некий второй вариант".)

 
 
 
 Re: Матрица поворота для молекулы
Сообщение13.06.2009, 00:39 
Могу вот такую матрицу Вам предложить:
$$
\left(\begin{array}{ccc}
\frac{x}{r} & \frac{y}{r} & \frac{z}{r} \\
0 & \frac{z}{d} & -\frac{y}{d} \\
-\frac{d}{r} & \frac{xy}{rd} & \frac{xz}{rd} \\
\end{array}\right)
$$
где $d=\sqrt{y^2+z^2}$, $r=\sqrt{x^2+y^2+z^2}$. В данном случае если $d$ обращается в 0, то это означает, что $y=z=0$, т.е. вектор уже имеет вид $(x,0,0)$ и поворачивать ничего не нужно.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение13.06.2009, 01:12 
Gordmit в сообщении #221734 писал(а):
Могу вот такую матрицу Вам предложить:
$$
\left(\begin{array}{ccc}
\frac{x}{r} & \frac{y}{r} & \frac{z}{r} \\
0 & \frac{z}{d} & -\frac{y}{d} \\
-\frac{d}{r} & \frac{xy}{rd} & \frac{xz}{rd} \\
\end{array}\right)
$$
где $d=\sqrt{y^2+z^2}$, $r=\sqrt{x^2+y^2+z^2}$. В данном случае если $d$ обращается в 0, то это означает, что $y=z=0$, т.е. вектор уже имеет вид $(x,0,0)$ и поворачивать ничего не нужно.


Спасибо! Ваша матрица очень похожа на мою из 17-го сообщения:
$$
\left(\begin{array}{ccc}
\frac{x}{r} & \frac{y}{r} & \frac{z}{r} \\
-\frac{xy}{dr} & \frac{d}{r} & -\frac{yz}{dr} \\
-\frac{z}{d} & 0 & \frac{y}{d} \\
\end{array}\right)
$$
где $d=\sqrt{x^2+z^2}$

которая у меня была записана в нотации MatLab'а так:
Код:
>> m = [x/r   y/r   z/r;   -x*y/d/r   d/r   -y*z/d/r;   -z/d   0   x/d]

Причем использована тоже буква d!
Как вы получили эту матрицу?

 
 
 
 Re: Матрица поворота для молекулы
Сообщение13.06.2009, 01:43 
Ну да, я специально стремился записать матрицу похоже на Вашу предыдущую такого вида. А получил я ее так: сначала сделаем поворот вокруг оси $Ox$ так, чтобы наш вектор оказался в плоскости $xOz$, для этого используем матрицу
$$
\left(\begin{array}{ccc}
1 & 0 & 0 \\
0 & \cos\varphi & -\sin\varphi \\
0 & \sin\varphi & \cos\varphi \\
\end{array}\right)
$$
где угол $\varphi$ выбирается так, чтобы $\cos\varphi=\frac{z}{d}$, $\sin\varphi=\frac{y}{d}$.
Затем нужно в плоскости $xOz$ повернуть вектор так, чтобы его направление совпало с направлением оси $Ox$ (т.е. поворот будет вокруг оси $Oy$), для чего используется матрица
$$
\left(\begin{array}{ccc}
\cos\psi & 0 & -\sin\psi \\
0 & 1 & 0 \\
\sin\psi & 0 & \cos\psi \\
\end{array}\right)
$$
где угол $\psi$ таков, что $\cos\psi=\frac{x}{r}$, $\sin\psi=-\frac{d}{r}$.

Теперь осталось эти две матрицы перемножить (вторую слева на первую) и получим требуемое.

Кстати, Ваша матрица получается аналогично: сначала поворот вокруг $Oy$ так, чтобы вектор оказался в плоскости $xOy$, а затем поворот вокруг оси $Oz$ (так, чтобы вектор в плоскости $xOy$ перешел в нужный - совпадающий по направлению с осью $Ox$).

 
 
 
 Re: Матрица поворота для молекулы
Сообщение13.06.2009, 02:20 
Gordmit в сообщении #221734 писал(а):
Могу вот где $d=\sqrt{y^2+z^2}$. В данном случае если $d$ обращается в 0, то это означает, что $y=z=0$, т.е. вектор уже имеет вид $(x,0,0)$ и поворачивать ничего не нужно.


Этим ваша матрица лучше моей! Еще раз благодарю, ваше решение идеально!
Однако никак не могу удержаться, чтобы не задать вам вопрос: "Что вы думаете про матрицу, предложенную Алексей К.? Почему она не похожа на наши матрицы?" :)

 
 
 
 Re: Матрица поворота для молекулы
Сообщение13.06.2009, 03:23 
Наши с Вами матрицы представляют собой композиции поворотов вокруг двух разных осей (одна - вокруг $Ox$ и $Oy$, другая - вокруг $Oy$ и $Oz$), в то время как матрица, которую предложил Алексей К., производит поворот напрямую в плоскости, натянутой на вектора $(x,y,z)$ и $(r,0,0)$ (т.е. по сути то, что в первом сообщении обозначено как верх удовольствия). При этом не работает она в точности в том же случае - когда $y=z=0$.

Недостаток матрицы Алексея К. состоит в том, что вектор $(x,y,z)$ должен быть нормирован (что, впрочем, легко исправить: достаточно заменить везде $x,y,z$ на $\frac{x}{r},\frac{y}{r},\frac{z}{r}$ соответственно, а затем домножить все элементы матрицы на $r$), ну и обоснование того, что она делает нужное преобразование, посложнее.

 
 
 
 Re: Матрица поворота для молекулы
Сообщение13.06.2009, 03:42 
Gordmit в сообщении #221746 писал(а):
матрица, которую предложил Алексей К., производит поворот напрямую в плоскости, натянутой на вектора $(x,y,z)$ и $(r,0,0)$ (т.е. по сути то, что в первом сообщении обозначено как верх удовольствия).


Тогда я также горячо благодарю и Алексея К., и приношу ему свои извинения за то, что не сразу оценил его результат.

 
 
 [ Сообщений: 20 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group