> | restart:with(Student[LinearAlgebra]):with(plots):with(plottools): |
Warning, the protected name . has been redefined and unprotected
Warning, the name changecoords has been redefined
Warning, the name arrow has been redefined
> | alias(theta=theta(t),phi=phi(t),psi=psi(t)); |
Etude du mouvement gyroscopique de la toupie
mouvement d'une toupie tournant sur son axe de rotation autour d'un point O sans frottement
Définition des Reperes
Repere fixe R0 (X0,Y0,Z0)
Repere mobile R1: rotation theta autour de Z, vecteur rotation et matrice de passage de R0->R1 (cpste de R1 dans R0)
theta= angle de precession
> | Omega10:=<0,0,diff(theta,t)>;
M01:=<<cos(theta),sin(theta),0>|<-sin(theta),cos(theta),0>|<0,0,1>>; M10:=Transpose(M01); |
Repere mobile R2: rotation phi autour de Y1
phi= angle de nutation (variation d'obliquité de la toupie)
> | Omega21:=<0,diff(phi,t),0>;
M12:=<<cos(phi),0,-sin(phi)>|<0,1,0>|<sin(phi),0,cos(phi)>>; M21:=Transpose(M12); |
Vecteur rotation de R2/R0
> | Omega20:=Omega21+M21.Omega10; |
Repere lie au solide R3: rotation psi autour de Z2
psi= rotation propre
> | Omega32:=<0,0,diff(psi,t)>; |
> |
Coordonnees de la toupie dans R0
> | OG:=M01.(M12.<0,0,l>); |
> | Toupie:=proc(Theta,Phi)
local OG; OG:=vector([cos(Theta)*sin(Phi),sin(Theta)*sin(Phi),cos(Phi)]); arrow(vector([0, 0, 0]),OG,0.05, 0.4, .0, cylindrical_arrow) end proc: |
> | display(Toupie(Pi/4,Pi/6),scaling=CONSTRAINED, axes=BOXED,labels=[X,Y,Z],title="toupie",orientation=[32,63]); |
Visualisation des reperes
> |
> | repere:=proc(M,c)
local u1,u2,u3; u1:=M.<1,0,0>: u2:=M.<0,1,0>: u3:=M.<0,0,1>: arrow(vector([0,0,0]),convert(u1,vector),.1, .2, .1,cylindrical_arrow,color=c), arrow(vector([0,0,0]),convert(u2,vector),.1, .2, .1,cylindrical_arrow,color=c), arrow(vector([0,0,0]),convert(u3,vector),.1, .2, .1,cylindrical_arrow,color=c): end proc: |
> | PR0:=repere(<<1,0,0>|<0,1,0>|<0,0,1>>,black):
PR1:=repere(subs(theta=Pi/4,M01),blue): PR2:=repere(subs(theta=Pi/4,phi=Pi/6,M01.M12),red): display({PR0,PR1},scaling=CONSTRAINED, axes=BOXED,labels=[X,Y,Z],title="repere R1",orientation=[32,63]); display({PR0,PR1,PR2},scaling=CONSTRAINED, axes=BOXED,labels=[X,Y,Z],title="repere R2",orientation=[32,63]); |
> |
Mise en équation
vecteur rotation instantané dans R2 et vitesse de G
> | Omega:=Omega32+Omega21+M21.Omega10; |
> | OG:=<0,0,l>; VG:=Omega &x OG; |
moment cinétique en G (Z2 axe de revolution), puis en O
> | MI:=<<I2,0,0>|<0,I2,0>|<0,0,I1>>; |
> | sigma:=MI.Omega; |
> | sigma0:=sigma + OG &x (m*VG); |
> | I20=I2+m*l^2; |
> | sigma0:=simplify(subs(I2=I20-m*l^2,sigma0)); |
> |
Energie cinetique
> | Ec:=1/2*sigma0.Omega; |
moment du poid en O: Mo=OG*mg
> | P:=M21.<0,0,-m*g>; |
> | MP:=OG &x P; |
Equation du mouvement dans R2
> | map(diff,sigma0,t) + Omega20 &x sigma0 - MP=0;eq:=lhs(%): |
Conservation du moment cinetique suivant Z2 (3ieme equation)
> | sigma0[3]=omega*I1;eq3a:=%/I1:eq3a;
diff(psi,t)=solve(%,diff(psi,t)); rel1:=%: |
Simplification equation 2 avec la 3ieme
> | eq2:=simplify(subs(rel1,eq[2]));
eq2:=expand(eq2/I20); k=I20/I1;rel2:=%: B=l*m*g/I20; rel3:=%: eq2:=subs(I1=I20/k,I20=l*m*g/B,eq2);eq2:=collect(%,sin(phi)); diff(phi,t$2)=collect(solve(%,diff(phi,t$2)),sin(phi));eq2a:=%: |
simplification de la 1ere equation avec la 3ieme
> | eq1:=simplify(subs(rel1,eq[1]));
eq1:=expand(eq1/I20);eq1:=subs(I1=k*I20,%); diff(theta,t$2)=solve(%,diff(theta,t$2));eq1a:=%: |
Equations du mouvement
> | eq1a; eq2a; eq3a; |
avec les parametres
> | rel2; rel3; |
Recherche des Integrales premieres
Conservation du moment cinetique suivant Z2: 1ere IP
> | eq3a; IP1:=%: |
Conservation du moment cinetique suivant l'axe Z0 (//e au poid): 2ieme IP
> | Z0:=M21.<0,0,1>; |
> | sigma0.Z0=omega*k0*I20; rel2; subs(I20=I1/k,expand(%%/I1)):collect(%,diff(theta,t));IP2:=%: |
En utilisant la première intégrale première, on obtiens la seconde IP
> | simplify(IP2-IP1*cos(phi)):diff(theta,t)=solve(%,diff(theta,t));IP2:=%: |
conservation de l'energie totale: 3ieme IP
> | U:=m*g*OG.Z0; rel2,rel3; |
> | E=Ec+U; IP3:=%: subs(diff(psi,t)=solve(IP1,diff(psi,t)),IP3);
IP3:=subs(I1=I20/k,I20=l*m*g/B,expand(%/I20-(omega^2/2/k=omega^2/2/k))):IP3; |
3ieme Integrale premiere (après simplification)
> | B*u0=lhs(IP3);rel4:=%:
B*u0=rhs(IP3);IP3a:=%: |
3 integrales premieres du mouvement
> | IP1;IP2;IP3a; |
> |
Etude d'une toupie: disque de rayon R sur un axe de longueur l=2R
> | l:=2*R; |
> | I1:=1/2*m*R^2; I20:=m*R^2+m*l^2; k:=I20/I1; B:=l*m*g/I20; |
Verification avec le mouvement simple de precession dans le cas phi=Pi/2
> | phi=Pi/2; rel:=%: |
> | #eq1a; eq2a; eq3a; |
Report dans les 3 equations du mouvement
> | subs(phi=Pi/2,eq1a):eval(%);
subs(phi=Pi/2,eq2a):eval(%);diff(theta,t)=solve(%,diff(theta,t)); subs(phi=Pi/2,eq3a):eval(%); |
Solution triviale (g=10, omega=100, R=0.1)
> | Theta1:=t->4*t; Phi1:=t->Pi/2; Psi1:=t->100*t; |
Mouvement de la toupie
> | T:=2; N:=50; dT:=T/N;
for i from 1 to N do T:=evalf(i*dT); anim[i]:=Toupie(Theta1(T),Phi1(T)): end do: display([seq(anim[i],i=1..N)],insequence=true,scaling=constrained,orientation=[50,74],axes=BOXED); |
Trace de la trajectoire d'un point de l'axe
> | OG1:=vector([cos(Theta1(t))*sin(Phi1(t)),sin(Theta1(t))*sin(Phi1(t)),cos(Phi1(t))]);
sph := sphere([0,0,0], 0.99): traj:=spacecurve(OG1,t=0..2,color=black,thickness=4): |
> | display({sph,traj},scaling=constrained, style=patchnogrid, axes=boxed,title="Trajectoire de G (precession)"); |
Détermination de la solution dans le cas général
Parametres
> | R:=1/10; g:=10; Theta:='Theta': Phi:='Phi': |
Equations
> | subs(theta=Theta(t),phi=Phi(t),eq1a); edp1:=%:
subs(theta=Theta(t),phi=Phi(t),eq2a); edp2:=%: subs(phi=Phi(t),eq3a); |
Conditions initiales
> | Theta(0)=0,D(Theta)(0)=1.0,Phi(0)=Pi/3,D(Phi)(0)=0;CI:=%:
|
très grande vitesse de rotation de la toupie: omega très grand
> | omega:=100; Tmax:=1/2; edp1,edp2; |
Resolution
> | dsol:=dsolve({edp1,edp2,CI},numeric,output=listprocedure); |
> | Phi1:=rhs(dsol[2]);Theta1:=rhs(dsol[4]);
dPhi1:=rhs(dsol[3]);dTheta1:=rhs(dsol[5]); |
> | plot(Phi1(t),t=0..Tmax,title="nutation tres faible / omega tres grand"); |
> | plot([dTheta1(t),dPhi1(t),omega-cos(Phi1(t))*dTheta1(t)],t=0..Tmax,legend=["dTheta","dPhi","dPsi"],title="Vitesse angulaire"); |
> |
Trace de la trajectoire d'un point de l'axe
> | OG1:=vector([cos(Theta1(t))*sin(Phi1(t)),sin(Theta1(t))*sin(Phi1(t)),cos(Phi1(t))]);
sph := sphere([0,0,0], 0.9): traj:=spacecurve(OG1,t=0..2*Tmax,color=black,thickness=4,numpoints=200): |
> | display({sph,traj},scaling=constrained, style=patchnogrid, axes=boxed,title="Trajectoire de G"); |
> |
On retrouve le mouvement de précésion
grande vitesse de rotation de la toupie: omega grand
> | omega:=50; Tmax:=1; edp1,edp2; |
Resolution
> | dsol:=dsolve({edp1,edp2,CI},numeric,output=listprocedure); |
> | Phi1:=rhs(dsol[2]);Theta1:=rhs(dsol[4]);
dPhi1:=rhs(dsol[3]);dTheta1:=rhs(dsol[5]); |
> | plot(Phi1(t),t=0..1,title="apparition de feston de nutation"); |
> | plot([dTheta1(t),dPhi1(t),omega-cos(Phi1(t))*dTheta1(t)],t=0..Tmax,legend=["dTheta","dPhi","dPsi"],title="Vitesse angulaire"); |
> | OG1:=vector([cos(Theta1(t))*sin(Phi1(t)),sin(Theta1(t))*sin(Phi1(t)),cos(Phi1(t))]);
sph := sphere([0,0,0], 0.95): traj:=spacecurve(OG1,t=0..Tmax/2,color=black,thickness=4,numpoints=400): |
> | display({sph,traj},scaling=constrained, style=patchnogrid, axes=boxed,title="Trajectoire de G"); |
> |
cas omega petit
> | omega:=10; Tmax:=1; edp1,edp2; |
Resolution
> | dsol:=dsolve({edp1,edp2,CI},numeric,output=listprocedure); |
> | Phi1:=rhs(dsol[2]);Theta1:=rhs(dsol[4]);
dPhi1:=rhs(dsol[3]);dTheta1:=rhs(dsol[5]); |
> | plot(Phi1(t),t=0..1,title="apparition de feston de nutation omega grand"); |
> | plot([dTheta1(t),dPhi1(t),omega-cos(Phi1(t))*dTheta1(t)],t=0..Tmax,legend=["dTheta","dPhi","dPsi"],title="Vitesse angulaire"); |
> | OG1:=vector([cos(Theta1(t))*sin(Phi1(t)),sin(Theta1(t))*sin(Phi1(t)),cos(Phi1(t))]);
sph := sphere([0,0,0], 0.95): traj:=spacecurve(OG1,t=0..Tmax,color=black,thickness=4,numpoints=400): |
> | display({sph,traj},scaling=constrained, style=patchnogrid, axes=boxed,title="Trajectoire de G"); |
> |
cas omega tres petit
> | omega:=1; Tmax:=1; edp1,edp2; |
Resolution
> | dsol:=dsolve({edp1,edp2,CI},numeric,output=listprocedure); |
> | Phi1:=rhs(dsol[2]);Theta1:=rhs(dsol[4]);
dPhi1:=rhs(dsol[3]);dTheta1:=rhs(dsol[5]); |
> | plot(Phi1(t),t=0..1,title="apparition de feston de nutation omega grand"); |
> | plot([dTheta1(t),dPhi1(t),omega-cos(Phi1(t))*dTheta1(t)],t=0..Tmax,legend=["dTheta","dPhi","dPsi"],title="Vitesse angulaire"); |
> | OG1:=vector([cos(Theta1(t))*sin(Phi1(t)),sin(Theta1(t))*sin(Phi1(t)),cos(Phi1(t))]);
sph := sphere([0,0,0], 0.95): traj:=spacecurve(OG1,t=0..4*Tmax,color=black,thickness=4,numpoints=400): |
> | display({sph,traj},scaling=constrained, style=patchnogrid, axes=boxed,title="Trajectoire de G"); |
> |
Omega très très petit (mouvement du pendule 3D)
> | omega:=0.01;Tmax:=1; edp1,edp2; |
Resolution
> | dsol:=dsolve({edp1,edp2,CI},numeric,output=listprocedure); |
> | Phi1:=rhs(dsol[2]);Theta1:=rhs(dsol[4]);
dPhi1:=rhs(dsol[3]);dTheta1:=rhs(dsol[5]); |
> | plot(Phi1(t),t=0..1,title="apparition de feston de nutation omega grand"); |
> | plot([dTheta1(t),dPhi1(t),omega-cos(Phi1(t))*dTheta1(t)],t=0..Tmax,legend=["dTheta","dPhi","dPsi"],title="Vitesse angulaire"); |
> | OG1:=vector([cos(Theta1(t))*sin(Phi1(t)),sin(Theta1(t))*sin(Phi1(t)),cos(Phi1(t))]);
sph := sphere([0,0,0], 0.95): traj:=spacecurve(OG1,t=0..5*Tmax,color=black,thickness=4,numpoints=400): |
> | display({sph,traj},scaling=constrained, style=patchnogrid, axes=boxed,title="Trajectoire de G"); |
FIN !