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?
fuente
x1
yx3
. (Inserte un comentario seco sobre gráficos sin leyendas o descripciones). Intente trazar los logaritmos de (los valores absolutos de)x2
yx4
.Respuestas:
Creo que Brian y Ertxiem ya han hecho los dos puntos principales: su valor inicial es un equilibrio inestable y el hecho de que sus cálculos numéricos nunca sean realmente exactos proporciona la pequeña perturbación que provocará la inestabilidad.
Para dar un poco más de detalle sobre cómo se desarrolla esto, considere su problema en forma de un problema de valor inicial general
En su código, puede probarlo calculando
lo que da 6.191e-16, por lo que casi pero no exactamente cero. ¿Cómo afecta eso a la dinámica de su sistema?
Además, en muy poco tiempo, la solución de su sistema se parece a la solución del sistema linealizado.
rhs
No podía molestarme en calcular el jacobiano a mano, así que utilicé la diferenciación automática para obtener una buena aproximación:
para que tu ecuación se convierta
Ahora necesitamos un paso final: podemos calcular una descomposición del valor propio del jacobiano de tal manera que
fuente
fuente
sin(0)
cos(0)
sin(pi/2)
cos(pi/2)
rhs(t,[0,0,0 0] == [0,0,0,0]
Mire los componentes de las fuerzas calculadas en sus funciones.
fuente
La suposición inicial era que la posición inicial estaba en un equilibrio estable (es decir, un mínimo de la energía potencial) con energía cinética cero y el sistema comenzó a alejarse del equilibrio.
Como físicamente no puede suceder (si consideramos la mecánica clásica), me vinieron a la mente dos cosas:
La segunda es que quizás haya algo mal con las ecuaciones de movimiento (¿quizás un error tipográfico en alguna parte?). ¿Puedes por favor escribir las ecuaciones explícitamente? Tal vez podría trazar la aceleración angular en función de la posición inicial de cada péndulo, suponiendo que la velocidad angular sea cero para verificar si hay algo extraño.
fuente
Debería buscar más sobre péndulos dobles: son lo que llamamos "sistemas caóticos". Aunque se comportan siguiendo reglas simples, a partir de condiciones iniciales ligeramente diferentes, las soluciones divergen bastante rápido. Hacer simulaciones numéricas para este tipo de sistemas no es fácil. Eche un vistazo al siguiente video para obtener más información sobre el problema.
Para el péndulo simple o doble, podría escribir una fórmula para la energía total del sistema. Suponiendo que se descuidan las fuerzas de fricción, esta energía total es preservada por el sistema analítico. Numéricamente este es un tema completamente diferente.
Antes de probar el péndulo doble, pruebe el péndulo simple. Notarás que para los métodos de Runge-Kutta de orden pequeña, la energía del sistema crecerá en las simulaciones numéricas, en lugar de permanecer constante (esto es lo que sucede en tus simulaciones: obtienes movimiento de la nada). Para evitar esto, podrían usarse métodos RK de orden superior (ode45 es de orden 4; RK de orden 8 funcionaría mejor). Hay otros métodos llamados "métodos simplécticos" que están diseñados de tal manera que las simulaciones numéricas conservan la energía. En general, debe detener la simulación tan pronto como la energía aumente significativamente en comparación con su inicialización.
Y trata de entender el péndulo simple antes de pasar al doble.
fuente
ode45