Vorrei simulare il comportamento di un sistema a doppio pendolo. Il sistema è un manipolatore robotico a 2 gradi di libertà che non viene attivato e, pertanto, si comporterà principalmente come un doppio pendolo influenzato dalla gravità. L'unica differenza principale con un doppio pendolo è che è composto da due corpi rigidi con proprietà di massa e inerzia nei loro centri di massa.
Fondamentalmente, ho programmato ode45
sotto Matlab per risolvere un sistema di ODE del seguente tipo:
dove è l'angolo del primo corpo rispetto all'orizzontale, è la velocità angolare del primo corpo; è l'angolo del secondo corpo rispetto al primo corpo e è la velocità angolare del secondo corpo. Tutti i coefficienti sono specificati nel seguente codice, nelle funzioni e che ho creato.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
Notare come ho impostato la condizione iniziale di (angolo del primo corpo rispetto all'orizzontale) in modo che il sistema si avvii in una posizione completamente verticale. In questo modo, poiché agisce solo la gravità, il risultato ovvio è che il sistema non dovrebbe muoversi affatto da quella posizione.
NOTA: in tutta la grafica seguente, ho tracciato le soluzioni e rispetto al tempo.
ode45
Quando eseguo la simulazione per 6 secondi ode45
, ottengo la soluzione prevista senza problemi, il sistema rimane dove si trova e non si sposta:
Tuttavia, quando eseguo la simulazione per 10 secondi, il sistema inizia a muoversi irragionevolmente:
ode23
Ho quindi eseguito la simulazione ode23
per vedere se il problema persisteva. Finisco con lo stesso comportamento, solo che questa volta la divergenza inizia 1 secondo dopo:
ode15s
Ho quindi eseguito la simulazione ode15s
per vedere se il problema persisteva e no, il sistema sembra essere stabile anche durante 100 secondi:
Inoltre, ode15s
è solo il primo ordine e nota che ci sono solo alcuni passaggi di integrazione. Quindi ho eseguito un'altra simulazione con ode15s
10 secondi, ma una MaxStep
dimensione di per aumentare la precisione e, sfortunatamente, questo porta allo stesso risultato di entrambi e .ode45
ode23
Normalmente, il risultato ovvio di queste simulazioni sarebbe che il sistema rimane nella sua posizione iniziale poiché nulla lo disturba. Perché si verifica questa divergenza? Ha qualcosa a che fare con il fatto che questo tipo di sistemi sono di natura caotica? È un comportamento normale per le ode
funzioni in Matlab?
x1
e x3
. (Inserisci un commento secco sui grafici senza legende o descrizioni.) Prova a tracciare i logaritmi di (i valori assoluti di) x2
e x4
.