Modellare il mondo in modo deterministico con GEKKO

Modeling the world deterministically with GEKKO.

Foto di Iván Díaz su Unsplash

Una guida completa alla risoluzione delle equazioni differenziali algebriche e all’applicazione dell’ottimizzazione dinamica

Con il nostro mondo sempre più digitalizzato, la raccolta di dati sta crescendo rapidamente. Questi dati ci hanno permesso di creare modelli più accurati che ci hanno aiutato a risolvere problemi e trovare soluzioni ottimizzate in molti settori del business e della tecnologia. Poiché questi modelli sono basati su dati del mondo reale, che sono per natura stocastici, cose come casualità, rumore e anomalie nei set di dati sono spesso inevitabili. Spesso si impiega molto tempo per eseguire EDA, pre-elaborazione dei dati e rilevazione degli outlier. Questi metodi sono diventati comuni per comprendere e raffinare i dati prima di adattare un modello. Tuttavia, qualsiasi modello costruito utilizzando tali dati è sempre un’approssimazione della soluzione reale. Ciò è dovuto al fatto che i dati sono di nuovo stocastici (incertezza aleatoria) e soggetti a molte influenze sconosciute (incertezza Knightiana). Inoltre, la mancanza di dati sufficienti o l’avere set di dati sbilanciati e tendenziosi può ulteriormente degradare l’accuratezza di un modello (incertezza epistemica). Nonostante queste difficoltà, i modelli costruiti in questo modo sono inestimabili e la stocasticità intrinseca può talvolta essere uno strumento per comprendere meglio le complessità del mondo reale. Tuttavia… esiste un approccio alternativo: l’ingresso della modellazione deterministica.

La modellazione deterministica è l’antitesi della modellazione con casualità. È un metodo per semplificare certi aspetti del processo di modellazione rimuovendo la confusione introdotta dal mondo reale. Questi modelli sono di natura idealistica, il che significa che rappresentano una soluzione ideale basata su specifiche ipotesi. Queste ipotesi possono derivare da un insieme di regole opinionate, probabilistiche o generalizzate e assumono che esista un modello ben definito tra gli input e gli output. Anche se questo può sembrare simile alla modellazione con dati stocastici, la differenza principale è che il modello viene ora determinato da queste ipotesi predefinite anziché dai dati di addestramento. Ora potrebbe sorgere una domanda nella tua mente chiedendo: “Beh, se non sto addestrando il modello sui dati, da dove ottengo queste ipotesi di modello?”. La risposta a questa domanda è piuttosto semplice ma a volte trascurata: conoscenza del dominio. La conoscenza del dominio è un insieme di regole e concetti noti su un argomento specifico. È attraverso la conoscenza del dominio che si derivano le ipotesi, che fungono da fondamento per la modellazione deterministica. In qualsiasi linguaggio di programmazione, questi modelli deterministici possono essere scritti utilizzando codice personalizzato, ma man mano che i modelli diventano più complessi, sono stati scritti librerie per affrontare specificamente questo compito. In Python, una di queste librerie chiamata GEKKO sarà esplorata.

GEKKO è una libreria Python per facilitare l’esecuzione del linguaggio di modellazione Advanced process monitor ( APMonitor ). Offre una serie di funzioni e caratteristiche adattate alle esigenze della modellazione deterministica, facilitando la creazione e l’analisi di modelli complessi. Può risolvere sia equazioni algebriche differenziali che intere miste, ed è accoppiato con risolutori su larga scala per la programmazione lineare, quadratica, non lineare e intera mista. GEKKO ha 9 tipi di problemi con cui definire una configurazione del modello deterministico. Tuttavia, per questo articolo, verrà considerata solo una stima a orizzonte mobile ( MHE ) che risolve tutte le equazioni contemporaneamente. La modalità MHE viene utilizzata per stimare gli stati di un sistema dinamico minimizzando la discrepanza tra le uscite misurate e le previsioni del modello formulate da un problema di ottimizzazione con un obiettivo. Ciò viene fatto applicando una stima ricorsiva o una stima a finestra mobile.

Uff! Questo è stato parecchio gergo, ma tutto avrà senso presto con l’esempio pratico seguente.

