A virtual power plant (VPP) does not build one big generator — it aggregates many small, independently-owned distributed energy resources (DERs) behind software and dispatches the pool as if it were a single plant. Each unit's output is noisy and intermittent on its own, but pooling reduces the relative volatility of the sum because per-unit weather noise is only partially correlated:
P_agg(t) = Σ P_i(t), i = 1..N
CV_unit = σ(P_i) / μ(P_i) (one unit's coefficient of variation)
CV_agg = σ(P_agg/N) / μ(P_agg/N)
For weakly-correlated sources: CV_agg ≈ CV_unit · √((1+(N-1)ρ)/N)
→ as N grows, CV_agg falls toward ρ·CV_unit (never to zero — shared
weather, ρ, sets the floor a fleet can't diversify away).
The aggregator then tries to match a grid dispatch target using a battery buffer as the residual controller:
surplus(t) = P_agg(t) − P_target(t)
if surplus > 0: battery charges, min(surplus, chargeLimit)
if surplus < 0: battery discharges, min(|surplus|, SoC, dischargeLimit)
P_dispatched(t) = P_agg(t) − P_battery(t)
- DER units (N) — how many small generators the VPP pools; more units means a smoother aggregate for the same per-unit noise.
- Solar share of mix — the rest splits between micro-wind and steady micro-CHP; CHP barely fluctuates, wind and solar are the volatile members.
- Weather variability — scales cloud passages and wind gusts; higher values widen each unit's swings and stress-test the pooling effect.
- Battery buffer capacity — how much energy the aggregator can bank to absorb the mismatch between aggregate output and the grid's requested dispatch curve.
Real-world relevance: utilities and aggregators (Tesla Autobidder, Sonnen, Octopus's Kraken) run exactly this loop across thousands of rooftop batteries and inverters to sell one smooth, dispatchable capacity block into wholesale and balancing markets. This 2D rendering plots the same hub-and-spoke topology as the 3D original from directly overhead — drag to pan, scroll or pinch to zoom.