🧪

二分探索を用いた酸塩基平衡シミュレーション

2021/07/22に公開

目標

この記事では,酸塩基平衡のシミュレータを作るためのアルゴリズムについて紹介します.

たとえば,以下の問題を解くことを考えます.

問題

酢酸 \rm CH_3COOH は以下のように電離する.

\rm CH_3COOH \rightleftharpoons CH_3COO^- + H^+

電離定数は 10^{-4.76} である.すなわち

\rm \frac{[CH_3COO^-][H^+]}{[CH_3COOH]} = 10^{-4.76} \\

リン酸 \rm H_3PO_4 は以下のように電離する.

\begin{aligned} \rm H_3PO_4 &\rightleftharpoons \rm H_2PO_4^- + H^+ \\ \rm H_2PO_4^- &\rightleftharpoons \rm HPO_4^{2-} + H^+ \\ \rm HPO_4^{2-} &\rightleftharpoons \rm PO_4^{3-} + H^+ \end{aligned}

電離定数は順に 10^{-2.12}10^{-7.21}10^{-12.67} である.すなわち

\begin{aligned} \rm \frac{[H_2PO_4^-][H^+]}{[H_3PO_4]} &= 10^{-2.12} \\ \rm \frac{[HPO_4^{2-}][H^+]}{[H_2PO_4^-]} &= 10^{-7.21} \\ \rm \frac{[PO_4^{3-}][H^+]}{[HPO_4^{2-}]} &= 10^{-12.67} \\ \end{aligned}

今,ビーカーに 1 [{\rm L}] の水を入れ,そこに酢酸を c_1 [{\rm mol}],リン酸を c_2 [{\rm mol}] 溶かした.この水溶液の \rm pH を求めなさい.

一般化

この問題は以下のように一般化されます.

m 種類の酸についての情報が与えられる. i 番目(1 \le i \le m)は n_i 価の酸 {\rm A}_i {\rm H}_{n_i} であり,以下のように電離する.

\begin{aligned} {\rm A}_i {\rm H}_{n_i} &\rightleftharpoons {\rm A}_i {\rm H}_{n_i - 1}^- + {\rm H}^+ \\ {\rm A}_i {\rm H}_{n_i - 1}^- &\rightleftharpoons {\rm A}_i {\rm H}_{n_i - 2}^{2-} + {\rm H}^+ \\ &\vdots \\ {\rm A}_i {\rm H}^{(n_i - 1)-} &\rightleftharpoons {\rm A}_i^{n_i-} + {\rm H}^+ \end{aligned}

i 番目の酸の第 j 解離定数は K_{ij} である.すなわち,

\begin{aligned} \frac{[{\rm A}_i {\rm H}_{n_i - 1}^-][{\rm H}^+]}{[{\rm A}_i {\rm H}_{n_i}]} &= K_{i1} \\ \frac{[{\rm A}_i {\rm H}_{n_i - 2}^{2-}][{\rm H}^+]}{[{\rm A}_i {\rm H}_{n_i - 1}^-]} &= K_{i2} \\ &\vdots \\ \frac{[{\rm A}_i^{n_i-}][{\rm H}^+]}{[{\rm A}_i {\rm H}^{(n_i - 1)-}]} &= K_{in_i} \end{aligned}

今,ビーカーに 1 [{\rm L}] の水を入れ,そこに酸 {\rm A}_1 {\rm H}_{n_1}c_1 [{\rm mol}],酸 {\rm A}_2 {\rm H}_{n_2}c_2 [{\rm mol}],……,酸 {\rm A}_m {\rm H}_{n_m}c_m [{\rm mol}] 溶かした.この水溶液の \rm pH を求めなさい.

方針

まず, \rm H^+ の濃度を決め打ちします.すると,電離平衡の式から各々の酸 {\rm A}_i {\rm H}_{n_i} について

