Perché la soluzione numerica di un ODE si allontana da un equilibrio instabile?


15

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 ode45sotto Matlab per risolvere un sistema di ODE del seguente tipo:

[10000M110M1200100M120M22][X˙1X˙2X˙3X˙4]=[X2-V1-sol1X4-V2-sol2]

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.X1X2X3X4rhsfMass

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.X1

NOTA: in tutta la grafica seguente, ho tracciato le soluzioni e rispetto al tempo.X1X3

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:

inserisci qui la descrizione dell'immagine

Tuttavia, quando eseguo la simulazione per 10 secondi, il sistema inizia a muoversi irragionevolmente:

inserisci qui la descrizione dell'immagine

ode23

Ho quindi eseguito la simulazione ode23per vedere se il problema persisteva. Finisco con lo stesso comportamento, solo che questa volta la divergenza inizia 1 secondo dopo:

inserisci qui la descrizione dell'immagine

ode15s

Ho quindi eseguito la simulazione ode15sper vedere se il problema persisteva e no, il sistema sembra essere stabile anche durante 100 secondi:

inserisci qui la descrizione dell'immagine

Inoltre, ode15sè solo il primo ordine e nota che ci sono solo alcuni passaggi di integrazione. Quindi ho eseguito un'altra simulazione con ode15s10 secondi, ma una MaxStepdimensione di per aumentare la precisione e, sfortunatamente, questo porta allo stesso risultato di entrambi e .0.01ode45ode23

inserisci qui la descrizione dell'immagine

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 odefunzioni in Matlab?


Oltre alle equazioni, penso che lo schema potrebbe anche aiutare molto a capire la domanda.
Nicoguaro

