# Likevektskonsentrasjoner i en syre-base likevekt
Her skal vi regne på en syre-baselikevekt, vi tar utgangspunkt i eksempel 16.8 (side 562) fra læreboken der vi blir bedt om å finne pH i 0.036 M HNO$_2$:

$$\text{HNO}_2 \rightleftharpoons \text{NO}_2^{-} + \text{H}^{+},$$

$$K_{a} = 4.5 \times 10^{-4}.$$

Vi skal løse denne oppgaven ved å bruke Python. For å kunne regne symbolsk skal vi bruke et bibliotek som heter [SymPy](https://www.sympy.org/).


```python
import sympy as sym  # Importer SymPy
```


```python
# Definer størrelsene vi kjenner
START_KONSENTRASJON = 0.036
KA = 4.5e-4
```

Over har vi listet opp hva vi kjenner. La oss også liste opp alle de ukjente som vi skal bestemme:
- $[\text{HNO}_2]$ ved likevekt.
- $[\text{NO}_2^{-}]$ ved likevekt.
- $[\text{H}^{+}]$ ved likevekt.

Vi har altså tre ukjente. La oss definere de som størrelser (spesifikt som [SymPy-symboler](https://docs.sympy.org/latest/tutorial/intro.html#a-more-interesting-example)) slik at vi kan regne med de (dette blir litt som når vi introduserer $x$ osv. for ukjente størrelser i ligninger vi skriver for hånd):


```python
# Vi definerer de ukjente størrelsene. For å spare litt skriving bruker vi
# - HA for syren HNO2
# - A for den korresponderende basen NO_2^-
# - H for H^+
c_HA, c_A, c_H = sym.symbols('c_HA c_A c_H')
```

Vi har nå definert konsentrasjonene. Disse er foreløpig ukjente. For å bestemme de, så trenger vi noen ligninger som relaterer de til hverandre. Mulige slike ligninger er:
- syre-basekonstanten
- elektronøytralitet
- massebalanser


```python
# La oss begynne med syre-basekonstanten. # Her sier vi at (c_A * c_H)/c_HA skal være lik ("sym.Eq") KA:
ligning1 = sym.Eq((c_A * c_H)/c_HA, KA)
```

Vi kan be SymPy skrive ut hva denne ligningen er, for å sjekke at den ser ut som vi hadde tenkt:


```python
ligning1
```

Den neste ligningen vi kan benytte oss av, er at det må være like mye negativ og positiv ladning. Her er det bare to ladede forbindelser, og de har motsatt fortegn. Det betyr at $[\text{A}]^- = [\text{H}]^+$. La oss skrive det som en ligning:


```python
# Elektronøytralitet:
ligning2 = sym.Eq(c_A, c_H)
```


```python
# Skriv ut denne ligningen også, for å dobbeltsjekke:
ligning2
```

I kjemiske reaksjoner er massen bevart (med mindre det skjer noen kjernereaksjoner som endrer typen av grunnstoffer). Det er litt omstendelig å jobbe med massebalanser, så vi skriver det her heller som en molbalanse.
Tankegangen er som følger: Vi har oppgitt startkonsentrasjonen av HNO$_2$, hvis vi vet volumet, så vet vi også hvor mange mol HNO$_2$ vi har i starten. Men da vet vi også hvor mange mol av grunnstoffene H, N og O vi har i systemet vårt. Disse moltallene endres ikke, men mengden av HNO$_2$ kan endres. Altså: generelt i kjemiske reaksjoner så endres ikke grunnstoffene, men hvordan de er koblet sammen endres.

Vi kan derfor her lage tre massebalanser:
- En for hydrogen,
- En for nitrogen,
- En for oksygen.

La oss bruke nitrogen:
- Antall mol av nitrogen totalt er lik antall mol av HNO$_2$ vi startet med.
- Ved likevekt er antall mol nitrogen totalt i systemet lik antall mol av HNO$_2$ pluss antall mol av NO$_2^-$
  (siden det er bare i disse to stoffene vi finner nitrogen, og det er ett nitrogen i hver av disse forbindelsene).

Med symboler (vi deler på et volumet for å gjøre om til konsentrasjon):

$$[\text{HNO}_3]_{\text{start}} = [\text{HNO}_3]_{\text{likevekt}} + [\text{NO}_2^-]_{\text{likevekt}} $$


La oss formulere det som en ligning:


```python
ligning3 = sym.Eq(START_KONSENTRASJON, c_HA + c_A)
```


```python
# Skriv ut ligning3 for dobbeltsjekk:
ligning3
```

Vi har nå tre ligninger og vi har tre ukjente. Dette kan vi (eller i dette tilfellet, SymPy) løse:


```python
løsninger = sym.solve([ligning1, ligning2, ligning3], [c_HA, c_A, c_H], dict=True)
```

Her får vi to løsninger:


```python
løsninger
```

En av løsningene SymPy fant gir negative konsentrasjoner. Dette er en ugyldig løsning og vi beholder bare den som har kun positive løsninger:


```python
# Vis gyldige løsninger:
gyldige = []
for løsning in løsninger:
    if all(i > 0 for i in løsning.values()):
        gyldige.append(løsning)
        print('Gyldig løsning:')
        print(f'- [HA] = {løsning.get(c_HA)}')
        print(f'- [A^-] = {løsning.get(c_A)}')
        print(f'- [H^+] = {løsning.get(c_H)}')
```


```python
# La oss finne pH:
ph = -sym.log(gyldige[0].get(c_H), 10)
```


```python
# La oss skrive ut verdien, for å få numerisk verdi, ber vi SymPy evaluere uttrykket:
print(f'pH = {ph.evalf()}')
```

Til sammenligning sier læreboka: $\text{pH} = 2.42$.

ff1c29ec23b2753bd8589738623ceb70c76c0631
ipynb
Jupyter Notebook
jupyter/syrebase/syrebase.ipynb
andersle/kj1000
9d68e9810c5541ebbe2e4559df8d066a85780129
CC-BY-4.0
jupyter/syrebase/syrebase.ipynb
andersle/kj1000
9d68e9810c5541ebbe2e4559df8d066a85780129
CC-BY-4.0
2021-06-21T15:04:15.000Z
2021-11-10T10:58:07.000Z
jupyter/syrebase/syrebase.ipynb
andersle/kj1000
9d68e9810c5541ebbe2e4559df8d066a85780129
CC-BY-4.0
Qwen/Qwen-72B
1. YES
2. YES