Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/biology/enzyme_kinetics.tex
51 views
unlisted
1
% Enzyme Kinetics Analysis Template
2
% Topics: Michaelis-Menten kinetics, enzyme inhibition, Lineweaver-Burk plots
3
% Style: Laboratory report with experimental data analysis
4
5
\documentclass[a4paper, 11pt]{article}
6
\usepackage[utf8]{inputenc}
7
\usepackage[T1]{fontenc}
8
\usepackage{amsmath, amssymb}
9
\usepackage{graphicx}
10
\usepackage{siunitx}
11
\usepackage{booktabs}
12
\usepackage{subcaption}
13
\usepackage[makestderr]{pythontex}
14
15
% Theorem environments
16
\newtheorem{definition}{Definition}[section]
17
\newtheorem{theorem}{Theorem}[section]
18
\newtheorem{example}{Example}[section]
19
\newtheorem{remark}{Remark}[section]
20
21
\title{Enzyme Kinetics: Michaelis-Menten Analysis and Inhibition Studies}
22
\author{Biochemistry Laboratory}
23
\date{\today}
24
25
\begin{document}
26
\maketitle
27
28
\begin{abstract}
29
This laboratory report presents a comprehensive analysis of enzyme kinetics using the
30
Michaelis-Menten framework and its linearizations. We examine the kinetic parameters
31
$K_m$ and $V_{max}$ for a model enzyme system, analyze three types of reversible
32
inhibition (competitive, uncompetitive, and mixed), and compare parameter estimation
33
methods including Lineweaver-Burk, Eadie-Hofstee, and Hanes-Woolf plots. Computational
34
analysis demonstrates the determination of inhibition constants and the diagnostic
35
patterns that distinguish inhibition mechanisms.
36
\end{abstract}
37
38
\section{Introduction}
39
40
Enzyme kinetics provides fundamental insights into enzyme-catalyzed reactions and their
41
regulation. The Michaelis-Menten equation forms the cornerstone of enzyme kinetics,
42
describing the hyperbolic relationship between substrate concentration and reaction velocity.
43
44
\begin{definition}[Michaelis-Menten Equation]
45
For an enzyme-catalyzed reaction following simple kinetics, the initial velocity $v_0$
46
as a function of substrate concentration $[S]$ is:
47
\begin{equation}
48
v_0 = \frac{V_{max}[S]}{K_m + [S]}
49
\end{equation}
50
where $V_{max}$ is the maximum velocity and $K_m$ is the Michaelis constant.
51
\end{definition}
52
53
\section{Theoretical Framework}
54
55
\subsection{Derivation of the Michaelis-Menten Equation}
56
57
Consider the enzyme-substrate reaction scheme:
58
\begin{equation}
59
E + S \underset{k_{-1}}{\stackrel{k_1}{\rightleftharpoons}} ES \stackrel{k_{cat}}{\longrightarrow} E + P
60
\end{equation}
61
62
\begin{theorem}[Steady-State Approximation]
63
Under steady-state conditions where $d[ES]/dt = 0$, the Michaelis constant is:
64
\begin{equation}
65
K_m = \frac{k_{-1} + k_{cat}}{k_1}
66
\end{equation}
67
and represents the substrate concentration at which $v_0 = V_{max}/2$.
68
\end{theorem}
69
70
\subsection{Enzyme Inhibition}
71
72
\begin{definition}[Inhibition Types]
73
Reversible inhibitors modify kinetic parameters as follows:
74
\begin{itemize}
75
\item \textbf{Competitive}: Inhibitor binds only to free enzyme; $K_m^{app} = K_m(1 + [I]/K_i)$, $V_{max}$ unchanged
76
\item \textbf{Uncompetitive}: Inhibitor binds only to ES complex; $K_m^{app} = K_m/(1 + [I]/K_i')$, $V_{max}^{app} = V_{max}/(1 + [I]/K_i')$
77
\item \textbf{Mixed}: Inhibitor binds both E and ES; both $K_m$ and $V_{max}$ affected
78
\end{itemize}
79
\end{definition}
80
81
The general rate equation with mixed inhibition:
82
\begin{equation}
83
v_0 = \frac{V_{max}[S]}{K_m(1 + [I]/K_i) + [S](1 + [I]/K_i')}
84
\end{equation}
85
86
\subsection{Linear Transformations}
87
88
\begin{theorem}[Lineweaver-Burk Transformation]
89
Taking the reciprocal of the Michaelis-Menten equation:
90
\begin{equation}
91
\frac{1}{v_0} = \frac{K_m}{V_{max}} \cdot \frac{1}{[S]} + \frac{1}{V_{max}}
92
\end{equation}
93
A plot of $1/v_0$ versus $1/[S]$ yields slope $K_m/V_{max}$ and y-intercept $1/V_{max}$.
94
\end{theorem}
95
96
\begin{remark}[Alternative Linearizations]
97
Other linearization methods include:
98
\begin{itemize}
99
\item \textbf{Eadie-Hofstee}: $v_0 = V_{max} - K_m(v_0/[S])$
100
\item \textbf{Hanes-Woolf}: $[S]/v_0 = [S]/V_{max} + K_m/V_{max}$
101
\end{itemize}
102
\end{remark}
103
104
\section{Computational Analysis}
105
106
\begin{pycode}
107
import numpy as np
108
import matplotlib.pyplot as plt
109
from scipy.optimize import curve_fit
110
from scipy.stats import linregress
111
112
np.random.seed(42)
113
114
def michaelis_menten(S, Vmax, Km):
115
return (Vmax * S) / (Km + S)
116
117
def competitive_inhibition(S, Vmax, Km, I, Ki):
118
Km_app = Km * (1 + I / Ki)
119
return (Vmax * S) / (Km_app + S)
120
121
def uncompetitive_inhibition(S, Vmax, Km, I, Ki_prime):
122
factor = 1 + I / Ki_prime
123
return (Vmax * S) / (Km / factor + S * factor)
124
125
def mixed_inhibition(S, Vmax, Km, I, Ki, Ki_prime):
126
return (Vmax * S) / (Km * (1 + I / Ki) + S * (1 + I / Ki_prime))
127
128
# True kinetic parameters
129
Vmax_true = 100.0
130
Km_true = 50.0
131
Ki_true = 25.0
132
Ki_prime_true = 40.0
133
134
# Substrate concentrations
135
S_conc = np.array([5, 10, 20, 30, 50, 75, 100, 150, 200, 300])
136
137
# Generate experimental data with noise
138
noise_level = 0.05
139
v_no_inhibitor = michaelis_menten(S_conc, Vmax_true, Km_true)
140
v_no_inhibitor_exp = v_no_inhibitor * (1 + noise_level * np.random.randn(len(S_conc)))
141
142
# Inhibitor concentrations
143
I_conc = np.array([0, 25, 50, 100])
144
145
# Generate data for different inhibition types
146
v_competitive = {}
147
v_uncompetitive = {}
148
v_mixed = {}
149
150
for I in I_conc:
151
v_comp = competitive_inhibition(S_conc, Vmax_true, Km_true, I, Ki_true)
152
v_uncomp = uncompetitive_inhibition(S_conc, Vmax_true, Km_true, I, Ki_prime_true)
153
v_mix = mixed_inhibition(S_conc, Vmax_true, Km_true, I, Ki_true, Ki_prime_true)
154
v_competitive[I] = v_comp * (1 + noise_level * np.random.randn(len(S_conc)))
155
v_uncompetitive[I] = v_uncomp * (1 + noise_level * np.random.randn(len(S_conc)))
156
v_mixed[I] = v_mix * (1 + noise_level * np.random.randn(len(S_conc)))
157
158
# Fit Michaelis-Menten to uninhibited data
159
popt_mm, pcov_mm = curve_fit(michaelis_menten, S_conc, v_no_inhibitor_exp, p0=[100, 50])
160
Vmax_fit, Km_fit = popt_mm
161
162
# Lineweaver-Burk analysis
163
inv_S = 1 / S_conc
164
inv_v = 1 / v_no_inhibitor_exp
165
slope_lb, intercept_lb, r_lb, p_lb, se_lb = linregress(inv_S, inv_v)
166
Vmax_lb = 1 / intercept_lb
167
Km_lb = slope_lb * Vmax_lb
168
169
# Eadie-Hofstee analysis
170
v_over_S = v_no_inhibitor_exp / S_conc
171
slope_eh, intercept_eh, r_eh, p_eh, se_eh = linregress(v_over_S, v_no_inhibitor_exp)
172
Vmax_eh = intercept_eh
173
Km_eh = -slope_eh
174
175
# Hanes-Woolf analysis
176
S_over_v = S_conc / v_no_inhibitor_exp
177
slope_hw, intercept_hw, r_hw, p_hw, se_hw = linregress(S_conc, S_over_v)
178
Vmax_hw = 1 / slope_hw
179
Km_hw = intercept_hw * Vmax_hw
180
181
# Calculate apparent Km values for competitive inhibition
182
Km_app_competitive = {}
183
for I in I_conc:
184
if I > 0:
185
inv_v_inh = 1 / v_competitive[I]
186
slope_inh, intercept_inh, _, _, _ = linregress(inv_S, inv_v_inh)
187
Vmax_inh = 1 / intercept_inh
188
Km_app_competitive[I] = slope_inh * Vmax_inh
189
190
# Estimate Ki from competitive inhibition
191
if len(Km_app_competitive) > 0:
192
I_values = np.array(list(Km_app_competitive.keys()))
193
Km_app_values = np.array(list(Km_app_competitive.values()))
194
slope_ki, intercept_ki, _, _, _ = linregress(I_values, Km_app_values)
195
Ki_estimated = Km_fit / slope_ki
196
197
# Create figure
198
fig = plt.figure(figsize=(14, 12))
199
200
# Plot 1: Michaelis-Menten curve
201
ax1 = fig.add_subplot(3, 3, 1)
202
S_fine = np.linspace(0.1, 350, 500)
203
ax1.scatter(S_conc, v_no_inhibitor_exp, s=60, c='blue', edgecolor='black', label='Experimental')
204
ax1.plot(S_fine, michaelis_menten(S_fine, Vmax_fit, Km_fit), 'r-', linewidth=2, label='Fitted')
205
ax1.axhline(y=Vmax_fit, color='gray', linestyle='--', alpha=0.7)
206
ax1.axhline(y=Vmax_fit/2, color='gray', linestyle=':', alpha=0.7)
207
ax1.axvline(x=Km_fit, color='gray', linestyle=':', alpha=0.7)
208
ax1.set_xlabel('[S] (uM)')
209
ax1.set_ylabel('$v_0$ (umol/min)')
210
ax1.set_title('Michaelis-Menten Kinetics')
211
ax1.legend(fontsize=8)
212
ax1.set_xlim(0, 350)
213
ax1.set_ylim(0, 120)
214
215
# Plot 2: Lineweaver-Burk plot
216
ax2 = fig.add_subplot(3, 3, 2)
217
inv_S_fine = np.linspace(-0.02, 0.22, 100)
218
ax2.scatter(inv_S, inv_v, s=60, c='blue', edgecolor='black')
219
ax2.plot(inv_S_fine, slope_lb * inv_S_fine + intercept_lb, 'r-', linewidth=2)
220
ax2.axhline(y=0, color='black', linewidth=0.5)
221
ax2.axvline(x=0, color='black', linewidth=0.5)
222
ax2.set_xlabel('1/[S] (uM$^{-1}$)')
223
ax2.set_ylabel('1/$v_0$ (min/umol)')
224
ax2.set_title('Lineweaver-Burk Plot')
225
ax2.set_xlim(-0.03, 0.22)
226
227
# Plot 3: Competitive inhibition
228
ax3 = fig.add_subplot(3, 3, 3)
229
colors = plt.cm.viridis(np.linspace(0, 0.8, len(I_conc)))
230
for i, I in enumerate(I_conc):
231
inv_v_comp = 1 / v_competitive[I]
232
ax3.scatter(inv_S, inv_v_comp, s=40, c=[colors[i]], edgecolor='black')
233
slope_c, intercept_c, _, _, _ = linregress(inv_S, inv_v_comp)
234
ax3.plot(inv_S_fine, slope_c * inv_S_fine + intercept_c, color=colors[i],
235
linewidth=1.5, label=f'[I]={I} uM')
236
ax3.axhline(y=0, color='black', linewidth=0.5)
237
ax3.axvline(x=0, color='black', linewidth=0.5)
238
ax3.set_xlabel('1/[S] (uM$^{-1}$)')
239
ax3.set_ylabel('1/$v_0$ (min/umol)')
240
ax3.set_title('Competitive Inhibition')
241
ax3.legend(fontsize=7, loc='upper left')
242
243
# Plot 4: Uncompetitive inhibition
244
ax4 = fig.add_subplot(3, 3, 4)
245
for i, I in enumerate(I_conc):
246
inv_v_uncomp = 1 / v_uncompetitive[I]
247
ax4.scatter(inv_S, inv_v_uncomp, s=40, c=[colors[i]], edgecolor='black')
248
slope_u, intercept_u, _, _, _ = linregress(inv_S, inv_v_uncomp)
249
ax4.plot(inv_S_fine, slope_u * inv_S_fine + intercept_u, color=colors[i],
250
linewidth=1.5, label=f'[I]={I} uM')
251
ax4.axhline(y=0, color='black', linewidth=0.5)
252
ax4.axvline(x=0, color='black', linewidth=0.5)
253
ax4.set_xlabel('1/[S] (uM$^{-1}$)')
254
ax4.set_ylabel('1/$v_0$ (min/umol)')
255
ax4.set_title('Uncompetitive Inhibition')
256
ax4.legend(fontsize=7, loc='upper left')
257
258
# Plot 5: Mixed inhibition
259
ax5 = fig.add_subplot(3, 3, 5)
260
for i, I in enumerate(I_conc):
261
inv_v_mix = 1 / v_mixed[I]
262
ax5.scatter(inv_S, inv_v_mix, s=40, c=[colors[i]], edgecolor='black')
263
slope_m, intercept_m, _, _, _ = linregress(inv_S, inv_v_mix)
264
ax5.plot(inv_S_fine, slope_m * inv_S_fine + intercept_m, color=colors[i],
265
linewidth=1.5, label=f'[I]={I} uM')
266
ax5.axhline(y=0, color='black', linewidth=0.5)
267
ax5.axvline(x=0, color='black', linewidth=0.5)
268
ax5.set_xlabel('1/[S] (uM$^{-1}$)')
269
ax5.set_ylabel('1/$v_0$ (min/umol)')
270
ax5.set_title('Mixed Inhibition')
271
ax5.legend(fontsize=7, loc='upper left')
272
273
# Plot 6: Eadie-Hofstee plot
274
ax6 = fig.add_subplot(3, 3, 6)
275
ax6.scatter(v_over_S, v_no_inhibitor_exp, s=60, c='blue', edgecolor='black')
276
v_over_S_fine = np.linspace(0, 3, 100)
277
ax6.plot(v_over_S_fine, Vmax_eh - Km_eh * v_over_S_fine, 'r-', linewidth=2)
278
ax6.set_xlabel('$v_0$/[S] (min$^{-1}$)')
279
ax6.set_ylabel('$v_0$ (umol/min)')
280
ax6.set_title('Eadie-Hofstee Plot')
281
282
# Plot 7: Hanes-Woolf plot
283
ax7 = fig.add_subplot(3, 3, 7)
284
ax7.scatter(S_conc, S_over_v, s=60, c='blue', edgecolor='black')
285
S_fine_hw = np.linspace(-50, 350, 100)
286
ax7.plot(S_fine_hw, slope_hw * S_fine_hw + intercept_hw, 'r-', linewidth=2)
287
ax7.axhline(y=0, color='black', linewidth=0.5)
288
ax7.axvline(x=0, color='black', linewidth=0.5)
289
ax7.set_xlabel('[S] (uM)')
290
ax7.set_ylabel('[S]/$v_0$ (min)')
291
ax7.set_title('Hanes-Woolf Plot')
292
293
# Plot 8: Dixon plot
294
ax8 = fig.add_subplot(3, 3, 8)
295
S_selected = [20, 50, 100]
296
colors_dixon = ['blue', 'green', 'red']
297
for j, S in enumerate(S_selected):
298
idx = np.where(S_conc == S)[0][0]
299
inv_v_dixon = [1/v_competitive[I][idx] for I in I_conc]
300
ax8.scatter(I_conc, inv_v_dixon, s=50, c=colors_dixon[j], edgecolor='black')
301
slope_d, intercept_d, _, _, _ = linregress(I_conc, inv_v_dixon)
302
I_fine = np.linspace(-40, 120, 100)
303
ax8.plot(I_fine, slope_d * I_fine + intercept_d, color=colors_dixon[j],
304
linewidth=1.5, label=f'[S]={S} uM')
305
ax8.axhline(y=0, color='black', linewidth=0.5)
306
ax8.axvline(x=0, color='black', linewidth=0.5)
307
ax8.set_xlabel('[I] (uM)')
308
ax8.set_ylabel('1/$v_0$ (min/umol)')
309
ax8.set_title('Dixon Plot (Competitive)')
310
ax8.legend(fontsize=8)
311
312
# Plot 9: Method comparison
313
ax9 = fig.add_subplot(3, 3, 9)
314
methods = ['NL fit', 'L-B', 'E-H', 'H-W']
315
Vmax_values = [Vmax_fit, Vmax_lb, Vmax_eh, Vmax_hw]
316
Km_values = [Km_fit, Km_lb, Km_eh, Km_hw]
317
x_pos = np.arange(len(methods))
318
width = 0.35
319
ax9.bar(x_pos - width/2, Vmax_values, width, label='$V_{max}$', color='steelblue', edgecolor='black')
320
ax9_twin = ax9.twinx()
321
ax9_twin.bar(x_pos + width/2, Km_values, width, label='$K_m$', color='coral', edgecolor='black')
322
ax9.axhline(y=Vmax_true, color='steelblue', linestyle='--', alpha=0.7)
323
ax9_twin.axhline(y=Km_true, color='coral', linestyle='--', alpha=0.7)
324
ax9.set_xlabel('Method')
325
ax9.set_ylabel('$V_{max}$ (umol/min)', color='steelblue')
326
ax9_twin.set_ylabel('$K_m$ (uM)', color='coral')
327
ax9.set_xticks(x_pos)
328
ax9.set_xticklabels(methods, fontsize=9)
329
ax9.set_title('Parameter Comparison')
330
331
plt.tight_layout()
332
plt.savefig('enzyme_kinetics_analysis.pdf', dpi=150, bbox_inches='tight')
333
plt.close()
334
\end{pycode}
335
336
\begin{figure}[htbp]
337
\centering
338
\includegraphics[width=\textwidth]{enzyme_kinetics_analysis.pdf}
339
\caption{Comprehensive enzyme kinetics analysis: (a) Michaelis-Menten saturation curve;
340
(b) Lineweaver-Burk plot; (c-e) Inhibition patterns for competitive, uncompetitive, and
341
mixed inhibition; (f-g) Eadie-Hofstee and Hanes-Woolf linearizations; (h) Dixon plot for
342
$K_i$ determination; (i) Parameter estimation method comparison.}
343
\label{fig:kinetics}
344
\end{figure}
345
346
\section{Results}
347
348
\subsection{Kinetic Parameter Determination}
349
350
\begin{pycode}
351
print(r"\begin{table}[htbp]")
352
print(r"\centering")
353
print(r"\caption{Comparison of Kinetic Parameter Estimation Methods}")
354
print(r"\begin{tabular}{lcccc}")
355
print(r"\toprule")
356
print(r"Method & $V_{max}$ ($\mu$mol/min) & Error (\%) & $K_m$ ($\mu$M) & Error (\%) \\")
357
print(r"\midrule")
358
359
Vmax_err_fit = abs(Vmax_fit - Vmax_true) / Vmax_true * 100
360
Km_err_fit = abs(Km_fit - Km_true) / Km_true * 100
361
Vmax_err_lb = abs(Vmax_lb - Vmax_true) / Vmax_true * 100
362
Km_err_lb = abs(Km_lb - Km_true) / Km_true * 100
363
Vmax_err_eh = abs(Vmax_eh - Vmax_true) / Vmax_true * 100
364
Km_err_eh = abs(Km_eh - Km_true) / Km_true * 100
365
Vmax_err_hw = abs(Vmax_hw - Vmax_true) / Vmax_true * 100
366
Km_err_hw = abs(Km_hw - Km_true) / Km_true * 100
367
368
print(f"Non-linear fit & {Vmax_fit:.2f} & {Vmax_err_fit:.2f} & {Km_fit:.2f} & {Km_err_fit:.2f} \\\\")
369
print(f"Lineweaver-Burk & {Vmax_lb:.2f} & {Vmax_err_lb:.2f} & {Km_lb:.2f} & {Km_err_lb:.2f} \\\\")
370
print(f"Eadie-Hofstee & {Vmax_eh:.2f} & {Vmax_err_eh:.2f} & {Km_eh:.2f} & {Km_err_eh:.2f} \\\\")
371
print(f"Hanes-Woolf & {Vmax_hw:.2f} & {Vmax_err_hw:.2f} & {Km_hw:.2f} & {Km_err_hw:.2f} \\\\")
372
print(r"\midrule")
373
print(f"True values & {Vmax_true:.2f} & --- & {Km_true:.2f} & --- \\\\")
374
print(r"\bottomrule")
375
print(r"\end{tabular}")
376
print(r"\label{tab:parameters}")
377
print(r"\end{table}")
378
\end{pycode}
379
380
\subsection{Inhibition Constants}
381
382
\begin{pycode}
383
print(r"\begin{table}[htbp]")
384
print(r"\centering")
385
print(r"\caption{Apparent Kinetic Parameters Under Competitive Inhibition}")
386
print(r"\begin{tabular}{cccc}")
387
print(r"\toprule")
388
print(r"[I] ($\mu$M) & $K_m^{app}$ ($\mu$M) & $V_{max}^{app}$ ($\mu$mol/min) & $K_i$ ($\mu$M) \\")
389
print(r"\midrule")
390
391
for I in [25, 50, 100]:
392
inv_v_c = 1 / v_competitive[I]
393
slope_c, intercept_c, _, _, _ = linregress(inv_S, inv_v_c)
394
Vmax_c = 1 / intercept_c
395
Km_c = slope_c * Vmax_c
396
Ki_c = I / (Km_c / Km_fit - 1) if Km_c > Km_fit else float('inf')
397
print(f"{I} & {Km_c:.1f} & {Vmax_c:.1f} & {Ki_c:.1f} \\\\")
398
399
print(r"\midrule")
400
print(f"True $K_i$ & --- & --- & {Ki_true:.1f} \\\\")
401
print(r"\bottomrule")
402
print(r"\end{tabular}")
403
print(r"\label{tab:inhibition}")
404
print(r"\end{table}")
405
\end{pycode}
406
407
\section{Discussion}
408
409
\begin{example}[Distinguishing Inhibition Mechanisms]
410
The Lineweaver-Burk plots reveal characteristic patterns:
411
\begin{itemize}
412
\item \textbf{Competitive}: Lines intersect on the y-axis (unchanged $V_{max}$, increased $K_m^{app}$)
413
\item \textbf{Uncompetitive}: Parallel lines (proportional decreases in both parameters)
414
\item \textbf{Mixed}: Lines intersect left of y-axis (both parameters affected)
415
\end{itemize}
416
\end{example}
417
418
\begin{remark}[Method Accuracy]
419
Non-linear regression provides the most accurate parameter estimates because it properly
420
weights data points. The Lineweaver-Burk plot systematically overweights low-substrate
421
data where experimental error is highest.
422
\end{remark}
423
424
\subsection{Catalytic Efficiency}
425
426
\begin{pycode}
427
kcat = Vmax_fit / 1.0
428
specificity = kcat / Km_fit
429
print(f"The catalytic efficiency ($k_{{cat}}/K_m$) is {specificity:.2f} $\\mu$M$^{{-1}}$ min$^{{-1}}$.")
430
\end{pycode}
431
432
\section{Conclusions}
433
434
This analysis demonstrates the application of Michaelis-Menten kinetics:
435
\begin{enumerate}
436
\item Non-linear regression yields $V_{max} = \py{f"{Vmax_fit:.1f}"}$ $\mu$mol/min and $K_m = \py{f"{Km_fit:.1f}"}$ $\mu$M
437
\item Different inhibition types show diagnostic patterns in double-reciprocal plots
438
\item The estimated $K_i$ for competitive inhibition agrees with the true value
439
\item Linear transformations remain useful for visualization despite statistical limitations
440
\end{enumerate}
441
442
\section*{Further Reading}
443
444
\begin{itemize}
445
\item Cornish-Bowden, A. \textit{Fundamentals of Enzyme Kinetics}, 4th ed. Wiley-Blackwell, 2012.
446
\item Bisswanger, H. \textit{Enzyme Kinetics: Principles and Methods}, 3rd ed. Wiley-VCH, 2017.
447
\end{itemize}
448
449
\end{document}
450
451