Ich habe einen Artikel darüber geschrieben, wie man die Übertragungsfunktion einer Schaltung mit Lcapy, einem linearen Schaltungsanalysepaket von Python, symbolisch analysiert.
[Circuit x Python] So finden Sie die Übertragungsfunktion einer Schaltung mit Lcapy
Nachdem Sie die Übertragungsfunktion gefunden haben, möchten Sie sie erweitern oder numerisch analysieren. Diese Methoden werden in diesem Artikel erläutert.
Python: 3.7.4、SymPy: 1.6.2、Lcapy: 0.67.0
Stellen Sie sich einen invertierenden Verstärker vor, bei dem ein Operationsverstärker durch die Widerstände RG und RF zurückgeführt wird.
Die Eigenschaften des Operationsverstärkers sind durch die folgende Gleichung auszudrücken.
Diese Schaltung erschien auch in Vorheriger Artikel und ist auf LTSPICE wie folgt gezeichnet.
Der Code zum Finden der Übertragungsfunktion und das Ausführungsergebnis lauten wie folgt.
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
Ausführungsergebnis:
Anweisungen zum Erweitern der Übertragungsfunktion finden Sie in der offiziellen Dokumentation Expressions => Methods (http://lcapy.elec.canterbury.ac.nz/expressions.html).
Ein in der obigen Schaltung verwendetes Beispiel ist unten gezeigt.
Auf diese Weise können Sie Ausdrücke mit sehr wenig Code einfach erweitern und transformieren.
Nachdem Sie die Schaltung symbolisch analysiert haben, um die Übertragungsfunktion zu finden, weisen Sie der Übertragungsfunktion einen Wert zu und führen eine numerische Analyse durch.
Suchen Sie zuerst die Übertragungsfunktion. (Der Code wurde teilweise von dem oben aufgeführten geändert. Siehe unten für den Grund)
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
Ausführungsergebnis:
Der folgende Code weist der erhaltenen Übertragungsfunktion einen Wert zu. Eingangswerte: AOL = 1000, p = 2π x 10 kHz, RG = 1 kΩ, RF = 2 kΩ
H = H.subs("AOL", 1000).subs("p", 2*pi*1e4).subs("RG", 1000).subs("RF", 2000)
H
Ausführungsergebnis:
Die Eigenschaften der Übertragungsfunktion (hier Intensität, Einheit dB) können mit dem folgenden Code berechnet und grafisch dargestellt werden.
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()
Ausführungsergebnis:
Der folgende Code wird numerisch berechnet, um ein Array zu generieren sm1 = H(f).dB.evaluate(freq)
Die folgende Verarbeitung wird hier durchgeführt. Ersetzen Sie s durch 2πjf → Berechnen Sie das Dezibel davon → Numerische Berechnung mit evaluieren (freq)
Wenn Sie eine numerische Berechnung anhand des unter "Zu analysierende Schaltung" beschriebenen Codes durchführen, tritt ein Fehler auf.
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()
""")
Ausführungsergebnis: ValueError: Cannot convert non-causal s-expression to f domain
Ich denke nicht, dass es im Code seltsam ist, aber ich bekomme eine Fehlermeldung. Die gleiche Übertragungsfunktion kann mit dem Code "2. Numerische Berechnung" erhalten werden, kann jedoch aus irgendeinem Grund berechnet werden. In meiner Umgebung verursacht der in der offiziellen Dokumentation beschriebene Code ebenfalls einen Fehler, daher denke ich, dass es sich um einen Fehler handelt. Wenn sich die Situation ändert, werde ich diesen Teil korrigieren.
Recommended Posts