Rで理論化学:電離平衡

問題

酢酸(CH₃COOH)は水溶液中で次のように電離平衡に達する弱酸です。

\[\text{CH}_3\text{COOH} \rightleftharpoons \text{CH}_3\text{COO}^- + \text{H}^+\]

酸解離定数は \(K_a = 1.8 \times 10^{-5}\) (25℃)とします。

(1) 初濃度 \(C_0 = 0.10~\text{mol/L}\) の酢酸水溶液について、電離度 \(\alpha\) および pH を、

  • a 近似式(電離度が小さいとみなす近似)
  • b 二次方程式による厳密解

の両方でRを用いて計算し、両者の差を比較しなさい。

(2) 初濃度 \(C_0\)\(10^{-1}~\text{mol/L}\) から \(10^{-6}~\text{mol/L}\) まで変化させたときの電離度 \(\alpha\) の変化をRで計算し、片対数グラフとして可視化しなさい。

この結果から、オストワルトの希釈律(希釈するほど電離度が増大するという経験則)が成り立っていることを確認しなさい。


解答方針

平衡定数の定義から、

\[K_a = \frac{[\text{CH}_3\text{COO}^-][\text{H}^+]}{[\text{CH}_3\text{COOH}]}\]

電離度を \(\alpha\) とすると、平衡時の各濃度は

\[[\text{H}^+] = [\text{CH}_3\text{COO}^-] = C_0\alpha, \qquad [\text{CH}_3\text{COOH}] = C_0(1-\alpha)\]

これを代入すると

\[K_a = \frac{C_0 \alpha^2}{1-\alpha}\]

これは \(\alpha\) についての二次方程式

\[C_0\alpha^2 + K_a\alpha - K_a = 0\]

に整理できます。

Rの polyroot()(または二次方程式の解の公式)でこれを厳密に解き、近似解(\(\alpha \approx \sqrt{K_a/C_0}\)、すなわち \(1-\alpha\approx1\) とする近似)と比較します。

# ------------------------------------------------------------
# 電離平衡:弱酸(酢酸)の電離度とpHの計算
# ------------------------------------------------------------

Ka <- 1.8e-5 # 酢酸の酸解離定数

# --- (1) C0 = 0.10 mol/L における電離度とpHの比較 ---

C0 <- 0.10

# (a) 近似解: alpha << 1 と仮定して 1-alpha ≈ 1 とする
alpha_approx <- sqrt(Ka / C0)
H_approx <- C0 * alpha_approx
pH_approx <- -log10(H_approx)

# (b) 厳密解: C0*alpha^2 + Ka*alpha - Ka = 0 を解の公式で解く
#     alpha = (-Ka + sqrt(Ka^2 + 4*C0*Ka)) / (2*C0)   (0<alpha<1側の根を採用)
alpha_exact <- (-Ka + sqrt(Ka^2 + 4 * C0 * Ka)) / (2 * C0)
H_exact <- C0 * alpha_exact
pH_exact <- -log10(H_exact)

cat("=== C0 = 0.10 mol/L における結果 ===\n")
cat(sprintf("近似解: alpha = %.5f, pH = %.4f\n", alpha_approx, pH_approx))
cat(sprintf("厳密解: alpha = %.5f, pH = %.4f\n", alpha_exact, pH_exact))
cat(sprintf(
  "相対誤差(alpha): %.3f %%\n",
  100 * abs(alpha_approx - alpha_exact) / alpha_exact
))

# 検算: 厳密解を平衡定数の式に戻して Ka が再現されるか確認
Ka_check <- C0 * alpha_exact^2 / (1 - alpha_exact)
cat(sprintf("検算: 厳密解から逆算したKa = %.3e (真値 %.3e)\n\n", Ka_check, Ka))
=== C0 = 0.10 mol/L における結果 ===
近似解: alpha = 0.01342, pH = 2.8724
厳密解: alpha = 0.01333, pH = 2.8753
相対誤差(alpha): 0.673 %
検算: 厳密解から逆算したKa = 1.800e-05 (真値 1.800e-05)

\(\alpha \ll 1\) が成り立つ濃度域では、近似解と厳密解の差はごく小さい(誤差1%未満)ことが確認できます。


続いて (2) オストワルトの希釈律の確認です。

# --- (2) 濃度を変化させたときの電離度の変化 ---

# C0 を 10^-1 ~ 10^-6 mol/L まで対数的に100点とる(グラフ描画用)
C0_seq <- 10^seq(-1, -6, length.out = 100)

# 各濃度について厳密解の alpha を計算する関数
calc_alpha_exact <- function(C0, Ka) {
  (-Ka + sqrt(Ka^2 + 4 * C0 * Ka)) / (2 * C0)
}

alpha_seq <- calc_alpha_exact(C0_seq, Ka)

# 近似解(比較用)。C0が小さくなるとalphaが1に近づき近似が破綻することを見る
alpha_seq_approx <- sqrt(Ka / C0_seq)
alpha_seq_approx[alpha_seq_approx > 1] <- NA # 物理的に意味を持たない領域は除外

# データフレームにまとめる
df <- data.frame(
  C0 = C0_seq,
  alpha_exact = alpha_seq,
  alpha_approx = alpha_seq_approx
)

