A 3-Node Incoherent Feedforward Loop

Signal S (clamped/externally controlled) drives species A directly, and also drives species B directly through a separate, saturable branch. B in turn inhibits the production of A. Because S reaches A by two opposite-sign routes — a direct positive arm (S → A) and an indirect negative arm (S → B ⊣ A) — this is called an incoherent feedforward loop. Unlike the negative-feedback design, B here does not depend on A at all; it is driven only by S. Watch how closely A returns to its starting value after each step in S.

Species concentration vs. time

Drag across the plot to inspect values at a given time. Adjust the controls below and watch this graph update.

Signal, S Species A Species B
A at t = 0:
A at end of run:
Difference:

Compare "A at t = 0" with "A at end of run" (S returns to the same value at both times by default). This incoherent feedforward loop typically lands much closer to perfect adaptation than the direct negative-feedback loop does — but, unlike the antithetic-feedback (X-mediated) design, it is still only approximate: try raising k2 or lowering Vf to see the gap widen.

Model & controls

Reaction network: S → A, rate = k1S(1−A) − k2AB (direct, inhibited by B)  ·  S → B, saturable rate depending on S and B (Vf, Kmf, k4)

About this model Sniffers, buzzers, toggles & blinkers

This ModelBrick is another variant built from the same article as the antithetic (X-mediated) perfect-adaptation model and the direct negative-feedback model: a three-node network in which signal S drives A directly while also driving B through a separate saturable branch, and B inhibits A's production. Because the two paths from S to A carry opposite signs, this is an incoherent feedforward loop rather than a feedback loop — B never "senses" A, it only senses S. S is stepped up in four increments of 0.2 and then back down in four decrements of 0.2, letting you compare A's response on the way up against the way down. Originally built and simulated in VCell and exported as SBML.