Übertragungsfunktion / Zustandsraummodell der RLC-Serienschaltung und Simulation von Python

Überblick

Studiennotizen zur Steuerungstechnik. Der Zweite.

Letztes Mal ist eine Python-Bibliothek für Steuerungssysteme. "[[] Ich habe mit "Python Control Systems Library" (https://python-control.readthedocs.io/en/0.8.3/index.html) simuliert.

Dieses Mal finden wir für die ** RLC-Reihenschaltung ** das Übertragungsfunktions- / Zustandsraummodell aus der Schaltungsgleichung und simulieren es mit Python.
![2020-04-28_09h00_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/f10d0f88-eba1-d2ca-9ebc-75858504a7d3. png)

Schaltungsgleichung

Normalerweise wird die Schaltungsgleichung unter Verwendung von ** Strom ** $ i (t) $ wie folgt formuliert.

v_{i}(t) = Ri(t) + L\frac{\mathrm{d}}{\mathrm{dt}}i(t) + \frac{1}{C}\int^{t}_{0} i(\tau)\,\mathrm{d} \tau

Um jedoch dem mechanischen System von vorherige zu entsprechen, berechnen Sie ** $ q (t) $ unter Verwendung der folgenden Beziehung. Ich werde die Schaltungsgleichung mit schreiben.

i(t) = \frac{\mathrm{d}}{\mathrm{dt}}q(t)

Die Schaltungsgleichung mit der Ladung $ q (t) $ lautet wie folgt.

v_{i}(t) = R\frac{\mathrm{d}}{\mathrm{dt}}q(t) + L\frac{\mathrm{d}^2}{\mathrm{dt}^2}q(t) + \frac{1}{C}q(t)

Organisieren Sie die Formel, indem Sie die Differenzierung in Punktnotation ändern.

L \ddot{q}(t) + R \dot{q}(t) + \frac{1}{C}q(t) = v_{i}(t)

Dies hat die gleiche Form wie die Bewegungsgleichung (unten) des Qualitätspunkts mit einem Freiheitsgrad in dem in [vorherigen] gezeigten Feder-Masse-Dämpfer-System (https://qiita.com/code0327/items/10fb56090a1e56046fa4). Sie können sehen, dass.

m\ddot{y}(t) + c\dot{y}(t) + ky(t) = f(t)

Modellieren Sie das System mit einer Übertragungsfunktion

Im Modell der Mechanik wurde die Übertragungsfunktion mit der Kraft $ f (t) $ als ** Eingabe ** in das System und der Verschiebung $ y (t) $ als ** Ausgabe ** vom System berechnet.

Wenn dies dem entspricht, wird die Übertragungsfunktion erhalten, indem die Eingangsspannung $ v \ _i (t) $ als ** Eingang ** für das System und die Ladung $ q (t) $ als ** Ausgang ** vom System verwendet wird. Es ist jedoch nicht einfach, die ** Gebühr ** $ q (t) $ ** ** direkt zu beobachten (zu messen). In der Realität ist auch die Spannung jedes Elements von Interesse. Daher ** Im Fall eines Stromkreises wird die Übertragungsfunktion unter Verwendung der Spannung als Ausgang ** berechnet.

Hier ist die Eingangsspannung $ v \ i (t) $ ** Eingang ** $ u (t) $ in das System, die Spannung über dem Kondensator $ v {C} (t) $ ist der Systemausgang **. Finden Sie die Übertragungsfunktion mit $ y (t) $.

Eingabe \, \, \, u (t) = v_ {i} (t)
Ausgabe \, \, \, y (t) = v_ {C} (t) = \ frac {1} {C} q (t)

Machen Sie die obige Ausgabe zu einem Ausdruck für $ q (t) $.

q(t) = Cy(t)

Ändern Sie dies in die obige Schaltungsgleichung $ L \ ddot {q} (t) + R \ dot {q} (t) + \ frac {1} {C} q (t) = v_ {i} (t) $ Ersatz zu bekommen:

LC \ddot{y}(t) + RC \dot{y}(t) + y(t) = u(t)

Laplace-Konvertierung davon, um das System zu finden ** Übertragungsfunktion ** $ G (s) = Y (s) / U (s) $ (zu diesem Zeitpunkt $ \ dot {y}) (Angenommen 0) = 0 $ und $ y (0) = 0 $).