Se ritieni che sia appropriato, puoi accettare una delle risposte (c'è un pulsante verde).
Ertxiem - ripristina Monica il

Non dici, ma sembra che tu stia complottando x1e x3. (Inserisci un commento secco sui grafici senza legende o descrizioni.) Prova a tracciare i logaritmi di (i valori assoluti di) x2e x4.
Eric Towers,

Risposte:


15

Penso che i due punti principali siano già stati fatti da Brian ed Ertxiem: il tuo valore iniziale è un equilibrio instabile e il fatto che i tuoi calcoli numerici non siano mai realmente esatti fornisce la piccola perturbazione che farà scattare l'instabilità.

Per dare un po 'più di dettaglio come va, considera il tuo problema sotto forma di un problema di valore iniziale generale

y˙(t)=M-1f(t,y(t))
y(t)=(X1(t),X2(t),X3(t),X4(t))

f(t,y(t))=[X2-V1-sol1X4-V2-sol2]

f(0,y0)=0y˙(0)=0f~

Nel tuo codice, puoi verificarlo elaborando

norm(rhs(0,[pi/2 0 0 0]))

che dà 6.191e-16 - quindi quasi ma non esattamente zero. Che impatto ha sulla dinamica del tuo sistema?

fy0y~0

Inoltre, in un tempo molto breve, la soluzione per il tuo sistema sembra la soluzione del sistema linearizzato

y˙(t)=f(0,y0)+f'(0,y0)(y(t)-y0)=f'(0,y0)(y(t)-y0)

f'frhsy0d(t): =y(t)-y0d

d˙(t)=f'(0,y0)d(t).

Non potevo preoccuparmi di calcolare a mano il giacobino, quindi ho usato la differenziazione automatica per ottenere una buona approssimazione:

J: =f'(0,y0)=[01009.8102,4525000012,452502,45250]

in modo che la tua equazione diventi

d˙(t)=Jd(t),d(0)=y~0-y0

Ora abbiamo bisogno di un ultimo passo: possiamo calcolare una decomposizione autovalore del giacobino tale che

J=QDQ-1

DJQde(t): =Q-1d(t)

e˙(t)=De(t),e(0)=Q1d0.

D

e˙i(t)=λiei(t),ei(0)=ith component of Q1d0

i=1,2,3,4λ1=3.2485

e1(t)=e1(0)e3.2485t.

d(0)=0e(0)=Q-1d(0)=0e1(0)=0e1(0)


16

π/2π/2


4
Se si monitorano attentamente le variabili di stato (osservando i valori stampati nella notazione scientifica), si dovrebbe essere in grado di vedere il movimento iniziale molto lento lontano dall'equilibrio.
Brian Borchers,

Questo ha senso e in effetti, quando avvio il sistema in una posizione verticale verso il basso (essendo un punto di equilibrio stabile), il sistema non si muove affatto, almeno per una simulazione di 1000 secondi che considero un periodo di tempo molto lungo .
jrojasqu,

6
X1sin(0)cos(0)sin(pi/2)cos(pi/2)rhs(t,[0,0,0 0] == [0,0,0,0]

π/2

1
θ=0 10-16

4

Guarda i componenti delle forze calcolate nelle tue funzioni.

π

10-16

un'=1.0un'=un'+10-16


4

L'ipotesi iniziale era che la posizione iniziale fosse a un equilibrio stabile (cioè un minimo dell'energia potenziale) con energia cinetica pari a zero e il sistema ha iniziato ad allontanarsi dall'equilibrio.
Dal momento che fisicamente non può succedere (se consideriamo la meccanica classica), mi sono venute in mente due cose:

  1. π/2-π/2

  2. Il secondo è che forse c'è qualcosa che non va nelle equazioni del movimento (forse un errore di battitura da qualche parte?). Potete per favore scrivere esplicitamente le equazioni? Forse potresti tracciare l'accelerazione angolare in funzione della posizione iniziale di ciascun pendolo, assumendo una velocità angolare zero per verificare se c'è qualcosa di strano.


1
π

2
A proposito, solo per divertimento, se si desidera mantenere il sistema in posizione verticale instabile, è possibile modificare l'origine delle coordinate per avere l'angolo uguale a zero che punta verso l'alto.
Ertxiem - ripristina Monica il

@Ertxiem un'altra opzione è quella di introdurre un piccolo attrito nei pin che consumerebbe errori numerici.
svavil,

peccato(π)

Dal momento che fisicamente non può succedere - Vista l'intuizione che siamo in un equilibrio instabile, in qualche modo lo sfido. I sistemi fisici (senza troppi attriti) non rimangono in equilibri instabili. Più in generale, se simuli sistemi reali, vorrai evitare che si blocchi accidentalmente in un equilibrio instabile (comunque ci sia arrivato) - è una caratteristica, non un bug. (Ci sono alcune rare eccezioni a questo, come lo stato non infetto in immunologia, che è un equilibrio instabile che può essere mantenuto.)
Wrzlprmft

0

Dovresti cercare di più sui doppi pendoli: sono quelli che chiamiamo "sistemi caotici". Anche se si comportano seguendo semplici regole, a partire da condizioni iniziali leggermente diverse, le soluzioni divergono abbastanza rapidamente. Fare simulazioni numeriche per questo tipo di sistemi non è facile. Guarda il video seguente per avere maggiori informazioni sul problema.

Per il pendolo semplice o doppio potresti scrivere una formula per l'energia totale del sistema. Supponendo che le forze di attrito siano trascurate, questa energia totale è preservata dal sistema analitico. Numericamente questo è un altro problema.

Prima di provare il doppio pendolo, prova il semplice pendolo. Noterai che per i metodi Runge-Kutta di piccolo ordine l'energia del sistema crescerà nelle simulazioni numeriche, invece di rimanere costante (questo è ciò che accade nelle tue simulazioni: ottieni movimento dal nulla). Per evitare ciò, è possibile utilizzare metodi RK di ordine superiore (ode45 è dell'ordine 4; RK dell'ordine 8 funzionerebbe meglio). Esistono altri metodi chiamati "metodi simplettici" progettati in modo tale che le simulazioni numeriche conservino l'energia. In generale, è necessario interrompere la simulazione non appena l'energia aumenta in modo significativo rispetto all'inizializzazione.

E cerca di capire il semplice pendolo prima di passare al doppio.


2
Tuttavia, non si tratta di un sistema caotico. Puoi avere un equilibrio instabile anche nei sistemi non caotici, ad es. Il singolo pendolo è "sulla sua testa" e mostrerà lo stesso comportamento descritto nella domanda.
Daniel,

1
Inoltre, non è vero che l'energia aumenta per RKM di piccolo ordine: l'Euler implicito è il primo ordine e mostra esattamente il comportamento opposto.
Daniel,

@BeniBogosel Lei menziona metodi semplicistici che hanno attirato la mia attenzione perché, ovviamente, nel mio esempio, l'energia non è conservata. Tuttavia, potresti indicare un metodo simplettico specifico che potrebbe essere implementato qui?
jrojasqu,

@jrojasqu perché dici che l'energia non è conservata sul tuo sistema?
Ertxiem - ripristina Monica il

ode45π
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.