Fischer Tropsch

Product chain length with Anderson - Schultz - Flory model

Javier Hipólito Marsal

More info at ( (spanish)

Fischer Tropsch it is a key chemical engineering reaction for obtaining hydrocarbures from different sources like petroleum, coal or biomass.

Its main advantade is that its product only contains alkanes & alkenes so its production does not create some pollutants like sulfur dioxide. Nowadays its use it is inverse proportional to petroleum availability & its increased motivated by enviromental factors.

Actually the reactive is shale gas which is converted into alkanes & alkenes

\begin{array}{ll} \ nCO + (2n+1)H_2 -> C_n H_{2n + 2} + nH_2O \\ \ nCO + 2nH_2 -> C_nH_{2n} + nH_2O \end{array}

One question arrises here

¿Which is the final product chain length?

It depends of:

* Operating conditions

High temperature and low pressure decreases chain lenght
Low temperature and high pressure increases chain length

* Catalyst

This part is analyzed in this notebook with the very interesting statiscal model from Anderson, Schultz and Flory.

Flory is novel prize awarded & great contributor of polymers field

Calatalyst has a great effect on selectivity which is studied at Flory model. For example Cobaltum it is very good for obtaining naftas. Iron is very similar to cobaltum & it balances price and activity so it is very used at industry.

Anderson Schultz model states that each catalyst has a chain probability grow and each chain probability grow has an specific weight for each chain length, obviously all the chains formed are equal to 100%: So there is a chain distribution. Therefore each catalyst has dispersion for products and they have to be separated (distillated).

Python makes analysis very interesting with its widgets, the user only has to change the critical(s) variable(s) & and at the same time plot output is produced.

In this case, first code box is for loading libraries, second for observing all the probability grows (catalyst) and how much of each molecule is obtained (%) and third for for analyze what distribution of hydrocarbures gives every probability grow (catalyst).

In [7]:
# Import matplotlib (plotting) and numpy (numerical arrays).
# This enables their use in the Notebook.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

# Import IPython's interact function which is used below to
# build the interactive widgets
from IPython.html.widgets import interact

C:\Users\Javier\Anaconda3\lib\site-packages\IPython\ ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.
  "`IPython.html.widgets` has moved to `ipywidgets`.", ShimWarning)

In [35]:
def plot_chain_distribution(n_carb = 1):
    # a is the chain grow probabilitie 
    a = np.linspace(0,1,100)
    w = n_carb * (1-a)**2 * a **(n_carb -1) 

    fig, ax = plt.subplots(figsize=(8, 6))
    ax.set_xlabel('Chain grow probability ')
    ax.set_ylabel('Weight fraction')
    ax.set_title('Anderson Schultz Flory model')

    ax.plot(a,  w,  marker='o', linewidth=2)

# Interact function creates a user interface to see how variables affect the system.

interact(plot_chain_distribution, n_carb = (1,50,1));

In [34]:
catalyst = ['Ni','Fe','Co','Co/K']

def plot_density_function(catalyst = 'Fe'):
    # a is the chain grow probability.
    # Each grow probability is related with a catalyst due its properties so here association its made.
    if catalyst == 'Ni':
        a = 0.05
    if catalyst == 'Fe':
        a = 0.675
    if catalyst == 'Co':
        a = 0.775
    if catalyst == 'Co/K':
        a = 0.9

    n_carb = np.linspace(1,20,100)
    w = n_carb * np.power((1-a),2) * np.power(a,(n_carb -1)) 

    fig, ax = plt.subplots(figsize=(8, 6))
    ax.set_xlabel('Number of carbons ')
    ax.set_ylabel('Weight fraction')
    ax.set_title('Anderson Schultz Flory model - density function')

    ax.plot(n_carb,  w,  marker='o', linewidth=2)

# Interact function creates a user interface to see how variables affect the system.

interact(plot_density_function, catalyst = ['Ni','Fe','Co','Co/K']) ;