Figure 5.19:

Langmuir isotherm for CO uptake on Ru.

Figure 5.19

Code for Figure 5.19

Text of the GNU GPL.

main.py


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Converted from assoc_isotherm.m - nonlinear Langmuir fit
import numpy as np
from scipy.optimize import minimize
from misc import octave_save

Pdata = np.array([[100., 1.28], [150., 1.63], [200., 1.77],
                  [250., 1.94], [300., 2.06], [400., 2.21]])
ndata = Pdata.shape[0]
ngrid = 20
P     = Pdata[:, 0]
b     = 1e6 / (760 * 82.06 * 373)
CO    = b * P
CO_s  = Pdata[:, 1]
data  = np.column_stack([CO, CO_s])

def f(x, CO, CO_s):
    K_CO, c_m = x
    CO_sc = (c_m * K_CO * CO) / (1 + K_CO * CO)
    diff  = CO_s - CO_sc
    return diff @ diff

res = minimize(lambda x: f(x, CO, CO_s), [10., 1.], method='Nelder-Mead',
               options={'xatol': 1e-12, 'fatol': 1e-12, 'maxiter': 100000})
K_CO, c_m = res.x

CO_grid   = np.linspace(CO[0], CO[ndata-1], ngrid)
CO_s_opt  = (K_CO * c_m * CO_grid) / (1 + K_CO * CO_grid)
output    = np.column_stack([CO_grid, CO_s_opt])

# save assoc_isotherm.dat output data
octave_save('assoc_isotherm.dat', ('output', output), ('data', data))