Présentation de la bibliothèque ** impedance.py ** qui peut analyser l'impédance (impédance électrochimique) avec python. Ajustez le graphique de Nyquist mesuré au modèle de circuit équivalent construit et obtenez les paramètres. Pas besoin de logiciel payant, vous pouvez donc l'utiliser facilement. En gros, je vais vous expliquer selon le Tutoriel officiel d'impedance.py, et je le compléterai à certains endroits, donc je veux beaucoup lire l'anglais. Pour ceux qui ne le font pas. Pour ceux qui n'ont pas besoin d'explications, le code est rassemblé en bas.
Je souhaite analyser l'impédance en utilisant uniquement des outils open source
L'analyse d'impédance électrochimique nécessite un logiciel d'analyse qui accompagne l'appareil de mesure, mais il est difficile d'analyser à chaque fois avec un PC de mesure. .. .. Cependant, la plupart des logiciels sont payants et, en raison de la licence, ils ne peuvent pas être installés sur votre propre PC. .. ..
À propos d'impedance.py
Comment démarrer avec python Veuillez vérifier "Comment utiliser python"
À partir du 22/07/2020
Puisqu'il est enregistré dans PyPI, installez-le avec pip install impedance
Pour les données de mesure, vous pouvez généralement lire_csv csv et le traiter comme pandas.Dataframe, mais comme il existe quelque chose appelé pré-traitement
, je vais l'utiliser.
Étant donné que les exemples de données sont préparés à partir du site officiel, téléchargez example.csv dans la colonne Étape 2 à partir de ** ici **
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'>
Le contenu de exampleData.csv ressemble à ceci
La colonne A est la fréquence, la colonne B est la partie réelle de Z, la colonne C est la partie imaginaire de Z, et même si vous regardez le code source de preprocessing.readCSV
, vous définissez simplement la colonne A sur les fractions et la colonne BC sur le type complexe Z et renvoyé. C'était juste.
Si vous pensez que c'est une fonction inutile, il y a en fait des fonctions que vous pouvez utiliser!
preprocessing
prend également en charge les extensions spécifiques au logiciel de l'appareil (** important ici **), et semble prendre en charge les logiciels et extensions suivants.
doux | extension |
---|---|
gamry | .dta |
autolab | Séparé par des virgules.csv?) |
parstat | .txt |
zplot | .z |
versastudio | .par |
powersuite | .txt |
biologic | .mpt |
chinstruments | .txt |
En regardant le code source, je suis très content car il traite les données à l'aide d'expressions régulières, etc.: clap: (je l'ai bien utilisé avec le fichier .mpt) L'utilisation est la suivante
python
from impedance import preprocessing
frequencies, Z = preprocessing.readFile('Chemin d'accès au fichier', instrument='Nom souple')
frequencies, Z = preprocessing.ignoreBelowX(frequencies, Z)
Vous pouvez spécifier le format de fichier en transmettant le nom du logiciel dans le tableau ci-dessus à l'option d'instrument.
Autre que ça
・ Découpez le premier quadrant preprocessing.ignoreBelowX (freq, Z)
-Couper les données par fréquence preprocessing.cropFrequencies (freq, Z, freqmin = 0, freqmax = None)
Est préparé
Cette fois, nous allons créer le modèle de circuit équivalent suivant à titre d'exemple.
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)
Un circuit équivalent peut être créé en exprimant des séries avec «-» et en parallèle avec «p (,)» et en le passant sous forme de chaîne de caractères à la classe «CustomCircuit». À ce stade, les paramètres initiaux doivent être passés sous forme de type liste à l'option ʻinitial_guess. Les éléments de circuit qui peuvent être exprimés sont résumés dans [** ici **](https://impedancepy.readthedocs.io/en/latest/circuit-elements.html). J'ai utilisé
CustomCircuit cette fois, mais si vous regardez le code source,
Randles` est également préparé par défaut.
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]
Effectuez le montage avec circuit.fit
. Il semble que «scipy.optimize.curve_fit» soit utilisé comme algorithme d'ajustement.
Après ajustement, les paramètres après ajustement et la variance des paramètres dans circuit.parameters_
et circuit.conf_
respectivement (les composantes diagonales de la matrice de covariance renvoyées par scipy.optimize.curve_fit
sont extraites). Peut être reçu.
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()
Obtenez le résultat de la simulation calculé à partir des paramètres équipés de circuit.predict (fréquences)
.
La visualisation fournit une «visualisation» basée sur matplotlib et altair, et les tracés nyquist sont affichés avec «plot_nyquist». Il écrit également poliment l'étiquette de l'axe.
En plus de cela, visualisation
a divers éléments tels que plot_bode
(bode plot). (Prévu pour être ajouté)
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