Honglin Li
  • Research
  • Projects
  • Publications
  • Software
  • Teaching
  • Learn
  • Notes
  • CV
  • Journeys

Grid Room

Run a fictional three-zone grid on real 2025 days: commit the plants, price each zone conditional on that commitment, and add a large load

Sandbox SB2 of Energy Systems, Step by Step: commit the plants of a fictional three-zone grid with a mixed-integer program, price each zone with the dispatch linear program, and add a large load.
  1. Learn
  2. SB2
  • Modeler · L3
  • Sandbox
  • 30 min
  • After M2 and M1
  • Completed
  1. 1Brief
  2. 2Bench
  3. 3Results
  4. 4Explain
  5. 5Sources

The brief

The system
The Plains Grid (fictional): Wind Ridge, Prairie Town and Metro in a row, joined by two links; 4,000 MW at the 2025 peak, with real 2025 hourly shapes.
You decide
The day or week; a large load (a data center) and where it connects; the two link limits (MW); the reserve required; the gas price.
The engine works out
Each day, a mixed-integer program commits the plants (chooses which are on each hour); then a linear program with that commitment fixed prices each zone.
It leaves out
Power-flow physics (a transport model), losses, ramp limits, forecast errors, plant outages, whether the reserve can reach each zone, and prices from the mixed-integer program itself.

Open-ended: start from a preset, change one thing at a time, and copy the plan link to keep a plan.

The bench

Control Default plan Range
Period Summer peak day one of: Summer peak day, Winter peak day, Windy spring day, Peak-demand week, Low-wind winter week
Large load (a data center) 0 MW 0 to 600 MW, in steps of 50 MW
It connects in Prairie Town one of: Prairie Town, Metro
Share it can curtail 0 % 0 to 50 %, in steps of 10 %
Curtailment bid 300 $/MWh 100 to 2,000 $/MWh, in steps of 50 $/MWh
Ridge–Town limit 900 MW 0 to 1,500 MW, in steps of 50 MW
Town–Metro limit 400 MW 0 to 1,200 MW, in steps of 50 MW
Operating reserve required 250 MW 0 to 600 MW, in steps of 25 MW
Gas price 3.85 $/MMBtu 1.5 to 8 $/MMBtu, in steps of 0.05 $/MMBtu

With JavaScript on, you change these, run each day in your browser and copy a link to your plan.

  • Illustrative: the Plains Grid, its zones, plants, links, the $5,000/MWh penalty for unserved load and the $1,000/MWh for reserve short; 2025 dollars.
  • Based on SPP 2025: hourly demand, wind and sun follow the Southwest Power Pool's 2025 shapes (EIA-930), scaled to each zone; all three zones share that one weather.
  • EIA: fuel prices, capacity factors and CO₂ coefficients (sources below).

Results

Result: summer peak day, 29 July 2025 (the default plan, then a 300 MW data center at Prairie Town) Value
Today's grid: production cost (running, no-load and start-up; 2025 dollars) $1,676,000
Today's grid: average price, Wind Ridge · Prairie Town · Metro (conditional on the commitment) $27 · $27 · $29 /MWh
Today's grid: highest price in any zone $30/MWh
Today's grid: hours at the limit, Ridge–Town · Town–Metro 0 · 2 of 24
Today's grid: unserved · reserve short 0 MWh · 0 MWh
Today's grid: uplift (make-whole payments) $50,000
With the 300 MW load: production cost (running, no-load and start-up; 2025 dollars) $1,895,000
With the 300 MW load: average price, Wind Ridge · Prairie Town · Metro (conditional on the commitment) $32 · $32 · $32 /MWh
With the 300 MW load: highest price in any zone $45/MWh
With the 300 MW load: hours at the limit, Ridge–Town · Town–Metro 0 · 4 of 24
With the 300 MW load: unserved · reserve short 0 MWh · 0 MWh
With the 300 MW load: uplift (make-whole payments) $0

Precomputed with HiGHS on 5 November 2026: each day a mixed-integer program commits the plants, then the dispatch linear program with that commitment fixed gives the prices. With JavaScript on, the bench runs your own plan.

How the engine works, as diagrams

Commit
A mixed-integer program chooses how many units of each group are on in each hour, with minimum outputs, start-up costs and minimum run times; it shows no prices.
Price
With every on/off decision fixed, the dispatch linear program runs the day again; each zone's shadow price is its price, conditional on the commitment.
It holds when
The zones share 2025's weather, each link carries any flow up to its limit, each day is committed alone with its load, wind and sun known, and units never fail.
It leaves out
Power-flow physics, losses, ramp limits, forecast errors, outages, whether the region-wide reserve can reach a zone, and the next day when a day is committed.
Go deeper · ModelerThe models behind the bench

M2 writes unit commitment down and grows its branch-and-bound tree; M1 reads prices from a dispatch linear program and adds the network. M2’s notebook rebuilds the commitment and the conditional prices in Python. The capstone C2 runs this engine over a year and checks adequacy.

