中和滴定曲線と中和点

# はじめに
酸性溶液に塩基性溶液を滴下していくと、pHが変化する。酸と塩基を過不足なく中和する点を中和点と呼ぶ。中和点は、滴定に用いる酸や塩基の強弱によって変化する。そこで、今回は『強酸・強塩基』、『弱酸・強塩基』、『強酸・弱塩基』、『弱酸・弱塩基』の4パターンにおいて、中和滴定曲線がどのようになり、中和点がどのように推移するのかをPythonを用いたシミュレーションで調査する。
# 原理
中和滴定のモデル式とそれの近似解を求めるための二分法のアルゴリズムについて述べる。
## 中和滴定曲線のモデル方程式

以下のサイトのモデルを参考にした。

https://www.stem-blog.com/science/analytical-chem/ph-simulation/

一価の弱酸$HA$に強塩基$BOH$を滴下していくという条件で考える。

電荷保存の法則より以下の等式が常に成立する。

```math
[H^+]+[B^+]=[OH^-]+[A^-]
```

この式を$x=[H^+]$とした方程式に変形することを目的とする。

まず、一価の酸$HA$の化学平衡について考える。

```math
\rm HA\rightleftharpoons H^{+}+A^{-}
```

このように、100%電離するとは限らないことに注意する。

これにより、化学平衡式は以下のようになる。

```math
K_a=\rm \dfrac {\left[ H^{+}\right] \left[ A^{-}\right] }{\left[ AH\right] }
```
ただし、初期の酸の濃度$[AH]$は$C_A$とすると反応前後で原子の総量は変化しない（物質収支）より、
``` math
C_A=\rm \left[ A^{-}\right] +\left[ AH\right]
```
となる。したがって、

``` math
[A^{-}]=\frac{K_aC_A}{K_a+[H^{+}]}
```

1価の塩基$BOH$についても同様に考えると以下の式が成立する。

``` math
C_B=\rm \left[ B^{+}\right] +\left[ BOH\right]
```

ここで、一価の塩基$BOH$の化学平衡について考える。

```math
\rm BOH\rightleftharpoons B^{+}+OH^{-}
```
これにより、化学平衡式は以下のようになる。

```math
K_b=\rm \dfrac {\left[ B^{+}\right] \left[ OH^{-}\right] }{\left[ BOH\right] }
```

ところで、水の電離の式は以下のように表すことができる。

``` math
K_w=\rm \left[ H^{+}\right] \left[ OH^{-}\right]
``` 
ゆえに、

``` math
 \left[ B^{+}\right]=\frac{K_b C_b}{ K_b+\frac{K_w}{[H^{+}]}}
``` 

``` math
 \left[ OH^{-}\right]=\frac{K_w}{\left[ H^{+}\right]}
``` 


以上の考察により、$[B^+],[A^-],[OH^-]$の式を以下の式に代入する。

```math
[H^+]+[B^+]=[OH^-]+[A^-]
```

したがって、

```math
[H^+]+\frac{K_b C_b}{ K_b+\frac{K_w}{[H^{+}]}}=\frac{K_w}{\left[ H^{+}\right]}+\frac{K_aC_A}{K_a+[H^{+}]}
```
となる。(左辺)=0の形にすると以下のようになる。
ゆえに、
```math
[H^+]+\frac{K_b C_b}{ K_b+\frac{K_w}{[H^{+}]}}-(\frac{K_w}{\left[ H^{+}\right]}+\frac{K_aC_A}{K_a+[H^{+}]})=0
```


という$[H^+]$に関する方程式を解けば、pHを算出することができる。今回は、この方程式の近似解を二分法を用いて推定する。

解の範囲が$0<[H^+]<1.0$程度になると予測が付けられるので、最大値を1として最小値を0とした。


ただし、酸性溶液の体積を$V_A$とし、滴定した塩基性溶液の体積を$V_B$とし、以下の希釈の前提条件で考える。

``` math
C_A=C_{A0}\frac{V_A}{V_A+V_B}
```

``` math
C_B=C_{B0}\frac{V_B}{V_A+V_B}
```
## 2分法について
以下、2分法について概略を述べる。
区間$a<x<b$において、単調増加もしくは単調減少を示す関数$f(x)$が存在するとする。

```math
f(x_{ex})=0
```
となる、$x_{ex}$が区間$a<x<b$に存在するとする。

このとき、

```math
f(x_{min})f(x_{max})<0
```
を満たすとき、

```math
x_{min}<x_{ex}<x_{max}
```

となる。したがって、

```math
x_{max}=\frac{x_{min}+x_{max}}{2}
```

と新たにおいた$x_{max}$において、

```math
f(x_{min})f(x_{max})<0
```

が成立すれば、

```math
x_{min}<x_{ex}<x_{max}
```

を満たすことになる。

この操作を繰り返していき、誤差関数が一定値以下になったら試行を終了する。これによって方程式の近似値を求めることができる。

# プログラム

酸の中和に用いる塩基の強弱で場合分けする必要性がある。つまり、弱塩基のときは、塩基解離定数の平衡式を用いるが、強塩基の場合は100%解離するものとする。

## 弱塩基用
以下の記事のようなプログラムを作成する。

https://qiita.com/arairuca/items/590c94c6db945ae7f449

ただし、今回は弱塩基に対応する以下のような新プログラムと強塩基に対応している上記リンク先の旧プログラムを用いた。