LCs^2Y(s) + RCsY(s) + Y(s) = U(s)
\big(LCs^2+ RC s + 1\big) Y(s) = U(s)
G(s) = \frac{Y(s)}{U(s)} = \frac{1}{LC s^2 + RC s + 1}

Im dynamischen Modell ist die Übertragungsfunktion mit Kraft als Eingabe und Verschiebung als Ausgabe, Masse als $ m $, Dämpfungskoeffizient als $ c $ und Federkonstante als $ k $ wie folgt. Sie können sehen, dass sowohl das mechanische System als auch das Schaltungssystem sehr ähnliche Formen haben.

G(s) = \frac{Y(s)}{F(s)} = \frac{1}{m s^2 + c s + k}

Modellierung / Simulation mit Python

Verwenden Sie zur Simulation die ** Python Control Systems Library ** von Python. Stellen Sie die Übertragungsfunktion ein, um das System zu modellieren und die ** Sprungantwort ** zu simulieren.

Im mechanischen System haben wir die ** Impulsantwort ** simuliert, um die Verschiebung zu beobachten, wenn eine Kraft für einen Moment auf den Qualitätspunkt ausgeübt wird, aber im Stromkreis ist die Eingangsspannung $ v_ {i} (t) = 1 \ Da es natürlicher ist, die Kondensatorspannung $ v_ {C} $ zu beobachten, wenn (t \ ge0) $ eingestellt ist, schauen wir uns die ** Sprungantwort ** an.

Vorbereitung (Google Colab.Umgebung)


!pip install --upgrade sympy
!pip install slycot
!pip install control

Sprungantwortsimulation (Übertragungsfunktion)


import numpy as np
import control.matlab as ctrl
import matplotlib.pyplot as plt

R = 2       #Widerstandswert
L = 1e-3    #Intensität
C = 10e-6   #Kapazität

sys = ctrl.tf((1),(L*C,R*C,1))
print(sys)

t_range = (0,0.01)
y, t = ctrl.step(sys, T=np.linspace(*t_range, 400))

plt.figure(figsize=(7,4),dpi=120,facecolor='white')
plt.hlines(1,*t_range,colors='gray',ls=':')
plt.plot(t,y)
plt.xlim(*t_range)
plt.ylim(bottom=0)
plt.show()

Ausführungsergebnis


      1
------------
s^2 + s + 10

f1.png

Wenn die Eingangsspannung $ v_ {i} (t) = 1 , (t \ ge0) $ ist, vibriert die Kondensatorspannung $ v_ {C} $ zuerst und schließlich $ 1 , \ [\ Sie können sehen, dass es sich auf mathrm {V} ] $ einstellt.

Modelliert mit einem Zustandsraummodell

Beschreiben Sie das System wie folgt als Zustandsraummodell $ \ mathcal {P} $.

python


