Kjemiske biblioteker#

Det finnes mange Python-biblioteker som inneholder funksjonalitet rettet mot kjemi. Vi har til og med visualiserings- og simuleringsverktøy som er utviklet her på UiO! Her skal vi derimot se på noen eksternt utviklete biblioteker som kan brukes til enkle beregninger og visualiseringer.

Først ser vi litt på biblioteket Mendeleev, som inneholder svært mye informasjon om grunnstoffene våre, og som dermed kan brukes til å visualisere og studere sammenhenger i periodesystemet. Deretter ser vi på biblioteket Chemlib, som også inneholder en del informasjon om grunnstoffene, men som også kan brukes til støkiometrisk beregninger og beregninger knyttet til elektrokjemiske celler. Til slutt ser vi på pHcalc, som brukes til å beregne pH i både enkle og sammensatte løsninger.

For å installere disse bibliotekene fra en notebook, skriver du følgende i en kodelinje:

!pip install mendeleev chemlib

Mendeleev#

Grunnenheten i Mendeleev-biblioteket er element. Dette er en såkalt klasse, som fungerer som en oppskrift for å opprette ulike grunnstoff-objekter. Hvert grunnstoffobjekt har en del felles egenskaper fordi de er laget med samme oppskrift/klasse. For eksempel har de elektronegativitet, kokepunkt, smeltepunkt, atomnummer osv. Vi oppretter et grunnstoffobjekt ved å bruke denne klassen på samme måte som vi bruker en funksjon. Parameteren skal være enten atomnummeret eller atomsymbolet:

from mendeleev import element

hydrogen = element("H") # Eller: grunnstoff = element(1)

Nå har vi et grunnstoffobjekt som representerer hydrogen. Vi kan finne ulike egenskaper til hydrogen ved å bruke metoder som er bygd inn i element-klassen (oppskriften på grunnstoffet). Disse metodene gir oss informasjon om akkurat denne utgaven av klassen. Her er noen eksempler:

navn = hydrogen.name
symbol = hydrogen.symbol
elektronegativitet = hydrogen.electronegativity()

print(f"Navn: {navn}, Symbol: {symbol}, Elektronegativitet: {elektronegativitet}")
Navn: Hydrogen, Symbol: H, Elektronegativitet: 2.2

Dette er bare et lite utvalg egenskaper vi kan se på. Dersom du undersøkeret grunnstoffobjektet, får du en oversikt over alle egenskapene som er registrert for grunnstoffet:

hydrogen
Element(
	abundance_crust=1400.0,
 	abundance_sea=108000.0,
 	annotation='density(@ -253C), evaporation_heat(H-H), fusion_heat(H-H), ',
 	atomic_number=1,
 	atomic_radius=25.0,
 	atomic_radius_rahm=154.0,
 	atomic_volume=14.1,
 	atomic_weight=1.008,
 	atomic_weight_uncertainty=None,
 	block='s',
 	c6=6.499026705,
 	c6_gb=6.51,
 	cas='1333-74-0',
 	covalent_radius_bragg=None,
 	covalent_radius_cordero=31.0,
 	covalent_radius_pyykko=32.0,
 	covalent_radius_pyykko_double=None,
 	covalent_radius_pyykko_triple=None,
 	cpk_color='#ffffff',
 	density=8.2e-05,
 	description='Colourless, odourless gaseous chemical element. Lightest and most abundant element in the universe. Present in water and in all organic compounds. Chemically reacts with most elements. Discovered by Henry Cavendish in 1776.',
 	dipole_polarizability=4.50711,
 	dipole_polarizability_unc=3e-05,
 	discoverers='Henry Cavendish',
 	discovery_location='England',
 	discovery_year=1766,
 	ec=<ElectronicConfiguration(conf="1s1")>,
 	econf='1s',
 	electron_affinity=0.754195,
 	en_allen=13.61,
 	en_ghosh=0.2638,
 	en_pauling=2.2,
 	evaporation_heat=0.904,
 	fusion_heat=0.117,
 	gas_basicity=None,
 	geochemical_class='volatile',
 	glawe_number=103,
 	goldschmidt_class='atmophile',
 	group=<Group(symbol=IA, name=Alkali metals)>,
 	group_id=1,
 	heat_of_formation=217.998,
 	ionic_radii=[IonicRadius(
	atomic_number=1,
 	charge=1,
 	coordination='I',
 	crystal_radius=-24.0,
 	econf='1s0',
 	id=172,
 	ionic_radius=-38.0,
 	most_reliable=False,
 	origin='',
 	spin='',
), IonicRadius(
	atomic_number=1,
 	charge=1,
 	coordination='II',
 	crystal_radius=-4.0,
 	econf='1s0',
 	id=173,
 	ionic_radius=-18.0,
 	most_reliable=False,
 	origin='',
 	spin='',
)],
 	is_monoisotopic=None,
 	is_radioactive=False,
 	isotopes=[<Isotope(Z=1, A=1, mass=1.00782503190(1), abundance=99.986(8))>, <Isotope(Z=1, A=2, mass=2.01410177784(2), abundance=0.015(8))>, <Isotope(Z=1, A=3, mass=3.01604928132(8), abundance=None)>, <Isotope(Z=1, A=4, mass=4.0264(1), abundance=None)>, <Isotope(Z=1, A=5, mass=5.03531(10), abundance=None)>, <Isotope(Z=1, A=6, mass=6.0450(3), abundance=None)>, <Isotope(Z=1, A=7, mass=7.053(1), abundance=None)>],
 	jmol_color='#ffffff',
 	lattice_constant=3.75,
 	lattice_structure='HEX',
 	mendeleev_number=105,
 	metallic_radius=None,
 	metallic_radius_c12=78.0,
 	molar_heat_capacity=28.836,
 	molcas_gv_color='#f2f2f2',
 	name='Hydrogen',
 	name_origin='Greek: hydro (water) and genes (generate)',
 	period=1,
 	pettifor_number=103,
 	phase_transitions=[1 Tm=13.989999999999952 Tb=20.270999999999987],
 	proton_affinity=None,
 	screening_constants=[<ScreeningConstant(Z=   1, n=  1, s=s, screening=    0.0000)>],
 	sources='Commercial quantities are produced by reacting superheated steam with methane or carbon. In lab work from reaction of metals with acid solutions or electrolysis.',
 	specific_heat_capacity=14.304,
 	symbol='H',
 	thermal_conductivity=0.1815,
 	uses='Most hydrogen is used in the production of ammonia. Also used in balloons and in metal refining. Also used as fuel in rockets. Its two heavier isotopes are: deuterium (D) and tritium (T) used respectively for nuclear fission and fusion.',
 	vdw_radius=110.00000000000001,
 	vdw_radius_alvarez=120.0,
 	vdw_radius_batsanov=None,
 	vdw_radius_bondi=120.0,
 	vdw_radius_dreiding=319.5,
 	vdw_radius_mm3=162.0,
 	vdw_radius_rt=110.00000000000001,
 	vdw_radius_truhlar=None,
 	vdw_radius_uff=288.6,
)

Elektronegativitet er en spesiell størrelse her, og fungerer som en egen metode som krever at vi enten avslutter med en tom parentes, eller en parentes med en parameter inni. Siden vi kan beregne elektronegativitet med utgangspunkt i ulike skalaer, kan vi f.eks. skrive:

print(hydrogen.electronegativity("pauling"))    # Paulings skala
print(hydrogen.electronegativity("allen"))      # Allens skala
print(hydrogen.electronegativity("mulliken"))   # Mullikens skala
2.2
13.61
7.176314502567999

For å få en komplett liste over funksjonaliteten i Mendeleev, kan du undersøke dokumentasjonen til mendeleev-biblioteket.

Underveisoppgave

Lag et program som skriver ut navn, symbol og elektronegativitet for de 18 letteste grunnstoffene.

Trender i elektrongativitet#

Vi kan bruke lister eller tilsvarende datasamlinger for å spare på verdiene underveis i løkka. Da kan vi plotte ulike egenskaper mot hverandre og utforske trender i periodesystemet:

from mendeleev import element
import matplotlib.pyplot as plt

atomnumre = []
el_neg = []

for Z in range(1,119):
    grunnstoff = element(Z)
    elektronegativitet = grunnstoff.electronegativity()
    atomnumre.append(Z)
    el_neg.append(elektronegativitet)
    
