bonsoir,
l'un de vous connaitrait-il la formule qui permettrait de calculer la matrice rotation à partir du vecteur direction u(u1,u2,u3) et de l'angle theta?
merci
-----
bonsoir,
l'un de vous connaitrait-il la formule qui permettrait de calculer la matrice rotation à partir du vecteur direction u(u1,u2,u3) et de l'angle theta?
merci
Salut
Tu trouveras cette formule dans cet article sur Wikipedia.
merci PopolAuQuébec.
je viens d'ecrire un programme sous matlab me permettant de la calculer, mais je doute fort qu'il soit bon, en particulier la derniere ligne:Code:function mr(u,t) u1=u(1,:); u2=u(2,:); u3=u(3,:); ub=(0 -u3 u2;u3 0 -u1;-u2 u1 0); uc11=u1^2; uc22=u2^2; uc33=u3^2; uc12=u1*u2; uc13=u1*u3; uc23=u2*u3; uc=(uc11 uc12 uc13;uc12 uc22 uc23;uc13 uc23 uc33); a=cos(t); b=1-cos(t); c=sin(t); id=(1 0 0;0 1 0; 0 0 1); mr=a*id+b*uc+c*ub;![]()
merci PopolAuQuébec.
je viens d'ecrire un programme sous matlab me permettant de la calculer, mais je doute fort qu'il soit bon, en particulier la derniere ligne:Code:function mr(u,t) u1=u(1,:); u2=u(2,:); u3=u(3,:); ub=(0 -u3 u2;u3 0 -u1;-u2 u1 0); uc11=u1^2; uc22=u2^2; uc33=u3^2; uc12=u1*u2; uc13=u1*u3; uc23=u2*u3; uc=(uc11 uc12 uc13;uc12 uc22 uc23;uc13 uc23 uc33); a=cos(t); b=1-cos(t); c=sin(t); id=(1 0 0;0 1 0; 0 0 1); mr=a*id+b*uc+c*ub;
Ben si ça m'a l'air juste, pourquoi penses tu que c'est faux ?
c'est la syntaxe que je mets en cause, car en tapant mr([1;3;8],6) dans la fenetre de commande, ça m'indique qu'il ne connait pas mr()
Pour définir les matrices c'est pas des crochets qu'on met ? Moi j'ai toujours utilisé cette syntaxe...
par exemple :
uc=[uc11 uc12 uc13;uc12 uc22 uc23;uc13 uc23 uc33]
vérifie ça...
l'ecriture de la matrice j'en suis cetain.
Tu as essayé de supprimer des bouts de codes et d'afficher certains des sous résultats pour voir l'étape qui buguait ?
oui.
quand j'ecris les instructions une à une dans la fenetre de commande ça fonctionne. mais lorque je les regroupe dans un fichier *.m pour en faire une fonction predefinie, plus rien.
le probleme se trouve dans la communication entre matlab et le *.m, donc dans les premiere et/ou derniere ligne. du moins, c'est ce que je pense
Il te faudrait pas utiliser cette syntaxe ?
Code:% Un exemple de fichier FUNCTION % ------------------------------ function y = fonc(x) y = x .^ 2;
ok!
ça donne ceci:
en l'executant, ça m'indique une erreur à la ligne 5 colonne 11:Code:function mr=adir2mr(u,t) u1=u(1,:); u2=u(2,:); u3=u(3,:); ub=(0 -u3 u2;u3 0 -u1;-u2 u1 0); uc11=u1^2; uc22=u2^2; uc33=u3^2; uc12=u1*u2; uc13=u1*u3; uc23=u2*u3; uc=(uc11 uc12 uc13;uc12 uc22 uc23;uc13 uc23 uc33); a=cos(t); b=1-cos(t); c=sin(t); id=(1 0 0;0 1 0; 0 0 1); mr=a*id+b*uc+c*ub;Code:ub=(0 -u3 u2;u3 0 -u1;-u2 u1 0);
au fait, c'est bon.
j'ai mal interpreté ton message:je croyais que tu me disait de ne pas mettre des crochets. je n'ai meme pas remarqué que j'ai mis des parentheses.Pour définir les matrices c'est pas des crochets qu'on met ?
maintenant, ça marche. merci
Code:function mr=adir2mr(u,t) u1=u(1,:); u2=u(2,:); u3=u(3,:); ub=[0 -u3 u2;u3 0 -u1;-u2 u1 0]; uc11=u1^2; uc22=u2^2; uc33=u3^2; uc12=u1*u2; uc13=u1*u3; uc23=u2*u3; uc=[uc11 uc12 uc13;uc12 uc22 uc23;uc13 uc23 uc33]; a=cos(t); b=1-cos(t); c=sin(t); id=[1 0 0;0 1 0; 0 0 1]; mr=a*id+b*uc+c*ub;>> mr=adir2mr([2;2;2],5)
mr =
3.1490 4.7832 0.9475
0.9475 3.1490 4.7832
4.7832 0.9475 3.1490
Avec plaisir !
Bon courage pour la suite.
bonsoir,
pour la suite, on me demande de faire un script.m pour tester la valeur ([3;12;-8],74).
est ce que vous sauriez quelle est la structure d'un script dans le cas general?
là tout ce que j'ai ecrit c'est:
je suppose qu'il manque qq lignes au debut comme pour la fonction.u=[3;12;-8];
t=74;
mr=adir2mr(u,t);
merci.
PS: si vous pouviez m'indiquer uniquement comment s'ecrit un script d'une facon generale, j'aimerais resoudre le probleme de mes propres moyens.
petit up !
C'est quoi adir2mr ?
j'ai juste appelé ainsi la fonction qui me retourne la matrice rotation
Première question : si tu tapes exactement ça dans la console, est-ce que ça marche ?
Si oui, utilise alors la même syntaxe qu'utilisée auparavant, que j'ai expliquée dans le post #10.
Si jamais, ça marche pas, il faut que tu t'intéresse à dans un premie temps ne pas mettre de point virgule dans le "mr=a*id+b*uc+c*ub;" dans ton premier script pour que tu puisses visualiser le résultat de ta fonction en console pour voir si c'est cohérent.
Ensuite, crée un autre .m, ou cette fois tu essayes de réutiliser la syntaxe que j'ai évoqué.
Si jamais ça marche pas, c'est qu'il doit falloir appelé la première fonction dans ton deuxième .m. Là je connais pas la syntaxe exacte. Cherche la un peu et essaye tout ça, si jamais ça marche toujours pas, fais moi signe.
Cordialement
merci sigmar. en enlevant les ";" ça marche
je suis trop fort![]()
![]()
bonsoir,
j'ai un porbleme avec ce programme:
jusqu'à la boucle d'iterations tout va bien c'est à l'interieur de la boucle que ça m'indique une erreur au niveau deCode:function x=newton(l,th,w,e,t,th0,xe,ye) l1=l(1,:); l2=l(2,:); l3=l(3,:); l4=l(4,:); l5=l(5,:); th1=th(1,:); th2=th(2,:); th3=th(3,:); j=[-l1*sin(th1) -0.5*l2*sin(th2) 0 -1 0; l1*cos(th1) 0.5*l2*cos(th2) 0 0 -1; -l1*sin(th1) -l2*sin(th2) l3*sin(th3) 0 0; l1*cos(th1) l2*cos(th2) -l3*cos(th3) 0 0; 1 0 0 0 0]; x=0; f=[l1*cos(th1)+0.5*l2*cos(th2)-xe; l1*sin(th1)+0.5*l2*cos(th2)-ye; l1*cos(th1)+l2*cos(th2)-l3*cos(th3)-l5; l1*sin(th1)+l2*sin(th2)-l3*sin(th3)-l4; th1-w*t-th0]; while (dx>e) { jinv=(j)^(-1); dx=-j*f; x=x+dx; }etjinv=(j)^(-1);si je sort jinv de la boucle et que je courcircuite celle ci (autrement dit: j'ecrit x=jinv), le programme marche.dx=-j*f;
personnellement je penses que le probleme est lié à l'increment dx, mais je ne sais comment corriger ça.
peut etre un probleme d'initialisation? mais comment regler ça?
l'un de vous aurait-il une idée?
merci
si je chage la boucle en:
il y a tjrs un probleme daus la ligne jinvwhile (1)
{
jinv=(j)^(-1);
% dx=-j*f;
x=jinv;
}
alors que si j'ecris directement:ça marchejinv=(j)^(-1);
% dx=-j*f;
x=jinv;
La syntaxe des boucles while dans MatLab c'est :
while test
...
end
et il n'y a pas d'accolades entourant le bloc d'instructions de la boucle...
merci Chip,
effectivement ecrit de cette facon ça fonctionne:
neammoin, ça ne fonctionne pas comme ça devrait, car ça donne le meme resultat sans la boucle while. ce qui veut dire qu'il n'y a pas d'iterations, et donc qu'il obtient le resultat des la premiere iteration. c'est pas normal!Code:function x=newton(l,th,w,e,t,th0,xe,ye) l1=l(1,:); l2=l(2,:); l3=l(3,:); l4=l(4,:); l5=l(5,:); th1=th(1,:); th2=th(2,:); th3=th(3,:); j=[-l1*sin(th1) -0.5*l2*sin(th2) 0 -1 0; l1*cos(th1) 0.5*l2*cos(th2) 0 0 -1; -l1*sin(th1) -l2*sin(th2) l3*sin(th3) 0 0; l1*cos(th1) l2*cos(th2) -l3*cos(th3) 0 0; 1 0 0 0 0]; j=[-l1*sin(th1) -0.5*l2*sin(th2) 0 -1 0; l1*cos(th1) 0.5*l2*cos(th2) 0 0 -1; -l1*sin(th1) -l2*sin(th2) l3*sin(th3) 0 0; l1*cos(th1) l2*cos(th2) -l3*cos(th3) 0 0; 1 0 0 0 0]; x=0; f=[l1*cos(th1)+0.5*l2*cos(th2)-xe; l1*sin(th1)+0.5*l2*cos(th2)-ye; l1*cos(th1)+l2*cos(th2)-l3*cos(th3)-l5; l1*sin(th1)+l2*sin(th2)-l3*sin(th3)-l4; th1-w*t-th0]; dx=e+1; while dx>e jinv=(j)^(-1); dx=-j*f; x=x+dx; end
l'un de vous saurait-il pourquoi?
merci
Tu réafécte une valeur à dx dans la boucle. Il se peut que cette valeur ne soit plus supérieure à e après, non ?
Ou alors les deux types de variable (de dx et de e) ne sont pas comparables, dans un cas un tableau, dans un autre un scalaire par exemple ? J'ai pas vérifié.
bonsoir,
c'est effectivement une possibilité. mais j'ai fais le test avec plusieurs valeurs de tx, est le resultat est tjrs le meme et le temps de calcul aussi.Tu réafécte une valeur à dx dans la boucle. Il se peut que cette valeur ne soit plus supérieure à e après, non ?
quant à la compatibilité , dx et e sont tous deux des scalaires.