Faculté des

Sciences

Appliquées

 

Mécanique Rationnelle

2e bachelier 2008-2009

TRAVAUX PRATIQUES MATLAB

GETTING STARTED

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.

 

 

 

Equation du Mouvement

Modélisation Matlab

Le code Matlab

Le frottement visqueux

Les animations

Vers le TP 1

Vers le Tutorial 2 (double-pendule)

 

Equation

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

 

­­­   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

 

IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
 

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));

 

IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE

 

 

­­­   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);

 

 

 

 

IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE

(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

 

 

IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE
IMAGE LONGUE A CHARGER - PATIENCE

 

Animation réalisée avec Scilab

 

­­­   Retour haut de la page  ­­­

 

Effet du Damping

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

 

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  ­­­

 

 

 

 

Depuis le 15.10.2008, vous êtes le visiteur