Namen: Zvezek (Notebook) je namenjen seznanjanju študentov z uporabo Jupytra pri impedančni spektroskopiji. Gre v bistvu za merjenje impedanc v določenem frekvenčnem spektru (obsebu frekvenc) in nato analizo izmerjenih impedanc. Posebnost je obravnava impedance (ali admitance) v kompleksni ravnini vendar ne v obliki kazalcev pač pa kot krivulje, kjer je parameter frekvenca. Impedančna spektroskopija se uporablja pri zelo različnih raziskavah, od klasičnih elektrotehniških (analize bolj kompleksnih elementov, senzorjev, transformatorjev, ...), do elektrokemijskih (baterije) in celo bioloških (na nivoju celotnega telesa, dela telesa, celice).
Prej bi lahko predelal tudi:
Obravnava impedančne spektroskopije morda nekoliko presega običajni obseg snovi pri predmetu Osnove elektrotehnike. Kljub temu pa je zanimivo pogledati eno od mnogih možnih uporab koncepta impedance. Običajno se impedančno spektroskopijo uporablja kot obrnjen postopek. Pomeni, da samega vezja ne poznamo (black box), smo pa izmerili impedanco v določenem frekvenčnem območju in nas zanima oblika nadomestnega vezja, ki bi najbolj ustrezala izmerjeni impedanci. Ni sicer nujno, da poiščemo model nadomestnega vezja, saj nas lahko v določenih primerih zanima le odziv vezja na na določene spremembe. Impedančno spektroskopijo seveda izvajamo tudi na električnih vezjih in strukturah vendar bom v tem zvezku prikazal morda manj znano uporabo impedančne spektroskopije v kemiji in biologiji.
Poglejmo si nekaj konkretnih primerov, ki jih bomo povzeli po par strokovnih člankih.
Avtorja v članku opisujeta vrsto možnih uporab impedančne spektroskopije. Spodnja slika kaže primer bioimpedančnega senzorja prisotnosti bakterije E-Coli ali Salmonele, ki se jo želi zaznavati že v zelo majhnih koncentracijah. To omogoča priprava merilne elektrode, ki je prevlečena z bioreceptorjem, ki omogoča, da se nanj vežejo omenjene bakterije, s čimer se spremeni električna upornost. Na sliki je tudi modelno vezje, kjer je Rs upornost elektrolita, Cdl kapacitivnost med elektrodo in elektrolitom (t.i. dvojna plast - double layer), Rct upornost pri prenosu naboja (charge transfer resistance) in ZW t.i. Warburgova impedanca, kot posledica difuzijskih procesov.
Warburgova impedanca pogosto nastopa pri analizi elektrokemijkih procesov z impedanco, saj se izkaže, da se difuzijski proces ne more analizirati s preprostimi R, L, C elementi pač pa je potreben element, ki ohranja fazni kot pri spremembah frekvence. Bolj splošno te elemente imenujemo CPE (constant phase element). Warburgovo impedanco zapišemo kot $\underline{Z}_W = \frac{A_W}{\sqrt\omega}(1-j)$. Vidimo, da Warburgova impedanca ohranja s frekvenco fazni kot $45^o$. Iz slike razberemo tudi značilno obliko prikaza spreminjanja impedance s frkvenco v kompeksni ravnini. Podobne oblike bomo obravnavali v nadaljevanju. Taki obliki grafa pogosto rečemo tudi Nyquistov graf.Slika na desni prikazuje tipično uporabo impedance pri analiziranju sestave človeškega telesa. Pri tem se uporabi štiri-elektrodno meritev, kar pomeni, da se dve elektrodi uporabi kot vzbujalni, na drugih dveh pa se meri napetost. Te metode običajno imenujemo bioimpedančne meritve. Prednost štirielektrodne konfiguracije je, da se izognemo zaznavanju impedance na stiku elektroda/elektrolit (elektroda/koža), ki je lahko zelo kompleksen za obravnavo in zaradi velike kapacitivnosti stika tudi omeji zaznavanje sprememb pri nizkih frekvencah. Tipično se iz meritev uporabi za določanje vsebnosti vode in množine maščobe ali mišične mase.
Spodnja slika kaže električni model biološke celice. R1 predstavlja upornost celične stene, R2 je upornost citoplazme, R3 je upornost vakuole (organeli), C1 kapacitivnost celične membrane (plazmaleme), C2 kapacitivnost tonoplasti (notranje membrane). S spremljanjem impedance celice lahko zaznavamo spremembe, ki se na njej dogajajo. Na primer spremljamo zorenje sadja, staranje ali odmiranje celic, vpliv zdravil na celice, vpliv elektroporacije - spreminjanje začasne propustnosti celic s kratkimi električnimi pulzi) in podobno.
2. Članek: Karkera, Guruprakash & Prakash, Annigere. (2018). An Inorganic Electrolyte Li-O2 Battery with High Rate and Improved Performance. ACS Applied Energy Materials. 1. 10.1021/acsaem.8b00095.
Avtorji v članku obravnavajo elektrolitsko litij-zrak baterijo. Med drugim za analizo delovanja uporabijo impedančno spektroskopijo in ugotovijo, da lahko iz prvega dela spektra (a, modra) razpoznajo upornost povezovalnih kablov, (b, zelena, polkrog) impedanco na anodni strani Z1, (c - viola in rjava, večji poklrog) predstavlja prispevek katode. Skupna nadomestna impedanca je tako serijska vezava impedance kablov ter dveh uporov vzporedno z t.i. CPE elementom ( o tem kasneje) ter na koncu še zaporedne vezave kondenzatorja in upora:
The electrochemical impedance spectroscopy (EIS) measurements revealed the role of molten nitrate electrolytes in a Li−O2cell. The typical impedance spectra depicted in Figure 5 indicate the following contributions: (a) resistance from electrolyte and connectivity cables (Ze, blue shaded), (b) small semi circle indicating the anodic contribution (Z1, green), resulting from the Li−electrolyte interphase at higher frequencies, which also comprises a surface SEI layer on the Li metal, (c) a bigger semicircle (Z2, pink) and inclined line Z3(brown) comprising the cathodic contributions, i.e., kinetic and mass transfer reactions.The impedance data have been analyzed using the equivalent circuit Re(Q1R1)(Q2R2)(CR3) given in Figure 5a,where R implies the resistance contributions of different components of battery, C is the capacitance contributions, and Q is the constant phase element (CPE).
Avtorji analizirajo možnost uporabe impedančne metode za analizo vpliva zdravil (drug resistance) na rakave celice.
Gre za uporabo impedančne spektroskopije na bioloških sistemih, zato se je s časom oblikovalo posebno raziskovalno področje bioimpedančne spektroskopije. Posebnosti je več, morda najbolj zanimiva je ta, da se je izkazalo, da s klasičnimi električnimi elementi (upor, kondenzator, tuljava) ni mogoče dobro opisati izmerjene impedance na bioloških sistemih. Zato so se oblikovali novi modeli, ki so predvsem matematični in nimajo prave fizikalne razlage. Najbolj pogosta je uporaba t.i. člena s konstantno fazo ali CPE, ki ga delno že poznamo iz elektrokemije kot Warburgov element. Impedanca CPE je $\underline Z_{CPE}=\frac{1}{(j \omega C)^\alpha}$, kjer je $\alpha$ koeficient med 0 in 1. Če je $\alpha = 1$ imamo enačbo kondenzatorja, sicer pa nek element
Obravnavajmo najprej primer vzporedne vezave upora in kondenzatorja. Poglejmo, kakšno obliko ima impedanca ali admitanca v kompleksni ravnini in frekvenčnem prostoru.
Izhajamo iz admitance $\underline{Y}(u)=G+j \omega C$. Impedanca je seveda $\underline{Y}=\frac{1}{\underline{Z}}$. Izrišimo tako impedanco kot admitanco v kompleksni ravnini.
## Admitanca in impedanca v kompleksni ravnini
from funkcije import complex_plane3
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
G=10
C=10e-3
omega=np.linspace(0,2000,10) # izdelamo 10 točk od 0 do 2000, linearno
Y=G+1j*omega*C
Z=1/Y
plt.subplots(figsize=(10, 6))
plt.subplot(1,2,1)
plt.plot(Y.real, Y.imag, 'ko')
plt.title('Admitanca')
plt.xlabel('Re[Y]')
plt.ylabel('Im[Y]')
plt.subplots_adjust(right=2)
plt.subplot(1,2,2)
plt.plot(Z.real, Z.imag, 'ko')
plt.title('Impedanca')
plt.xlabel('Re[Z]')
plt.ylabel('Im[Z]')
plt.show()
Ugotovitve: Točke z vrednostmi admitance se, kot pričakovano, nizajo v smeri Y osi z naraščanjem frekvence. Točke impedance imajo bolj nenavadno obliko, so na negativni strani imaginarne osi in kažejo polkrožno obliko. Osnovni princip preslikave iz admitančne kompleksne ravnine v impedančno je, da se preslika pozitivni kot v negativnega (in obratno) ter velika amplituda v majhno (in obratno) saj velja:
$\underline{Y}=Y e^{j\varphi} $ in
${\underline Z}=\frac{1}{\underline Y}=\frac{1}{Y e^{j\varphi}} = Z e^{-j\varphi}$
Bolj jasno sliko dobimo, če imata Re in Im os enaki velikosti. To naredimo v spodnjem grafu za impedanco, poleg tega povečamo frekvenčno območje ter obrnemo imaginarno os, tako, da rišemo negativno imaginarno os. To je tudi običajno v praksi.
## Izris impedance z obrnjeno Y osjo
omega=np.linspace(0,20000,100) # izdelamo 10 točk od 0 do 2000, linearno
Y=G+1j*omega*C
Z=1/Y
plt.subplots(figsize=(10, 6))
plt.plot(Z.real, -Z.imag, '-ko')
plt.title('Impedanca')
plt.xlabel('Re[Z]')
plt.ylabel('-Im[Z]')
plt.axis('scaled')
plt.show()
Ugotovitve: Povezane točke tvorijo pravi polkrog (ne elipse). To bi lahko ugotovili tudi teoretično, če bi ustrezno razdelali enačbo za admitanco v impedanco. Poleg tega ugotovimo, da se točke impedance zelo gostijo v smeri proti koordinatnemu izhodišču z večanjem frekvence. To tudi pomeni, da merjenje impedance z linearnim večanjem frekvence ni ravno najbolj optimalno, saj pri nižjih frekvencah izgubljamo informacijo, pri višjih pa ni mnogo novih informacij, saj se med točkami impedanca malo spreminja.
Zato je bolj običajno, da se impedanco določa z bolj enakomerno razporejenimi vrednostmi frekvence. Poskusimo eksponentno.
## Nyquistov diagram z log razporeditvijo frekvenc
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
omega=10**(eksponent)
Y=G+1j*omega*C
Z=1/Y
plt.subplots(figsize=(10, 6))
plt.plot(Z.real, -Z.imag, '-ko')
plt.title('Impedanca')
plt.xlabel('Re[Z]')
plt.ylabel('-Im[Z]')
plt.axis('scaled')
plt.show()
Narišimo še impedanco tako, da je na abscisi frekvenca. Na ordinati pa naj bo impedanca in fazni kot, torej potrebujemo dve ordinatni osi.
## Linearna os
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
Y=G+1j*omega*C
Z=1/Y
fig, ax1 = plt.subplots(figsize=(10, 6))
color = 'tab:red'
ax1.set_xlabel('Frekvenca (Hz)')
ax1.set_ylabel('Abs(Impedanca) / $\Omega$', color=color)
ax1.plot(freq,abs(Z), color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax1.grid(axis='x')
ax2 = ax1.twinx() # x os za drugi plot naj bo enaka x osi prvega plota
color = 'tab:blue'
ax2.set_ylabel('Fazni kot /rad', color=color)
ax2.plot(freq,np.angle(Z), color=color)
ax2.tick_params(axis='y', labelcolor=color)
plt.show() # klikni puščico za ogled vsebine
Iskaže se, da nam tak graf ne da kaj dosti informacij, ker se sprememba impedance zgodi v zelo ozkem frekvenčnem oknu. Zato je bolj običajno, da se abscisno os (in tudi ordinatno) riše v logaritemskem merilu. Ne pa tudi ordinatno os za fazni kot, ki ostane linearna. Takemu prikazu rečemo Bodejev diagram. Bolj pogosto to ime zasledimo pri analizi filtrov, ki jih bomo na kratko obdelali v naslednjem zvezku.
## Bodjev diagram
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
Y=G+1j*omega*C
Z=1/Y
fig, ax1 = plt.subplots(figsize=(10, 6))
color = 'tab:red'
ax1.set_xlabel('Frekvenca (Hz)')
ax1.set_ylabel('Abs(Impedanca) / $\Omega$', color=color)
ax1.loglog(freq,abs(Z), color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax1.grid(axis='x')
ax2 = ax1.twinx() # x os za drugi plot naj bo enaka x osi prvega plota
color = 'tab:blue'
ax2.set_ylabel('Fazni kot /rad', color=color)
ax2.plot(freq,np.angle(Z), color=color)
ax2.tick_params(axis='y', labelcolor=color)
plt.show() # klikni puščico za ogled vsebine
Ugotovitve: Impedanca vzporedne RC vezave je do določene frekvence konstantna, fazni kot je enak 0. To je pri nizkih frekvencah, ko je impedanca kondenzatorja zelo velika in nima vpliva na skupno impedanco. Pri visokih frekvencah pa postaja impedanca kondenzatorja (reaktanca) vedno manjša in sčasoma (zaradi vporedne vezave) prevlada, kar se odraža tudi v faznem kotu, ki se "premakne" proti $-\pi/2$.
Padanje impedance pri višjih frekvencah je v logaritemskem prikazu linearno. Poglejmo zakaj. Absolutna vrednost impedance kondenzatorja je $Z_C = \frac{1}{\omega C}$ in če jo logaritmiramo, dobimo
je $\log(Z_C) =\log(\frac{1}{\omega C})=\log(1)-\log(\omega C) = - \log(\omega)-\log(C)$.
Dobimo enačbo premice $y=-kx-n $ za logaritemsko merilo.
Preverimo še, kako se odražajo spremembe določenega parametra v grafu. Na primer, izrišimo impedanco vzporedne RC vezave za različne vrednosti kapacitivnosti v Nyquistovem in Bodejevem diagramu.
## Impedanca vporedne vezave RC v Bodejevem in Nyquistovem diagramu
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
Y=G+1j*omega*C
def Z(C,G):
return 1/(G+1j*omega*C)
fig, (ax1, ax2) = plt.subplots(1, 2,figsize=(10, 6))
plt.subplot(1,2,1)
color = 'tab:blue'
plt.xlabel('Frekvenca (Hz)')
plt.ylabel('Abs(Impedanca) / $\Omega$', color=color)
plt.loglog(freq,abs(Z(1e-4,10)), color='b')
plt.loglog(freq,abs(Z(1e-3,10)), color='r')
plt.loglog(freq,abs(Z(1e-2,10)), color='g')
plt.ylim(1e-3,1)
plt.subplots_adjust(right=2)
plt.subplot(1,2,2)
plt.ylabel('Im [Z]', color=color)
plt.ylabel('Re [Z]', color=color)
plt.plot(Z(1e-4,10).real,-Z(1e-4,10).imag,color='b') # dodaj 'o' za izris krogcev
plt.plot(Z(1e-3,10).real,-Z(1e-3,10).imag, color='r')
plt.plot(Z(1e-2,10).real,-Z(1e-2,10).imag, color='g')
plt.show() #
Ugotovitve: V loglog merilu dobimo tri krivulje, kot pričakovano, če je kapacitivnost večja, je reaktanca manjša in bo njen vpliv večji že pri nižjih frekvencah. Nekoliko bolj presenetljiv rezultat je na desni, saj smo dobili kot rezultat eno samo krivuljo. Je to ok? odgovor je DA, vezje je še vedno enako za vse tri primere kapacitivnosti. Če bi spremljali točke impedance za različne frekvence, bi ugotovili, da so za različne kapacitivnosti na različnih mestih, vendar ležijo na isti krivulji. To lahko hitro preveriš tako, da zmanjšaš število točk, ki se izrisujejo (iz 100 na npr. 10) in v plotu dopišeš, naj se izrisujejo točke brez povezane krivulje (dodaš 'o'). Zadostuje pa tudi že razmislek, da frekvenca in kapacitivnost v enačbi nastopata skupaj, v produktu, torej ima povečanje frekvence ali povečanje kapacitivnost enak učinek.
Sedaj tudi vidimo, zakaj je izris v kompleksni ravnini (med drugim) primeren - iz oblike krivulje lahko dobro razberemo vezavo nadomestne impedance vezja.
Zdaj pa ti: Spremeni vrednosti prevodnosti G (pri fiksni vrednosti kapacitivnosti) in ugotavljaj spremembe na grafih. Ali se sprememba G-ja odraža tudi v Nyquistovem diagramu?
Ugotovitve: Bodejev diagram kaže spremembe predvsem pri nižjih frekvencah, ko impedanca ni več popolnoma "ravna", bolj izrazite spremembe pa vidimo v kompleksni ravnini, kjer se pojavi dodatni "izrastek", ki "pokvari" obliko polkroga. Ravno ta "izrastek" tipično nakazuje vpliv Warburgovega člena. Poleg tega opazimo, da tudi v kompleksni ravnini dobimo tri ravnine, saj v Warburgovem členu $\omega$ ne nastopa skupaj s kapacitivnostjo.
Randelsova celica v elektrokemiji imenujejo električni model (impedanco) preproste elektrokemijske strukture, ki jo določata elektrodi in elektrolit med elektrodama. Model sestavlja vzporedna vezava kondenzatorja ($C_{dl}$) in upora ($R_{ct}$) kateri je zaporedno dodan še en upor ($R_s$). Glej npr. https://www.gamry.com/application-notes/EIS/basics-of-electrochemical-impedance-spectroscopy/. $C_{dl}$ predstavlja kapacitivnost t.i. dvojne plasti, ki se tvori ob stiku elektrolita z elektrodo, $R_{ct}$ je upornost ob prenosu naboja (charge transfer resistance), $R_s$ pa predstavlja upornost razstopine (solution). Na kratko nadomestno impedanco zapišemo kot
$\underline Z = R_s +R_{ct}||\underline Z_{dl}$.
Ker smo že v prejšnjem poglavju obravnavali vzporedno vezavo kondenzatorja in upora, je analiza impedance ob dodatku še zaporedno vezanega upora enostavna.
## Randelsova celica
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
R=0.1
def Z(C,G):
return 1/(G+1j*omega*C)+R
fig, (ax1, ax2) = plt.subplots(1, 2,figsize=(10, 6))
plt.subplot(1,2,1)
color = 'tab:blue'
plt.xlabel('Frekvenca (Hz)')
plt.ylabel('Abs(Impedanca) / $\Omega$', color=color)
plt.loglog(freq,abs(Z(1e-4,10)), color='b')
plt.loglog(freq,abs(Z(1e-3,10)), color='r')
plt.loglog(freq,abs(Z(1e-2,10)), color='g')
plt.ylim(1e-3,1)
plt.subplots_adjust(right=2)
plt.subplot(1,2,2)
plt.ylabel('Im [Z]', color=color)
plt.ylabel('Re [Z]', color=color)
plt.plot(Z(1e-4,10).real,-Z(1e-4,10).imag,color='b') # dodaj 'o' za izris krogcev
plt.plot(Z(1e-3,10).real,-Z(1e-3,10).imag, color='r')
plt.plot(Z(1e-2,10).real,-Z(1e-2,10).imag, color='g')
plt.xlim(0,0.3); plt.ylim(0,0.2)
plt.show()
Dodajmo vzporedni vezavi RC zaporedno še t.i. Warburgov člen, tako, da impedanca postane
$\underline{Z}(u)=\frac{1}{G+j \omega C}+\frac{A_W}{\sqrt\omega}(1-j)$.
Poglejmo, kaj dobimo, če impedanco zrišemo v Nyquistovem in Bodejevem diagramu.
## Z dodatkom Warburgove impedance
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
Aw=0.1
def Z(C,G,R):
return 1/(G+1j*omega*C)+R+Aw*(1-1j)/np.sqrt(omega)
fig, (ax1, ax2) = plt.subplots(1, 2,figsize=(10, 6))
plt.subplot(1,2,1)
color = 'tab:blue'
plt.xlabel('Frekvenca (Hz)')
plt.ylabel('Abs(Impedanca) / $\Omega$', color=color)
plt.loglog(freq,abs(Z(1e-4,10,1)), color='b')
plt.loglog(freq,abs(Z(1e-3,10,1)), color='r')
plt.loglog(freq,abs(Z(1e-2,10,1)), color='g')
#plt.ylim(1e-3,1)
plt.subplots_adjust(right=2)
plt.subplot(1,2,2)
plt.ylabel('Im [Z]', color=color)
plt.ylabel('Re [Z]', color=color)
plt.plot(Z(1e-4,10,1).real,-Z(1e-4,10,1).imag,color='b') # dodaj 'o' za izris krogcev
plt.plot(Z(1e-3,10,1).real,-Z(1e-3,10,1).imag, color='r')
plt.plot(Z(1e-2,10,1).real,-Z(1e-2,10,1).imag, color='g')
plt.show()
Ugotovitve: Če primerjamo Bodejev diagram brez serijske in z serijsko upornostjo ugotovimo precejšnjo razliko, predvsem v amplitudi impedance pri višjih frekvencah. Brez serijske upornosti pri visokih frekvencah impedanca pada proti nič (kratek stik), pri Randelsovi celici pa je impedanca omejena s serijsko upornostjo.
V kompleksni ravnini pa opazimo razliko preprosto v premiku polkroga v desno za vrednost upornosti. Potrebno pa se je zavedati, da kompleksorji impedance izhajajo iz koordinatnega izhodišča in ne iz središča polkroga. Pri $\omega = 0$ je $Z(0)=R_s+R_{ct}$, pri $\omega = \infty$ pa je $Z(\infty)=R_s$.
Upornosti zaradi prenosa naboja $R_{ct}$ se pogosto doda Warburgov člen, ki smo ga že obravnavali, s čimer se modelira poleg kinetičnega procesa še difuzijski proces.
Zdaj pa ti:
CPE je matematično zasnovan element, ki na najbolj ustrezen način opiše frekvenčne karakteristike impedance, ki jih zasledimo pri analizi določenih struktur, najpogosteje v kemiji ali biologiji. Impedanca CPE je določena kot
$\underline Z_{CPE} = \frac{1}{(j\omega C)^{\alpha}}$ ali tudi $\underline Z_{CPE} = \frac{1}{Q(j\omega)^{\alpha}}$, odvisno, katero literaturo vzamete v roko. Admitanca je torej $\underline Y_{CPE} = (j\omega C)^{\alpha}$ ali tudi $\underline Y_{CPE} = Q{(j\omega )^{\alpha}}$, ki jo lahko razdelimo na realni in imaginarni del in dobimo
$\underline Y_{CPE} = Q\omega^{\alpha}(\cos\frac{\alpha\pi}{2}+j\sin\frac{\alpha\pi}{2})$.
Iz enačbe razberemo, da je pri $\alpha=1$ CPE v bistvu kodenzator, pri $\alpha=0$ upor, pri $\alpha=-1$ pa tuljava. Pri ostalih vrednostih pa je nekaj vmes med uporom, kondenzatorjem in tuljavo, s tem, da ima določeno amplitudo, ki se spreminja s frekvenco a hkrati konstantno fazo.
Poglejmo si, kako izgleda na sliki frekvenčna karakteristika zaporedne vezave upora in CPE elementa $\underline Z_{nad} = \frac{1}{(j\omega C)^{\alpha}} + R$ za različne vrednosti $\alpha$.
### CPE element v odvisnosti od frekvence
eksponent=np.linspace(0,9,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
C=1e-5
R=1
def ZCPE(a):
return 1/(1j*omega*C)**a+R
def YCPE(a):
return 1/ZCPE(a)
fig, (ax1, ax2) = plt.subplots(2, 2,figsize=(10, 6))
plt.subplot(1,2,1)
plt.xlabel('Frekvenca (Hz)')
plt.ylabel('Abs(Impedanca) / $\Omega$')
plt.loglog(freq,abs(ZCPE(1)), color='b',label='1')
plt.loglog(freq,abs(ZCPE(0.7)), color='k',label='0.7')
plt.loglog(freq,abs(ZCPE(1/2)), color='r',label='0.5')
plt.loglog(freq,abs(ZCPE(0)), color='g',label='0')
plt.legend()
plt.subplots_adjust(right=1)
plt.subplot(1,2,2)
plt.xlabel('Frekvenca (Hz)')
plt.ylabel('Abs(Admitanca) / S')
plt.loglog(freq,abs(YCPE(1)), color='b')
plt.loglog(freq,abs(YCPE(0.7)), color='k')
plt.loglog(freq,abs(YCPE(1/2)), color='r')
plt.loglog(freq,abs(YCPE(0)), color='g')
[<matplotlib.lines.Line2D at 0x1991e5b0>]
Ugotovitve: Abslutna vrednost nadomestne impedance se v log-log merilu linearno manjša, saj je $\log (Z_{CPE}) = \log{(\omega C)^{-\alpha}} = -\alpha \log(\omega C)= -\alpha (\log\omega + \log C)$. Ko pade vrednost pod vrednost upornosti, določa vrednost impedance upor.
Zanimivo je pogledati še potek impedance v kompleksni ravnini.
## ZCPE+R v kompleksni ravnini
fig, (ax1, ax2) = plt.subplots(2, 2,figsize=(10, 6))
plt.subplot(1,2,1)
plt.xlabel('Re[Z] / $\Omega$')
plt.ylabel('Im[Z] / $\Omega$')
plt.plot(ZCPE(1).real,ZCPE(1).imag, color='b',label='1')
plt.plot(ZCPE(0.7).real,ZCPE(0.7).imag, color='k',label='0.7')
plt.plot(ZCPE(1/2).real,ZCPE(1/2).imag, color='r',label='0.5')
plt.plot(ZCPE(0).real,ZCPE(0).imag, color='g',label='0')
plt.ylim(0,-400)
plt.legend()
plt.subplots_adjust(right=2)
plt.subplot(1,2,2)
plt.xlabel('Re[Y] / S')
plt.ylabel('Im[Y] / S')
plt.plot(YCPE(1).real,YCPE(1).imag, color='b')
plt.plot(YCPE(0.7).real,YCPE(0.7).imag, color='k')
plt.plot(YCPE(1/2).real,YCPE(1/2).imag, color='r')
plt.plot(YCPE(0).real,YCPE(0).imag, color='g')
[<matplotlib.lines.Line2D at 0x1bb55270>]
Ugotovitve: Impedanca zaporedne vezave CPE in upora je v kompleksni impedančni ravnini premica, ki pa se v kompleksno admitančno ravnino preslika v točke, ki niso več polkrogi (razen za $\alpha = 1$) pač pa del loka krožnice, ki nima središča na Re osi pač pa pod njo. Take oblike "potlačenih" polkrogov pogosto dobimo iz meritev bioloških ali kemijskih struktur.
Vzemimo najpreprostejši model izgubnega kondenzatorja, ki ga modeliramo kot vzporedno vezavo idealnega kondenzatorja in upora. Admitanca takega kondenzatorja, ki jo predstavimo z nadomestno kapacitivnostjo $C_{nad}$ je $\underline Y = j\omega C_{nad} = j\omega C + G$.
Za preprost ploščni kondezator velja $C=\epsilon \frac{A}{d}$ in $G=\gamma \frac{A}{d}$, kjer je $\epsilon$ dielektričnost in $\gamma$ specifična prevodnost kondenzatorja. Če to vstavimo v zgornjo enačbo za nadomestno kapacitivnost, dobimo $j\omega \underline{\epsilon} \frac{A}{d} = j\omega \epsilon \frac{A}{d} + \gamma \frac{A}{d}$. Iz tega sledi enačba za kompleksno dielektričnost
$\underline{\epsilon} = \epsilon + \gamma \frac{1}{j\omega}$ ali tudi v splošnem
$\underline{\epsilon} = \epsilon ' - j \epsilon '' $.
Iz izmerjene impedance določenega vzorca, lahko ob poznavanju geometrije vzorca določimo dielektrične lastnosti vzorca. Če je ustrezen fizikalni model kondenzatorja vzporedna vezava idealnega kondenzatorja in upora, potem realni del kompleksne dielektričnosti predstavlja dielektričnost vzorca $\epsilon ' =\epsilon $, imaginarni pa prevodnost $\epsilon '' =\gamma \frac{1}{\omega}$.
Dielektrična spektroskopija se opravlja popolnoma na enak način kot impedančna spektroskopija, za določitev dielektričnih lastnosti je potrebno poznati le t.i. konstanto celice, ki je v našem primeru $ \frac{A}{d}$.
Na enak način kot smo določili kompleksno dielektričnost, se da določiti tudi kompleksno prevodnost $\underline \gamma$ in tudi kompleksno permeabilnost (permitivnost) $\underline \mu$. Slednjo se pogosto uporablja pri opisovanju frekvenčnih lastnosti feromagnetnih materialov, še posebno feritov.
Pri raziskavi dielektrikov nas zanima določitev t.i. disperzijskih in absorpcijskih lastnosti, ki jih določata imaginarna in realna komponenta kompleksne dielektričnosti. Osnovni model je t.i. Debye-jev model, ki je zgrajen iz vzporedne vezave kodenzatorja v eni veji in kodenzatorja in upora v drugi veji (glej sliko, levo (a)).
Ta model zapišemo v obliki
$\underline{\epsilon} = \epsilon _{\infty} + \frac{\epsilon _{0} - \epsilon _{\infty}}{1+j\omega\tau} $.
$\epsilon _0$ predstavlja dielektričnost pri nizkih frekvencah (DC), $\epsilon _{\infty}$ pa pri visokih frekvencah. $\tau$ imenujemo relaksacijski čas in je povezan s hitrostjo relaksacije oz. iznihanja polariziranih dipolov. Na primer, pri nizkih frekvencah nihanje dipolov v snovi uspe slediti vzbujalnemu signalu, nad določeno frekvenco pa jim to več ne uspeva, zato se njihove dielektrične lastnosti zmanjšajo.
Debye-jev model izhaja iz fizikalnega ozadja in dokaj verno opiše absorpcijske in disperzijske lastnosti dielektrikov, ne pa tudi v popolnosti. Izmerjene dielektrične lastnosti so pokazale odstopanja, ki jih razreši nadgrajen model, t.i. Cole-Cole model. Ta vsebuje že omenjeni CPE element, tako, da postane enačba za kompleksni epsilon oblike
$\underline{\epsilon} = \epsilon _{\infty} + \frac{\epsilon _{0} - \epsilon _{\infty}}{1+(j\omega\tau)^{1-\alpha}} $.
Na zgornji sliki desno vidimo uporabo Cole-Cole modela za prileganje izmerjenim vrednostim dielektričnih lastnosti nekaterih snovi.
V spodnji celici smo uporabili Debyejev in Cole-Colov model za opis dielektričnih lastnosti vode.
e0=81
einf=1.8
tau=9.4*10**(-12)
alfa=0.09
print(1/tau)
eksponent=np.linspace(5,13,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
def eps(e0, einf,tau, alfa):
return einf+(e0-einf)/(1+(1j*omega*tau)**(1-alfa))
fig, (ax1, ax2) = plt.subplots(2, 1,figsize=(10, 6))
plt.subplot(1,2,1)
plt.xlabel('Frekvenca (Hz)')
plt.ylabel('Abs(Impedanca) / $\Omega$')
plt.semilogx(freq,eps(e0,einf,tau,0).real, color='b',label='Debye real')
plt.semilogx(freq,eps(e0,einf,tau,alfa).real, color='r',label='Cole real')
plt.semilogx(freq,-eps(e0,einf,tau,0).imag, color='b',linestyle=':',label='Debye imag')
plt.semilogx(freq,-eps(e0,einf,tau,alfa).imag, color='r',linestyle=':',label='Cole imag')
plt.legend()
plt.subplots_adjust(right=2)
plt.subplot(1,2,2)
plt.xlabel('Re[Y] / S')
plt.ylabel('Im[Y] / S')
plt.plot(eps(e0,einf,tau,0).real,-eps(e0,einf,tau,0).imag, color='b')
plt.plot(eps(e0,einf,tau,alfa).real,-eps(e0,einf,tau,alfa).imag, color='r')
106382978723.40427
[<matplotlib.lines.Line2D at 0x293d6410>]
Ugotovitve: Vidimo, da je realni del dielektričnosti vode praktično do GHz konstanten, potem pa pade na vrednost 1.8. Kot omenjeno, je to posledica nezmožnosti dipolov vode, da sledijo frekvenci vzbujalnega signala. Ob tem prihaja do trenja, ki se odraža v imaginarnem delu kompleksne dielektričnosti, ki, kot smo videli iz enačb, predstavlja "ohmske" izgube, ki jih pri dielektričnosti opišemo z izrazom absorpcija (EM valovi se absorbirajo). Razlika med Cole-Cole modelom in Debyejevim modelom za vodo ni velika, večja pa je za druge strukture, kot je razvidno tudi iz slike iz članka.
Največja absorpcija nastopa v GHz področju, vendar glede na graf pri višjih frekvencah, kot pa deluje mikrovalovna pečica (2.4 GHz) - ki ravno izkorišča efekt dielektrične absorpcije za gretje piščanca. To naj bi bilo narejeno namerno, tako, da se mikrovalovi ne absorbirajo le na površini piščanca, pač pa del njih prodre tudi v notrajnost in ga tako bolj enakomerno segreje. Poleg tega je relaksacijska frekvenca precej odvisna od temeprature, pri višji temperaturi je manjša.Več npr. v http://www1.lsbu.ac.uk/water/microwave_water.html.
Zanimivo je, da Cole-Cole model ni primeren le za modeliranje dielektričnih lastnosti "preprostih" dielektrikov, pač pa se je izkazalo, da v razširjeni obliki zelo dobro modelira tudi dielektrične lastnosti bioloških tkiv. Trenutno, v bistvu že kar nekaj časa, je v veljavi več-parametrski model, ki sta ga predlagala Gabriel & Gabriel () in temelji na uporabi več osnovnih Cole-Cole enačb. S tem omogoči, da se modelira relaksacijske mehanizme v bioloških sistemih, ki nastopajo pri več različnih frekvencah. Model, ki sta ga uporabila
$$\underline{\epsilon} = \epsilon _{\infty} + \sum_{n=1}^{4} \frac{\Delta \epsilon_n}{1+(j\omega\tau _n)^{1-\alpha _n}} + \frac{\gamma }{j \omega \epsilon _0}$$.
ef=4.000
del1=56
tau1=8.377e-12
alf1=.1
del2=5200
tau2=132.629e-9
alf2=.1
sig=.7
del3=0.7
tau3=159.155
alf3=0.2
del4=0
tau4=15e-3
alf4=0
e0=8.854e-12
# 56.00 8.377 0.100 5200 132.629 0.100 0.700 0.00E+0 159.155 0.200 0.00E+0 15.915 0.000
eksponent=np.linspace(1,12,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
eps=ef+del1/(1+(1j*omega*tau1)**(1-alf1))+del2/(1+(1j*omega*tau2)**(1-alf2))
eps=eps+del3/(1+(1j*omega*tau3)**(1-alf4))+del4/(1+(1j*omega*tau4)**(1-alf4))+sig/(1j*omega*e0)
sigma=1j*eps*omega*e0
fig, (ax1, ax2) = plt.subplots(2, 1,figsize=(10, 6))
plt.subplot(1,2,1)
plt.xlabel('Frekvenca (Hz)')
plt.ylabel('Eps in Gama / ')
plt.loglog(freq,(eps).real, color='b',linewidth=3,label='eps.real')
plt.loglog(freq,sigma.real, color='r',linewidth=3,label='gama.real')
plt.loglog(freq,(sigma).imag, color='r',linestyle=':',label='gama.imag')
plt.grid(True,which="both")
plt.ylim(.1,1e4)
plt.legend()
plt.subplots_adjust(right=2)
plt.subplot(1,2,2)
plt.xlabel('Re ')
plt.ylabel('Im')
plt.plot((1/eps).real,(1/eps).imag, color='b')
#plt.plot(sigma.real,-sigma.imag, color='b')
[<matplotlib.lines.Line2D at 0x37472df0>]
Ugotovitve: Na sliki na levi je izrisana realna komponenta kompleksne dielektričnosti (epsr), ki opisuje dielektrične lastnosti krvi in specifična prevodnost (gama), ki je določena kot (glej uvod v dielektrično spektroskopijo) $\gamma = - \omega \epsilon '' \epsilon_0$.
Dielektričnost se ne spreminja do cca 1 MHz, potem izkazuje eno relaksacijo in pri frekvenci 10 GHz še eno. To se odraža tudi v večanju prevodnosti s frekvenco.
Ali to pomeni, da pri prevajanju izmeničnih signalov v krvi prevladujejo dielektrične lastnosti, torej kapacitivni efekt (premikalni tok) v primerjavi z ohmskim? V bistvu ne, izkaže se, da je ohmska komponenta v bistvu mnogo večja od dielektrične (kapacitivne) do precej visokih frekvenc. To bi videli, če bi na grafu izrisali tudi imaginarno komponento kompleksne dielektričnosti, ki se nanaša na ohmsko komponento. Ta bi bila mnogo večja pri nizkih frekvencah. Analogno lahko primerjamo tudi realno in imaginarno komponento prevodnosti, saj je $\underline \gamma = j \omega \underline \epsilon$. Sedaj realna komponenta predstavlja ohmski prispevek, imaginarna pa kapacitivni. Na sliki vidimo, da je imaginarna komponenta specifične prevodnosti mnogo manjša od realne do frekvenc pod MHz, kar ravno pove, da v tem področju prevladuje ohmsko prevajanje. Nad to frekvenco pa začne prevladovati dielektrično prevajanje.
Na sliki desno rišemo $1/\underline\epsilon$ v kompleksni ravnini. Zakaj $1/\underline\epsilon$ in ne $\underline\epsilon$. Zato, ker za $\underline\epsilon$ ne bi dobili "nič pametnega". Kaj to pomeni? Realni del od $\underline\epsilon$ predstavlja dielektrične, imaginarni pa prevodne lastnosti tkiva. Prevodne lastnosti (ohmske) precej prevladujejo dielektrične, še posebno pri nižjih frekvencah (do nekaj MHz), ki pa se kot inverzne vrednosti preslikajo v male vrednosti in polkrog.
Če bi želeli opazovati vpliv Cole-Cole elementov znotraj modela, bi bilo potrebno zakomentirati zadnji del modela, ki vsebuje člen $ \frac{\gamma }{j \omega \epsilon _0}$.
Načeloma je iskanje parametrov določeni funkciji, ki jo primerjamo z izmerjenimi vrednostmi lahko enostavno. V Pythonu obstaja modul SciPy, ki vsebuje funkcije za iskanje optimalnega prileganja (fitanje z grdim izrazom) modelne funkcije z npr. izmerjenimi vrednostmi. Nas zanima prileganje modelu impedance ali admitance. Predpostavimo torej določen model (nadomestne) impedance, ki ga predstavimo s funkcijo in nato uporabimo Scipyjev ukaz optimize.curve_fit, da poiščemo parametre, ki najbolje prilegajo modelno funkcijo izmerjenim vrednostim.
Uporaba funkcije curve_fit je v našem primeru nekoliko bolj zapletena, ker je funcija impedance kompleksna in v bistvu sestavljena iz dveh delov, realnega in imaginarnega ali pa amplitude in faze. Direkten vnos kompleksne funkcije v curve_fit ni mogoč, zato je potrebno uporabiti "trik", da bo rezultat modelne funkcije niz vrednosti float, pri čemer so imaginarne vrednosti spremenjene v float.
Da bi lažje razumeli uporabo funkcije curve_fit, si poglejmo najprej uporabo na preprostem "ne-kompleksnem" modelu prileganja eksponentne funkcije. Namesto izmerjene uporabimo eksaktno funkcijo, ki pa ji dodamo naključni šum.
Kot zanimivost: Ena od možnih aplikacij (od mnogih) merjenje dielektričnih lastnosti krvi je ugotavljanje dielektričnosti pri sladkornih bolnikih. Izkaže se, da se dielektrične lastnosti krvi pri diabetikih zelo spremenijo, kar predstavlja možno metodo določanja nivoja glukoze v krvi. Za več glej npr. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2914348/.
## Uporaba knjižnice Scipy in optimize znotraj nje
import scipy.optimize as opt
def exp_func(t, amp, tau):
return amp * np.exp(-t/tau)
# izdelamo eksaktno funkcijo in funkcijo z dodanim šumom
t = np.linspace(0, 5, 101)
y_exact = exp_func(t, 2, 0.5)
y_noise = exp_func(t, 2, 0.5) + np.random.normal(size=len(t), scale=0.05)
plt.plot(t,y_exact)
plt.plot(t, y_noise, '.')
# Prileganje
popt, pcov = opt.curve_fit(exp_func, t, y_noise) # uporaba funkcije curve_fit
t_new=np.linspace(0, 5, 10) # rešitev bom risal samo v 10 ih točkah zato tvorim nov vektor časa
plt.plot(t_new, exp_func(t_new,popt[0],popt[1]), 'o') # fitana funkcija - zelene točke
# določen prvi in drugi parameter + interval zaupanja (en sigma)
print("amp =", popt[0], "+/-", pcov[0,0]**0.5)
print("tau =", popt[1], "+/-", pcov[1,1]**0.5)
amp = 2.0482431712098235 +/- 0.029313893219368586 tau = 0.4827304466393505 +/- 0.010280560612845888
Vzamemo kar model Randelsove celice (vzporedni RC člen in zaporedno upor), kar na kratko zapišemo kot
$\underline Z = R_s +R_{ct}||\underline Z_C$.
Najprej določimo to impedanco za konkretne vrednosti parametrov, potem pa skušamo poiskati te parametre z "napačnimi" izhodiščnimi parametri.
### Iskanje parametrov modela
# ker se fita kompleksna funkcija, jo je potrebno spremeniti v "navadno"
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
freq=10**(eksponent)
omega=2*np.pi*freq
R=0.1
G=2
C=1e-4
Z= 1/(G+1j*omega*C)+R
## To deluje za shranjevanje v binarni file in brnje nazaj
# (načeloma ne potrebujem, le če bi v resnici bral izmerjene impedance)
with open('test.npy', 'wb') as f:
np.save(f, omega)
np.save(f, Z)
with open('test.npy', 'rb') as f:
om = np.load(f)
ZZ = np.load(f)
## Uporaba knjižnice Scipy in optimize znotraj nje
import scipy.optimize as opt
def func(omega,a,b,c): # definiram funkcijo s parametri a,b,c, ki jih iščem
Zfunc=(1/(a+1j*omega*b)+c)
return Zfunc.view(np.float) # ker gre za kompleksne vrednosti, jim moram spremeniti v dvojni float array
a=100; b=1e-4; c=100 # začetni parametri (prave vrednosti so G, C in R)
omega2=np.append(omega,omega) # potrebujem dvojni array, ker bo func vrnila dvojne vrednosti namesto kompleksnih
Z2= Z.view(np.float)# spremenim Z v dvojni array
(a_, b_, c_), _ = opt.curve_fit(func, omega, Z2) # fitting procedura, func vrne dvojni array zato primerjam z Z2
print(a_,b_,c_) # dobljeni parametri
z_model = func(omega2, a_, b_, c_) # dobljena funkcija oz. vrednosti iz modela
zz=z_model.view(complex) # spremenim nazaj v kompleksne vrednosti
#print(y)
plt.plot(Z.real,-Z.imag,label='meritev') # to iščem
plt.plot(zz.real,-zz.imag,'o',label='model') # izris rezultata fitanja
plt.legend()
2.0 0.0001 0.1
<matplotlib.legend.Legend at 0x223640f0>
V zvezku smo spoznali uporabo impedančne spektroskopije za iskanje nadomestnega modela impedance strukture. Pri tem se izkaže, da je pogosto težko določiti nadomestni model le s pomočjo vezja sestavljenega iz uporov, kodenzatorjev in tuljav. Še posebno pride ta problem do izraza pri elektrokemijskih pojavih ali bioloških sistemih.
V ta namen se pogosto impedanco ali admitanco kot funkcijo frekvence riše v kompleksni ravnini. Iz oblike krivulje v kompleksni ravnini, ki je pogosto v obliki polkroga, več polkrogov ali kaj podobnega, se lahko razbere nadomestna vezava elementov.
Spoznali smo t.i. Warburgov element oz. Warburgovo inpedanco $\underline{Z}_W = \frac{A_W}{\sqrt\omega}(1-j)$, ki v elektrokemiji dobro modelira difuzijske procese, ki so prisotni predvsem pri nižjih frekvencah.
Še bolj splošen model je koncept elementa s konstantno fazo CPE (constant phase element), katerega impedanca je $\underline Z_{CPE} = \frac{1}{Q (j\omega)^{\alpha}}$. Z nastavljanjem parametra $\alpha$ je mogoče nastavljati konstanten fazni kot ter hitrost spreminjanja impedance s frekvenco. To se v kompleksni ravnini odraža kot nekakšna poltačena polkrožnica, ki pa odlično modelira impedance, ki jih dobimo v elektrokemijskih ali bioloških sistemih.
Pomemben del analize s pomočjo impedančne spektroskopije je tudi iskanje ustreznega nadomestnega modela izmerjenim vrednostim impedance. V tem zvezku je prikazan možen princip iskanja parametrov z iskanjem prileganja modela impedance izmerjenim vrednostim.
## Nyquistov diagram za zaporedno vezavo R in L
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
omega=10**(eksponent)
R=10
L=10e-4
Z=R+1j*omega*L
Y=1/Z
plt.subplots(figsize=(10, 6))
plt.plot(Y.real, Y.imag, '-ko')
plt.title('Admitanca')
plt.xlabel('Re[Y]')
plt.ylabel('Im[Y]')
plt.axis('scaled')
style = dict(size=10, color='gray')
freq=10**(np.linspace(0,4,10))
Y2=1/(R+1j*2*np.pi*freq*L)
for i in [0,5,6,7,8,9]:
plt.text(1.01*Y2.real[i], Y2.imag[i], np.round(freq[i]), **style)
plt.show()
## Nyquistov diagram za zaporedno vezavo R in C
eksponent=np.linspace(0,5,100) # izdelamo 10 točk od 0 do 2000, linearno
omega=10**(eksponent)
R=10
C=10e-5
Z=R+1/(1j*omega*C)
Y=1/Z
plt.subplots(figsize=(10, 6))
plt.plot(Y.real, Y.imag, '-ko')
plt.title('Admitanca')
plt.xlabel('Re[Y]')
plt.ylabel('Im[Y]')
plt.axis('scaled')
# Za izris frekvence v določenih točkah
for i in [0,40,50,60,70,80,90]:
plt.text(1.01*Y.real[i], Y.imag[i], np.round(omega[i]), **style)
plt.show()
plt.show()