计算离子的部分电荷时,各原子电荷的总和应保持该离子的总电荷。chematic v1.1.3 实现了包含这一约束的 EEM 计算:OH⁻ 的原子电荷总和为 −1,NH₄⁺ 为 +1。

使用相同原子坐标运行 RDKit 2026.09.1 的 CalcEEMcharges,这两个示例的总电荷符号会反转。RDKit issue #9688记录了这一行为。本文比较公开发布的 chematic v1.1.3 npm 包与 RDKit 2026.09.1 Python 包。

在相同坐标下比较总电荷

OH⁻ 的 O 与 H 相距 0.97 Å。NH₄⁺ 采用以 N 为中心、N–H 键长为 1.01 Å 的正四面体坐标。两套库接收相同的原子顺序与坐标。

ion      formal charge  chematic 1.1.3  RDKit 2026.09.1
OH-      -1             -1.000000       1.000000
NH4+      1              1.000000      -1.000000

表中的计算值是所有原子 EEM 部分电荷的总和。电荷以元电荷为单位,总和为 −1 表示一个净负电荷。比较数据还保存了坐标与各原子的数值。

将总电荷作为约束一起求解

EEM,即电负性均衡法,根据元素参数与原子间距离计算部分电荷。chematic 使用公开 NEEMP 模型的参数。

v1.1.3 将 sum(q_i) = Q 纳入线性方程组。q_i 是各原子的部分电荷,Q 是分子形式电荷之和。实现中明确了矩阵行列的对应关系,在求解原子电荷的同时满足总电荷约束,因此返回值保持输入离子的总电荷。

Rust 实现和 Python 回归测试核对了 OH⁻ 与 NH₄⁺ 的部分电荷总和等于各自的形式电荷。

用公开 npm 包运行

在已安装 Node.js 的环境中,将 v113-eem.mjs 保存到空的工作文件夹,再运行:

npm init -y
npm install --save-exact @kent-tokyo/chematic@1.1.3
node v113-eem.mjs
[OH-] -1.000000
[NH4+] 1.000000

脚本创建显式包含氢原子的分子,并按原子顺序传入以 Å 为单位的坐标。计算 API 为 eem_charges_json(mol, coordsJson)。返回的 charges 数组保持相同的原子顺序,便于按原子索引关联到表格或结构图。

OH⁻ 中,O 的数值约为 −1.063214,H 约为 +0.063214。部分电荷是模型分配给各原子的实数,这两个数值的总和为 −1。将其用于原子着色或基于电荷的分子特征时,可以保持与离子总电荷的对应关系。

比较于 2026 年 10 月 13 日在 macOS arm64 上运行。另提供 RDKit 复现脚本和记录发行包、运行环境及文件哈希的运行记录。