Figure 5.19:
Langmuir isotherm for CO uptake on Ru.
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))
|