```python
from sympy import *
```

# Доказать (или опровергнуть), что для известного трёхмерного вектора v единичной длины матрица является матрицей поворота.

$R = \begin{bmatrix}
\vec{k}\times(\vec{k}\times\vec{v}) & \vec{k}\times\vec{v} &  \vec{k}
\end{bmatrix}^T$

$|\vec{v}|=1$

$R = \begin{bmatrix}
 & \vec{k}\times(\vec{k}\times\vec{v}) & \\
 & \vec{k}\times\vec{v} & \\
0 & 0 & 1
\end{bmatrix}$


```python
vx, vy,vz = symbols('v_x v_y v_z')
v = Matrix([vx, vy, vz])
k = Matrix([0, 0, 1])
```


```python
k.T
```




$\displaystyle \left[\begin{matrix}0 & 0 & 1\end{matrix}\right]$




```python
v.T
```




$\displaystyle \left[\begin{matrix}v_{x} & v_{y} & v_{z}\end{matrix}\right]$



## Відновлення матриці по стрічкам

$R = \begin{bmatrix}
 & \vec{k}\times(\vec{k}\times\vec{v}) & \\
 & \vec{k}\times\vec{v} & \\
0 & 0 & 1
\end{bmatrix}$


```python
k.cross(v).T
```




$\displaystyle \left[\begin{matrix}- v_{y} & v_{x} & 0\end{matrix}\right]$



$R = \begin{bmatrix}
- & \vec{k}\times(\vec{k}\times\vec{v}) & -\\
-v_y & v_x & 0\\
0 & 0 & 1
\end{bmatrix}$


```python
k.cross( k.cross(v) ).T
```




$\displaystyle \left[\begin{matrix}- v_{x} & - v_{y} & 0\end{matrix}\right]$



$R = \begin{bmatrix}
-v_x & -v_y & 0\\
-v_y & v_x & 0\\
0 & 0 & 1
\end{bmatrix}$


```python
R = Matrix([[-vx, -vy, 0], [-vy, vx, 0], [0, 0, 1]])
R
```




$\displaystyle \left[\begin{matrix}- v_{x} & - v_{y} & 0\\- v_{y} & v_{x} & 0\\0 & 0 & 1\end{matrix}\right]$




```python
R.det()
```




$\displaystyle - v_{x}^{2} - v_{y}^{2}$



$det(R) \neq 1$, оскільки за умовою лише $v_x^2 + v_y^2 + v_z^2=1$ (ще $det(R) < 0$)


```python
R.inv() - R.T
```




$\displaystyle \left[\begin{matrix}v_{x} - \frac{v_{x}}{v_{x}^{2} + v_{y}^{2}} & v_{y} - \frac{v_{y}}{v_{x}^{2} + v_{y}^{2}} & 0\\v_{y} + \frac{v_{y}}{- v_{x}^{2} - v_{y}^{2}} & - v_{x} + \frac{v_{x}}{v_{x}^{2} + v_{y}^{2}} & 0\\0 & 0 & 0\end{matrix}\right]$



## Офіційна відповідь: матриця $R$ не є матрицею повороту (ябо є лише у випадку коли один з стовпчиків домножити на $-1$, та при умові що $v_z = 0$).

# Вывести матрицу поворота

$\begin{cases} R\vec{v} = \vec{i} \\ R^T=R^{-1} \\ det(R) = 1 \end{cases}$

Перша матриця: поворот навколо осі $Z$


```python
cos_fi = vx/sqrt(vx**2+vy**2)
sin_fi = vy/sqrt(vx**2+vy**2)

R = Matrix([[cos_fi, sin_fi, 0],
            [-sin_fi, cos_fi, 0],
            [0, 0, 1]])
R
```




$\displaystyle \left[\begin{matrix}\frac{v_{x}}{\sqrt{v_{x}^{2} + v_{y}^{2}}} & \frac{v_{y}}{\sqrt{v_{x}^{2} + v_{y}^{2}}} & 0\\- \frac{v_{y}}{\sqrt{v_{x}^{2} + v_{y}^{2}}} & \frac{v_{x}}{\sqrt{v_{x}^{2} + v_{y}^{2}}} & 0\\0 & 0 & 1\end{matrix}\right]$



Перевірка того, чи це дійсно матриця повороту


```python
R.det()
```




$\displaystyle 1$




```python
R.T - R.inv()
```




$\displaystyle \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$



і координата $v_y$ зануляється


```python
v2 = simplify(R*v)
v2
```




$\displaystyle \left[\begin{matrix}\sqrt{v_{x}^{2} + v_{y}^{2}}\\0\\v_{z}\end{matrix}\right]$



Друга матриця: поворот навколо осі $Y$


```python
sin_fi = vz
cos_fi = sqrt(1 - sin_fi**2)

F = Matrix([[cos_fi, 0, sin_fi],
            [0, 1, 0],
            [-sin_fi, 0, cos_fi]])
F
```




$\displaystyle \left[\begin{matrix}\sqrt{1 - v_{z}^{2}} & 0 & v_{z}\\0 & 1 & 0\\- v_{z} & 0 & \sqrt{1 - v_{z}^{2}}\end{matrix}\right]$




```python
F.det()
```




$\displaystyle 1$




```python
F.inv() - F.T
```




$\displaystyle \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$



і координата $v_z$ зануляється


```python
(F*v2).subs(vx**2+vy**2, 1- vz**2)
```




$\displaystyle \left[\begin{matrix}1\\0\\0\end{matrix}\right]$



## Комбінована матриця


```python
FinalR = (F*R).subs(vx**2 + vy**2, 1 - vz**2)
FinalR
```




$\displaystyle \left[\begin{matrix}v_{x} & v_{y} & v_{z}\\- \frac{v_{y}}{\sqrt{1 - v_{z}^{2}}} & \frac{v_{x}}{\sqrt{1 - v_{z}^{2}}} & 0\\- \frac{v_{x} v_{z}}{\sqrt{1 - v_{z}^{2}}} & - \frac{v_{y} v_{z}}{\sqrt{1 - v_{z}^{2}}} & \sqrt{1 - v_{z}^{2}}\end{matrix}\right]$



Перевірка множенням на $\vec{v}$


```python
simplify(FinalR*v)
```




$\displaystyle \left[\begin{matrix}v_{x}^{2} + v_{y}^{2} + v_{z}^{2}\\0\\\frac{v_{z} \left(- v_{x}^{2} - v_{y}^{2} - v_{z}^{2} + 1\right)}{\sqrt{1 - v_{z}^{2}}}\end{matrix}\right]$



Спрощення виразу і підстановка $v_x^2 + v_y^2 + v_z^2 =1$


```python
simplify(FinalR*v).subs(vx**2 + vy**2 + vz**2, 1)
```




$\displaystyle \left[\begin{matrix}1\\0\\0\end{matrix}\right]$



Поворот назад


```python
FinalR.inv()*Matrix([1,0,0])
```




$\displaystyle \left[\begin{matrix}- \frac{v_{x} v_{z}^{2} - v_{x}}{v_{x}^{2} + v_{y}^{2}}\\- \frac{v_{y} v_{z}^{2} - v_{y}}{v_{x}^{2} + v_{y}^{2}}\\v_{z}\end{matrix}\right]$



Спрощення виразу і підстановка $v_x^2 + v_y^2 = 1- v_z^2$


```python
simplify(FinalR.inv()*Matrix([1,0,0])).subs(vx**2 + vy**2, 1 - vz**2)
```




$\displaystyle \left[\begin{matrix}v_{x}\\v_{y}\\v_{z}\end{matrix}\right]$




```python

```

14fa19c7b573047c735aa97ab88293314879538c
ipynb
Jupyter Notebook
lab3/rotation.ipynb
ArcaneStudent/stereolabs
730c64bd3b71809cf0dd36c69748bdf032e5265a
MIT
lab3/rotation.ipynb
ArcaneStudent/stereolabs
730c64bd3b71809cf0dd36c69748bdf032e5265a
MIT
lab3/rotation.ipynb
ArcaneStudent/stereolabs
730c64bd3b71809cf0dd36c69748bdf032e5265a
MIT
Qwen/Qwen-72B
1. YES
2. YES