Arbeiten mit ODEs
Physikalische Systeme können typischerweise durch Differentialgleichungen oder Gleichungen, die Ableitungen enthalten, modelliert werden. Kräfte, daher Newtons Gesetze, können als Ableitungen ausgedrückt werden, ebenso wie Maxwells Gleichungen, sodass Differentialgleichungen die meisten physikalischen Probleme beschreiben können. Eine Differentialgleichung beschreibt, wie sich ein System basierend auf dem aktuellen Zustand des Methods ändert, und definiert so faktisch den Zustandsübergang. Differentialgleichungssysteme können in Matrix-/Vektorform geschrieben werden:
Dabei ist x der Zustandsvektor, A die aus der physikalischen Dynamik ermittelte Zustandsübergangsmatrix und x dot (oder dx/dt) die Zustandsänderung bei zeitlicher Änderung. Im Wesentlichen wirkt Matrix A auf den Zustand x ein, um ihn um einen kleinen Zeitschritt voranzutreiben. Diese Formulierung wird typischerweise für lineare Gleichungen verwendet (wobei Elemente von A keinen Zustandsvektor enthalten), kann aber für nichtlineare Gleichungen verwendet werden, bei denen die Elemente von A Zustandsvektoren haben können, die zu dem oben beschriebenen komplexen Verhalten führen können. Diese Gleichung beschreibt, wie sich eine Umgebung oder ein System ausgehend von einem bestimmten Ausgangszustand im Laufe der Zeit entwickelt. In der Mathematik werden diese als Anfangswertprobleme bezeichnet, da zur Beurteilung der Entwicklung des Methods die Angabe eines Ausgangszustands erforderlich ist.
Der obige Ausdruck beschreibt eine bestimmte Klasse von Differentialgleichungen, gewöhnliche Differentialgleichungen (ODE), bei denen die Ableitungen alle von einer Variablen stammen, normalerweise von der Zeit, gelegentlich aber auch vom Raum. Der Punkt bezeichnet dx/dt oder eine Zustandsänderung mit inkrementeller zeitlicher Änderung. ODEs sind intestine untersucht und für lineare ODE-Systeme steht eine breite Palette analytischer Lösungsansätze zur Verfügung. Analytische Lösungen ermöglichen es, Lösungen in Type von Variablen auszudrücken, was sie für die Untersuchung des gesamten Systemverhaltens flexibler macht. Für nichtlineare Systeme gibt es weniger Ansätze, für bestimmte Systemklassen stehen jedoch analytische Lösungen zur Verfügung. Zum größten Teil lassen sich nichtlineare (und einige lineare) ODEs jedoch am besten durch Simulation lösen, wobei die Lösung in jedem Zeitschritt als numerische Werte ermittelt wird.
Bei der Simulation geht es darum, eine Annäherung an die Differentialgleichung zu finden, oft durch Transformation in eine algebraische Gleichungdas über eine kleine Zeitänderung bis zu einem bekannten Grad genau ist. Laptop können dann im Laufe der Zeit viele kleine Änderungen durchlaufen, um zu zeigen, wie sich das System entwickelt. Zur Berechnung dieses Willens stehen zahlreiche Algorithmen zur Verfügung, beispielsweise ODE45 von Matlab oder die Funktionsolve_ivp von Python SciPy. Diese Algorithmen nehmen eine ODE und einen Startpunkt/Anfangszustand an, bestimmen automatisch die optimale Schrittgröße und durchlaufen das System bis zur angegebenen Endzeit.
Wenn wir die richtigen Steuereingaben an ein ODE-System anwenden können, können wir es oft in einen gewünschten Zustand bringen. Wie beim letzten Mal besprochen, bietet RL einen Ansatz zur Bestimmung der richtigen Eingaben für nichtlineare Systeme. Um RLs zu entwickeln, werden wir erneut die Turnhallenumgebung verwenden, dieses Mal werden wir jedoch eine benutzerdefinierte Turnhallenumgebung basierend auf unserem eigenen ODE erstellen. Nachfolgend GymnasialdokumentationWir schaffen einen Beobachtungsraum, der unseren Zustandsraum abdeckt, und einen Aktionsraum für den Kontrollraum. Wir initialisieren/setzen das Gymnasium auf einen beliebigen Punkt innerhalb des Zustandsraums (wobei wir hier vorsichtig sein müssen, nicht alle gewünschten Endzustände). sind immer erreichbar von jedem Ausgangszustand für einige Systeme). In der Schrittfunktion des Gymnasiums machen wir einen Schritt über einen kurzen Zeithorizont in unserem ODE, indem wir die vom Algorithmus geschätzte Eingabe mithilfe der Python SciPy-Funktion „solve_ivp“ anwenden. Solve_ivp ruft eine Funktion auf, die die jeweilige ODE enthält, mit der wir arbeiten. Der Code ist verfügbar unter Fool. Die Init- und Reset-Funktionen sind unkompliziert; Init erstellt einen Beobachtungsraum für jeden Zustand im System und Reset legt einen zufälligen Startpunkt für jede dieser Variablen innerhalb der Domäne in einem Mindestabstand vom Ursprung fest. Beachten Sie in der Schrittfunktion die Zeile „solve_ivp“, die die eigentliche Dynamik aufruft, die Dynamik-ODE über einen kurzen Zeitschritt löst und dabei die angewendete Steuerung Okay übergibt.
#taken from https://www.gymlibrary.dev/content material/environment_creation/
#create fitness center for Moore-Greitzer Mannequin
#motion area: steady +/- 10.0 float , possibly make scale to mu
#commentary area: -30,30 x2 float for x,y,zand
#reward: -1*(x^2+y^2+z^2)^1/2 (attempt to drive to 0)#Moore-Grietzer mannequin:
from os import path
from typing import Elective
import numpy as np
import math
import scipy
from scipy.combine import solve_ivp
import gymnasium as fitness center
from gymnasium import areas
from gymnasium.envs.classic_control import utils
from gymnasium.error import DependencyNotInstalled
import dynamics #native library containing formulation for solve_ivp
from dynamics import MGM
class MGMEnv(fitness center.Env):
#no render modes
def __init__(self, render_mode=None, dimension=30):
self.observation_space =areas.Field(low=-size+1, excessive=size-1, form=(2,), dtype=float)
self.action_space = areas.Field(-10, 10, form=(1,), dtype=float)
#must replace motion to regular distribution
def _get_obs(self):
return self.state
def reset(self, seed: Elective(int) = None, choices=None):
#want under to seed self.np_random
tremendous().reset(seed=seed)
#begin random x1, x2 origin
np.random.seed(seed)
x=np.random.uniform(-8.,8.)
whereas (x>-2.5 and x<2.5):
np.random.seed()
x=np.random.uniform(-8.,8.)
np.random.seed(seed)
y=np.random.uniform(-8.,8.)
whereas (y>-2.5 and y<2.5):
np.random.seed()
y=np.random.uniform(-8.,8.)
self.state = np.array((x,y))
commentary = self._get_obs()
return commentary, {}
def step(self,motion):
u=motion.merchandise()
outcome=solve_ivp(MGM, (0, 0.05), self.state, args=(u))
x1=outcome.y(0,-1)
x2=outcome.y(1,-1)
self.state=np.array((x1.merchandise(),x2.merchandise()))
finished=False
commentary=self._get_obs()
information=x1
reward = -math.sqrt(x1.merchandise()**2)#+x2.merchandise()**2)
truncated = False #placeholder for future expnasion/limits if answer diverges
information = x1
return commentary, reward, finished, truncated, {}
Nachfolgend finden Sie die Dynamik der Moore-Greitzer-Modus-Funktion (MGM). Diese Implementierung basiert auf der Solve_ivp-Dokumentation. Es werden Grenzen gesetzt, um Lösungsdivergenzen zu vermeiden. Wenn das System die Grenzwerte erreicht, ist die Belohnung gering, was den Algorithmus dazu veranlasst, den Kontrollansatz zu überarbeiten. Das Erstellen von ODE-Turnhallen auf der Grundlage der hier besprochenen Vorlage sollte unkompliziert sein: Ändern Sie die Größe des Beobachtungsraums, um sie an die Abmessungen des ODE-Methods anzupassen, und aktualisieren Sie die Dynamikgleichung nach Bedarf.
def MGM(t, A, Okay):
#non-linear approximation of surge/stall dynamics of a fuel turbine engine per Moore-Greitzer mannequin from
#"Output-Feedbak Cotnrol on Nonlinear techniques utilizing Management Contraction Metrics and Convex Optimization"
#by Machester and Slotine
#2D system, x1 is mass circulation, x2 is strain improve
x1, x2 = A
if x1>20: x1=20.
elif x1<-20: x1=-20.
if x2>20: x2=20.
elif x2<-20: x2=-20.
dx1= -x2-1.5*x1**2-0.5*x1**3
dx2=x1+Okay
return np.array((dx1, dx2))
Für dieses Beispiel verwenden wir eine ODE, die auf dem Moore-Greitzer-Modell (MGM) basiert, um die Pump-Stall-Dynamik von Gasturbinentriebwerken zu beschreiben¹. Diese Gleichung beschreibt gekoppelte gedämpfte Schwingungen zwischen Motormassenstrom und -druck. Das Ziel des Reglers besteht darin, Schwingungen schnell auf Null zu dämpfen, indem er den Druck auf den Motor steuert. MGM hat „eine wesentliche Entwicklung des nichtlinearen Steuerungsdesigns motiviert“ und es zu einem interessanten Testfall für die SAC- und GP-Ansätze gemacht. Code, der die Gleichung beschreibt, finden Sie unter Github. Außerdem sind drei weitere nichtlineare ODEs aufgeführt. Der Van-Der-Pol-Oszillator ist ein klassisches nichtlineares Schwingsystem, das auf der Dynamik elektronischer Systeme basiert. Der Lorenz-Attraktor ist ein scheinbar einfaches System von ODEs, das chaotisches Verhalten oder Ergebnisse hervorrufen kann, die sehr empfindlich auf Anfangsbedingungen reagieren, sodass jede unendlich kleine Abweichung im Ausgangspunkt in einem unkontrollierten System bald zu stark divergierenden Zuständen führt. Das dritte ist ein Imply-Discipline-ODE-System von Duriez/Brunton/Noack, das die Entwicklung komplexer Wechselwirkungen stabiler und instabiler Wellen als Annäherung an turbulente Flüssigkeitsströmungen beschreibt.
Um eine Wiederholung der Analyse des letzten Artikels zu vermeiden, präsentieren wir hier lediglich die Ergebnisse und weisen darauf hin, dass der GP-Ansatz wiederum einen besseren Controller in kürzerer Rechenzeit lieferte als der SAC/neuronale Netzwerk-Ansatz. Die folgenden Abbildungen zeigen die Schwingungen eines ungeregelten Methods unter dem GP-Regler und unter dem SAC-Regler.
Beide Algorithmen verbessern die unkontrollierte Dynamik. Wir sehen, dass der SAC-Controller zwar schneller arbeitet (ca. 20 Zeitschritte), aber eine geringe Genauigkeit aufweist. Der GP-Controller braucht etwas länger, um zu reagieren, sorgt aber für ein reibungsloses Verhalten in beiden Zuständen. Auch als vorGP konvergierte in weniger Iterationen als SAC.
Wir haben gesehen, dass Turnhallen leicht übernommen werden können, um das Coaching von RL-Algorithmen auf ODE-Systemen zu ermöglichen, haben kurz besprochen, wie leistungsfähig ODEs für die Beschreibung und damit Erforschung der RL-Steuerung der physikalischen Dynamik sein können, und haben erneut gesehen, dass der GP bessere Ergebnisse liefert. Allerdings haben wir noch nicht versucht, einen der beiden Algorithmen zu optimieren, sondern haben uns bei der Einrichtung im Wesentlichen auf eine Schätzung der grundlegenden Algorithmusparameter gestützt. Wir werden dieses Manko jetzt beheben, indem wir die MGM-Studie erweitern.