Phase Diagram

和GPT一起写了一个生成相图的小程序,目标是选择两种物种的浓度作为x和y轴,并给定其他物种的浓度,计算出每个区间内的优势物种。

具体算法是首先确定相图上每个点的阴离子浓度,例如在Cu-PO4相图中,

α(H2PO4)=[H2PO4]c(P(V))=Ka1[H+]2[H+]3+Ka1[H+]2+Ka1Ka2[H+]+Ka1Ka2Ka3\alpha({\rm H_2PO_4^-}) = \frac{[{\rm H_2PO_4^-}]}{c(P({\rm V}))} = \dfrac{K_{a1}[{\rm H^+}]^2}{[{\rm H^+}]^3 + K_{a1}[{\rm H^+}]^2 + K_{a1}K_{a2}[{\rm H^+}] + K_{a1}K_{a2}K_{a3}}

然后求解各个金属的浓度,

c(Cu)=[Cu2+]+[Cux(OH)y(2xy)+]+[Cux(HPO4)y(2x2y)+]c({\rm Cu}) = [{\rm Cu}^{2+}] + \sum[{\rm Cu_{\mathit x}(OH)_{\mathit y}}^{(2x-y)+}] + \sum[{\rm Cu}_{\mathit x}({\rm HPO_4})_{\mathit y}^{(2x-2y)+}]

这里的近似是如果Cu-HPO4络合物浓度相对P(V)可以忽略,否则需要求解多元非线性方程。最后解出各络合物浓度即可。

相图的优势物种的判定逻辑为:1) 如果有沉淀显示为沉淀,若有多种沉淀都能产生(Qsp > Ksp),则利用Ksp反解出当前约束下Cu2+的浓度,最低者为优势物种;2) 若不生成沉淀则显示溶液中含Cu物种中浓度最大的那一个。

下面就是一个磷酸盐浓度0.001 M条件的Cu-pH相图。图中显示出形成的稳定含铜矿物按pH从小到大是libethenite,pseudomalachite和tenorite。

相关代码已托管至Github