08 - Általános forgatások ☠

Állítsuk elő a 2. feladatban szereplő forgatásmátrixok segítségével egy ferde tengely körüli térbeli forgatás mátrixát! A tengely legyen koordinátarendszerünk origóján átmenő egyenes!

  • A tengely iránya olyan, hogy ha egyik felét kiválasztjuk, annak a vízszintes $x$-$y$ síkra vett vetülete $\varphi=\pi/3$ szöget zár be az $x$ tengely pozitív ágával, pozitív szögelfordulás irányában mérve.
  • Ugyanakkor a tengely előbb kiválasztott fele $\theta=\pi/4$ szöget zár be a vízszintes síkkal felfelé mérve (azaz az $x,y,z$ tengelyek pozitív ága közti térrészben helyezkedik el a tengelynek ez a félegyenese).
  • A forgatás szöge legyen $\alpha=\pi/6$ a ferdén felfelé mutató ága irányából nézve!

Segítség: Határozzuk meg mátrixunkat a következő transzformációk egymásutánjából! Először forgassuk el két forgatással a tér pontjait úgy, hogy a kiválasztott forgástengely átmenjen az $x$ tengely egyenesébe! Utána forgassunk az $x$ tengely körül $\alpha$ szöggel! Végül csináljuk vissza a kezdeti forgatásokat, hogy a kiválasztott forgástengely az $x$ tengelyből visszakerüljön a helyére! Így a végeredményt tekintve nyilván ennek a tengelynek a pontjai a helyükön maradnak.

Ellenőrzésül számoljuk ki a mátrix sajátértékeit! Azt kaptuk-e, amit kell?

Megoldás

Először meghívjuk a pylab csomagot.

In [1]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib

Ezután definiálunk függvényeket, amik segítségével megkapjuk a bizonyos tengelyek körül elforgató mátrixokat.

In [2]:
def R_x(alpha):
    '''Visszaadja az x tengely körül, alpha szöggel elforgató mátrixot'''
    return matrix([[1, 0, 0], [0, cos(alpha), -sin(alpha)], [0, sin(alpha), cos(alpha)]])

def R_y(alpha):
    '''Visszaadja az y tengely körül, alpha szöggel elforgató mátrixot'''
    return matrix([[cos(alpha), 0, sin(alpha)], [0, 1, 0], [-sin(alpha), 0, cos(alpha)]])

def R_z(alpha):
    '''Visszaadja a z tengely körül, alpha szöggel elforgató mátrixot'''
    return matrix([[cos(alpha), -sin(alpha), 0], [sin(alpha), cos(alpha), 0], [0, 0, 1]])

A cél, hogy definiáljunk egy olyan függvényt, amely a megadott $\varphi$ és $\theta$ szöggel jellemezhető tengely körüli forgatást elvégző mátrixot állítja elő. Ezt, a feladatban leírt módszerel, oldhatjuk meg: Ha egy $v$ vektort el akarunk forgatni az adott tengely körül, akkor először a $z$ tengely körül forgatjuk el $-\varphi$ szöggel $z$ tengely körül, majd $-\theta$ szöggel $y$ tengely körül. Így a tengelyt bevittük $x$ tengelybe, vagyis, végre kell hajtani a forgatást $x$ körül, és az előző forgatásokat visszacsinálni. Ez alapján tehát: $$R \left(\alpha\right) = R_z \left(\varphi\right) R_y \left(-\theta\right) R_x \left(\alpha\right) R_y \left(\theta\right) R_z \left(-\varphi\right) $$

In [3]:
def R(alpha, phi, theta):
    '''Visszaadja azt a mátrixot, amely a phi és theta szöggel jellemezhető tengely körül alpha szöggel fordít'''
    return R_z(phi) * R_y(-theta) * R_x(alpha) * R_y(theta) * R_z(-phi)

Így a kérdéses mátrix:

In [4]:
M = R(pi/6, pi/3, pi/4)
M
Out[4]:
matrix([[ 0.88277223, -0.32454704,  0.33967987],
        [ 0.38255974,  0.91626588, -0.11876399],
        [-0.27269257,  0.2347894 ,  0.9330127 ]])

A sajátértékproblámájának megoldása:

In [5]:
eig(M)
Out[5]:
(array([ 0.8660254+0.5j,  0.8660254-0.5j,  1.0000000+0.j ]),
 matrix([[ 0.66143783+0.j        ,  0.66143783-0.j        ,  0.35355339+0.j        ],
         [-0.16366342-0.53452248j, -0.16366342+0.53452248j,  0.61237244+0.j        ],
         [-0.18898224+0.46291005j, -0.18898224-0.46291005j,  0.70710678+0.j        ]]))

Két komplex, és egy valós, egyértékű sajátértéke van, ami valóban a forgásmátrixokra jellemző, ráadásul az 1 sajátértékhez tartozó sajátvektor komponensei is megfelelőek, úgyhogy tényleg azt a mátrixot kaptuk, amit kellett.