Portfolio 04: Analysis of rate data

CHEN3010/ CHEN5040: chemical reaction engineering

Modified

May 29, 2024

Solutions

Answers to the portfolio questions are uploaded at Portfolio 4 answers

Introduction

Direct vapor phase oxidation of ethylene

\ce{C2H4 + 1/2 O2 -> C2H4O}

was carried out in the presence of a silver catalyst in a differential reactor at 300 °C. Experiments were conducted at different partial pressures of \ce{C2H4} and \ce{O2} and the effluent concentration of EO was measured. The measured rate data is shown in Table 1. (The data is available in csv format: portfolio-4-raw-data.csv).

Table 1: Raw data
Experiment P_{\ce{C2H4}} (atm) P_{\ce{O2}} (atm) C_{\ce{C2H4O}} ( mol/dm^3 \times 10^{4} )
1 0.5 9.5 1.618
2 0.7 9.5 1.853
3 0.9 9.5 2.040
4 1.1 9.5 2.198
5 1.4 9.5 2.337
6 19.0 0.94 1.194
7 19.0 1.88 1.895
8 19.0 2.88 2.484
9 19.0 3.78 3.010
10 19.0 4.68 3.493

The exit volumetric flow rate from a differential packed bed containing 20g of catalyst was maintained at 300 dm^3/min for each run. The partial pressures of \ce{C2H4} and \ce{O2} were determined at the entrance to the reactor, and the \ce{C2H4O} concentration was measured at the reactor exit.

Questions

  1. Why do you think a differential reactor was used for these experiments? (2 marks)
  1. In a step wise manner, outline the strategy (including any equations) you will use to analyze the data and determine the dependence of rate law on P_{\ce{C2H4}} and, P_{\ce{O2}}. (14 marks)
  1. Based on the data calculate the rates of reaction. (4 marks)
  1. Determine the rate law and rate law parameters. Report your values of the orders of reaction with respect to P_{\ce{C2H4}} and, P_{\ce{O2}} and reaction rate constant k (in mol/atm\ kg-cat\ s). Skeleton python code is provided at the end of the portfolio statement. Report all relevant statistical data (such as slope, intercept, and R^2 value for a linear fit; error estimates (optimality) for least squares fit)(8 marks)
  1. What is the limitation of current experimental program in context of deriving the rate law? How will you overcome it? (2 marks)

Skeleton code

import numpy as np
from scipy.stats import linregress
from scipy.optimize import least_squares
import matplotlib.pyplot as plt

Temperature = 300  # deg. C
DeltaW = 20 # g
V_0 = 300   # dm^3/min

# Define the data type for each field
dtype = [
    ('Run', int),         # Run number (experiment number)
    ('P_c2h4', float),    # Pressure of C2H4 in atm
    ('P_o2', float),      # Pressure of O2 in atm
    ('C_c2h4o', float)    # Concentration of C2H4O in mol/dm^3 x 10^4
]

# Data for each experiment
data = np.array([
    (1, 0.5, 9.5, 1.618),
    (2, 0.7, 9.5, 1.853),
    (3, 0.9, 9.5, 2.040),
    (4, 1.1, 9.5, 2.198),
    (5, 1.4, 9.5, 2.337),
    (6, 19.0, 0.94, 1.194),
    (7, 19.0, 1.88, 1.895),
    (8, 19.0, 2.88, 2.484),
    (9, 19.0, 3.78, 3.010),
    (10, 19.0, 4.68, 3.493)
], dtype=dtype)

pc2h4 = data["P_c2h4"]
po2 = data["P_o2"]
cc2h4o = data["C_c2h4o"]*1e-4

# Calculate rate

# Select appropriate data for analysis

# Example code
# first data point has index 0
# x_a = x[1:n] # Selects data points 2 to n from x array

# transform the data for analysis

# example code for linear regression
# log_x = np.log(x) # calculate log
# res = linregress(x,y) # fit line
# slope, intercept, and r value can be accessed using res.slope, 
# res.intercept, res.rvalue 
# line = res.slope * x + res.intercept # Create a line from linear regression

# Print results
# print (res.slope, res.intercept, res.rvalue)

# example code for least_squares
# Objective function to minimize: the difference between rate (experimental)
# and rate (calculated) 
#def objective(params, *args):
#    a, b  = params
#    x, y_obs = args
#
#    # calculate objective function
#    y_calc = (a * x**b)  # Replace with your own expressions
#    return y_obs - y_calc
#
# # Initial guesses
# a = 1 
# b = 1
#
# guess = np.array([a,b])
# bounds = (
#    [1e-3, 1e-3],  # lower bound
#    [1e3, 1e3]     # upper bound
# )
# args = (x,y_obs)
#
# # Minimize the objective function
# result = least_squares(objective, guess, args=args, bounds=bounds)
#
# # Extract the results
# a_fit, b_fit = result.x
# optimality = res.optimality
#

# Print results
# print (a_fit, b_fit)

# Plotting

# Example code

# plt.plot(x,y, label="y") # Normal plot 
# plt.loglog(x, y, 'o', label='Experimental') # log - log plot scatter points
# plt.show()

Citation

BibTeX citation:
@online{untitled,
  author = {},
  title = {Portfolio 04: {Analysis} of Rate Data},
  url = {https://cre.smilelab.dev//content/portfolio/04-analysis-of-rate-data},
  langid = {en}
}
For attribution, please cite this work as:
“Portfolio 04: Analysis of Rate Data.” n.d. https://cre.smilelab.dev//content/portfolio/04-analysis-of-rate-data.