Introduksjon: Programmering som verktøy i kjemi#
Kjemi er et eksperimentelt fag. Vi observerer, måler, sammenlikner og prøver å forklare hvorfor stoffer oppfører seg slik de gjør. Tradisjonelt har laboratoriet vært den viktigste arenaen for dette arbeidet. Der kan vi blande stoffer, endre temperaturen, måle pH eller undersøke hvor raskt en reaksjon går.
Men ikke alle kjemiske fenomener er direkte observerbare. Vi kan ikke se hvordan elektroner er fordelt i et molekyl, følge hver enkelt kollisjon mellom molekyler eller vente noen millioner år på at en langsom geokjemisk prosess skal bli ferdig. Eksperimenter kan også produsere så store datamengder at vi trenger hjelp til å finne mønstre i dem. Da kan datamaskinen fungere som både laboratorium, visualiseringsverktøy og regnehjelp.
Programmering gir oss et språk for å fortelle datamaskinen hva den skal gjøre. Men i kjemi er ikke målet først og fremst å lage dataprogrammer. Målet er å bruke programmer til å stille bedre spørsmål, undersøke kjemiske sammenhenger og forstå hva modeller og eksperimentelle data forteller oss.
Læringsutbytte
Etter å ha arbeidet med dette kapitlet, skal du kunne:
forklare hvordan programmering kan brukes til å utforske og forstå kjemiske fenomener
gjøre rede for sammenhengen mellom kjemiske modeller, simuleringer og programkode
beskrive hvordan datahåndtering kan brukes til å finne mønstre i eksperimentelle data
diskutere noen muligheter og begrensninger ved bruk av kunstig intelligens som programmeringverktøy
lese, kjøre og modifisere et enkelt program som utfører en kjemisk beregning
Hvorfor programmering?#
En datamaskin er svært god til å gjøre enkle operasjoner raskt og mange ganger. Den kan behandle tusenvis av målinger, gjenta den samme beregningen for mange ulike temperaturer eller beregne hvordan konsentrasjonen av flere stoffer endrer seg i små tidssteg. Dette er nyttig fordi mange kjemiske problemer nettopp består av mange enkle prosesser som virker sammen.
Tenk for eksempel på et spektrometer som måler hvor mye lys en løsning absorberer ved flere hundre bølgelengder. Én enkelt måling er ikke så vanskelig å håndtere, men dersom vi har målinger fra mange løsninger, blir det raskt mye informasjon. Med et program kan vi lese inn alle dataene, rydde bort manglende verdier, visualisere spektrene og sammenlikne dem med hverandre.
Eller tenk på en kjemisk reaksjon. En fartslov beskriver hvor raskt konsentrasjonen endrer seg akkurat nå. Dersom vi ønsker å finne konsentrasjonen om ett minutt, må vi undersøke hvordan alle de små endringene bygger seg opp over tid. Datamaskinen kan dele reaksjonsforløpet inn i mange små tidssteg og oppdatere konsentrasjonene for hvert steg.
Datamaskinen gjør likevel ingen kjemiske vurderinger på egen hånd. Den vet ikke om modellen er rimelig, om enhetene er riktige eller om resultatet gir kjemisk mening. Det er det vi som må avgjøre.
Programmering i kjemi
Programmering i kjemi handler om å bruke programkode til å representere, utforske, analysere og visualisere kjemiske fenomener og data.
Et verktøy for å tenke med#
Programmering brukes ofte til å effektivisere beregninger vi allerede vet hvordan vi skal gjøre. Det er nyttig, men programmering kan også påvirke hvordan vi tenker om et problem.
I matematikk beskriver vi gjerne en sammenheng med et ferdig funksjonsuttrykk eller en likning. Programkode må derimot inneholde en oppskrift på hva som skal skje, steg for steg. Derfor må vi gjøre resonnementet vårt eksplisitt. Dersom vi for eksempel vil simulere en kjemisk reaksjon, kan en svært enkel algoritme se slik ut:
bestem startkonsentrasjonene
gjenta mange ganger:
beregn reaksjonsfarten
beregn hvor mye konsentrasjonene endrer seg
oppdater konsentrasjonene
Her ser vi den kjemiske prosessen på en annen måte enn i et ferdig matematisk uttrykk. Den nye konsentrasjonen er den gamle konsentrasjonen pluss en liten endring. Deretter brukes den nye konsentrasjonen til å beregne hva som skjer i neste tidssteg. Slik utvikler det kjemiske systemet seg i programmet omtrent på samme måte som vi forestiller oss at reaksjonen utvikler seg i tid.
Det betyr ikke at programkode alltid gir bedre forståelse enn matematikk. Matematiske uttrykk, programkode, grafer og molekylmodeller viser ulike sider av det samme fenomenet. Styrken ligger i å kunne bevege seg mellom dem og se hvordan de henger sammen.
Fra kjemisk fenomen til program#
Før vi kan simulere et kjemisk system, må vi beskrive systemet med en modell. En modell er en forenklet representasjon av virkeligheten. Den tar med noen egenskaper og ser bort fra andre.
Når vi lager et program for å utforske kjemi, går vi ofte gjennom følgende prosess:
Vi formulerer et spørsmål. Hvordan endrer reaksjonsfarten seg med temperaturen? Hvorfor folder et protein seg på en bestemt måte?
Vi avgrenser systemet. Hvilke partikler, forbindelser eller variabler er relevante?
Vi velger eller lager en modell. Modellen kan for eksempel være en fartslov, en tilnærming til kreftene mellom atomer eller en statistisk modell for eksperimentelle data.
Vi oversetter modellen til en algoritme og programkode. Da må antakelsene og operasjonene uttrykkes på en måte datamaskinen kan følge.
Vi undersøker resultatet. Vi kan få tall, tabeller, grafer, molekylstrukturer eller en animasjon av systemet.
Vi vurderer og forbedrer modellen. Stemmer resultatet med kjemisk teori og eksperimentelle data? Hva skjer dersom vi endrer en parameter?
Prosessen stopper altså ikke når programmet kjører uten feilmeldinger. Et program kan fungere helt fint og samtidig bygge på en dårlig modell. Resultatet fra programmet må derfor brukes som utgangspunkt for videre kjemisk tenking.
Modell
En modell er en forenklet representasjon av et fenomen eller system. Modellen bygger på antakelser og har derfor alltid et bestemt gyldighetsområde og visse begrensninger.
Simuleringer – eksperimenter på datamaskinen#
En simulering er et program som beregner hvordan en modell oppfører seg under bestemte betingelser. Vi kan for eksempel simulere hvordan molekyler beveger seg, hvordan et legemiddel binder seg til et protein eller hvordan konsentrasjonen av ozon i atmosfæren endrer seg over tid.
Simuleringer gjør det mulig å utføre numeriske eksperimenter. Vi kan endre temperaturen, startkonsentrasjonen eller styrken på en vekselvirkning og undersøke hva som skjer. Dersom resultatet er overraskende, kan vi endre modellen eller undersøke systemet nærmere. Datamaskinen gir oss ofte rask tilbakemelding, og denne vekslingen mellom spørsmål, resultat og nye spørsmål kan drive utforskingen videre.
Det er også mulig å undersøke systemer som er for små, store, raske, langsomme, dyre eller farlige for et vanlig laboratorium. En simulering kan vise oss mikronivået som vi ellers ikke kan observere direkte, for eksempel bevegelsen til molekyler eller fordelingen av elektroner i en kjemisk forbindelse.
Men en simulering er ikke et vindu rett inn i virkeligheten. Den viser hvordan modellen oppfører seg. Dersom viktige vekselvirkninger mangler i modellen, vil de også mangle i simuleringen. Derfor bør simuleringer sammenliknes med kjemisk teori, eksperimentelle resultater og andre modeller. De erstatter ikke nødvendigvis eksperimenter i laboratoriet, men kan utfylle dem ved å synliggjøre prosesser, foreslå forklaringer og gi grunnlag for nye eksperimenter.
Simulering
En simulering er en beregning av hvordan en modell oppfører seg. Simuleringen kan brukes som et numerisk eksperiment der vi endrer betingelser og undersøker konsekvensene.
Fra måling til kunnskap – datahåndtering#
Eksperimentelle data forklarer ikke seg selv. Før vi kan trekke en konklusjon, må vi ofte organisere, rydde, visualisere og analysere målingene. Det kan innebære å:
lese data fra instrumenter og datafiler
oppdage manglende eller urimelige verdier
regne ut gjennomsnitt, standardavvik og andre statistiske størrelser
visualisere data med grafer
tilpasse modeller til målepunktene
sammenlikne resultater fra flere eksperimenter
Programmering gjør det mulig å utføre de samme operasjonene på en systematisk og etterprøvbar måte. Dersom analysen er skrevet som programkode, kan vi se hvilke valg som er gjort og kjøre den samme analysen på nytt. Det er spesielt viktig når datasettet er stort eller analysen består av mange trinn.
Datahåndtering handler likevel ikke bare om å finne en funksjon som passer til målepunktene. Vi må også spørre hva variablene representerer, hvor usikre målingene er, og om modellen har en kjemisk begrunnelse. En svært god matematisk tilpasning er ikke nødvendigvis en god kjemisk forklaring.
Datahåndtering
Datahåndtering innebærer å organisere, bearbeide, visualisere og analysere data slik at vi kan undersøke mønstre og trekke begrunnede konklusjoner.
Datamaskinen krever tydelige antakelser#
Når vi regner for hånd, kan vi hoppe over mellomregninger fordi vi forstår hva vi selv mener. Datamaskinen trenger derimot nøyaktige instrukser. Alle variabler må ha en verdi, alle operasjoner må komme i riktig rekkefølge, og alle spesielle tilfeller må håndteres.
Det kan oppleves tungvint, men det er også en styrke. Når vi oversetter et kjemisk problem til programkode, blir vi tvunget til å formulere hva størrelsene betyr og hvordan de henger sammen. Vi oppdager ofte uklarheter i vår egen forståelse når vi prøver å forklare problemet til datamaskinen.
Feilmeldinger og uventede resultater er derfor ikke bare hindringer. De kan være ledetråder. Kanskje har vi skrevet feil variabelnavn, men kanskje har vi også glemt en viktig kjemisk prosess eller brukt en modell utenfor gyldighetsområdet. Å feilsøke et program handler både om å undersøke koden og om å undersøke det faglige resonnementet bak koden.
KI kan skrive kode – men hvem gjør den faglige tenkingen?#
Generativ kunstig intelligens (KI) kan nå lage, forklare og rette programkode. Det senker terskelen for å bruke programmering i kjemi. En kjemiker trenger ikke nødvendigvis å huske all syntaks eller bygge hvert program fra bunnen av. KI kan for eksempel hjelpe oss med å lese en datafil, lage et plott eller finne en feil i en løkke. Dermed kan vi bruke mer tid på det kjemiske problemet vi egentlig ønsker å undersøke.
Dette betyr likevel ikke at det er blitt unødvendig å forstå programmering. KI kan lage kode som ser overbevisende ut, men som bruker feil enheter, en uegnet modell eller en funksjon som ikke gjør det KI påstår. Den kan også foreslå en svært komplisert løsning på et enkelt problem. Dersom vi ikke forstår hva programmet gjør, blir det vanskelig å avgjøre om resultatet er riktig.
Den mest produktive bruken av KI oppstår derfor når vi selv beholder kontrollen over problemløsingen. Vi bør formulere det kjemiske spørsmålet, avgrense systemet og vurdere hvilke antakelser som er rimelige. KI kan deretter fungere som en dynamisk programmeringshjelp som gir forslag, forklarer kode og hjelper oss videre når vi står fast.
Tenk først, spør etterpå – og tenk en gang til
Når du bruker KI som programmeringshjelp, kan du arbeide slik:
Forklar først for deg selv hva problemet er, og hva programmet skal gjøre.
Gi KI relevant kjemisk kontekst, enheter og tydelige avgrensninger.
Be gjerne om små deler av programmet eller en forklaring, ikke nødvendigvis en ferdig løsning.
Les og test koden. Endre verdier og undersøk om resultatet oppfører seg som forventet.
Vurder resultatet med utgangspunkt i kjemisk kunnskap. Det er du, ikke KI-en, som må stå for den faglige konklusjonen.
Hva må en kjemiker kunne om programmering?#
Du trenger ikke å bli programvareutvikler for å ha nytte av programmering i kjemi. Men du bør kunne:
lese enkel programkode og forklare hva de viktigste linjene gjør
dele et problem opp i mindre trinn
kjenne igjen variabler, vilkår, løkker, funksjoner og datasamlinger
kjøre og modifisere eksisterende programmer
teste om koden gir rimelige resultater
tolke grafer, tall og andre resultater i en kjemisk sammenheng
vurdere antakelsene og begrensningene i modellen
bruke dokumentasjon, medstudenter/kollegaer og KI som hjelp uten å gi fra deg kontrollen over resonnementet
Målet er altså ikke å huske flest mulig kommandoer. Målet er å kunne bruke programkode som en del av kjemisk problemløsing. Resten av disse nettsidene gir deg verktøyene du trenger for å komme i gang med dette.
Et første program – fra konsentrasjon til pH#
La oss begynne med et lite program som regner ut pH fra konsentrasjonen av oksoniumioner, \(\mathrm{H_3O^+}\). Sammenhengen er:
Her bruker vi den vanlige tilnærmingen der pH beregnes direkte fra konsentrasjonen. Strengt tatt er pH definert ved aktiviteten til oksoniumionene. Forskjellen blir viktigere i mer konsentrerte løsninger, men den tar vi ikke hensyn til i dette første eksempelet.
Før du kjører programmet nedenfor, kan du prøve å lese det som en oppskrift:
Programmet henter en matematisk funksjon som beregner logaritmer.
Konsentrasjonen av oksoniumioner lagres i en variabel.
Programmet bruker modellen ovenfor til å beregne pH.
Resultatet skrives ut.
from math import log10
h3o_concentration = 0.001 # mol/L
pH = -log10(h3o_concentration)
print("pH =", pH)
pH = 3.0
Programmet gir pH = 3,0. Men det interessante er ikke bare at programmet finner svaret. Vi kan bruke programmet til å undersøke sammenhengen mellom konsentrasjon og pH.
Underveisoppgave
Hva tror du skjer med pH dersom konsentrasjonen av \(\mathrm{H_3O^+}\) blir ti ganger mindre?
Endre
h3o_concentrationtil0.0001mol/L og kjør programmet på nytt. Fikk du det resultatet du forventet?Prøv flere konsentrasjoner. Hvilket mønster ser du?
Endre programmet slik at det regner ut konsentrasjonen av \(\mathrm{H_3O^+}\) fra en oppgitt pH. Du kan ta utgangspunkt i sammenhengen \(\left[\mathrm{H_3O^+}\right]=10^{-\mathrm{pH}}\).
Du kan også prøve programmet i den nettbaserte editoren nedenfor. Kjør programmet med knappen øverst til venstre, endre verdier og se hva som skjer.
Hvis du kan litt programmering fra før#
Prøv å utvide programmet ovenfor slik at det:
avgjør om en løsning er sur, basisk eller nøytral ut fra pH.
beregner pH for flere konsentrasjoner med en løkke. Klarer du også å visualisere sammenhengen?
Oppsummering#
Programmering kan brukes til å automatisere beregninger, men den viktigste rollen i kjemi er større enn som så. Med programkode kan vi gjøre modeller eksplisitte, simulere systemer vi ikke kan observere direkte, og finne mønstre i store mengder eksperimentelle data. Programmering gir oss også nye representasjoner av kjemiske fenomener og kan dermed hjelpe oss med å se sammenhenger mellom matematikk, mikronivået og det vi observerer i laboratoriet.
KI gjør det enklere å lage og forstå programkode, også for vitenskapsfolk som først og fremst ønsker å arbeide med kjemi. Men det faglige ansvaret kan ikke overlates til verken datamaskinen eller KI-en. Vi må fortsatt stille spørsmålene, velge og vurdere modellene og avgjøre om resultatene gir kjemisk mening.
I de neste kapitlene skal vi se nærmere på de grunnleggende byggeklossene i programmering. Underveis skal vi hele tiden bruke dem til å undersøke matematiske og kjemiske sammenhenger.