fr  en
Hypo-thèses

Bienvenue, vous n'êtes pas connecté. ( Se connecter - S'enregistrer )

RSS >  Matrice de rotation
MarbolanGos #1 18/06/2008 - 09h52
  •   Up
Hors ligne


Chimie

Salut,

allez voici une petite discussion qui va amener les mathématiciens à encore partir dans des idées tordues mais j'en ai un peu besoin.

Mon objectif est de faire tourner un système (non sans blague) mais le système est assez particulier ce sont des atomes que l'on va considérer comme des points parce que les matheux comprennent pas ce qu'est un atome (vite je m'esquive).

J'ai retrouvé dans mes archives de cours la matrice de rotation pour le plan, celle-ci est aussi sous wikipedia mais des que l'on doit tourner dans l'espace c'est pas la même. Celle-ci est disponible là : http://fr.wikipedia.org/wiki/Rotation_vectorielle#.C3.89criture_matricielle
La suite de l'article wikipédia part dans des informations que je comprends pas tout.

Ensuite une autre information TRES importante, je ne possède les coordonnées que en cartésien (les sphériques c'est pas trop adapté pour moi).

Et aussi mon axe de rotation n'est pas forcément (0 0 0). Même si pour cela une simple translation préliminaire suffit.

Prenons un exemple (en image) :
http://img337.imageshack.us/my.php?image=imagezl7.png

Bon le dessin a été fait en 2 minutes donc m'en voulez pas mais je pense que le principe est donné. J'ai pas mis les axes mais bon ça change pas grand chose on supposera qu'à la fin l'oxygène-Calcium est sur l'axe y.
Meianki #2 18/06/2008 - 14h25
  •   Up
Hors ligne


Mathématiques

Hum si tu connais ton axe de rotation ta matrice de rotation dans l'espace est en fait un matrice de rotation dans le plan...

Bon c'est pas clair d'accord :p

Tu as ton axe de rotation, tu prends le plan perpendiculaire à l'axe et qui passe par ton point. Tu obtiens un système plan où tu dois faire ta rotation.

Au final ta matrice en 3d c'est ça :
R = \begin{pmatrix}<br />
cos(\theta) & -sin(\theta) & 0 \\<br />
sin(\theta) & cos(\theta) & 0 \\<br />
0 & 0 & 1<br />
\end{pmatrix}

C'est c'est pour une rotation autour de l'axe z dans la base centrée sur ton atome.
Un changement de base doit pouvoir se faire assez simplement si tu as la position de ton atome, ainsi tu peux avoir la matrice de passage P entre la base voulue et la base canonique (c'est les coordonnées de la base voulue dans la canonique), tu l'inverses (soit par opérations élémentaire en essayant d'obtenir la matrice unité puis en appliquant les mêmes opérations à la matrice unité ensuite,ou si tu as les vecteurs de ta base de l'atome en écrivant les vecteurs de la base canonique dans la base de l'atome, ou alors tout bêtement avec un logiciel de calcul :) )
Et tu vas alors avoir la matrice de rotation en canonique qui sera : Rc = PRP^{-1}

Voilà en espérant que je suis pas à côté de la plaque ^^"
General Vans #3 18/06/2008 - 19h21
  •   Up
Codeur

En ligne Courriel


Mathématiques

Juste un truc, la matrice de passage est celle d'une symétrie donc P-1=tP ?

C'est surement une connerie
Meianki #4 18/06/2008 - 20h17
  •   Up
Hors ligne


Mathématiques

La matrice de passage est orthogonale seulement si tu prends une base orthogonale pour la base de l'atome (la base canonique est déjà orthogonale)
Donc rien à voir avec la symétrie.
General Vans #5 18/06/2008 - 23h08
  •   Up
Codeur

En ligne Courriel


Mathématiques

ah oui mince désolé j'ai confondu  :gene:
Ce message a été édité par General Vans le 18/06/2008 à 23h08.
MarbolanGos #6 19/06/2008 - 10h16
  •   Up
Hors ligne


Chimie

Si je comprends bien je dois ramener mon système dans le plan xy, enfin les 2 atomes considérés (ici O et Ca) ?

Là déjà je sais pas faire...

Puis appliquer la matrice de rotation là ça ira.

Au maximum je vais rester en coordonnées cartésiennes parce que c'est un repère orthonormé et puis il faut que je régénère les géométries à la fin du fichier.

En tout cas merci. Si on peut m'éclaire sur la première manipulation à effectuer ? Ca serait pas une rotation aussi par hasard ?
Meianki #7 19/06/2008 - 11h21
  •   Up
Hors ligne


Mathématiques

La première manipulation c'est un changement de base, il te faut un vecteur sur ton axe de rotation, et deux autres vecteurs dans ton plan.

A priori tu as l'axe de rotation, donc tu as sa direction, donc tu peux en prendre un vecteur normé.

Tu as un vecteur orthogonal au plan donc tu as le plan(ou presque) (p): ax + by + cz = d
a,b,c sont les coordonnées du vecteur normal.
Tu dois déterminer d pour que l'atome appartienne au plan. Donc remplacer x,y,z par les coordonnées de l'atome.
Ensuite tu trouves un vecteur qui appartienne à ce plan. Il sera orthogonal au premier puisqu'il est dans le plan. Tu normalise le dit vecteur. Enfin tu fais un produit vectoriel pour avoir le dernier.

Tu te retrouve avec une base orthonormée.
Je pense que ça peut marcher.
MarbolanGos #8 20/06/2008 - 08h50
  •   Up
Hors ligne


Chimie

Il va falloir que je reprenne ça à tête reposée et que je regarde comment coder cela.

D'ailleurs c'est bizarre que personne l'ait déjà écrit ce bout de code en fortran ça m'aurait bien aidé  B)

Réinventons la roue !

En tout cas merci, je vais coder cela et je donnerai le code quand il marchera  B)
11TLP #9 22/06/2008 - 03h41
  •   Up
Hors ligne Courriel


Mathématiques

* passage rapide, coucou tout le monde ! xD *

J'ai le code en TI-Basic pour la rotation dans le plan mais pour la 3D en fortran c'est pas pour moi :(
MarbolanGos #10 22/06/2008 - 15h21
  •   Up
Hors ligne


Chimie

La rotation dans le plan c'est facile je l'ai déjà codé en Fortran c'est la version en 3D qui est un peu dure pour moi. Après j'en suis sûr que ça doit déjà être écrit dans un code libre mais où ?

[edit] J'ai trouvé cette page : http://www.siggraph.org/education/materials/HyperGraph/modeling/mod_tran/3drota.htm#Rotation%20about%20an%20Arbitrary%20Axis

Ca a l'air de me donner ce que je veux mais c'est compliqué.
Un autre : http://www.mines.edu/~gmurray/ArbitraryAxisRotation/ArbitraryAxisRotation.html
Ce message a été édité par MarbolanGos le 22/06/2008 à 17h47.
MarbolanGos #11 24/06/2008 - 11h14
  •   Up
Hors ligne


Chimie

Allez voici le sous-programme qui fait ce que je voulais

     SUBROUTINE ROT3D(XA, YA, ZA, XB, YB, ZB, NBATMA, NBATMB)
C
C THIS SUBROUTNIE ROTATES THE MOLECULES IN ORDER TO HAVE THE ATOMS1 OF
C MOLECULE A AND B ALIGNED ON THE Y AXIS
C
     IMPLICIT NONE
     INTEGER MAXATM, NBATMA, NBATMB, I
     PARAMETER(MAXATM=100)
     REAL*8 XA(MAXATM), YA(MAXATM), ZA(MAXATM)
     REAL*8 XAT(MAXATM), YAT(MAXATM), ZAT(MAXATM)
     REAL*8 XB(MAXATM), YB(MAXATM), ZB(MAXATM)
     REAL*8 XBT(MAXATM), YBT(MAXATM), ZBT(MAXATM)
     REAL*8 XR, YR, ZR, THETA, RZ(3,3), RX(3,3)
     REAL*8 DIST, COTEX, COTEY, COTEZ
C
C TRANSLATION OF THE MOLECULES SUCH THAT ATOM1 OF MOLECULE A IS AT (0, 0, 0)
C
     XR = XA(1)
     YR = YA(1)
     ZR = ZA(1)

     DO 10 I = 1, NBATMA
        XA(I) = XA(I) - XR
        YA(I) = YA(I) - YR
        ZA(I) = ZA(I) - ZR
10    CONTINUE
     DO 20 I = 1, NBATMB
        XB(I) = XB(I) - XR
        YB(I) = YB(I) - YR
        ZB(I) = ZB(I) - ZR
20    CONTINUE
C
C WE  DO NOT HAVE TO ROTATE IF WE ARE ALREADY ON THE Y AXIS
C
     IF(XB(1).EQ.0.0D0.AND.ZB(1).EQ.0.0D0) GOTO 999
C
C IF WE ARE COLINEAR TO THE Z AXIS
C
     IF(XB(1).EQ.0.0D0.AND.YB(1).EQ.0.0D0) THEN
C
C WE DO A ROTATION OF -PI/2
C
        DO 50 I = 1, NBATMA
           YAT(I) = ZA(I)
           ZA(I)  = -YA(I)
           YA(I) = YAT(I)
50       CONTINUE
        DO 60 I = 1, NBATMA
           YBT(I) = ZB(I)
           ZB(I)  = -YB(I)
           YB(I) = YBT(I)
60       CONTINUE
     GOTO 999
     ENDIF
C
C MAKING THE ROTATION IN ORDER TO HAVE
C ATOM1 OF A AND ATOM1 OF B ALIGNED ON THE Y AXIS
C
     DIST  = DSQRT(XB(1)*XB(1) + YB(1)*YB(1) + ZB(1)*ZB(1))
     COTEX = DSQRT(YB(1)*YB(1) + ZB(1)*ZB(1))
     COTEY = DSQRT(XB(1)*XB(1) + ZB(1)*ZB(1))
     COTEZ = DSQRT(XB(1)*XB(1) + YB(1)*YB(1))
C
C ROTATION ABOUT THE Z-AXIS
C
     RZ(1,1) = YB(1)/COTEZ
     RZ(1,2) = -XB(1)/COTEZ
     RZ(1,3) = 0.0D0
     RZ(2,1) = -RZ(1,2)
     RZ(2,2) = RZ(1,1)
     RZ(2,3) = 0.0D0
     RZ(3,1) = 0.0D0
     RZ(3,2) = 0.0D0
     RZ(3,3) = 1.0D0
C
C ROTATION ABOUT THE X-AXIS
C
     RX(1,1) = 1.0D0
     RX(1,2) = 0.0D0
     RX(1,3) = 0.0D0
     RX(2,1) = 0.0D0
     RX(2,2) = COTEZ/DIST
     RX(2,3) = ZB(1)/DIST
     RX(3,1) = 0.0D0
     RX(3,2) = -RX(2,3)
     RX(3,3) = RX(2,2)
C
C ROTATIONS FOR MOLECULE A
C
     DO 30 I = 1, NBATMA
C
C FIRST ROTATION
C
        XAT(I) = XA(I)*RZ(1,1) + YA(I)*RZ(1,2) + ZA(I)*RZ(1,3)
        YAT(I) = XA(I)*RZ(2,1) + YA(I)*RZ(2,2) + ZA(I)*RZ(2,3)
        ZAT(I) = XA(I)*RZ(3,1) + YA(I)*RZ(3,2) + ZA(I)*RZ(3,3)
C
C SECOND ROTATION
C
       XA(I) = XAT(I)*RX(1,1) + YAT(I)*RX(1,2) + ZAT(I)*RX(1,3)
       YA(I) = XAT(I)*RX(2,1) + YAT(I)*RX(2,2) + ZAT(I)*RX(2,3)
       ZA(I) = XAT(I)*RX(3,1) + YAT(I)*RX(3,2) + ZAT(I)*RX(3,3)
30    CONTINUE
C
C ROTATIONS FOR MOLECULE B
C
     DO 40 I = 1, NBATMB
C
C FIRST ROTATION
C
        XBT(I) = XB(I)*RZ(1,1) + YB(I)*RZ(1,2) + ZB(I)*RZ(1,3)
        YBT(I) = XB(I)*RZ(2,1) + YB(I)*RZ(2,2) + ZB(I)*RZ(2,3)
        ZBT(I) = XB(I)*RZ(3,1) + YB(I)*RZ(3,2) + ZB(I)*RZ(3,3)
C
C SECOND ROTATION
C
       XB(I) = XBT(I)*RX(1,1) + YBT(I)*RX(1,2) + ZBT(I)*RX(1,3)
       YB(I) = XBT(I)*RX(2,1) + YBT(I)*RX(2,2) + ZBT(I)*RX(2,3)
       ZB(I) = XBT(I)*RX(3,1) + YBT(I)*RX(3,2) + ZBT(I)*RX(3,3)
40    CONTINUE
C
C IF SPECIAL CASE GO TO END
C
999   CONTINUE
     RETURN
     END SUBROUTINE ROT3D

 >  Réponse rapide

Composez votre message

 >  Informations du forum

1 personne(s) présente(s) sur ce forum au cours des dernières 20 minutes (0 membre(s) et 1 invité(s)).

top top

Temps de génération = 0.18192s | Accessibilité | Nous cont@cter
valid xhtml valid CSS firefox firefox