Fonction de transmission / modèle d'espace d'état du circuit série RLC et simulation par Python

Aperçu

Notes d'étude d'ingénierie de contrôle. La deuxième.

Dernière fois est une bibliothèque Python pour les systèmes de contrôle, "[[] J'ai simulé en utilisant "Python Control Systems Library" (https://python-control.readthedocs.io/en/0.8.3/index.html).

Cette fois, pour ** circuit série RLC **, nous trouverons la fonction de transfert / modèle d'espace d'état à partir de l'équation du circuit et la simulerons en utilisant 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)

Équation de circuit

Normalement, l'équation du circuit est formulée en utilisant ** current ** $ i (t) $ comme suit.

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

Cependant, ici, afin de correspondre au système mécanique de précédent, ** charge ** $ q (t) $ en utilisant la relation suivante. J'écrirai l'équation du circuit en utilisant.

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

L'équation de circuit avec la charge $ q (t) $ est la suivante.

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)

Organisez la formule en changeant la différenciation en notation par points.

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

Cela a la même forme que l'équation de mouvement (ci-dessous) du point de qualité avec un degré de liberté dans le système ressort-masse-amortisseur montré dans précédent. Tu peux voir ça.

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

Modélisez le système avec une fonction de transfert

Dans le modèle de la mécanique, la fonction de transfert a été calculée avec la force $ f (t) $ comme ** entrée ** au système et le déplacement $ y (t) $ comme ** sortie ** du système.

Si cela correspond à cela, la fonction de transfert est obtenue en utilisant la tension d'entrée $ v \ _i (t) $ comme ** entrée ** pour le système et la charge $ q (t) $ comme ** sortie ** du système. Cependant, il n'est pas facile d'observer directement (mesurer) ** charge ** $ q (t) $ ** **. Aussi, en réalité, c'est la tension de chaque élément qui est intéressante. Par conséquent, ** dans le cas d'un circuit électrique, la fonction de transfert est calculée en utilisant la tension comme sortie **.

Ici, la tension d'entrée $ v \ i (t) $ est ** input ** $ u (t) $ au système, la tension aux bornes du condensateur $ v {C} (t) $ est la ** sortie ** du système. Trouvez la fonction de transfert avec $ y (t) $.

Entrée \, \, \, u (t) = v_ {i} (t)
Sortie \, \, \, y (t) = v_ {C} (t) = \ frac {1} {C} q (t)

Faites de la sortie ci-dessus une expression pour $ q (t) $.

q(t) = Cy(t)

Remplacez ceci par l'équation de circuit ci-dessus $ L \ ddot {q} (t) + R \ dot {q} (t) + \ frac {1} {C} q (t) = v_ {i} (t) $ Remplacez pour obtenir:

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

Conversion Laplace de ceci pour trouver le système ** fonction de transfert ** $ G (s) = Y (s) / U (s) $ (à ce moment, $ \ dot {y} (En supposant 0) = 0 $ et $ 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}

Dans le modèle dynamique, la fonction de transfert avec la force comme entrée et le déplacement comme sortie, la masse comme $ m $, le coefficient d'amortissement comme $ c $ et la constante de ressort comme $ k $ est la suivante. Vous pouvez voir que le système mécanique et le système de circuits ont des formes très similaires.

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

Modélisation / simulation avec Python

Utilisez la ** Python Control Systems Library ** de Python pour la simulation. Définissez la fonction de transfert pour modéliser le système et simuler la ** réponse par étapes **.

Dans le système mécanique, nous avons simulé la ** réponse impulsionnelle ** pour observer le déplacement lorsqu'une force est appliquée au point de qualité pendant un moment, mais dans le circuit électrique, la tension d'entrée $ v_ {i} (t) = 1 \ Puisqu'il est plus naturel d'observer la tension du condensateur $ v_ {C} $ quand, (t \ ge0) $ est défini, regardons la ** réponse en échelon **.

Préparation (Google Colab.environnement)


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

Simulation de réponse de pas (fonction de transmission)


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

R = 2       #Valeur de résistance
L = 1e-3    #Intensité
C = 10e-6   #Capacitance

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()

Résultat d'exécution


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

f1.png

Si la tension d'entrée est $ v_ {i} (t) = 1 , (t \ ge0) $, la tension du condensateur $ v_ {C} $ vibre d'abord et enfin $ 1 , \ [\ Vous pouvez voir qu'il s'installe en mathrm {V} ] $.

Modélisé avec un modèle d'espace d'état

Décrivez le système comme le modèle d'espace d'états $ \ mathcal {P} $ comme suit.

python


\mathcal{P}\,:\,\left\{
\begin{array}{l}
\dot{\boldsymbol{x}} = \mathbf{A}\boldsymbol{x} + \mathbf{B}\boldsymbol{u}&Équation d'état\\
\boldsymbol{y} = \mathbf{C}\boldsymbol{x} + \mathbf{D}\boldsymbol{u}&Équation de sortie (équation d'observation)
\end{array}
\right.

En guise de préparation, l'équation de circuit $ LC \ ddot {y} (t) + RC \ dot {y} (t) + y (t) = u (t) $, $ \ ddot {y} (t) = .. Transformez-le en. $.

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

Comme $ x \ _1 (t) = y (t) $, $ x \ _2 (t) = \ dot {y} (t) $, ** état ** $ \ boldsymbol {x} = \ [x \ _1 , , x \ _2] ^ T $ est défini.

À partir de là, $ \ dot {x} \ _1 (t) = \ dot {y} (t) = x \ _2 $. En outre, $ \ dot {x} \ _2 (t) = - \ frac {1} {LC} y (t) - \ frac {R} {L} \ dot {y} (t) + \ frac {1} {LC} u (t) $.

À partir de ce qui précède, l '** équation d'état ** suivante peut être obtenue.

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

De plus, on obtient ** l'équation de sortie ** suivante (équation d'observation) (** tension du condensateur ** $ v_ {C} $ état correspondant $ x_1 $ et ** courant ** correspondant $ 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) ,) $ est observé).

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

Cependant, $ \ mathbf {D} = 0 $.

Modélisation / simulation avec Python

Simulez une ** réponse d'étape ** dans le modèle d'espace d'états.

Préparation à l'utilisation du japonais sur les graphiques (Google Colab.environnement)


!pip install japanize-matplotlib

Simulation de réponse de pas (modèle d'espace d'états)


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

R = 2       #Valeur de résistance
L = 1e-3    #Intensité
C = 10e-6   #Capacitance

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(['Tension du condenseur','Courant']) :
  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

Fonction de transmission / modèle d'espace d'état du circuit série RLC et simulation par Python
Fonction de transmission / modèle d'espace d'état du système ressort / masse / amortisseur et simulation par Python
[Ingénierie de contrôle] Calcul des fonctions de transfert et des modèles d'espace d'états par Python
J'ai essayé d'implémenter "Bases de l'analyse des séries temporelles et du modèle d'espace d'état" (Hayamoto) avec pystan
Modèle d'espace d'états personnalisé en Python
Explication du modèle d'optimisation de la production par Python
[Calcul scientifique / technique par Python] Ajustement par fonction non linéaire, équation d'état, scipy
Implémentation du filtre à particules par Python et application au modèle d'espace d'états
Introduction facile de la série python3 et d'OpenCV3
Implémenter un modèle avec état et comportement (3) - Exemple d'implémentation par décorateur
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Fonctionnement de base de Python Pandas Series et Dataframe (1)
[Python of Hikari-] Chapitre 06-02 Fonction (argument et valeur de retour 1)
Implémentation Python du mode de fusion CSS3 et discussion sur l'espace colorimétrique