自动配平机

Aster CODE➤GEASS, 理宅异闻录 Leave a Comment

高中的时候我总是在想,是不是有一个万能的方法能够配平一切化学方程式?

这显然是有的,大不了把所有元素的关系全部写出来,然后解方程.

不过后来学了线性代数后发现不用这么烦,方程都不用解,求个零空间就行了.


先来个比较基本的反应,碳里加硝酸.

把每个化合物都分解到原子,顺序无所谓.

\[\begin{array}{c|ccccc}
& HNO_3 & C & H_2O & CO_2 & NO_2 \\ \hline
H & 1 & 0 & 2 & 0 & 0 \\
N & 1 & 0 & 0 & 0 & 1 \\
O & 3 & 0 & 1 & 2 & 2 \\
C & 0 & 1 & 0 & 1 & 0
\end{array}\]

然后看成一个矩阵,求得其零空间为:

\[x = k{(4,1, - 2, - 1, - 4)^T}\]

也就是说:

\[4 HNO_3 +  C \rightarrow 2H_2O + CO_2 + 4NO_2  \]

嗯没错就这个.


有离子反应的时候应该把电子也视为一种元素.

考虑如下在酸环境中高锰酸根与亚硫酸根发生反应的例子.

\[\begin{array}{c|cccccc}
{}&MnO_4^-&SO_3^{2-}&H^+&Mn^{2+}&SO_4^{2-}&H_2O\\ \hline
Mn& 1&0&0&1&0&0 \\
O & 4&3&0&0&4&1 \\
S & 0&1&0&0&1&0 \\
H & 0&0&1&0&0&2 \\
e & - 1&- 2&1&2&- 2&0
\end{array}\]

求零空间得到:

\[x = k{(2,5,6, - 2, - 5, - 3)^T}\]

也就是说:

\[2MnO_4^ -  + 5SO_3^{2 - } + 6{H^ + } \rightarrow 2M{n^{2 + }} + 5SO_4^{2 - } + 3{H_2}O\]

这个方法的好处是你甚至不用不用知道啥是反应物啥是生成物.

要是零空间里有俩向量说明这个反应可以分拆.

要是零空间里有0元素说明这个物体在体系内不消耗,也许是中间产物或者催化剂,当然更有可能就是个杂质而已.


接下来的问题就是如何用代码搞定这个了:

先写一个正则解决简单情景,拆分不带原子团和电荷的化合物.

StringCases[ToString@Fe3O4,RegularExpression["\\d+|[A-Z][a-z]*"]]

把正则翻译成Mathematica的等价语法:

StringCases[{"Fe3O4","C2H5OH","Uut14AuO6"},DigitCharacter..|(_?UpperCaseQ~~___?LowerCaseQ)]

还不够得把元素提取出来,列成矩阵...

运行一个例子试试看:

ChemicalSolver[{"C2H5OH", "H2O", "O2", "CO2"}]

除了第一次要初始化索引以至很慢以外还挺不错的...

发表评论