import numpy as np
import scipy.linalg as linalg
import scipy.signal as signal
import warnings
"error") warnings.filterwarnings(
In Octave oder Matlab steht uns mit covar
eine Methode zur Verfügung, mit welcher wir die stationäre Kovarianz des Zustandsvektors scipy
noch in control
.
Dabei ist covar
wieder mit der
Kovarianz eines zeitdiskretes Systems
Gegeben sei ein lineares System, das von Eingängen mit weißem Gauß’schen Rauschen gesteuert wird. Dieses Rauschen ist also kein Kontrolleingang sondern eine Störung. In Form eines Zustandsraums wird dieses System wie folgt dargestellt:
wobei
Bei den Eingangsstörungen
gegeben ist.
Analyse stochastischer linearer Systeme
Wir wollen hier nun stochastische zeitdiskrete zeitinvariante lineare Systeme analysieren. Dafür verwenden wir ein etwas andere Notation. Um den zeitlichen Zusammenhang stärker herauszustellen schreiben wir statt
Gegeben sei das System
Der Anfangszustand
Der Eingangsvektor
Der momentane Erwartungswert des Zustandsvektors kann offenbar aus der folgenden zeitdiskreten Bewegungsgleichung berechnet werden:
Da der Vektor-Zufallsprozeß
Für eine stabile Matrizen
Die Kovarianzmatrix des Ausgangs
konvergiert für stabile System zu
Für instabile System (Spektralradius
Die Verbindung zur
gegeben. Die
Wir verwenden im Code statt
Zusammengefasst lässt sich ein Zustandsraumverfahren wie folgt berechnen:
- Berechne eine Zustandsrealisierung aus der Übertragungsfunktion
- Löse die Lyapunov Gleichung, (dabei muss gelten
)
Code
def covar_d(A,B,C,D,W):
""" naive implementation of covar for linear time-discrete systems (d-LTI)
(there might be better ways to do that)
"""
if np.all(np.abs(linalg.eigvals(A)) <= 1):
= linalg.solve_discrete_lyapunov(A.T, B@W@B.T)
Px = C@Px@C.T + D@W@D.T
Py else:
= np.inf
Px = np.inf
Py return [Px, Py]
def covar_d_data(tout,yout,xout):
""" data based approximation of covar for linear time-discrete systems (d-LTI)
(there might be better ways to do that)
"""
# catch overflow
try:
= xout.T@xout/len(tout)
Px = yout.T@yout/len(tout)
Py except RuntimeWarning:
= np.inf
Px = np.inf
Py return [Px, Py]
Stabiles System
= np.array([[0.5, 0.1],[0.1, 0.5]])
Ad_stable print(np.abs(linalg.eigvals(Ad_stable)) <= 1.)
= np.array([[0.],[1.]])
Bd = np.eye(2)*0.5
Cd = np.zeros((2,1))
Dd = np.eye(1)*5
Wd
= covar_d(Ad_stable,Bd,Cd,Dd,Wd)
Px, Py print(Px)
print(Py)
[ True True]
[[0.15174655 0.46502976]
[0.46502976 6.73069392]]
[[0.03793664 0.11625744]
[0.11625744 1.68267348]]
Wir wollen die modellbasierte Variante mit einer datenbasierten Variante vergleichen. Dazu erzeugen wir Eingangsdaten und Ausgangsdaten.
= signal.StateSpace(Ad_stable, Bd, Cd, Dd, dt=1.)
G_sys = np.sqrt(Wd)*np.random.randn(100000)
w_in = signal.dlsim(G_sys, w_in.T) tout, yout, xout
= covar_d_data(tout, yout, xout)
Px_data, Py_data print(Px_data)
print(Py_data)
[[0.15053712 0.45885585]
[0.45885585 6.70173513]]
[[0.03763428 0.11471396]
[0.11471396 1.67543378]]
print(linalg.norm(Px - Px_data)/linalg.norm(Px))
print(linalg.norm(Py - Py_data)/linalg.norm(Py))
0.004474953153232987
0.004474953153232987
Beide Varianten stimmen sehr gut überein. Die Differenz erklärt sich einerseits durch die endlichen Daten und die numerische Ungenaugikeit. np.float128
könnte bessere Ergebnisse liefern.
Instabiles System
= np.array([[1.5, 0.1], [0.1, 1.5]])
Ad_unstable print(np.abs(linalg.eigvals(Ad_unstable)) < 1.)
= covar_d(Ad_unstable,Bd,Cd,Dd,Wd)
Px, Py print(Px)
print(Py)
[False False]
inf
inf
= signal.StateSpace(Ad_unstable, Bd, Cd, Dd, dt=1.)
G_sys = np.sqrt(Wd)*np.random.randn(100000)
w_in = signal.dlsim(G_sys, w_in.T) tout, yout, xout
= covar_d_data(tout,yout,xout)
Px_data, Py_data print(Px_data)
print(Py_data)
inf
inf
Die Kovarianmatrizen werden zu groß und erzeugen deshalb eine Laufzeitwarnung, welche abgefangen wird.
Fazit
Die Kovarianzmatrizen kommen in vielen wissenschaftlichen Aufsätzen zum Einsatz, vor allem in Aufsätzen in denen Schätzer analysiert werden (Kalmanfilter, Systemidentifikation, Adaptive Regelung, Bestärkendes Lernen, …).
Die Kovarianzmatrizen stehen mit der
Referenzen
- Optimal Sampled-Data Control Systems (Tongwen Chen und Bruce Francis, 1994)
- Essentials of Robust Control (Kemin, Zhoun, John C. Doyle, 1997)
- Regelungstechnik, Mathematische Grundlagen, Entwurfsmethoden, Beispiele (Geering, 2004)