\mathcal{P}\,:\,\left\{
\begin{array}{l}
\dot{\boldsymbol{x}} = \mathbf{A}\boldsymbol{x} + \mathbf{B}\boldsymbol{u}&Zustandsgleichung\\
\boldsymbol{y} = \mathbf{C}\boldsymbol{x} + \mathbf{D}\boldsymbol{u}&Ausgangsgleichung (Beobachtungsgleichung)
\end{array}
\right.

Zur Vorbereitung ist die Schaltungsgleichung $ LC \ ddot {y} (t) + RC \ dot {y} (t) + y (t) = u (t) $, $ \ ddot {y} (t) = .. Verwandle es in. $.

\ddot{y}(t) = -\frac{1}{LC} y(t)- \frac{R}{L} \dot{y}(t) + \frac{1}{LC} u(t)

Als $ x \ _1 (t) = y (t) $, $ x \ _2 (t) = \ dot {y} (t) $, ** Zustand ** $ \ boldsymbol {x} = \ [x \ _1 , , x \ _2] ^ T $ ist gesetzt.

Daraus ergibt sich $ \ dot {x} \ _1 (t) = \ dot {y} (t) = x \ _2 $. Außerdem ist $ \ dot {x} \ _2 (t) = - \ frac {1} {LC} y (t) - \ frac {R} {L} \ dot {y} (t) + \ frac {1} {LC} u (t) $.

Aus dem Obigen kann die folgende ** Zustandsgleichung ** erhalten werden.

python


\left[
    \begin{array}{c}
      \dot{x}_1 \\
      \dot{x}_2
    \end{array}
  \right]
=\left[
    \begin{array}{cc}
      0 & 1  \\
      -\frac{1}{LC} & -\frac{R}{L} 
    \end{array}
  \right]
  \left[
    \begin{array}{c}
      x_1 \\
      x_2
    \end{array}
  \right]
+ \left[
    \begin{array}{c}
      0 \\
      \frac{1}{LC}
    \end{array}
  \right] u

python


\dot{\boldsymbol{x}} 
=\left[
    \begin{array}{cc}
      0 & 1  \\
      -\frac{1}{LC} & -\frac{R}{L} 
    \end{array}
  \right]
\boldsymbol{x} + \left[
    \begin{array}{cc}
      0 \\
      \frac{1}{LC}
    \end{array}
  \right] u
\dot{\boldsymbol{x}} =\mathbf{A}\boldsymbol{x} + \mathbf{B} u

Zusätzlich wird die folgende ** Ausgangsgleichung ** (Beobachtungsgleichung) erhalten (** Kondensatorspannung ** $ v_ {C} $ entsprechender Zustand $ x_1 $ und ** Strom ** entsprechen $ Cx \ _2 (= C \ dot {y} (t) = C \ dot {v} _ {C} (t) = C \ big (\ frac {1} {C} \ dot {q} (t) \ big) = \ dot {q} (t) = i (t) ,) $ wird beobachtet).

python


y = \left[
    \begin{array}{cc}
      1 & 0\\
      0 & C\\
    \end{array}
  \right]   \left[
    \begin{array}{c}
      x_1 \\
      x_2
    \end{array}
  \right]
y =\mathbf{C}\boldsymbol{x} + \mathbf{D} u

$ \ Mathbf {D} = 0 $.

Modellierung / Simulation mit Python

Simulieren Sie eine ** Sprungantwort ** im Zustandsraummodell.

Vorbereitung für die Verwendung von Japanisch in Diagrammen (Google Colab.Umgebung)


!pip install japanize-matplotlib

Sprungantwortsimulation (Zustandsraummodell)


import numpy as np
import control.matlab as ctrl
import matplotlib.pyplot as plt
import japanize_matplotlib

R = 2       #Widerstandswert
L = 1e-3    #Intensität
C = 10e-6   #Kapazität

A = [[0,1],[-1/(L*C), -R/L]]
B = [[0],[1/(L*C)]]
C = [[1,0],[0,C]]
D = 0

sys = ctrl.ss(A,B,C,D)
#print(sys)

t_range = (0,0.01)
y, t = ctrl.step(sys, T=np.linspace(*t_range, 400))

fig, ax = plt.subplots(nrows=2, figsize=(7,5),dpi=120,sharex='col')
fig.patch.set_facecolor('white') 
fig.subplots_adjust(hspace=0.1)  
for i,s in enumerate(['Kondensatorspannung','Aktuell']) :
  ax[i].hlines(0,*t_range,colors='gray',ls=':')
  ax[i].plot(t,y[:,i])
  ax[i].set_ylabel(s)
  ax[i].set_xlim(*t_range)
plt.show()

f2.png

Recommended Posts

Übertragungsfunktion / Zustandsraummodell der RLC-Serienschaltung und Simulation von Python
Übertragungsfunktion / Zustandsraummodell des Feder- / Masse- / Dämpfersystems und Simulation von Python
[Steuerungstechnik] Berechnung von Übertragungsfunktionen und Zustandsraummodellen durch Python
Ich habe versucht, "Grundlagen der Zeitreihenanalyse und des Zustandsraummodells" (Hayamoto) mit Pystan zu implementieren
Benutzerdefiniertes Zustandsraummodell in Python
Erklärung des Produktionsoptimierungsmodells durch Python
[Wissenschaftlich-technische Berechnung von Python] Anpassung durch nichtlineare Funktion, Zustandsgleichung, scipy
Implementierung des Partikelfilters durch Python und Anwendung auf das Zustandsraummodell
Einfache Einführung in die Python3-Serie und OpenCV3
Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Grundlegende Bedienung von Python Pandas Series und Dataframe (1)
[Python of Hikari-] Kapitel 06-02 Funktion (Argument und Rückgabewert 1)
Python-Implementierung des CSS3-Mischmodus und Diskussion über den Farbraum