risoluzione di ODE accoppiati con vincoli di valore iniziale e valore finale


12

L'essenza della mia domanda è la seguente: ho un sistema di due ODE. Uno ha un vincolo del valore iniziale e l'altro ha un vincolo del valore finale. Questo può essere pensato come un singolo sistema con un vincolo di valore iniziale su alcune variabili e un vincolo di valore finale su altre.

Ecco i dettagli:

Sto cercando di utilizzare un controller LQR ad orizzonte finito a tempo continuo per guidare un sistema dinamico lineare. Vorrei continuare a utilizzare l'ecosistema Python.

Il sistema è nella forma , soggetto ax(0)=x0x˙(t)=Ax(t)+Bu(t)x(0)=x0

La soluzione LQR genera una matrice tale che l'ingresso di controllo ottimale u (t), lineare in , sia .x ( t ) u ( t ) = K ( t ) x ( t )K(t)x(t)u(t)=K(t)x(t)

doveK(t)=R1BTP(t)

e è la soluzione per un'equazione differenziale di Riccati a tempo continuo (si noti che questa è una matrice)P ( t )P(t)P(t)

P˙(t)=ATP(t)P(t)A+P(t)BR1BTP(t)+Q soggetto aP(tf)=Q

A , , , , , , sono tutti dati.x 0 Q Q f R t fBx0QQfRtf

In inglese: hai un sistema dinamico che inizia nello stato . Il controller LQR genera una matrice di feedback da utilizzare tra il tempo e ( è comunemente chiamato l'orizzonte temporale del problema) 0 t f t fx00tftf

Si noti che i due ODE sono accoppiati solo in una direzione: la soluzione a non dipende da . Pertanto, un modo per risolvere il problema è invertire l'equazione di Riccati per trasformare il problema del valore finale in un problema del valore iniziale e trovare una soluzione numerica tra il tempo e usando un integratore ODE standard. Posso quindi utilizzare questa soluzione numerica per trovare . Questo mi preoccupa perché il solutore ODE numerico per x (t) non campionerà necessariamente l'ODE contemporaneamente ai tempi nella soluzione numerica a $ P (t). Forse c'è un modo intelligente per far valere questo.x ( t ) 0 t f x ( t )P(t)x(t)0tfx(t)

L'altro modo in cui prevedo di risolvere il problema è risolvere il sistema insieme, ma non so come gestire il mix di vincoli di valore iniziale e valore finale. Questi problemi sono computazionalmente pesanti da risolvere? Posso farlo in SciPy / Python?

Risposte:


8

Non sono d'accordo con le altre risposte. Dato che hai solo un accoppiamento unidirezionale tra i problemi di inversione e di avanzamento, sarà molto più efficiente risolverli in sequenza, come proponi per la prima volta. È sufficiente una soluzione che può essere valutata in qualsiasi momento . t [ 0 , t f ]P(t)t[0,tf]

Puoi farlo interpolando tra i valori di output . Vi consiglio di usare un metodo Runge-Kutta che supporti un output denso. Ad esempio, scipy.integrate.ode.dopri5si basa su un tale metodo. Quindi dovresti essere in grado di specificare tempi di uscita molto finemente distanziati senza forzare l'integratore a fare passi molto piccoli (supponendo che l'interfaccia scipy ad esso sia implementata correttamente).


Sì, questo è davvero più semplice. È possibile utilizzare qualsiasi metodo per generare e in tutti i punti che l'integratore trova necessari e interpolare in mezzo con una spline cubica di Hermite se la precisione di O (h ^ 4) è sufficiente. P ( t )P(t)P(t)
Arnold Neumaier,

6

Questo è chiamato problema al valore limite a due punti ed è ben studiato.

Il metodo di scatto è molto semplice da programmare ma può essere estremamente instabile numericamente.

Il modo standard per risolvere questi problemi consiste nell'utilizzare un approccio di tiro multiplo e nel risolvere il sistema di equazioni non lineare corrispondente da un solutore standard non lineare. Per un elenco di solutori di sistemi di equazioni non lineari, consultare, ad esempio,
http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonlin

Prendi come variabili gli stati su una griglia regolare nel tempo (di solito non è necessaria una griglia molto fine), e come equazioni le condizioni al contorno e le mappature che mappano le variabili tempo t alle variabili tempo t + h. Questo dà tante equazioni quante variabili. Devi solo fornire le routine per valutare questa mappatura per una data configurazione di stati sulla griglia e il risolutore non lineare fa tutto il resto. (Forse hai bisogno di più punti di partenza se le tue ipotesi iniziali sono scarse.)

Wikipedia http://en.wikipedia.org/wiki/Direct_multiple_shooting_method ha una descrizione utile del processo, se la descrizione sopra non è abbastanza dettagliata per te. Il libro di Stoer / Bulirsch qui citato fornisce dettagli completi.


5

Non so come farlo in Python, ma la parola chiave che vuoi cercare in letteratura è "metodo di ripresa". Questo è il nome di un metodo che risolve problemi che hanno vincoli di valore sia iniziali che finali.


1

AUTO è in grado di risolvere BVP a due punti e ha un'interfaccia Python ed è relativamente facile da installare. http://www.ma.hw.ac.uk/~gabriel/auto07/node6.html .

Se segui la strada del voler risolvere prima P (t) e trasmetterlo all'altro ODE come input, un modo efficace per impostare questo è usando PyDSTool. PyDSTool è molto facile da installare su qualsiasi piattaforma, vedi http://pydstool.sf.net . Per impostazione predefinita, utilizzerà solo l'interpolazione lineare anche se per la soluzione precedentemente calcolata (quindi calcola che alla risoluzione a tempo debito). Tuttavia, è possibile forzare PyDSTool a passare esattamente ai punti temporali desiderati anche con un integratore adattivo (sebbene ciò possa essere inefficiente e portare a imprecisioni). Ma con intervalli di tempo max abbastanza piccoli, l'interpolazione lineare e un integratore veloce (Dopri è integrato) per il secondo sistema significa che andrà bene per sistemi "normali" come questo.

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.