Repetisjon I: Kjemioppgaver#

Læringsutbytte

Oppgavene nedenfor er ment å fungere som en repetisjon av grunnleggende programmering, samtidig som du må anvende dette på nye problemstillinger. Når du setter deg inn i et nytt problem, må du, bevisst eller ubevisst:

  1. Dekomponere: Hvilke deler består problemet av? Hva er målet med å løse problemet?

  2. Analysere: Hvordan henger delene sammen?

  3. Vurdere I: Hvordan kan jeg bruke det jeg kan til å løse problemet, og hva trenger jeg å finne ut av?

  4. Syntetisere: Sette sammen en løsning.

  5. Vurdere II: Løste jeg problemet på en god måte? Finnes det andre måter å løse problemet på? Kan jeg gjøre det mer effektivt eller enklere?

Her skal vi se på ulike problemet knyttet til kjemi, uavhengig av om du har kjemi som programfag eller ikke. Vi skal benytte to biblioteker som heter “mendeleev” og “chemlib”, så du kan starte med å installere disse.

Oppgave 1: Periodiske trender I#

Vi starter med et enkelt eksempel for å bli kjent med Mendeleev-biblioteket.

from mendeleev import element

Z = 10
grunnstoff = element(Z)

navn = grunnstoff.name
symbol = grunnstoff.symbol
gruppe = grunnstoff.group_id

print("Atomnummer:", Z, "--Navn:", navn, "--Symbol:", symbol, "--Gruppe:", gruppe)
Atomnummer: 10 --Navn: Neon --Symbol: Ne --Gruppe: 18

Oppgave

  1. Forklar hva programmet ovenfor gjør. Hva slags struktur er “element”, og hva er da “grunnstoff” i programmet ovenfor?

  2. Utvid programmet slik at det også skriver ut periodenummeret. Du kan enten tippe på hva kommandoen for periode er, eller du kan slå det opp i dokumentasjonen til mendeleev-biblioteket.

  3. Modifiser programmet slik at det skriver ut informasjon om de 18 letteste grunnstoffene.

La oss kombinere mendeleev-biblioteket med løkker og lister slik at vi kan finne informasjon om flere grunnstoffer, i tillegg til at vi kan plotte ulike sammenhenger.

from pylab import *
from mendeleev import element

atomnummer = []
elektronegativitet = []

for i in range(1, 119):
    grunnstoff = element(i)
    atomnummer.append(grunnstoff.atomic_number)
    elektronegativitet.append(grunnstoff.electronegativity())

Oppgave

  1. Forklar hva programmet ovenfor gjør.

  2. Kjør programmet og print ut lista med atomnummer og lista med elektronegativitet. Gjorde programmet det du tenkte?

  3. Istedenfor å bare printe ut listene, prøv å plotte listene mot hverandre (atomnummer på x-aksen og elektronegativitet på _y_aksen). Bruk gjerne scatter istedenfor plot, slik at vi får punkter og ikke linjer.

  4. Modifiser programmet slik at det kun plotter grunnstoffene i andre periode. Beskriv trenden.

    Vi kan gjennomgå hvert element i ei liste slik:

    navneliste = ["Arne", "Bjarne", "Mia", "Pia"]
    
    for navn in navneliste:
        print(navn)
    
  5. Bruk denne måten å gjennomgå lister på til å modifisere programmet slik at det kun plotter grunnstoffene i første gruppe. Beskriv trenden. Gjør det samme for gruppe 18 og beskriv denne trenden også.

  6. Lag et program som skriver ut eller plotter kokepunktet til alle halogenene. Beskriv og forklar trenden i kokepunkt.

Oppgave 2: Periodiske trender II#

a) Bruk mendeleev og plott året grunnstoffet er oppdaget (discovery_year) som funksjon av atomnummer. Hvorfor tror du utviklingen ser slik ut? Prøv å beskrive ulike trender i plottet.

b) Forklar hva plottet nedenfor beskriver. Prøv å lage et program som lager dette plottet.

periodiske trender

c) Når vi kjenner atomradius til et stoff, kan vi finne ut mye om elektronegativiteten, ioniseringsenergien og elektronaffiniteten til stoffet.

  • Plott elektronegativitet som funksjon av atomradius. Beskriv det du ser.

  • Utforsk trender i ioniseringsenergi (ionenergies) og elektronaffinitet (electron_affinity) ved hjelp av programmering. Du velger selv framgangsmåte, og om du vil skrive ut informasjonen eller lage illustrerende plott. Legg merke til at funksjonen ionenergies skriver ut en liste med energiene som kreves for å fjerne opp til alle elektronene i grunnstoffet, ikke bare det første.