Il volo spaziale è un’incredibile conquista umana. L’impresa di inviare qualcosa di fatto dall’uomo nello spazio è una meraviglia sia dell’ingegneria che dell’ingegnosità. Ma inviare qualcosa nello spazio è piuttosto costoso. Quindi, costruire razzi con la sicurezza della loro capacità di funzionare come previsto è cruciale. Raccogliere dati di un vero lancio dal vivo è utile per migliorare le prestazioni di un futuro razzo. Ma un razzo doveva essere lanciato prima per ottenere i dati, e qui sta il problema. Nessun dato stocastico, nessun modello basato su stocastico. Entra il modello deterministico e GEKKO . Le ipotesi per un modello deterministico di un razzo sono piuttosto semplici, hai indovinato, la scienza dei razzi! Ciò significa che, senza dover nemmeno lanciare un razzo di un pollice da terra, possiamo invece utilizzare le leggi della fisica per determinare come si comporterà una configurazione di razzo specifica in uno scenario idealistico. Ad esempio, riproduciamo la configurazione del razzo Falcon 1 Stage 1 di SpaceX utilizzando GEKKO .

Per iniziare, utilizziamo informazioni pubblicamente note [1] [2] per la configurazione del razzo Falcon 1 Stage 1 e cominciamo definendo alcune costanti di simulazione e valori noti.

Ora possiamo davvero iniziare con le cose interessanti in GEKKO. Dal momento che stiamo lavorando con una simulazione basata sul tempo, definiamo prima i nostri componenti temporali:

  • Il tempo di volo del razzo sarà di 200 secondi
  • Il tempo di combustione del carburante è di 161,6 secondi
  • E un componente temporale aggiuntivo da utilizzare successivamente

Con l’array di tempo impostato, possiamo inizializzare un modello GEKKO e impostare il componente temporale del modello. Il passo successivo è definire le variabili che devono essere risolte ad ogni passo temporale. Queste variabili sono determinate dalle ipotesi che faremo per il nostro razzo, ma possono includere anche variabili che potremmo essere interessati a valutare alla fine della simulazione. Per mantenere semplice questa simulazione, le variabili sono:

  • Massa
  • Distanza
  • Velocità
  • Forza generata dalla spinta
  • Componente temporale fittizio aggiuntivo da utilizzare successivamente

Per ciascuna di queste variabili possiamo fornire un valore iniziale e impostare limiti inferiori e superiori per vincolarle. Le variabili GEKKO sono il modo più generico per definire le variabili di nostro interesse. Tuttavia, esistono effettivamente molte altre opzioni come variabili fisse, controllate e manipolate che danno all’utente molto più controllo su come possono evolvere. Dovresti dar loro un’occhiata!

Prima di continuare, è importante notare che per il bene del tuo tempo di lettura e per non appesantire troppo con la matematica, questo modello di razzo trascurerà molte delle assunzioni note sulla fisica dei razzi. Queste includono il cambiamento della densità dell’aria e della gravità mentre il razzo sale, gli effetti della forza di Coriolis e molti componenti di ingegneria meccanica. Tuttavia, con le ipotesi che vengono fatte, saranno coperte le forze principali che influenzano il volo e la dinamica di un razzo. E ora, è probabilmente un buon momento per introdurle e anche per spiegare quanto sia semplice applicarle in GEKKO.

Come per qualsiasi oggetto in movimento classico, si applicano le leggi del moto di Newton. Questo significa che abbiamo già un’idea di come si muoverà questo razzo. Ma facciamo un breve riepilogo delle equazioni differenziali di cui avremo bisogno per farlo. Non preoccuparti, sono davvero semplici. Iniziamo definendo l’equazione per come il razzo si muoverà e coprirà la distanza,

Wow! Questa è fisica di base, la velocità dell’oggetto è semplicemente un cambiamento nella distanza su un cambiamento nel tempo. Successivamente, aggiungiamo la forza resistiva che il razzo sperimenterà mentre si muove nell’aria, P.S. è una vera e propria resistenza.

Con questo, possiamo stabilire un’altra relazione tra la forza e la velocità. Ricorda,

Bene, con questo possiamo collegare tutte le forze che il razzo sperimenterà (spinta in avanti, resistenza e ovviamente gravità) con la velocità. Ecco come,

