求解化学式(反应中的分子数)

计算科学 线性代数 八度 混合整数规划
2021-12-03 05:10:44

为了平衡化学方程式中的原子数:

 a O2 + b C12H24O11 → c CO2 + d H2O

我做线性方程:

O: 2*a + 11*b = 2*c + d
C: 12*b = c
H: 24*b = 2*d

我必须找到满足该问题的最小正非零整数。

在 GNU Octave 中,我用人机交互解决了这个问题:

[2,11,-2,-1; 0,12,-1,0; 0,24,0,-2; 0,1,0,0]\[0;0;0;1]
ans =
12.5000
 1.0000
12.0000
12.0000

[2,11,-2,-1; 0,12,-1,0; 0,24,0,-2; 0,1,0,0]\[0;0;0;2]
ans =
25
 2
24
24

通过搜索b系数直到找到第一个整数解。

是否有任何数学包可以自动找到解决方案?

2个回答

通常,将使用的算法将求解您在问题中显示的形式的方程组,然后乘以产生每个物种的积分系数的最小整数。该算法不会通过混合整数规划来执行,因为混合整数规划将使用低效算法来解决此类问题。

据我所知,您需要的唯一附加部分是转换为有理近似值并找到最小公倍数的函数。Octave(和 Matlab)有ratlcm

x1 = A\[0;0;0;1];
[n,d] = rat(x1);
x = x1*lcm(d(1),lcm(d(2),lcm(d(3),d(4))))

Matlablcm至少不能处理集合,因此您需要将其自定义为其他维度。

在解决某些系统时可能会引入错误——尤其是对于较大的系统。在这种情况下,有理逼近将返回一个古怪的值。您可以将容差设置为 的第二个参数rat解决此问题的另一种方法是象征性地求解系统并使用numden

x1 = sym(A)\sym([0;0;0;1]);
[n,d] = numden(x1);
d = double(d);
...

A我还应该提到,在使用这些方法中的任何一种时,都没有必要通过添加第四行来创建增强矩阵。