|
Faculté
des Sciences Appliquées |
|
Mécanique
Rationnelle 2e bachelier
2008-2009 |
TRAVAUX PRATIQUES MATLAB
Séminaire du 15.10.2008 |
1. |
Modéliser le mouvement d’un pendule simple de
masse m=1 kg avec Matlab et visualiser en temps
quasi réel son mouvement. Tracer les trajectoires dans le plan des phases. Dans un premier temps, on modélisera le pendule
sans frottement visqueux(damping)
puis avec un frottement visqueux de type
k.dq/dt avec k=1/s. Vers le Tutorial 2 (double-pendule) ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Retour haut de la page
Modélisation Matlab
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Tout comme avec
Runge Kutta, on est d’abord amené à ramener l’équation
différentielle du mouvement qui est au
second ordre en un système d’équations différentielles du premier
ordre : Code Scilab – Mouvement du pendule
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ function dy=fon(t, y) global g l dy(1) = y(2); dy(2)=-g/l*sin(y(1)); endfunction
teta_init = 45;teta_init=teta_init/180*pi;dteta_init = 0; g=9.81;l=1; t=0:0.1:20; y=ode([teta_init;dteta_init],0,[t],fon);
//Preparation du graphe f = gcf(); // on recupere le handle de la fen^etre graphique f.pixmap = "on"; // on met la fenetre en mode double buffer f.background = color("white"); f.foreground = color("white");; //FIN Preparation du graphe
i = 1; while i<=length(y) i = i+1; clf(); // On efface l'image précédente - on évite le scintillement xtitle('', 'm', 'm'); a = gca(); // On récupère l'objet graphique axes pour modifier les légendes a.isoview = "on"; a.data_bounds = [-2 2 -2 2]; a.title.text = "Le pendule "; a.title.font_size = 4; a.title.foreground = color("white"); a.background = color("white");; xpoly([0 +l*sin(y(1,i))],[0 -l*cos(y(1,i))],"lines",0) ep = gce(); // On récupère l'objet graphique double-pendule atwood // pour modifier son aspect cosmétique ep.thickness = 3;ep.foreground = color("blue"); plot([+l*sin(y(1,i))],[-l*cos(y(1,i))],'o','MarkSize',10,'MarkBackground','b') xgrid(12) show_pixmap() // basculement de la pixmap a l'ecran end f.pixmap = "off"; // on remet la fen^etre en mode usuel Si on veut suaver les images de l’animation pour en faire un film,
ajouter : f.pixmap="off" filename = sprintf("R:\image%d.gif", i); xs2gif(f,filename); Code Matlab – Plan des Phases
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ clear; mov = avifile('c:\test113.avi','Compression','None','Quality',100,'fps',25) global g l l=10;g = 9.81 figure('NumberTitle','off','Name','Cours
du 29.11.2002') axis([-6 20 -6
6]);hold on; xlabel('\theta '); ylabel('d\theta/dt /s'); for i=1:100 options = odeset('RelTol',1e-5); [t,y] = ode45('Linear_Damping_Pendulum',[0:0.05:20],[i/5
0],options); plot(y(:,1),y(:,2)); % Sauvetage sous forme de film F = getframe(gcf); mov = addframe(mov,F); % Fin % Sauvetage sous forme d’une sucession
d’images png X =
frame2im(F); imwrite(X,['R:\pendule',num2str(i),'.png'],'png') drawnow; % Fin zoom on hold on; end mov = close(mov); function dy = Linear_Damping_Pendulum(t,y) global g l k L dy = zeros(2,1); dy(1) = y(2); dy(2)=-g/l*sin(y(1));
Retour haut de la page Simulation Temps Quasi Réel du
mouvement
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Code Matlab clear; mov = avifile('c:\test55.avi','Compression','Indeo5','Quality',100,'fps',25) global g l k l=10;g = 9.81;k=0; figure('NumberTitle','off','Name','Cours
du 18.02.2005','Renderer','OpenGL','Color','w','Position',[100 100 500 500]) subplot(2,1,1,'replace');axis([-22 22
-11 11]);box on; Title('Simulation du Mouvement');hold on subplot(2,1,2);axis([-6 20 -6
6]); Title('Plan des
Phases');xlabel('\theta');ylabel('d\theta/dt /s');hold on options = odeset('RelTol',1e-6); for j=1:15
[t,y]
= ode45('Linear_Damping_Pendulum',[0:0.25:10],[0 j/5],options); x=zeros(2,1); z=zeros(2,1); for i=2:max(size(t))
tic x(2)=l*sin(y(i,1)); z(2)=-l*cos(y(i,1)); subplot(2,1,1,'replace'); axis([-22 22
-11 11]);box on;grid on; line(x,z,'LineWidth',2); line(x(2),z(2),'Marker','.','MarkerSize',40'); subplot(2,1,2);line([y(i-1,1)
y(i,1)],[y(i-1,2) y(i,2)],'Color','r','LineWidth',1); F = getframe(gcf); mov = addframe(mov,F); drawnow; while toc<0.0025;end; % le
mouvement est accéléré 100 fois end end mov = close(mov); (Animation réalisée avec Scilab ) Le pendule est
lancé avec un vitesse initiale de plus en plus grande
à partir de sa position d’équilibre stable 0°. Le mouvement est en temps
réel. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Code Scilab function dy=Linear_Damping_Pendulum(t, y) global g l k L dy(1) = y(2); dy(2)=-g/l*sin(y(1)); endfunction
l=10;g = 9.81;k=0;
//Preparatif d'affichage f = gcf(); // on recupere le handle de la fenetre graphique f.pixmap = "on"; // on met la fenetre en mode double buffer f.background = color("white"); f.foreground = color("white"); //FIN Preparatif d'affichage
//Preparatif d'affichage de la première sous-fenêtre subplot(2,1,1); a = gca(); // on recupere le handle des axes pour améliorer leur cosmétique a.isoview = "on"; a.data_bounds = [-22 22 -11 11]; a.title.text = "pendule"; a.title.font_size = 4; a.title.foreground = color("white");; a.background = color("white");
//On prépare la barre du pendule puis on récupère le handle pour améliorer sa cosmétique ep1=xpoly(x,z,"lines",0); ep1 = gce(); ep1.thickness = 3; ep1.foreground = color("blue"); //FIN On prépare la barre du pendule puis on récupère le handle pour améliorer sa cosmétique
//On prépare l'extrémité du pendule puis on récupère le handle pour améliorer sa cosmétique ep2= xrect(x(2),z(2),2,2) ep2=gce(); ep2.thickness = 2; ep2.foreground = color("blue"); show_pixmap() //FIN On prépare l'extrémité du pendule puis on récupère le handle pour améliorer sa cosmétique
//Preparatif d'affichage de la seconde sous-fenêtre subplot(2,1,2) a = gca(); a.box="on"; a.x_location="middle"; a.isoview = "on"; a.data_bounds = [-20 20 -5 5]; a.title.text = "Plan des phases"; a.font_size = 3; // taille de la police a.title.foreground = color("white");; a.background = color("white"); a.x_location = "origin"; // top, bottom, middle ou origin a.y_location = "origin"; // left, right, middle ou origin a.axes_visible = 'on' ; // visibilité des axes a.x_location="bottom"; // top, bottom, middle ou origin a.y_location="left"; // left, right, middle ou origin a.box="on"; // on, off, hidden_axes a.title.font_size=3; //FIN Preparatif d'affichage de la seconde sous-fenêtre
x=zeros(2,1); z=zeros(2,1); for j=1:15 // On trace 15 trajectoires de phases correspondant à 15 CI différentes t=0:0.25:10; y = ode([0;j/5],0,[t],Linear_Damping_Pendulum); for i=2:max(size(t)) subplot(2,1,1); x(2)=l*sin(y(1,i)); z(2)=-l*cos(y(1,i)); ep1.data=[x,z]; ep2.data=[x(2),z(2),2,2]; subplot(2,1,2); xtitle('', 'theta', 'dtheta/dt'); xpoly([y(1,i-1) y(1,i)],[y(2,i-1) y(2,i)],"lines",0); xgrid(12) i = i+1; show_pixmap() // basculement de la pixmap a l'ecran // Pour sauver l'naimation en sucesssion de GIF // f.pixmap="off" // on sort du mode double buffer pour l'animation // filename = sprintf("R:\image%d.gif", j*100+i) // xs2gif(f,filename); // FIN Pour sauver l'naimation en sucesssion de GIF end end Animation réalisée avec Scilab
Retour haut de la page ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ On introduit un frottement
visqueux L’équation du pendule est
alors : Et la modélisation Matlab Dans les codes
précédents il suffit de changer : function dy = Linear_Damping_Pendulum(t,y) global g l k L dy = zeros(2,1); dy(1) = y(2); dy(2)=-g/l*sin(y(1))-k*y(2);
Le mouvement
est accéléré.
Retour haut de la page |