Oppgave 3: Støkiometriske beregninger#

Ved hjelp av biblioteket chemlib kan vi også definere kjemiske forbindelser og gjøre støkiometriske beregninger på dem. Her er noen eksempler på hva du kan gjøre:

from chemlib import Compound

butan1ol = Compound("C4H9OH") # Definerer forbindelsen
# Regner fra gram til mol og molekyler
print(butan1ol.get_amounts(grams=2))
# Finner prosentvis masse hydrogen i ammoniakk
print(butan1ol.percentage_by_mass("H"))

natriumsulfat = Compound("Na2SO4")
# Fra mol til gram og formelenheter
print(natriumsulfat.get_amounts(moles=1))

ammoniakk = Compound("NH3")
# Fra molekyler til mol og gram
print(ammoniakk.get_amounts(molecules=1E24))
{'grams': 2, 'molecules': 1.6243271319293604e+22, 'moles': 0.026982178271251833}
13.599017848710924
{'moles': 1, 'grams': 142.04099999999997, 'molecules': 6.02e+23}
{'molecules': 1e+24, 'moles': 1.6611295681063123, 'grams': 28.290697674418603}
  1. Hva gjør programmet ovenfor?

  2. Finn antall gram i 2 mol NaCl.

  3. Finn antall molekyler i 2 g metanol.

  4. Finn antall mol HCl-molekyler i 2 g HCl.

Vi kan også sjekke om kjemiske reaksjoner er balansert, og vi kan balansere dem med chemlib:

from chemlib import Compound, Reaction

# Definerer forbindelser
H2 = Compound("H2")
I2 = Compound("I2")
HI = Compound("HI")

# Definerer reaksjon som en liste med reaktanter og en med produkter
reaksjon = Reaction([H2, I2], [HI])
print(reaksjon.formula)     # Printer reaksjonslikningen
print(reaksjon.is_balanced) # Sjekker om reaksjonen er balansert

reaksjon.balance()          # Balanserer reaksjonen
print(reaksjon.formula)
print(reaksjon.is_balanced)
1H₂ + 1I₂ --> 1H₁I₁
False
1H₂ + 1I₂ --> 2H₁I₁
True
  1. Forklar hvordan klassen Reaction fungerer (helt overordna). Skriv reaksjonslikningen vi har definert her.

  2. Forklar hva resten av programmet gjør.

  3. Lag et program som balanserer følgende reaksjonslikninger:

\[C_2H_6(g) + O_2(g) \rightarrow CO_2(g) + H_2O(l)\]
\[NH_3(g) + O_2(g) \rightarrow NO(g) + H_2O(g)\]
\[Mg(s) + N_2(g) \rightarrow Mg_3N_2(s)\]

Oppgave 4: Titrering (utfordring)#

Titrering er en kvantitativ analysemetode der vi bestemmer konsentrasjonen av et ukjent stoff (analytten) ved å tilsette et stoff med kjent konsentrasjon (titranten). Titranten tilsettes ofte fra en byrette, og vi kan notere oss pH i analytten underveis ettersom vi tilsetter et visst volum titrant. Her er en titreringskurve for titrering av en svak syre med en sterk base.

titreringskurve

Ved ekvivalenspunktet er grafen brattest, og her er stoffmengdene av syre og base ekvivalente (og dermed like hvis forholdet er 1:1 i reaksjonslikningen). Dette kan vi bruke til å finne konsentrasjonen av analytten. Vi skal se på noen metoder for å finne ekvivalenspunktet og pH-en ved ekvivalenspunktet i en slik titrering.

a) Les og plott dataene fra fila titreringsdata.txt, som viser titreringsdata for titrering av glykolsyre med NaOH. Sørg for at datapunktene vises i plottet.

b) Deriver pH-en numerisk med hensyn på volumet og legg den deriverte pH-en i ei ny liste. Forklar hva den deriverte av pH-en kan fortelle oss.

c) Lag en funksjon som finner den største deriverte i lista med de deriverte verdiene. Sammenlikn gjerne med numpy-funksjonen max. La programmet skrive ut hvilket volum dette tilsvarer. Dette er volumet sterk base som er tilsatt ved ekvivalenspunktet. Finn også pH ved ekvivalenspunktet ved hjelp av programmet ditt.