如何处理批处理反应器 SciPy 求解器的化学反应系统

计算科学 Python scipy 计算化学
2021-12-04 01:18:21

我有一个化学反应系统,其中速率方程代表间歇反应器模型。该模型是使用 SciPysolve_ivp函数求解的 ODE 系统。我的示例(见下文)目前包含 5 个反应,但我需要从整体方案中添加更多反应。使用我目前的方法,跟踪化学物质、质量分数、速率参数等是很乏味的。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# Parameters
# -----------------------------------------------------------------------------

species = (
    'CELL', 'CELLA', 'CH2OHCHO', 'CHOCHO', 'CH3CHO', 'C6H6O3', 'C2H5CHO',
    'CH3OH', 'CH2O', 'CO', 'GCO', 'CO2', 'H2', 'H2O', 'GCH2O', 'HCOOH',
    'CH2OHCH2CHO', 'CH4', 'GH2', 'CHAR', 'C6H10O5', 'GCOH2', 'GMSW', 'HCE1',
    'HCE2'
)

# time vector to evaluate reaction rates [s]
time = np.linspace(0, 2.0)

# Solve batch reactor system of equations
# -----------------------------------------------------------------------------

def dcdt_debiagi(t, y):
    """
    Rate equations for Debiagi 2018 biomass pyrolysis kinetics.
    """
    R = 1.9859          # universal gas constant [cal/(mol K)]
    T = 773.15          # temperature [K]

    cell = y[0]         # cellulose mass fraction [-]
    cella = y[1]        # active cellulose mass fraction [-]
    gmsw = y[22]        # softwood hemicellulose mass fraction [-]

    # Cellulose reactions and rate constants
    # 1) CELL -> CELLA
    # 2) CELLA -> 0.40 CH2OHCHO + 0.03 CHOCHO + 0.17 CH3CHO + 0.25 C6H6O3 + 0.35 C2H5CHO + 0.20 CH3OH + 0.15 CH2O + 0.49 CO + 0.05 GCO + 0.43 CO2 + 0.13 H2 + 0.93 H2O + 0.05 GCH2O + 0.02 HCOOH + 0.05 CH2OHCH2CHO + 0.05 CH4 + 0.1 GH2 + 0.66 CHAR
    # 3) CELLA -> C6H10O5
    # 4) CELL -> 4.45 H2O + 5.45 CHAR + 0.12 GCOH2 + 0.18 GCH2O + 0.25 GCO + 0.125 GH2 + 0.125 H2
    k1 = 1.5e14 * np.exp(-47_000 / (R * T))
    k2 = 2.5e6 * np.exp(-19_100 / (R * T))
    k3 = 3.3 * T * np.exp(-10_000 / (R * T))
    k4 = 9e7 * np.exp(-31_000 / (R * T))

    # Hemicellulose reactions and rate constants
    # 5) GMSW -> 0.70 HCE1 + 0.30 HCE2
    k5 = 1e10 * np.exp(-31_000 / (R * T))

    # species reaction rate equations where r = dc/dt
    # mass fractions associated with each species are also given
    r_CELL = -k1 * cell
    r_CELLA = k1 * cell - k2 * cella - k3 * cella
    r_CH2OHCHO = k2 * cella * 0.1481
    r_CHOCHO = k2 * cella * 0.0107
    r_CH3CHO = k2 * cella * 0.0462
    r_C6H6O3 = k2 * cella * 0.1944
    r_C2H5CHO = k2 * cella * 0.1254
    r_CH3OH = k2 * cella * 0.0395
    r_CH2O = k2 * cella * 0.0278
    r_CO = k2 * cella * 0.0846
    r_GCO = k2 * cella * 0.008637 + k4 * cell * 0.04319
    r_CO2 = k2 * cella * 0.1167
    r_H2 = k2 * cella * 0.001616 + k4 * cell * 0.001554
    r_H2O = k2 * cella * 0.1033 + k4 * cell * 0.4944
    r_GCH2O = k2 * cella * 0.009259 + k4 * cell * 0.03333
    r_HCOOH = k2 * cella * 0.005677
    r_CH2OHCH2CHO = k2 * cella * 0.02284
    r_CH4 = k2 * cella * 0.004947
    r_GH2 = k2 * cella * 0.001243 + k4 * cell * 0.001554
    r_CHAR = k2 * cella * 0.04889 + k4 * cell * 0.4037
    r_C6H10O5 = k3 * cella
    r_GCOH2 = k4 * cell * 0.02222
    r_GMSW = -k5 * gmsw
    r_HCE1 = k5 * gmsw * 0.7
    r_HCE2 = k5 * gmsw * 0.3

    # system of ODEs
    dcdt = (
        r_CELL, r_CELLA, r_CH2OHCHO, r_CHOCHO, r_CH3CHO, r_C6H6O3, r_C2H5CHO,
        r_CH3OH, r_CH2O, r_CO, r_GCO, r_CO2, r_H2, r_H2O, r_GCH2O, r_HCOOH,
        r_CH2OHCH2CHO, r_CH4, r_GH2, r_CHAR, r_C6H10O5, r_GCOH2, r_GMSW, r_HCE1,
        r_HCE2
    )
    return dcdt

# initial mass fractions [-]
y0 = np.zeros(len(species))
y0[0] = 0.6
y0[22] = 0.4

# solution for system of equations for a batch reactor
sol = solve_ivp(dcdt_debiagi, (time[0], time[-1]), y0, t_eval=time)

# Print
# ----------------------------------------------------------------------------

print('--- Initial ---')
print(f'CELL        {sol.y[0][0]}')
print(f'GMSW        {sol.y[22][0]}')

print('--- Final ---')
for i, sp in enumerate(species):
    print(f'{sp:11} {sol.y[i][-1]:.4f}')

理想情况下,我想定义一个数组中的所有反应,解析该数组,并输出一个矩阵,SciPy 可以使用该矩阵solve_ivp来确定每个时间步的物种浓度。我正在考虑如下所示的内容:

R = 1.9859      # universal gas constant [cal/(mol K)]
T = 773.15      # temperature [K]

reactions = [
    'CELL -> CELLA',
    'CELLA -> 0.40 CH2OHCHO + 0.03 CHOCHO + 0.17 CH3CHO + 0.25 C6H6O3 + 0.35 C2H5CHO + 0.20 CH3OH + 0.15 CH2O + 0.49 CO + 0.05 GCO + 0.43 CO2 + 0.13 H2 + 0.93 H2O + 0.05 GCH2O + 0.02 HCOOH + 0.05 CH2OHCH2CHO + 0.05 CH4 + 0.1 GH2 + 0.66 CHAR',
    'CELLA -> C6H10O5'
]

names = {
    'CELL': 'C6H10O5',
    'CELLA': 'C6H10O5',
    'GCO': 'CO',
    'GCH2O': 'CH2O',
    'GH2': 'H2',
    'CHAR': 'C'
}

arrhenius = [
    (1.5e14, 0, 47_000),
    (2.5e6, 0, 19_100),
    (3.3, 1, 10_000)
]

如何定义一个化学方程式系统,solve_ivp无需为每种化学物质手动编写每个速率方程式即可实现?

0个回答
没有发现任何回复~