目的是根据乙烷蒸汽气化反应产物和反应物(蒸汽+C2H6 的摩尔比为 4:1)的吉布斯生成能,计算 1000K 时混合物的热力学平衡组成,如下所示:
from gekko import GEKKO
m = GEKKO(remote=True)
x = m.Array(m.Var,13,value=1,lb=1e-27,ub=20.0)
H2,H2O,CO,O2,CO2,CH4,C2H6,C2H4,C2H2,lamda1,lamda2,lamda3,summe= x
H2.value = 3.0
H2O.value = 1.0
CO.value = 0.5
O2.value = 0.001
CO2.value = 0.5
CH4.value = 0.1
C2H6.value = 0.000215
C2H4.value = 0.00440125
C2H2.value = 0.0041294
summe.value = 8.0
lamda1.value = 1.0
lamda2.value = 1.0
lamda3.value = 1.0
eq1 = m.Param(value=14)
eq2 = m.Param(value=4)
eq3 = m.Param(value=2)
summe = m.Var(H2 + O2 + H2O + CO + CO2 + CH4 + C2H6 + C2H4 + C2H2)
lamda2 = m.Var((-1)*m.log(H2 / summe) / 2)
lamda1 = m.Var(46.03 / 1.9872 - m.log(H2O / summe) + 2 * lamda2)
lamda3 = m.Var(47.942 / 1.9872 - m.log(CO / summe) + lamda1)
m.Equation(m.exp(-4.61 / 1.9872 - 4 * lamda2 - lamda3) * summe == CH4)
m.Equation(m.exp(-28.249 / 1.9872 - 4 * lamda2 - 2 * lamda3) * summe == C2H4)
m.Equation(m.exp(-40.604 / 1.9872 - 2 * lamda2 - 2 * lamda3) * summe == C2H2)
m.Equation(m.exp(-26.13 / 1.9872 - 6 * lamda2 - 2 * lamda3) * summe == C2H6)
m.Equation(m.exp(94.61 / 1.9872 - 2 * lamda1 - lamda3) * summe == CO2)
m.Equation(m.exp(-2 * lamda1) * summe == O2)
m.Equation(2 * CO2 + CO + 2 * O2 + H2O == eq2)
m.Equation(4 * CH4 + 4 * C2H4 + 2 * C2H2 + 2 * H2 + 2 * H2O + 6 * C2H6 == eq1)
m.Equation(CH4 + 2 * C2H4 + 2 * C2H2 + CO2 + CO + 2 * C2H6 == eq3)
m.Minimize((summe-(H2 + O2 + H2O + CO + CO2 + CH4 + C2H6 + C2H4 + C2H2))**2)
m.options.IMODE = 3 #IPOPT
m.options.MAX_ITER = 1000
m.options.OTOL = 1e-10
m.options.RTOL = 1e-10
m.solve()
print('x: ', x)
print('Objective: ',m.options.OBJFCNVAL)
EXIT: Optimal Solution Found.
The solution was found.
The final value of the objective function is 81.0000000000000
---------------------------------------------------
Solver : IPOPT (v3.12)
Solution time : 1.169999998819549E-002 sec
Objective : 81.0000000000000
Successful solution
---------------------------------------------------
x: [[5.797458326] [1.202541674] [1.202541674] [1.6791020526e-21]
[0.79745832603] [1.6503662452e-22] [3.2694282596e-27] [1.1255712085e-27]
[1e-27] [2.185089969] [2.185089969] [2.185089969] [9.5605307091]]
然后使用 GRG 作为优化器:
两种解决方案仍然不同。有趣的是,(约束)根查找器的输出仍然不同,但同时收敛:
Total number of equations: 13
Number of implicit equations: 4
Number of explicit equations: 9
Solution method CONSTRAINED
Convergence tolerance: 1e-07
# of iterations used: 8
CO 1.685236
H2 5.118105
H2O 1.387357
SUM 8.899115
C2H2 0.0041294
C2H4 0.0044224
C2H6 0.0092403
CH4 0.2269213
CO2 0.0522585
lamda1 1.537016
lamda2 0.2765838
lamda3 2.53957
O2 0.4114448
以下是各种解决方案的比较:
解向量 x | 壁虎 | EXCEL表格 | 寻根器 | GEKKO-最终版 |
---|---|---|---|---|
H2:1 | 5.797458326 | 5.344360712 | 5.118105 | 5.219 |
水:2 | 1.202541674 | 1.521995663 | 1.387357 | 1.681 |
二氧化碳:3 | 1.202541674 | 1.388351672 | 1.685236 | 1.581 |
氧气:4 | 1.6791020526e-21 | 5.82E-21 | 0.4114448 | 1e-5 |
二氧化碳:5 | 0.79745832603 | 0.544826 | 0.0522585 | 0.3693 |
通道4: 6 | 1.6503662452e-22 | 0.0668213 | 0.2269213 | 0.05 |
乙烷:7 | 3.2694282596e-27 | 1.70E-07 | 0.0092403 | 1e-5 |
乙烷:8 | 1.1255712085e-27 | 9.74E-08 | 0.0044224 | 1e-5 |
乙烷:9 | 1e-27 | 3.25E-10 | 0.0041294 | 1e-5 |
lamda1:10 | 2.185089969 | 24.3878385 | 1.537016 | |
lamda2:11 | 2.185089969 | 0.253110984 | 0.2765838 | |
lamda3:12 | 2.185089969 | 1.558979624 | 2.53957 | |
总数:13 | 9.5605307091 | 8.866356107 | 8.899115 | 8.90 |
变量
lamda1
、lamda2
、lamda3
、summe
被定义两次,与这些变量相关的方程仅用于初始化变量的第二次定义。将它们切换到
Intermediate()
定义是解决问题的简单方法。完整脚本如下:
现在,目标值
0
具有0
求根所需的自由度。解决方案是:对于水煤气变换反应来说,这个解决方案看起来不太正确。我不得不回去重新回忆一下 1000 K 下含有乙烷 (C₂H₆) 和蒸汽 (H₂O) 的反应混合物的平衡组成。
1. 蒸汽重整反应
氢气产生的主要反应:
2. 水煤气变换反应
一氧化碳与蒸汽的二次反应:
3. 其他碳氢化合物反应
该系统还包括碳氢化合物的分解和部分氧化:
4. 积碳
在某些条件下会发生碳沉积:
或者
热力学建模
通过最小化系统的吉布斯自由能来计算平衡组成:
在哪里:
ni
: 物质的摩尔量i
。gi°
:物种的标准吉布斯生成自由能i
。ntotal
:所有物种的总摩尔数。限制:
以下是基于这些方程的完整脚本:
结果: