from sympy import init_printing
init_printing()
from sympy import *
Bei der Eingangs-Zustandslinearisierung ist der Ausgang
Für die Überprüfung der Existenz eines Ausganges mit relativem Grad
Die Theorie der differential-geometrischen Regelungstechnik ist sehr gut ausgebaut, jedoch alles andere als trivial. Für das Erlernen dieser Techniken sollte viel Zeit eingeplant werden. An den Universitäten werden dafür meist mehrere Vorlesungen benötigt, um diese Theorie vollständig einzuführen.
Es soll hier nur gezeigt werden, dass Python / Sympy auf für nichtlineare Methoden gut geeignet ist.
Lie-Klammer
Die Lie-Klammer ist folgendermaßen definiert
wobei hier sowohl
Auch die Lie-Klammer (Lie-Ableitung der Vektorfelder) kann wie die Lie-Ableitung der skalaren Funktionen rekursive angewendet werden. Die k-fache Lie-Klammer lässt sich in der Form
mit dem Operator
Existenz eines Ausganges mit relativem Grad r = n)
Für SISO Systeme ist es notwendig aber nicht hinreichend, dass die Matrix
den Rang
Beispiel
Dieses Beispiel ist aus dem Vorlesungskript von Andreas Kugi, TU Wien entnommen.
Gegeben sei das AI-System
Das Durchführen der Rechnung führt auf das Ergebnis
Wir wollen diese Berechnung nun in Python / Sympy durchführen.
def jac(f,x):
return f.jacobian(x)
def lie_deriv(f, h, x, n=1):
""" Lie-derivative of a scalar function h with respect to a vector-field f
"""
if n==0:
= h
Lfh else:
= h.jacobian(x)@f
Lfh for i in range(1,n):
= Lfh.jacobian(x)@f
Lfh return Lfh
def lie_braket(f, g, x, n=1):
""" Lie-bracket, Lie-derivative of a vector-field g with respect to another vector-field f
"""
if n==0:
= g
adfg else:
= g.jacobian(x)@f - f.jacobian(x)@g
adfg for i in range(1,n):
= adfg.jacobian(x)@f - f.jacobian(x)@adfg
adfg return adfg
= symbols('x1 x2 x3 x4', real=True)
x1, x2, x3, x4 = Matrix([[x1],[x2],[x3],[x4]]) x_vec
= symbols('c g l m', positive=True)
c, g, l, m = symbols('I1 d1', positive=True)
I1, d1 = symbols('I2 d2', positive=True) I2, d2
= Matrix([
f
[x3],
[x4],-c/I1*x1+c/I1*x2-d1/I1*x3],
[/I2*x1-c/I2*x2-m*g*l/I2*cos(x2)-d2/I2*x4]
[c
])
f
= Matrix([
g 0],
[0],
[1/I1],
[0]
[
]) g
= lie_braket(f, g, x_vec,n=0)
adf0g = lie_braket(f, g, x_vec,n=1)
adf1g = lie_braket(f, g, x_vec,n=2)
adf2g = lie_braket(f, g, x_vec,n=3)
adf3g = adf0g
M = M.col_insert(1,adf1g)
M = M.col_insert(2,adf2g)
M = M.col_insert(3,adf3g)
M simplify(M)
M.rank()
Die Matrix
hat also den vollen Rang
Fazit
Python / Sympy bietet viele Möglichkeiten für die nichtlineare Regelungtechnik. Dieser Blogeintrag bezieht sich auf differentialgeometrischen Methoden, genauer auf die Exakte Eingangs-Zustandslinearisierung im Eingrößenfall.
Sind die nichtlinearen Regler einmal hergeleitet, so können diese mithilfe der Python-Control Submodule wie control.flatsys
oder control.NonlinearIOSystem
implementiert werden.
Referenzen
- Nichtlineare Systeme und Regelungen, 3. Auflage (Jürgen Adamy, 2018)
- The Geometry of Physics, Third Edition (Theodore Frankel, 2012)
- Regelsysteme 2 (Andreas Kugi, Vorlesung SS 2021)