Tripartite population model
This model explores how cooperation, exploitation and privatization coexist in a microbial community built around a single shared carbon source, sucrose. Three metabolic strategies compete for it: the public metabolizer secretes invertase, hydrolysing sucrose into glucose that becomes freely available to the whole community; the cheater takes up that glucose without paying the metabolic cost of producing the enzyme; and the private metabolizer imports and digests sucrose intracellularly, avoiding both the cost of sharing and the risk of exploitation.
Population growth follows a generalized Lotka-Volterra model with density-dependent self-limitation for each strategy, an exploitation term through which cheaters benefit at the public metabolizer's expense, and a competition term between public and private metabolizers for the shared sucrose pool. Because the same right-hand sides can be read as per-capita growth rates, the model doubles as a three-strategy evolutionary game: each strategy's fitness is exactly its payoff, and the interior equilibrium where all three coexist corresponds to the point where all three payoffs are equal.
The public metabolizer needs a growth-rate advantage over the private metabolizer to sustain the community: this model's analysis finds stable three-way coexistence only for a narrow window of that ratio (roughly 1.2-5x), with the most robust balance around 1.2-2x. Outside that window the system collapses to a boundary state, private-only dominance if the public metabolizer grows too slowly, or loss of the private metabolizer if it grows too fast relative to the public strategy.

Simulation parameters
Initial conditions
Analyses
Time course
Loading chart...
Public metabolizer growth rate scan
Add analysis
Model Details
Review and edit model structure, biological variables, and kinetic parameters.
| Name | Tex name | Initial value | Actions |
|---|---|---|---|
Edit Options
Edit Options
Edit Options
Generated LaTeX Code
\begin{align*}
\frac{d \text{Public}}{dt} &= r_P \cdot \text{Public} - \alpha \cdot \text{Public} \cdot \text{Cheater} - \beta \cdot \text{Public} \cdot \text{Private} - \eta \cdot \text{Public} \cdot \text{Public} \\
\frac{d \text{Cheater}}{dt} &= \alpha \cdot \text{Public} \cdot \text{Cheater} - \nu \cdot \text{Cheater} \cdot \text{Cheater} \\
\frac{d \text{Private}}{dt} &= r_M \cdot \text{Private} - \beta \cdot \text{Public} \cdot \text{Private} - \gamma \cdot \text{Private} \cdot \text{Private}
\end{align*}Fit to data
Fit settings
| Setting | Value |
|---|---|
| Fit backend | |
| Function evaluations per progress update | |
| Maximum total function evaluations | |
| Stop once residual norm reaches |
Curriculum learning (advanced)
Every bar shares one fixed step budget. Drag a divider to move a cutoff, drag a bar's top edge (or focus it and use the arrow keys) to change its share — the final stage isn't draggable, it always gets whatever's left. Double-click a bar or use its + to split it, use a divider's × (or Delete/Backspace while it's focused) to remove it.
| Stage | Data cutoff | Iteration budget |
|---|---|---|
| 1 (final) | full data | 1000 iterations (runs to convergence within this) |
Data
Plot options
| Parameter | Fit | Log-space | Initial guess / fixed value | Fitted value |
|---|---|---|---|---|
| Public growth rate | — | |||
| Public self-limitation | — | |||
| Cheater self-limitation | — | |||
| Private growth rate | — | |||
| Private self-limitation | — | |||
| Exploitation rate | — | |||
| Competition rate | — |