``` python 2bun_pH.py
import numpy as np
import matplotlib.pyplot as plt
import math
import japanize_matplotlib

h=1.0*10**-15
n=100

K_w=10**-14
#酢酸
K_a=1.75*10**-5

#塩酸
#K_a=1.0*10**7

#アンモニア
K_b=1.0*10**-4.75

C_A0=0.1
C_B0=0.2

V_A=10

def equation(x,V_A,V_B1):
    C_A=(C_A0)*V_A/(V_A+V_B1)
    C_B=(C_B0)*V_B1/(V_A+V_B1)
    B_pra=K_b*C_B*(K_b+K_w/x)**-1
    return (x+B_pra-(K_w/x+K_a*C_A/(K_a+x)))

V_B=np.linspace(0.1,10,n)
pH_array=[]
for i in range(n):
  #初期値
  ## 最大値
  x_p=1.0
  ## 最小値
  x_q=0
  #塩基溶液の体積
  V_B1=V_B[i]
  #二分法
  x=(x_p+x_q)/2
  while abs(equation(x,V_A,V_B1))>10**-5:
     x=(x_p+x_q)/2
     if equation(x,V_A,V_B1)*equation(x_p,V_A,V_B1)<0:
        x_q=x
     else:
        x_p=x
  pH=-math.log10(x)
  pH_array.append(pH)
plt.title("酢酸とアンモニアの中和滴定曲線")
plt.xlabel("塩基溶液の体積")
plt.ylabel("pH")
plt.plot(V_B,pH_array)
plt.savefig("中和滴定曲線_弱酸_弱塩基.png")
plt.show()
```

## 強塩基用
1価の塩基$BOH$についても同様に考えると以下の式が成立する。

``` math
C_B=\rm \left[ B^{+}\right] +\left[ BOH\right]
```

ただし、$BOH$は強塩基なので近似的に以下の式で表すことができる。

``` math
\rm \left[ B^{+}\right]=C_B 
```
したがって、


```math
[H^+]+C_B=\frac{K_w}{\left[ H^{+}\right]}+\frac{K_aC_A}{K_a+[H^{+}]}
```

したがって、

```math
[H^+]+C_B-(\frac{K_w}{\left[ H^{+}\right]}+\frac{K_aC_A}{K_a+[H^{+}]})=0
```

これを満たす解を二分法を用いて見つける。


``` python 2bun_pH.py
import numpy as np
import matplotlib.pyplot as plt
import math
import japanize_matplotlib

h=1.0*10**-15
n=100

K_w=10**-14
K_a=1.75*10**-5

C_A0=0.1
C_B0=0.2

V_A=10

def equation(x,V_A,V_B1):
    C_A=(C_A0)*V_A/(V_A+V_B1)
    C_B=(C_B0)*V_B1/(V_A+V_B1)
    return (x+C_B-(K_w/x+K_a*C_A/(K_a+x)))

V_B=np.linspace(0.1,10,n)
pH_array=[]
for i in range(n):
  #初期値
  ## 最大値
  x_p=1.0
  ## 最小値
  x_q=0
  #塩基溶液の体積
  V_B1=V_B[i]
  #二分法
  x=(x_p+x_q)/2
  while abs(equation(x,V_A,V_B1))>10**-5:
     x=(x_p+x_q)/2
     if equation(x,V_A,V_B1)*equation(x_p,V_A,V_B1)<0:
        x_q=x
     else:
        x_p=x
  pH=-math.log10(x)
  pH_array.append(pH)
plt.xlabel("塩基溶液の体積")
plt.ylabel("pH")
plt.plot(V_B,pH_array)
plt.savefig("中和滴定曲線.png")
plt.show()
```





# 結果
以下に、強塩基を滴定で用いた場合（旧プログラム）と弱塩基を滴定で用いた場合（新プログラム）での数値解析結果について述べる。

## 強塩基
### 強酸

![中和滴定曲線_塩酸と水酸化ナトリウム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/e70a6cf5-245e-21e2-698b-1b6b9e8ecf07.png)

中和点はpH7程度のpHカーブの真ん中に位置している。

### 弱酸

![中和滴定曲線.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/8fc323b1-e759-7eaf-080e-24c772a14c38.png)

強酸・強塩基の場合と比較すると、中和点は若干pHが大きくなる方へ移動している。


## 弱塩基


### 強酸

![中和滴定曲線_強酸_弱塩基.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/477c9485-df37-234c-6897-496bd60666e1.png)

強酸・強塩基の場合と比較すると、中和点は若干pHが小さくなる方へ移動している。

### 弱酸

![中和滴定曲線_弱酸_弱塩基.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/016de8a3-e5f9-ed6e-f493-55deb423bedf.png)

中和点は、pH7程度ではあるが、強酸・強塩基と比較して、pHは中和点前後で緩やかに変化する。

# まとめ　
今回は、中和滴定に使用する溶液により中和滴定曲線がどのように変化して、中和点にどのような影響を与えるのかを数値計算を用いて調査した。結果、中和点は2種類の溶液の強い側に引っ張られるということが分かった。このことから、実際の中和滴定では溶液の性質に合わせて、適切な指示薬を用いることが大切であるといえる。

# 参考文献

https://www.nhk.or.jp/kokokoza/kagakukiso/assets/memo/memo_0000002065.pdf