平衡化学反应的非线性方程组

Balancing a System of Non-Linear equations for Chemical Reactions

我正在尝试计算合成气和空气混合物的最终成分和温度。他们分别以 300 K 和 600 K 输入。合成气是 CO 和 H2 的混合物,其比例在 3:1 到 1:3 之间变化。后来,这个比例是固定的,并引入额外的氮气。最后,计算热损失并计算其对 temperature/composition 的影响。专注于第一部分,我很难平衡非线性方程组。化学反应的一般方程式如下:

aCO + bH2 + c*(O2 + 79/21 * N2) + dN2 = eCO + f H2 + gO2 + hN2 + jCO2 + kH2O + lNO

来自物种保护:

碳:a = e + j

氧气:a + 2c = e + 2g + 2*j + k + l

氢:2b = 2f + 2*k

氮气:2*(79/21)c + 2d = 2*h + l

由于存在三种化合物,因此存在三个分压平衡值,称为K_p。 K_p 是温度的函数,根据经验数据是一个已知常数。

K_p_NO = (X_NO * P) / (sqrt(X_N2*P)*sqrt(X_O2 * P))

K_p_H2O = (X_H2O * P) / (sqrt(P*X_O2)X_H2P)

K_p_CO2 = (X_CO2 * P) / (sqrt(P*X_O2)X_COP)

其中 X 是摩尔分数。例如。 X_H2O = k/(e+f+g+h+j+k+l)

变量e,f,g,h,j,k,l是7个未知数,有7个方程。变量 a、b、c 和 d 是手动变化的,并被视为已知值。使用 scipy,我实现了 fsolve(),如下所示:

from scipy.optimize import fsolve  # required library
import sympy as sp
import scipy
# known values hard coded for testing
a = 0.25
b = 0.75
c = a + b
d = 0
kp_NO = 0.00051621
kp_H2O = 0.0000000127
kp_CO2 = 0.00000001733
p = 5 # pressure
dec = 10 # decimal point precision

# Solving the system of equations
def equations(vars):
    (e, f, g, h, j, k, l) = vars
    f1 = e + j - a
    f2 = e + 2*g + 2*j + k + l - a - 2*c
    f3 = f + k - b
    f4 = 2*h + l - 2*d - (2*79/21)*c
    f5 = kp_NO - (l/sp.sqrt(c*(79/21)*c))
    f6 = kp_H2O - (k/(b*sp.sqrt((c*p)/(e + f + g + h + j + k + l))))
    f7 = kp_CO2 - (j/(a*sp.sqrt((c*p)/(e + f + g + h + j + k + l))))
    return[f1, f2, f3, f4, f5, f6, f7]
e, f, g, h, j, k, l = scipy.optimize.fsolve(equations, (0.00004, 0.00004, 0.49, 3.76, 0.25, 0.75, 0.01))
# CO, H2, O2, N2, CO2, H2O, NO
print(e, f, g, h, j, k, l)

结果是

0.2499999959640893 0.7499999911270915 0.999499382628763 3.761404150987935 4.0359107126181326e-09 8.872908576472292e-09 0.001001221833654118

注意 e = 0.24999995 但 a = 0.25。似乎化学反应几乎没有进展。为什么我的输入会作为结果返回?我知道出了点问题,因为在某些情况下,化学系数是负数。

我尝试过的事情: 三重检查了我的 math/definitions。使用来自 sympy 的 nsolve(),来自 scipy 的 nonlinsolve(),其他杂项。求解器。

我没有发现您的代码有任何问题,尽管我会以不同的方式解决它。 这个问题应该移到 Chemistry stackexchange: The Kp values you are using are wrong. 500K 时水形成的值约为 7.65E22(当压力以巴表示时),我很确定 CO 到 CO2 的常数也高得多。

我会把它写成评论,但我没有足够的声誉。