plt.scatter(atomnumre, el_neg, color="hotpink")
plt.title("Elektronegativitetstrender i periodesystemet")
plt.xlabel("Atomnummer")
plt.ylabel("Elektronegativitet")
plt.show()
../../_images/5739b699b30a3e39cd918cc1bd048058e1ddd423963ab452498365691d70701f.png

Underveisoppgave

Modifiser programmet slik at det kun plotter grunnstoffene i andre periode. Forklar trenden du ser.

Støkiometriske beregninger#

La oss nå se på hvordan vi kan bruke biblioteket Chemlib til støkiometriske beregninger. Først definerer vi en kjemisk forbindelse med klassen Compound. Dette er et objekt av Compound-klassen. Deretter kan vi bruke ulike metoder på dette objektet. For eksempel kan vi gjør enkle beregninger på stoffmengde og masse.

Stoffmengdeberegninger#

from chemlib import Compound

butan1ol = Compound("C4H9OH")
NH3 = Compound("NH3")
butan1ol.get_amounts(grams=2)     # Finner stoffmengden og antall molekyler/formelenheter
{'grams': 2,
 'molecules': 1.6243271319293604e+22,
 'moles': 0.026982178271251833}
butan1ol.get_amounts(molecules=2) # Finner stoffmengden og massen
{'molecules': 2,
 'moles': 3.322259136212625e-24,
 'grams': 2.4625581395348844e-22}

Løsninger og fortynning#

Vi kan også lage en løsning med klassen Solution. Dette blir et objekt som vi kan finne konsentrasjonen til og fortynne. Det gjør du slik:

from chemlib import Solution
sol1 = Solution("NaNO3", 0.24)                                      # Lager en løsning med 0.24 mol/L NaNO3
sol2 = Solution.by_grams_per_liters("NaOH", grams = 40, liters = 1) # Lager en løsning med en viss masse i et gitt volum
print(sol2.molarity) # Finner molariteten til løsning 2
1.000075005625422
C2 = sol1.dilute(V1 = 0.1, V2 = 3.44) # Fortynner løsningen
C2
{'Solute': 'Na₁N₁O₃', 'Molarity': 0.0069767441860465115, 'Volume': 3.44}

Kjemiske reaksjoner#

Det er ganske rett fram å definere kjemiske reaksjoner når vi først har lagd noen forbindelser. Deretter kan vi sjekke om reaksjonen er balansert, og eventuelt få programmet til å balansere dem for oss.

from chemlib import Reaction

H2 = Compound("H2")
I2 = Compound("I2")
HI = Compound("HI")
reaksjon = Reaction([H2, I2],[HI]) # Reaktanter i liste til venstre, produkter i liste til høyre
print(reaksjon.formula)
print(reaksjon.is_balanced)
1H₂ + 1I₂ --> 1H₁I₁
False
reaksjon.balance()
reaksjon.formula
'1H₂ + 1I₂ --> 2H₁I₁'
  • Oppgave: Bruk chemlib til å balansere ufullstendig forbrenning av benzen (vi får vann og CO)

Elektrokjemi#

Chemlib kan også brukes til å regne på og visualisere elektrokjemiske reaksjoner. Noen eksempler er gitt nedenfor.

Galvaniske elementer#

from chemlib import Galvanic_Cell
celle = Galvanic_Cell("Pb", "Zn")
egenskaper = celle.properties
print(egenskaper)
{'Cell': 'Zn | Zn2+ || Pb2+ | Pb', 'Anode': 'Zn', 'Cathode': 'Pb', 'Cell Potential': 0.63}
egenskaper["Cell Potential"] # trekker ut kun cellepotensialet
# celle.draw() #Tegner celle
0.63

Elektrolyse#

from chemlib import electrolysis

elektrolyse = electrolysis("Cu", n = 2, amps = 10, seconds = 3600)
elektrolyse
{'element': 'Cu',
 'n': 2,
 'seconds': 3600,
 'amps': 10,
 'grams': 11.854982639788567}
  • Oppgave: Finn ut hvor lang tid det minimum tar å dekke en gjenstand med 30 g sølv med en løsning AgNO\(_3\) når vi bruker en strømstyrke på 10 A.