我正在尝试编写一个平衡化学方程式的脚本。我正在用光合作用反应进行测试:
CO 2 + H 2 O - > C6H12O6 + O2
作为Python表达式:
a0*(C+2*O) + a1*(2*H+O) = b0*(6*C+12*H+6*O) + b1*(2*O)
作为SymPy表达式:
Eq(a0*(2*H + O) + a1*(C + 2*O), 2*O*b1 + b0*(6*C + 2*H + 6*O))
或
a0*(2*H + O) + a1*(C + 2*O) - (2*O*b1 + b0*(6*C + 2*H + 6*O))
'H','C'和'O'是表示原子的SymPy符号。
'a0','a1','b0'和'b1'是表示分子系数的SymPy符号。
如何解决'a0','a1','b0'和'b1',以便'H','C'和'O'的系数在左侧和右侧相等反应?此外,还有无数的解决方案,那么我如何指定最低的正解?
答案 0 :(得分:1)
由于解空间为1d且系统是同构的,因此您可以从描述系统的矩阵的零空间读取最小整数解。以下是如何使用sympy获取nullspace(矩阵的行对应于C,O,H,列为a0,a1,b0,b1):
m = sympy.Matrix([[1, 0, -6, 0], [2, 1, -6, -2], [0, 2, -12, 0]])
n, = m.nullspace()
n / functools.reduce(sympy.gcd, n.T)
# Matrix([
# [6],
# [6],
# [1],
# [6]])
所以最小的整数解是a0 = 6,a1 = 6,b0 = 1,b1 = 6