Deseo simular el comportamiento de un sistema de doble péndulo. El sistema es un robot manipulador de 2 grados de libertad que no se acciona y, por lo tanto, se comportará principalmente como un doble péndulo afectado por la gravedad. La única diferencia principal con un péndulo doble es que está compuesto por dos cuerpos rígidos con propiedades de masa e inercia en sus centros de masa.
Básicamente, ode45
programé bajo Matlab para resolver un sistema de EDO del siguiente tipo:
donde es el ángulo del primer cuerpo con respecto a la horizontal, es la velocidad angular del primer cuerpo; es el ángulo del segundo cuerpo con respecto al primer cuerpo, y es la velocidad angular del segundo cuerpo. Todos los coeficientes se especifican en el siguiente código, en las funciones y que creé.rhs
fMass
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
Observe cómo configuro la condición inicial de (ángulo del primer cuerpo con respecto a la horizontal) para que el sistema comience en una posición completamente vertical. De esta manera, dado que solo la gravedad está actuando, el resultado obvio es que el sistema no debería moverse en absoluto desde esa posición.
NOTA: en todos los gráficos a continuación, las soluciones y con respecto al tiempo.
ODE45
Cuando ejecuto la simulación durante 6 segundos ode45
, obtengo la solución esperada sin ningún problema, el sistema permanece donde está y no se mueve:
Sin embargo, cuando ejecuto la simulación durante 10 segundos, el sistema comienza a moverse sin razón:
ODE23
Luego ejecuté la simulación ode23
para ver si el problema persistía. Termino con el mismo comportamiento, solo que esta vez la divergencia comienza 1 segundo después:
ODE15s
Luego ejecuté la simulación ode15s
para ver si el problema persistía y no, el sistema parece ser estable incluso durante 100 segundos:
Por otra parte, ode15s
solo es de primer orden y tenga en cuenta que solo hay unos pocos pasos de integración. Así que ejecuté otra simulación ode15s
durante 10 segundos pero con un MaxStep
tamaño de para aumentar la precisión, y desafortunadamente, esto lleva al mismo resultado que con ambos y .ode45
ode23
Normalmente, el resultado obvio de estas simulaciones sería que el sistema se mantiene en su posición inicial ya que nada lo perturba. ¿Por qué está ocurriendo esta divergencia? ¿Tiene algo que ver con el hecho de que este tipo de sistemas son de naturaleza caótica? ¿Es este un comportamiento normal para las ode
funciones en Matlab?
x1
y x3
. (Inserte un comentario seco sobre gráficos sin leyendas o descripciones). Intente trazar los logaritmos de (los valores absolutos de) x2
y x4
.