Prometto che è stata l’equazione più difficile per questa simulazione. Rimangono solo altre due ipotesi da fare per il nostro razzo prima che decolli. Uno di essi riguarda il carburante nel razzo. Se il razzo sta bruciando il suo carburante come propellente, un’idea intelligente è descrivere come deve cambiare la massa del razzo. Per fare questo, diciamo semplicemente che la perdita di massa ha una relazione lineare con la spinta massima e il tempo di combustione come questo,

L’ultima ipotesi riguarda ciò che succede quando il carburante è completamente esaurito. Questa è davvero interessante perché è una dichiarazione logica e GEKKO ha qualcosa per questo anche.

Con tutto ciò fatto, possiamo ora mettere insieme tutti i pezzi e costruire il nostro modello deterministico.

Si noti che nel codice sopra ci sono alcune cose extra che non sono state menzionate. Prima è stata chiamata un’equazione temporale fittizia, questo serve per tenere traccia del tempo quando il carburante finisce. Successivamente è stato utilizzato un obiettivo di ottimizzazione. Perché è stato fatto ciò? Beh, l’MHE risolve un obiettivo, in questo caso cercando di far raggiungere al razzo l’altezza massima dal suolo ad ogni passo temporale. È possibile provare altre funzioni di obiettivo basate su ciò che si desidera ottimizzare (ad esempio, prova a dare una chance a m.fix_final(h, 50e3) e poi m.Obj(thrust*v) per cercare di essere parsimoniosi con il carburante del razzo). Un’ultima cosa è che GEKKO stamperà se la simulazione è riuscita a trovare una soluzione ottimale o meno. Per questa simulazione, si vedrà che in realtà avevamo gradi di libertà negativi. Questo è un trucco nell’uso di m.if3 e di solito può causare la mancata risoluzione della simulazione. Quindi, se si desidera provare qualcosa di più elaborato, si può provare a usare m.if2 al suo posto.

Infine, è arrivato il momento di vedere i frutti della nostra simulazione. Per ottenere una visione buona e veloce di ciò che la simulazione ha risolto, tracciare i risultati è un ottimo modo per visualizzarli.

Analizzando le prestazioni del razzo si ottengono interessanti spunti. In primo luogo, ha raggiunto un’altezza massima di 73,83 km e una velocità massima di 802,15 m/s. In secondo luogo, il razzo ha avuto una spinta media di 322,68 kN bruciando una notevole quantità di energia pari a 19,59 GJ durante il volo.

Questi risultati ci offrono informazioni cruciali sulle capacità e le prestazioni del razzo, anche prima di costruirlo. Ancora meglio, i parametri possono essere facilmente regolati e ottimizzati insieme all’aumentare della complessità per mostrare veramente il potenziale incredibile che la modellazione deterministica porta sul tavolo. Con tutte queste informazioni disponibili, tali conoscenze possono essere utilizzate ulteriormente per aiutare gli ingegneri nelle ottimizzazioni di progettazione e nel bilancio per tali progetti costosi.

Mentre i razzi sono fantastici e tutto, applicazioni più realistiche della modellazione deterministica includono l’ottimizzazione di molti tipi diversi di sistemi. Esempi di tali sistemi sono: la linea di produzione in una fabbrica, il controllo del traffico e la pianificazione dei percorsi, la simulazione della diffusione complessa di infezioni e malattie, la modellazione dei cambiamenti climatici e dei loro effetti e persino l’utilizzo di modelli di teoria dei giochi basati sulla deterministica nella finanza.

Per concludere, la modellazione deterministica è una grande opzione per trovare soluzioni per scenari idealistici che possono essere ben descritti dalla conoscenza di dominio. Possono essere utilizzati per modellare sistemi complessi non lineari e fornire previsioni solide e probabilistiche prima della disponibilità dei dati del mondo reale. In definitiva, la modellazione deterministica è uno strumento potente per coloro che desiderano padroneggiarlo.

[1] Propulsion Falcon-I (http://www.b14643.de/Spacerockets_2/United_States_2/Falcon-I/Propulsion/engines.htm)

[2] Falcon 1 (https://en.wikipedia.org/wiki/Falcon_1)