3: Calculation of limits/ extremes
Single reactions
The limits for a single reaction are fairly obvious: no reaction (k=0) and infinitely fast reaction (k=$\infty$). Using Baldyga’s closure is straightforward as described in his 1994 publication. For one reaction (A+B>P) with (in this illustration) similar concentrations in each stream, the following limits are obtained full-size:

Multiple reactions
The limits for multiple reactions are more numerous. For example there are four possible limits (extremes) with two reactions and in general the number of possible extremes including the no-reaction limit (“mixing line”) is $2^{N_{rxns}}$. The formaulae for each line segment (between 0 and $f_{s}$ and between $f_{s}$ and 1) in these reactions can be worked out by hand using algebra, stoichiometric coefficients and feed concentrations. The algebra becomes tedious quickly and more complex when many reactions compete for the same reactants, or reactions consume products of other reactions.
I have done my share of those algebraic manipulations and it does not take long to realize that there must be a better way using computational tools in 2026. I have written a smallish open source python program (species_limits.py) that reads in the reaction scheme as a JSON file and generates the full set of limits/ extremes for more or less any reaction system. If you are interested in the methodology, read the documentation that comes inside and with the source code. For this article, its sufficient to say that I used optimization via linear programming (LP) to maximize the extent of all reactions at each limit/extreme, with some tweaks to ensure the correct maximum was found in a few difficult cases. When writing the code, I found it very helpful to use Anthropic’s Claude Code product inside Microsoft’s VS Code. I mainly used Claude Sonnet 4.6.
I hope the introductory posts on limits were clear enough to prepare you for a bit of an onslaught of plots for multiple reactions, presented below. You will notice that my terminology refers to the concentrated fed limiting reactant as “A” - which for me chimes with “Added” and the bulk typically more dilute reactant as “B” which chimes with “Bulk”. That is different to the terminology used generally by Baldyga and Bourne, in which “B” is the name they give to the limiting reactant.
The original azo-coupling (A+B>R, A+R>S), sometimes called the “first Bourne reaction”, with 4 limits full-size:

The full azo-coupling in 3-reaction format (A+B>P, A+P>S, A+C>Q), with 8 limits full-size:

The fuller azocoupling in 5-reaction format (A+B>R, A+R>S, A+B>T, A+T>S, A+C>Q), with 32 limits full-size:

I would encourage you to look at the extremes closely (click ‘full-size’ and zoom in), at least for one multiple reaction system. Here are a few things worth noticing:
- each subplot (apart from the first subplot containing the mixing line) considers a different subset of the reactions, all running infinitely fast; there is one subset for every possible combination of infinitely fast reactions
- the subsets are numbered starting at zero and the reactions considered in a subset are shown above the subplot
- with a fairly modest sized reaction scheme there are already a lot of subset limits to consider
- some subset solutions / extremes are duplicates of the no-reaction extreme; if the necessary reactants are not available (either fed or produced) at that extreme, some or all reaction lines will not run
- some extremes are duplicates of other extremes, for the same reason; that duplicatiom means that for each species there are fewer than $2^{N_{rxns}}$ unique limits
- when at least some reactions in a subset can run to completion, an $f_{s}$ is calculated and a vertical dashed line indicates its position along the f-axis. $f_{s}$ is also noted in the title of the plot for that subset
- typically there are several subsets with distinct values of $f_{s}$ and distinct sets of reactant and product profiles in the now familiar “tent” shapes
- the last subset considered includes all reactions
- not all reaction products are produced in all subsets; even if the reaction line that produces a species is present in the subset, if another line consumes that species, that product amount will be zero at that limit.
In principle and depending on the actual kinetics of each reaction line and the starting concentrations of all species, behaviour of a real complex reaction system could fall between the no-reaction line and any of these extremes. As noted in the 2025 publication from Baldyga’s group, it is also possible for the behaviour of a real complex reaction system to fall between the no-reaction line and a combination of these extremes.
So, which limits to use?
If we are aiming for a closure model that is widely applicable to (more or less) any reaction system, with any set of kinetic parameters and input concentrations and any mixing intensity, it appears that we have to consider a broad range of potential behaviour/ limits/ extremes and/or their combinations. My journey through that somewhat complex terrain will be summarized in the next posts.
Joe Hannon's blog