# ggplot2で片対数プロット(x軸: 濃度の対数、y軸: 電離度)
library(ggplot2)

df_long <- data.frame(
  C0 = rep(df$C0, 2),
  alpha = c(df$alpha_exact, df$alpha_approx),
  type = rep(c("厳密解", "近似解"), each = nrow(df))
)

p <- ggplot(df_long, aes(x = C0, y = alpha, color = type, linetype = type)) +
  geom_line(linewidth = 1) +
  scale_x_log10(
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  ) +
  labs(
    title = "酢酸の電離度と濃度の関係(オストワルトの希釈律)",
    x = expression(C[0] ~ "(mol/L, 対数軸)"),
    y = expression(alpha ~ "(電離度)"),
    color = NULL, linetype = NULL
  ) +
  theme_minimal(base_size = 13)

print(p)

# オストワルトの希釈律の定量的確認:
C0_check <- c(1e-2, 1e-4)
alpha_check_exact <- calc_alpha_exact(C0_check, Ka)
alpha_check_approx <- sqrt(Ka / C0_check)

ratio_C <- C0_check[1] / C0_check[2]
ratio_alpha_exact <- alpha_check_exact[2] / alpha_check_exact[1]
ratio_alpha_approx <- alpha_check_approx[2] / alpha_check_approx[1]

cat("=== オストワルトの希釈律の確認 ===\n")
cat(sprintf("濃度比 C0(1e-2)/C0(1e-4) = %.1f\n", ratio_C))
cat(sprintf("電離度比(厳密解) alpha(1e-4)/alpha(1e-2) = %.2f\n", ratio_alpha_exact))
cat(sprintf(
  "電離度比(近似解, sqrt則) = %.2f (定義上 sqrt(%.0f) = %.2f と厳密に一致)\n",
  ratio_alpha_approx, ratio_C, sqrt(ratio_C)
))
cat(sprintf(
  "両者の差 = %.2f  ← (1-alpha)を1とみなす近似がどれだけ破れているかの目安\n",
  ratio_alpha_approx - ratio_alpha_exact
))

# 参考: それぞれの濃度でのalpha自体も表示しておく
cat("\n--- 各濃度での電離度(厳密解) ---\n")
cat(sprintf("C0 = %.0e : alpha = %.4f\n", C0_check[1], alpha_check_exact[1]))
cat(sprintf("C0 = %.0e : alpha = %.4f\n", C0_check[2], alpha_check_exact[2]))
=== オストワルトの希釈律の確認 ===
濃度比 C0(1e-2)/C0(1e-4) = 100.0
電離度比(厳密解) alpha(1e-4)/alpha(1e-2) = 8.27
電離度比(近似解, sqrt則) = 10.00 (定義上 sqrt(100) = 10.00 と厳密に一致)
両者の差 = 1.73  ← (1-alpha)を1とみなす近似がどれだけ破れているかの目安

--- 各濃度での電離度(厳密解) ---
C0 = 1e-02 : alpha = 0.0415
C0 = 1e-04 : alpha = 0.3437
Figure 1

Figure 1 は、酢酸濃度 \(C_0\)(横軸、対数スケール)に対する電離度 \(\alpha\)(縦軸)の変化を、厳密解(青破線)と近似解(赤実線)で比較したものです。

高濃度域(\(C_0 \approx 10^{-1}\)付近)では両曲線はほぼ重なっており、\(\alpha\)が非常に小さいため「\(1-\alpha \approx 1\)」という近似の前提が良く成り立っていることが分かります。

濃度が薄くなるにつれて両曲線は徐々に乖離し始め、\(C_0\)\(10^{-4}\)より小さい領域で差が顕著になります。これは電離が進んで \(\alpha\) が大きくなり、分母の \((1-\alpha)\) を1とみなす近似の誤差が無視できなくなるためです。

特に注目すべきは、近似解(赤)の曲線が \(\alpha=1\) を超えて途中で途切れている点です。近似式 \(\alpha \approx \sqrt{K_a/C_0}\)\(C_0\) が小さくなるほど発散的に増大するため、\(C_0\)がある値より小さくなると \(\alpha>1\) という非物理的な値を与えてしまいます。

スクリプト内で alpha_seq_approx[alpha_seq_approx > 1] <- NA として除外した結果、グラフ上でも曲線が途中から消えている(高\(\alpha\)域で描画されない)形になっています。

一方、厳密解(青)は二次方程式そのものを解いているため、どんなに希釈しても \(0 \le \alpha < 1\) の範囲に自然に収まり、\(C_0 \to 0\)\(\alpha \to 1\)(完全電離)へなめらかに漸近しています。

この挙動の違いこそが、近似式の適用限界と、オストワルトの希釈律が本質的に非線形な現象であることを視覚的に裏付けています。

項目内容
電離平衡の基礎式\(K_a = C_0\alpha^2/(1-\alpha)\)
近似解 \(\alpha \approx \sqrt{K_a/C_0}\)(高濃度・小さいαで妥当)
厳密解二次方程式の解の公式で厳密に求まる
オストワルトの希釈律希釈(\(C_0\)減少)により \(\alpha\) が増大する現象を定量的に確認

以上です。