Go deeperThe days and weeks you can run
Period Why this one
Summer peak day, 29 July 2025 The 2025 summer day with the highest hourly demand
Winter peak day, 21 January 2025 The 2025 winter day with the highest hourly demand, among days with no repaired hours
Windy spring day, 17 April 2025 The 2025 spring day with the most wind energy
Peak-demand week, 14–20 August 2025 The 2025 week with the highest average daily demand peak
Low-wind winter week, 2–8 January 2025 One of the two calmest weeks of winter 2025 by mean wind; lesson A8's week

A week runs day by day: each day is committed without seeing the next, as a day-ahead market commits one day at a time, and carries the units' state at 23:00 into the next day.

Go deeperWhen two answers cost the same: the tie rule

Several schedules can cost exactly the same. Tiny stated costs, far below a cent per MWh, pick one:

  • Spilled wind and sun: Wind Ridge's first, then Prairie Town's, then Metro's.
  • Unserved load, if several zones could go short: Metro's first, then Prairie Town's, then Wind Ridge's.
  • Reserve: carried first by the unit groups listed first.

The engine's test runs seven benchmark plans again with the tie weights ×10 and ×0.1: every number shown stays the same.

In those runs, each price equals the cost slope when its zone's load moves 0.001 MWh up and when it moves down: no price sits on a corner. Your own plans are not checked this way.

Numbers, sources and what’s next

Inputs the engine uses

Input Value Source
Peak load: Ridge · Town · Metro 300 · 450 · 3,250 MW Illustrative; each hour follows SPP's 2025 demand shape (EIA-930, accessed 2 Nov 2026)
Wind built: Ridge · Town · Metro 2,000 · 150 · 300 MW Illustrative
Solar built: Ridge · Town · Metro 0 · 200 · 600 MW Illustrative
Output per MW: wind · solar 33.8% · 24.0% a year SPP's 2025 shapes scaled to EIA's 2025 monthly capacity factors: EPM Table 6.07.B, issue of 23 Oct 2026
Link limits: Ridge–Town · Town–Metro 900 · 400 MW Illustrative
Fuel: gas · coal $3.85 · $2.42/MMBtu Average cost to the electric power industry, 2025: EIA, Electric Power Annual, Table 7.4 · final 2025 data; checked 5 Nov 2026. One MMBtu is a million British thermal units of fuel heat
Heat rates 6.4 to 11.2 MMBtu/MWh Illustrative, around EIA's 2025 averages (coal 10.65, gas 7.78 MMBtu/MWh): Electric Power Annual, Table 8.1 · 2025 data; checked 5 Nov 2026
CO₂: gas · subbituminous coal 52.91 · 97.13 kg/MMBtu EIA, Carbon Dioxide Emissions Coefficients · released 18 Sep 2024; checked 5 Nov 2026
Unserved load · reserve short $5,000 · $1,000/MWh Illustrative penalties in the objective, not costs anyone pays
The plantsEach unit group's data (illustrative)
Unit group Zone Units Minimum output Running cost at $3.85 gas No-load cost Start-up Minimum up · down Reserve per unit
Town combined cycle Prairie Town 1 × 200 MW 80 MW $30.72/MWh $308/h $6,000 4 · 4 h 60 MW
Town peakers Prairie Town 3 × 50 MW none $49.12/MWh none none none 50 MW
Metro coal units Metro 2 × 500 MW 200 MW $29.67/MWh $726/h $25,000 12 · 8 h 50 MW
Metro combined cycles Metro 3 × 667 MW 267 MW $27.14/MWh $1,028/h $9,000 4 · 4 h 133 MW
Metro gas steam unit Metro 1 × 300 MW 100 MW $42.50/MWh $770/h $7,000 6 · 6 h 50 MW
Metro peakers Metro 14 × 80 MW none $45.43/MWh none none none 80 MW

Running cost = heat rate × fuel price + variable upkeep; no-load cost = the heat burned each hour a unit is on × fuel price. Peakers start within minutes and have no minimum output, so the model gives them no on/off decision.

Keep going

Back to the course map

Built on

  • M2 (unit commitment), M1 (prices from a linear program) and lesson 8 (the merit order).
  • Applied in the capstone C2, which adds builds, adequacy and who pays.
  • Open tools for larger grid models: PyPSA, GenX and JuMP.

Sources and further reading

  • EIA. Hourly Electric Grid Monitor (Form EIA-930): the Southwest Power Pool's demand, wind and sun, 2025.
  • EIA. Electric Power Annual, Table 7.4: average cost of fossil fuels for the electric power industry, 2025.
  • EIA. Electric Power Annual, Table 8.1: average operating heat rates, 2025.
  • EIA. Carbon Dioxide Emissions Coefficients.
  • HiGHS. Documentation of the open-source solver that runs the bench in your browser.

Spotted an error, or stuck? Write to hlli@ksu.edu. Corrections are made in place and dated here.

Text licensed CC BY 4.0, code MIT: teachers and students may reuse and adapt it, with credit to Honglin Li.

© 2026 Honglin Li · Kansas State University · hlli@ksu.edu

 

Last updated: November 2026 · Built with Quarto