Einführung in die Bibliothek ** impedance.py **, mit der die Impedanz (elektrochemische Impedanz) mit Python analysiert werden kann. Passen Sie das gemessene Nyquist-Diagramm an das konstruierte Ersatzschaltbild an und erhalten Sie die Parameter. Sie benötigen keine kostenpflichtige Software, sodass Sie sie problemlos verwenden können. Grundsätzlich werde ich gemäß dem offiziellen Tutorial von impedance.py erklären und es an einigen Stellen ergänzen, daher möchte ich viel Englisch lesen. Für diejenigen, die dies nicht tun. Für diejenigen, die keine Erklärung benötigen, wird der Code unten zusammengestellt.
Ich möchte die Impedanz nur mit Open Source-Tools analysieren
Die elektrochemische Impedanzanalyse erfordert eine Analysesoftware, die dem Messgerät beiliegt. Die Analyse ist jedoch jedes Mal mit einem Mess-PC schwierig. .. .. Der größte Teil der Software wird jedoch bezahlt und kann aufgrund der Lizenz nicht auf Ihrem eigenen PC installiert werden. .. ..
Über impedance.py
Wie fange ich mit Python an? Probieren Sie es mit "Wie benutzt man Python?"
Stand 2020/07/22
Da es in PyPI registriert ist, installieren Sie es mit "pip install impedance"
Für Messdaten können Sie normalerweise csv lesen_csv und es als pandas.Dataframe behandeln, aber da es etwas gibt, das als "Vorverarbeitung" bezeichnet wird, werde ich es verwenden. Da Beispieldaten vom Beamten erstellt wurden, laden Sie example.csv in der Spalte Schritt 2 von [** hier **] herunter (https://impedancepy.readthedocs.io/en/latest/getting-started.html#).
python
from impedance import preprocessing
frequencies, Z = preprocessing.readCSV('./exampleData.csv')
#type(frequencies): <class 'numpy.ndarray'>
#type(frequencies[0]): <class 'numpy.float64'>
#type(Z): <class 'numpy.ndarray'>
#type(Z[0]): <class 'numpy.complex128'>
Der Inhalt von exampleData.csv sieht folgendermaßen aus Spalte A ist die Häufigkeit, Spalte B ist der Realteil von Z, Spalte C ist der Imaginärteil von Z, und selbst wenn Sie sich den Quellcode von "preprocessing.readCSV" ansehen, setzen Sie Spalte A einfach auf Brüche und Spalte BC auf den komplexen Typ Z und geben ihn zurück. Es war nur.
Wenn Sie denken, dass es eine nutzlose Funktion ist, gibt es tatsächlich Funktionen, die Sie verwenden können!
preprocessing
unterstützt auch Erweiterungen, die für die Gerätesoftware spezifisch sind (** hier wichtig **), und scheint die folgende Software und Erweiterungen zu unterstützen
Sanft | Erweiterung |
---|---|
gamry | .dta |
autolab | Durch Kommata abgetrennt.csv?) |
parstat | .txt |
zplot | .z |
versastudio | .par |
powersuite | .txt |
biologic | .mpt |
chinstruments | .txt |
Wenn ich mir den Quellcode anschaue, bin ich sehr glücklich, weil er die Daten mit regulären Ausdrücken usw. Verarbeitet: clap: (Ich habe ihn gut mit der .mpt-Datei verwendet) Die Verwendung ist wie folgt
python
from impedance import preprocessing
frequencies, Z = preprocessing.readFile('Pfad zur Datei', instrument='Weicher Name')
frequencies, Z = preprocessing.ignoreBelowX(frequencies, Z)
Sie können das Dateiformat angeben, indem Sie den Namen der Software in der obigen Tabelle an die Instrumentenoption übergeben.
Außerdem
・ Schneiden Sie den ersten Quadranten preprocessing.ignoreBelowX (freq, Z)
aus
-Schneiden Sie die Daten nach der Häufigkeit "preprocessing.cropFrequences (freq, Z, freqmin = 0, freqmax = None)"
Ist vorbereitet
Dieses Mal erstellen wir als Beispiel das folgende Ersatzschaltbild.
python
from impedance.models.circuits import CustomCircuit
circuit = 'R0-p(R1,C1)-p(R2-Wo1,C2)'
initial_guess = [.01, .01, 100, .01, .05, 100, 1]
circuit = CustomCircuit(circuit, initial_guess=initial_guess)
Ein Ersatzschaltbild kann erstellt werden, indem Reihen mit -
und parallel zu p (,)
ausgedrückt und als Zeichenfolge an die Klasse CustomCircuit
übergeben werden. Zu diesem Zeitpunkt müssen die Anfangsparameter als Listentyp an die Option initial_guess
übergeben werden. Die Schaltungselemente, die ausgedrückt werden können, sind in ** hier ** zusammengefasst.
Ich habe diesmal "CustomCircuit" verwendet, aber wenn Sie sich den Quellcode ansehen, wird "Randles" auch standardmäßig vorbereitet.
python
circuit.fit(frequencies, Z)
params = circuit.parameters_
#[1.65187261e-02 8.67655045e-03 3.32142565e+00 5.38996281e-03
# 6.30927436e-02 2.32520436e+02 2.19541831e-01]
covs = circuit.conf_
#[1.54227642e-04 1.91273738e-04 1.89536697e-01 2.05799010e-04
# 1.93973976e-03 1.62269546e+01 1.75432523e-02]
Führen Sie die Anpassung mit Circuit.fit
durch. Es scheint, dass "scipy.optimize.curve_fit" als Anpassungsalgorithmus verwendet wird.
Nach dem Anpassen werden die Parameter nach dem Anpassen und die Varianz der Parameter in "Circuit.Parameter_" bzw. "Circuit.Conf_" (die von "scipy.optimize.curve_fit" zurückgegebenen diagonalen Komponenten der Kovarianzmatrix werden extrahiert). Kann empfangen werden.
python
import matplotlib.pyplot as plt
from impedance.visualization import plot_nyquist
Z_fit = circuit.predict(frequencies)
fig, ax = plt.subplots()
plot_nyquist(ax, Z, fmt='o')
plot_nyquist(ax, Z_fit, fmt='-')
plt.legend(['Data', 'Fit'])
plt.show()
Holen Sie sich das Simulationsergebnis, das aus den Parametern berechnet wird, die mit "Circuit.predict (Frequenzen)" ausgestattet sind. Die Visualisierung bietet eine "Visualisierung" basierend auf Matplotlib und Altair, und Nyquist-Diagramme werden mit "plot_nyquist" angezeigt. Es schreibt auch höflich das Achsenetikett. Darüber hinaus enthält "Visualisierung" verschiedene Elemente wie "plot_bode" (Bode-Plot). (Geplant, hinzugefügt zu werden)
python
from matplotlib import pyplot as plt
from impedance import preprocessing
from impedance.models.circuits import CustomCircuit
from impedance.visualization import plot_nyquist
def main():
frequencies, Z = preprocessing.readCSV('./exampleData.csv')
frequencies, Z = preprocessing.ignoreBelowX(frequencies, Z)
circuit = 'R0-p(R1,C1)-p(R2-Wo1,C2)'
initial_guess = [.01, .01, 100, .01, .05, 100, 1]
circuit = CustomCircuit(circuit, initial_guess=initial_guess)
circuit.fit(frequencies, Z)
print(circuit.parameters_)
print(circuit.conf_)
Z_fit = circuit.predict(frequencies)
fig, ax = plt.subplots()
plot_nyquist(ax, Z, fmt='o')
plot_nyquist(ax, Z_fit, fmt='-')
plt.legend(['Data', 'Fit'])
plt.show()
if __name__ == '__main__':
main()
Recommended Posts