平衡化学反应的非线性方程组
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 的常数也高得多。
我会把它写成评论,但我没有足够的声誉。
我正在尝试计算合成气和空气混合物的最终成分和温度。他们分别以 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 的常数也高得多。
我会把它写成评论,但我没有足够的声誉。