I denne øvelsen skal vi finne ekvivalenspunktet i en titrering, hvor vi starter med en saltstyre (HCl) og tilsetter kontrollert en sterk base, natriumhydroksid (NaOH). Etterhvert som basen tilsettes vil pHen gradvis øke, først sakte, så raskt i omslagsområdet, for så flate ut. Målingene gjøres med en dråpeteller og en pH-måler fra PASCO, som logger til samme data-fil. Det er også mulig å gjøre forsøket manuelt, men pass på å gjøre hyppige målinger, ekvivalenspunktet kan komme brått på!
Innholdsfortegnelse
Gjør målingene
Selve målingen kan gjøres på to måter, enten ved en pH-sensor og man skriver inn hvor mye base som tilsettes underveis eller ved en pH-sensor og en dråpetellersensor som automatiserer prosessen.
Etter å ha gjennomført målingene og lagret dataene (i SPARKvue eller Capstone hvis du bruker PASCO-utstyr), laster vi dataene i Python, hvor vi analyserer dataene videre og finner ekvivalenspunktet.
Les data
Dataene, som er lagret i en tekstfil (.csv- eller .txt-format) lastes inn i Python som lister / eller arrays. Slike lister er nyttige, siden de inngå i enkle regneoppgaver, hvor du gjør regneoperasjonen på alle elementene i listen, fremfor ett og ett element av gangen.
Her leses hver enkelt linje av filen og tallene i 1. og 2.kolonne lagres som hhv. tilsatt mL og pH.
Data-filen som er brukt i dette eksempelet kan lastes ned fra denne siden (se lenger ned). Dersom du ønsker å lage din egne data-filer, kan det gjøres i excel, f.eks. som vist til høyre.
volum_data = []
pH_data = []
# Innlesing av data
with open('titrering.csv') as file:
next(file) # Hopper over overskrift-linjen
# Les en linje av gangen
for line in file:
# Klargjør data for lagring i lister
line = line.replace(",",".")
line = line.replace("\n","")
line = line.split(";")
# Lagrer verdier fra fil til liste
volum_data.append(float(line[0])) #Volum
pH_data.append(float(line[1])) # pH
Derivasjon
Derivasjon i programmering gjøres identisk til hvordan det utledes i læreboken og på tavla, så fremfor å lete etter innebygde løsninger i Python, er det god trening (og like enkelt) å skrive denne delen selv. Det finnes flere løsninger på denne oppgaven, her er et forslag med bruk av while-løkker.
Vi bruker den deriverte til å finne ekvivalenspunktet, med hjelp av de innebygde funksjonene index() og max() i Python, og skriver ut for hvilken verdi av volum_data ekvivalenspunktet inntreffer.
Halvtitreringspunktet nås etter at 11.11 mL base er tilsatt
# Beregn den deriverte numerisk
derivert_data = [] # Lag en liste for lagring
i = 0 # Indeks for iterering
while i <= len(volum_data)-2:
#Beregn den deriverte i punkt i
# OBS "\"=linjeskift
derivert = (pH_data[i+1] - pH_data[i]) / \
(volum_data[i+1] - volum_data[i])
derivert_data.append(derivert) # Lagre verdien
i += 1 # Øker indeksen med 1
# Finn indeksen til den maksimale verdien
ekvivalens = derivert_data.index(max(derivert_data))
print('Halvtitreringspunktet nås etter at',
round(volum_data[ekvivalens],2),'mL base er tilsatt')
Plotting
Helt til sist plotter vi de målte verdiene volum_data og ph_data mot hverandre, samt den deriverte i ett vindu. Siden y-akseverdiene ikke er like store og heller ikke har samme enhet, plotter vi i to ulike undervinduer med funksjonen subplot().
Vi gjenkjenner resultatet som vi fikk skrevet ut av kode her, at pH-grafen har størst stigning ved ca. 11mL, samt at den deriverte har maksverdi ved omtrent samme volum. Siden endringene skjer utrolig raskt nær ekvivalenspunktet, er det veldig verdifult med en dråpeteller som logger automatisk og med høy frekvens.
subplot(2,1,1) # Første plot:
plot(volum_data[0:-1], pH_data[0:-1],'go-')
xticks(list(range(14)))
title('pH som funksjon av tilført base')
xlabel('mL tilført base')
ylabel('pH')
grid()
subplot(2,1,2)
plot(volum_data[0:-1], derivert_data,'go-')
xticks(list(range(14)))
title('Endring i pH per mL tilført base')
xlabel('mL tilført base')
ylabel('$\Delta$pH / $\Delta$mL')
grid()
tight_layout()
show()
Last ned
# PYTHOSKOLE: Titrering
# Versjon: 07.10.2021
# Kontakt: post@pythonskole.no
from pylab import *
# Importering av data
volum_data = []
pH_data = []
# Innlesing av data
with open('titrering.csv') as file: # Åpner datafil
next(file) # Hopper over overskrift-linjen
# Les en linje av gangen
for line in file:
# Klargjør data for lagring i lister
line = line.replace(",",".")
line = line.replace("\n","")
line = line.split(";")
# Lagrer verdier fra fil til liste
volum_data.append(float(line[0])) #Tilsatt volum
pH_data.append(float(line[1])) # Målt pH
# Beregn den deriverte numerisk
derivert_data = [] # Lag en liste for lagring
i = 0 # Indeks for iterering
while i <= len(volum_data)-2: # Siste indeks er nest siste
#Beregn den deriverte i punkt i (OBS linjeskift "\")
derivert = (pH_data[i+1] - pH_data[i]) / \
(volum_data[i+1] - volum_data[i])
derivert_data.append(derivert) # Lagre verdien i listen
i += 1 # Øker indeksen med 1
# Finner indeksen til den maksimale verdien til den deriverte.
ekvivalens = derivert_data.index(max(derivert_data))
print('Halvtitreringspunktet nås etter at',
round(volum_data[ekvivalens],2),'mL base er tilsatt')
# Plotting av data og den deriverte.
# I plottet, legg merke til at den høyeste
# toppen i den deriverte samsvarer
# med halvtitreringspunktet
subplot(2,1,1) # Første plot:
plot(volum_data[0:-1], pH_data[0:-1],'go-') # Måledata (pH)
xticks(list(range(14))) # Låser x-aksen
title('pH som funksjon av tilført base') # Tittel første plot
xlabel('mL tilført base') # Navn førsteaksen
ylabel('pH') # Navn andreaksen
grid() # Rutenett
subplot(2,1,2) # Andre plot
plot(volum_data[0:-1], derivert_data,'go-') # Deriverte
xticks(list(range(14))) # Låser x-aksen
title('Endring i pH per mL tilført base') # Tittel andre plot
xlabel('mL tilført base') # Navn førsteakse
ylabel('$\Delta$pH / $\Delta$mL') # Navn andreakse
grid() # Rutenett
tight_layout() # Ryddig tekst
show() # Viser plott