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.
Python: 3.7.4、SymPy: 1.6.2、Lcapy: 0.67.0
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.
Ce circuit est également apparu dans Article précédent, et est dessiné comme suit sur LTSPICE.
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:
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.
De cette façon, vous pouvez facilement développer et transformer des expressions avec très peu de code.
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:
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:
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:
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)
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.