Übertragungsfunktion / Zustandsraummodell des Feder- / Masse- / Dämpfersystems und Simulation von Python

Überblick

Studiennotizen zur Steuerungstechnik. Das Übertragungsfunktions- / Zustandsraummodell wird aus der Bewegungsgleichung des Qualitätspunktes des Feder-Masse-Dämpfer-Systems und der Python-Bibliothek des Steuerungssystems "Python Control Systems Library erhalten. 0.8.3 / index.html) ”wird für die Simulation verwendet. 2020-04-27_23h38_44.png

Bewegungsgleichung des Qualitätspunktes mit einem Freiheitsgrad im Feder-Masse-Dämpfer-System

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

$ \ ddot {y} (t) $ ist Beschleunigung, $ \ dot {y} (t) $ ist Geschwindigkeit und $ y (t) $ ist Verschiebung. $ m $ ist die Masse, $ c $ ist der Dämpfungskoeffizient und $ k $ ist die Federkonstante (beide sind physikalische Konstanten und daher nicht negative Werte).

Modellieren Sie das System mit einer Übertragungsfunktion

Laplace-Konvertierung der Kraft $ f (t) $ als ** Eingabe ** in das System und Verschiebung $ y (t) $ als ** Ausgabe ** vom System zum System ** Übertragungsfunktion ** $ G ( Das Finden von s) = Y (s) / F (s) $ ergibt: (Zu diesem Zeitpunkt sind die Anfangswerte von Geschwindigkeit und Verschiebung Null, dh $ \ dot {y} (0) = 0 $ und $ y. (0) = 0 $).

ms^2Y(s) + c sY(s) + kY(s) = F(s)
\big(ms^2+c s + k\big) Y(s) = F(s)
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 ** Impulsantwort ** zu simulieren.

Vorbereitung (Google Colab.Umgebung)


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

Impulsantwortsimulation (Übertragungsfunktion)


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

m = 1    #Masse[kg]Nicht negativ
c = 1    #Dämpfungskoeffizient[N/m]Nicht negativ
k = 10   #Federkoeffizient[Ns/m]Nicht negativ

sys = ctrl.tf((1),(m,c,k)) #Übertragungsfunktion
print(sys)

t_range = (0,10) #Simulieren Sie den Bereich von 0 bis 10 Sekunden
y, t = ctrl.impulse(sys, T=np.arange(*t_range, 0.01))

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

Ausführungsergebnis


           1
-----------------------
1e-08 s^2 + 2e-05 s + 1

f1.png

Modelliert mit einem Zustandsraummodell

Im Zustandsraummodell können mehrere Beobachtungsgrößen (Ausgänge) eingestellt werden. Zusätzlich ist es möglich, mit jedem Anfangswert zu berechnen.

Modellieren Sie das System in das folgende 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.

Transformieren Sie zur Vorbereitung die Bewegungsgleichung in $ \ ddot {y} (t) = ... $.

m\ddot{y}(t) + c\dot{y}(t) + ky(t) = f(t)
m\ddot{y}(t) = - ky(t) - c\dot{y}(t) + f(t)
\ddot{y}(t) = - \frac{k}{m}y(t) - \frac{c}{m} \dot{y}(t) +\frac{1}{m} f(t)

Als $ x \ _1 (t) = y (t) $, $ x \ _2 (t) = \ dot {y} (t) $, ** Zustand ** $ \ boldsymbol {x} = \ [x \ _1 , , x \ _2] ^ T $ ist definiert. ** Verschiebung ** $ y (t) $ ist der Zustand $ x_1 $, ** Geschwindigkeit ** $ \ dot {y} (t) $ ist der Zustand $ x_2 $. </ font>

Daraus ergibt sich $ \ dot {x} \ _1 (t) = \ dot {y} (t) = x \ _2 $.

Außerdem ist $ \ dot {x} \ _2 (t) = \ ddot {y} (t) = - \ frac {k} {m} y (t) - \ frac {c} {m} \ dot {y} (t) + \ frac {1} {m} f (t) $.

Wenn die Kraft $ f (t) $ die Eingabe $ u (t) $ ist, wird die folgende ** Zustandsgleichung ** aus dem Obigen erhalten.

python


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

python


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

Zusätzlich wird die folgende ** Ausgangsgleichung ** (Beobachtungsgleichung) erhalten (Zustand $ x_1 $ entsprechend ** Verschiebung ** und Zustand $ x_2 $ entsprechend ** Geschwindigkeit ** werden beobachtet).

python


y = \left[
    \begin{array}{cc}
      1 & 0 \\
      0 & 1 \\
    \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 die ** Impulsantwort ** im Zustandsraummodell. Im Gegensatz zur Übertragungsfunktion wird $ 0.1 $ als Anfangswert der Verschiebung festgelegt, und die Geschwindigkeit wird ebenfalls ausgegeben (beobachtet).

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


!pip install japanize-matplotlib

Impulsantwortsimulation (Zustandsraummodell mit Anfangswerten)


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

m = 1    #Masse[kg]Nicht negativ
c = 1    #Dämpfungskoeffizient[N/m]Nicht negativ
k = 10   #Federkoeffizient[Ns/m]Nicht negativ

A = [[0,1],[-k/m, -c/m]]
B = [[0],[1/m]]
C = [[1,0],[0,1]]
D = 0

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

t_range = (0,10)

# x1(=Anfangswert der Verschiebung) ist 0.Auf 1 setzen. x2 (=Anfangswert der Geschwindigkeit) wird auf 0 gesetzt
y, t = ctrl.impulse(sys, T=np.arange(*t_range, 0.01), X0=[0.1, 0.0])

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(['Verschiebung','Geschwindigkeit']) :
  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()

Das Ausführungsergebnis ist wie folgt.
F2.png

Recommended Posts

Übertragungsfunktion / Zustandsraummodell des Feder- / Masse- / Dämpfersystems und Simulation von Python
Übertragungsfunktion / Zustandsraummodell der RLC-Serienschaltung und Simulation von Python
[Steuerungstechnik] Berechnung von Übertragungsfunktionen und Zustandsraummodellen durch Python
Benutzerdefiniertes Zustandsraummodell in Python
[Wissenschaftlich-technische Berechnung von Python] Anpassung durch nichtlineare Funktion, Zustandsgleichung, scipy
Implementierung des Partikelfilters durch Python und Anwendung auf das Zustandsraummodell
Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur
Erklärung des Produktionsoptimierungsmodells durch Python
Ich habe versucht, "Grundlagen der Zeitreihenanalyse und des Zustandsraummodells" (Hayamoto) mit Pystan zu implementieren
[Python of Hikari-] Kapitel 06-02 Funktion (Argument und Rückgabewert 1)