计算离子的部分电荷时,各原子电荷的总和应保持该离子的总电荷。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 复现脚本和记录发行包、运行环境及文件哈希的运行记录。