Je souhaite simuler le comportement d'un système à double pendule. Le système est un robot manipulateur à 2 degrés de liberté qui n'est pas actionné et se comportera donc principalement comme un double pendule affecté par la gravité. La seule différence principale avec un pendule double est qu'il est composé de deux corps rigides avec des propriétés de masse et d'inertie à leurs centres de masse.
En gros, j'ai programmé ode45
sous Matlab pour résoudre un système d'ODE du type suivant:
où est l'angle du premier corps par rapport à l'horizontale, est la vitesse angulaire du premier corps; est l'angle du deuxième corps par rapport au premier corps, et est la vitesse angulaire du deuxième corps. Tous les coefficients sont spécifiés dans le code suivant, dans les fonctions rhs
et que fMass
j'ai créées.
clear all
opts= odeset('Mass',@fMass,'MStateDependence','strong','MassSingular','no','OutputFcn',@odeplot);
sol = ode45(@(t,x) rhs(t,x),[0 5],[pi/2 0 0 0],opts);
function F=rhs(t,x)
m=[1 1];
l=0.5;
a=[0.25 0.25];
g=9.81;
c1=cos(x(1));
s2=sin(x(3));
c12=cos(x(1)+x(3));
n1=m(2)*a(2)*l;
V1=-n1*s2*x(4)^2-2*n1*s2*x(2)*x(4);
V2=n1*s2*x(2)^2;
G1=m(1)*a(1)*g*c1+m(2)*g*(l*c1+a(2)*c12);
G2=m(2)*g*a(2)*c12;
F(1)=x(2);
F(2)=-V1-G1;
F(3)=x(4);
F(4)=-V2-G2;
F=F';
end
function M=fMass(t,x)
m=[1 1];
l=0.5;
Izz=[0.11 0.11];
a=[0.25 0.25];
c2=cos(x(3));
n1=m(2)*a(2)*l;
M11=m(1)*a(1)^2+Izz(1)+m(2)*(a(2)^2+l^2)+2*n1*c2+Izz(2);
M12=m(2)*a(2)^2+n1*c2+Izz(2);
M22=m(2)*a(2)^2+Izz(2);
M=[1 0 0 0;0 M11 0 M12;0 0 1 0;0 M12 0 M22];
end
Remarquez comment j'ai défini la condition initiale de (angle du premier corps par rapport à l'horizontale) pour que le système démarre dans une position complètement verticale. De cette façon, puisque seule la gravité agit, le résultat évident est que le système ne doit pas du tout bouger de cette position.
REMARQUE: dans tous les graphiques ci-dessous, j'ai tracé les solutions et en fonction du temps.
ODE45
Lorsque j'exécute la simulation pendant 6 secondes avec ode45
, j'obtiens la solution attendue sans aucun problème, le système reste où il est et ne bouge pas:
Cependant, lorsque j'exécute la simulation pendant 10 secondes, le système commence à se déplacer de manière déraisonnable:
ODE23
J'ai ensuite exécuté la simulation avec ode23
pour voir si le problème persistait. Je me retrouve avec le même comportement, mais cette fois la divergence commence 1 seconde plus tard:
ODE15s
J'ai ensuite exécuté la simulation avec ode15s
pour voir si le problème persistait et non, le système semble être stable même pendant 100 secondes:
Là encore, ce ode15s
n'est que du premier ordre et notez qu'il n'y a que quelques étapes d'intégration. J'ai donc exécuté une autre simulation avec ode15s
pendant 10 secondes mais une MaxStep
taille de pour augmenter la précision, et malheureusement, cela conduit au même résultat qu'avec les deux ode45
et ode23
.
Normalement, le résultat évident de ces simulations serait que le système reste à sa position initiale car rien ne le perturbe. Pourquoi cette divergence se produit-elle? Cela a-t-il quelque chose à voir avec le fait que ces types de systèmes sont de nature chaotique? Est-ce un comportement normal pour les ode
fonctions de Matlab?
x1
et x3
. (Insérez un commentaire sec sur les graphiques sans légendes ni descriptions.) Essayez de tracer les logarithmes de (les valeurs absolues de) x2
et x4
.