[Circuit x Python] Comment développer et calculer les fonctions de transfert à l'aide de Lcapy

introduction

J'ai écrit un article sur la façon d'analyser symboliquement la fonction de transfert d'un circuit à l'aide de Lcapy, qui est un package d'analyse de circuit linéaire de Python.

[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy

Après avoir trouvé la fonction de transfert, vous souhaitez l'étendre ou l'analyser numériquement. Ces méthodes sont expliquées dans cet article.

environnement

Python: 3.7.4、SymPy: 1.6.2、Lcapy: 0.67.0

Circuit à analyser

Prenons un amplificateur inverseur dans lequel un amplificateur opérationnel est renvoyé par des résistances RG et RF. Les caractéristiques de l'amplificateur opérationnel doivent être exprimées par l'équation suivante. $A(f) = \frac{A_{OL}}{1+s/p}$ image.png

Ce circuit est également apparu dans Article précédent, et est dessiné comme suit sur LTSPICE. image.png

Le code pour trouver la fonction de transfert et le résultat de l'exécution sont les suivants.

python


from lcapy import *
cct = Circuit("""
E1 0 OUT N002 0 1
C1 N002 0 {1/p}
R1 N002 0 1
R2 OUT INN RF
R3 INN N001 RG
V1 N001 0 s 1
G1 0 N002 0 INN AOL
""")

H = cct["OUT"].V(s).simplify()
H

Résultat de l'exécution: $- \frac{A_{\mathrm{OL}} R_{F} p}{A_{\mathrm{OL}} R_{G} p + R_{F} p + R_{G} p + s \left(R_{F} + R_{G}\right)}$

1. 1. Développez la fonction de transfert

Des instructions sur la façon d'étendre la fonction de transfert peuvent être trouvées dans la documentation officielle Expressions => Méthodes (http://lcapy.elec.canterbury.ac.nz/expressions.html).

Un exemple utilisé dans le circuit ci-dessus est illustré ci-dessous. image.png

De cette façon, vous pouvez facilement développer et transformer des expressions avec très peu de code.

2. Calcul numérique

Après avoir analysé symboliquement le circuit pour trouver la fonction de transfert, attribuons une valeur à la fonction de transfert et effectuons une analyse numérique.

Tout d'abord, recherchez la fonction de transfert. (Le code a été partiellement modifié par rapport à celui indiqué ci-dessus. Voir ci-dessous pour la raison)

from lcapy import *
cct = Circuit("""
E1 0 OUT N002 0 1
C1 N002 0 {1/p}
R1 N002 0 1
R2 OUT INN RF
R3 INN N001 RG
V1 N001 0 step
G1 0 N002 0 INN AOL
""")

H = (cct["OUT"].V(s) / cct.V1.V(s)).simplify()
H

Résultat de l'exécution: $- \frac{A_{\mathrm{OL}} R_{F} p}{p \left(A_{\mathrm{OL}} R_{G} + R_{F} + R_{G}\right) + s \left(R_{F} + R_{G}\right)}$

Le code suivant attribue une valeur à la fonction de transfert obtenue. Valeurs d'entrée: AOL = 1000, p = 2π x 10kHz, RG = 1kΩ, RF = 2kΩ

H = H.subs("AOL", 1000).subs("p", 2*pi*1e4).subs("RG", 1000).subs("RF", 2000)
H

Résultat de l'exécution: $- \frac{40000000000.0 \pi}{3000 s + 20060000000.0 \pi}$

Les caractéristiques de la fonction de transfert (ici, intensité, unité dB) peuvent être calculées et représentées graphiquement avec le code suivant.


import numpy as np
import matplotlib.pyplot as plt

freq = np.logspace(start=5, stop=9, num=(9-5)*21)
sm1 = H(f).dB.evaluate(freq)

fig, ax = plt.subplots()
ax.plot(freq,sm1)

ax.set_xscale("log")
ax.set_xlabel("Frequency (Hz)")
ax.set_ylabel("Signal Magnitude (dB)")

plt.show()

Résultat de l'exécution: image.png

Le code suivant est calculé numériquement pour générer un tableau sm1 = H(f).dB.evaluate(freq)

Le traitement suivant est effectué ici. Substituer 2πjf pour s → Calculer le décibel de ce → Calcul numérique avec évaluer (freq)

image.png

punaise? (2020/10/31)

Si vous effectuez un calcul numérique à partir du code décrit dans "Circuit à analyser", une erreur se produira.

python


from lcapy import *
cct = Circuit("""
E1 0 OUT N002 0 1
C1 N002 0 {1/p}
R1 N002 0 1
R2 OUT INN RF
R3 INN N001 RG
V1 N001 0 s 1
G1 0 N002 0 INN AOL
""")

H = cct["OUT"].V(s).simplify()

H = H.subs("AOL", 1000).subs("p", 2*pi*1e4).subs("RG", 1000).subs("RF", 2000)

import numpy as np
import matplotlib.pyplot as plt

freq = np.logspace(start=5, stop=9, num=(9-5)*21)
sm1 = H(f).dB.evaluate(freq)

fig, ax = plt.subplots()
ax.plot(freq,sm1)

ax.set_xscale("log")
ax.set_xlabel("Frequency (Hz)")
ax.set_ylabel("Signal Magnitude (dB)")

plt.show()
""")

Résultat de l'exécution: ValueError: Cannot convert non-causal s-expression to f domain

Je ne pense pas que ce soit étrange dans le code, mais j'obtiens une erreur. La même fonction de transfert peut être obtenue avec le code "2. Calcul numérique", mais elle peut être calculée pour une raison quelconque. Dans mon environnement, le code décrit dans la documentation officielle provoque également une erreur, donc je pense que c'est un bug. Si la situation change, je corrigerai cette partie.

Recommended Posts

[Circuit x Python] Comment développer et calculer les fonctions de transfert à l'aide de Lcapy
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
[Circuit x Python] Comment résoudre symboliquement les équations de circuit en utilisant sympy
[Python] Comment calculer MAE et RMSE
[Circuit x Python] Comment activer le package d'analyse de circuit linéaire Lcapy
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment installer Python à l'aide d'Anaconda
Comment calculer la date avec python
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
Comment empaqueter et distribuer des scripts Python
De Python à l'utilisation de MeCab (et CaboCha)
Comment installer et utiliser pandas_datareader [Python]
[Ingénierie de contrôle] Représentation graphique des fonctions de transfert par Python
Comment effacer Python 2.x sur Mac.
python: Comment utiliser les locals () et globals ()
Comment utiliser le zip Python et énumérer
[Python] Comprendre comment utiliser les fonctions récursives
Comment utiliser is et == en Python
Comment générer une séquence en Python et C ++
Comment créer des variables explicatives et des fonctions objectives
Python datetime Comment calculer des dates et convertir des chaînes strftime, strptime [Definitive Edition]
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
[Algorithm x Python] Comment utiliser la liste
[Python] Comment utiliser la fonction de hachage et taple.
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
Comment configurer un environnement Python à l'aide de pyenv
Comment soumettre automatiquement des formulaires Microsoft à l'aide de python (version Mac)
[Python] Comment développer des variables dans une chaîne de caractères
Comment créer un package Python à l'aide de VS Code
[Python] Comment trier un dict dans une liste et une instance dans une liste
[Python] Comment fractionner et modulariser des fichiers (simple, exemple)
[Python] Comment créer une matrice de corrélation et une carte thermique
Comment quitter lors de l'utilisation de Python dans Terminal (Mac)
Comment récupérer plusieurs tableaux à l'aide de slice en python.
[Introduction à Python] Comment arrêter la boucle en utilisant break?
Python # Comment vérifier le type et le type pour les super débutants
Comment exécuter une commande à l'aide d'un sous-processus en Python
[Introduction à Python] Comment écrire des instructions répétitives à l'aide d'instructions for
Comment installer Python
Comment installer python
Comment analyser le code source Java avec AST (Abstract Syntax Tree) en utilisant ANTLR et Python
Essayez de le faire avec GUI, PyQt en Python
[Introduction à Python] Comment écrire des branches conditionnelles en utilisant des instructions if
Comment échanger des éléments dans un tableau en Python et comment inverser un tableau.
[python] Résumé de la récupération des listes et des éléments du dictionnaire
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Comment se connecter à diverses bases de données à partir de Python (PEP 249) et SQL Alchemy
Comment transloquer un tableau à deux dimensions en utilisant uniquement python [Note]
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
[Python] Comment définir des noms de variables dynamiquement et comparer la vitesse
Méthode d'apprentissage TensorFlow pour les professionnels des arts libéraux et les débutants en Python
Comment ajouter de nouvelles données (lignes droites et tracés) à l'aide de matplotlib
Créer un environnement Python et transférer des données vers le serveur