\begin{aligned} [{\rm A}_i {\rm H}_{n_i}] : [{\rm A}_i {\rm H}_{n_i - 1}^-] &= [{\rm H}^+] : K_{i1} \\ [{\rm A}_i {\rm H}_{n_i - 1}^-] : [{\rm A}_i {\rm H}_{n_i - 2}^{2-}] &= [{\rm H}^+] : K_{i2} \\ &\vdots \\ [{\rm A}_i {\rm H}^{(n_i - 1)-}] : [{\rm A}_i^{n_i-}] &= [{\rm H}^+] : K_{in_i} \\ \end{aligned}

のように濃度の比 [{\rm A}_i {\rm H}_{n_i}] : [{\rm A}_i {\rm H}_{n_i - 1}^-][{\rm A}_i {\rm H}_{n_i - 1}^-] : [{\rm A}_i {\rm H}_{n_i - 2}^{2-}],……,[{\rm A}_i {\rm H}^{(n_i - 1)-}] : [{\rm A}_i^{n_i-}] が分かるので,これらを合わせて比 [{\rm A}_i {\rm H}_{n_i}] : [{\rm A}_i {\rm H}_{n_i - 1}^-] : [{\rm A}_i {\rm H}_{n_i - 2}^{2-}] : \cdots : [{\rm A}_i^{n_i-}] が求まります.

一方これらの濃度の合計 [{\rm A}_i {\rm H}_{n_i}] + [{\rm A}_i {\rm H}_{n_i - 1}^-] + [{\rm A}_i {\rm H}_{n_i - 2}^{2-}] + \cdots + [{\rm A}_i^{n_i-}]c_i [\rm mol/L] であると分かっているので,比の情報と合わせることで濃度 [{\rm A}_i {\rm H}_{n_i}][{\rm A}_i {\rm H}_{n_i - 1}^-][{\rm A}_i {\rm H}_{n_i - 2}^{2-}],……,[{\rm A}_i^{n_i-}] が全て求まります.

ここで, {\rm A}_i {\rm H}_{n_i - 1}^-1 価, {\rm A}_i {\rm H}_{n_i - 2}^{2-}2 価,……, {\rm A}_i^{n_i-}n_i 価の陰イオンであることに着目すると,これらのもつ電荷の合計は

\sum_{j = 1}^{n_i} -j[{\rm A}_i {\rm H}_{n_i - j}^{j-}] = -1 [{\rm A}_i {\rm H}_{n_i - 1}^-] -2 [{\rm A}_i {\rm H}_{n_i - 2}^{2-}] - \cdots - n_i [{\rm A}_i^{n_i-}]

となります. m 種類全ての酸についてこれを計算し,総和

S = \sum_{i = 1}^{m} \sum_{j = 1}^{n_i} -j[{\rm A}_i {\rm H}_{n_i - j}^{j-}]

を求めます.

もし,最初に決め打ちした \rm [H^+] の値が正しければ,水溶液は電気的に中性なので [{\rm H}^+] + S = 0 となるはずです.

では,決め打ちした \rm [H^+] の値が実際より大きかったらどうなるでしょうか?これは,いったん水溶液に強酸 \rm AH を加えて,平衡に達したところで突然陰イオン \rm A^- だけを取り除いた状況(実際にはあり得ないが)と同じなので, [{\rm H}^+] + S > 0 となります.

逆に \rm [H^+] の値が実際より小さければ, [{\rm H}^+] + S < 0 となります.

よって, \rm [H^+] を決め打ちしたらそれが実際より大きいか小さいか分かるので,二分探索によって [\rm H^+] を求めることができます.

おわりに

この方法によって,様々な種類の酸が混ざった水溶液の \rm pH を簡単に求めることができます.酸だけでなく塩基も含まれる場合や,塩を溶かす場合についても,同様に解くことができます.

なんだか用途の限られた(?)記事になってしまいましたが,誰かの役に立てば幸いです.

誰かこれ読んでブラウザ上で簡単にシミュレーションができる Web サイト作って欲しい
なんと THF さんが作ってくださいました!ここで実行できます.

Discussion