Modeler checkpoint: formulate an unseen problem, find a defect, validate a result
About four hours on problems the course has not shown; worked formulations and code open when you submit
How this checkpoint works · about 240 minutes, no hints
- A · The brief (about 120 min). Choose a variant. Model: formulate the water brief as a linear program, solve it and read the solution. Empirical: analyse a real year of grid data.
- B · The planted defect (about 60 min). Find the one defect in a supplied model, say which check shows it, fix it and solve again.
- C · Validation (about 45 min). Check one of your results against an independent reference: hand calculations (model) or a published figure (empirical).
- Submit (about 15 min). Enter your results in the eleven tasks below, in any order. The worked formulations and code open once all eleven are answered.
How it is marked, before you start
- Proficient: at least 6 of the 9 auto-marked tasks right on the first try, including the defect's line (task 6), plus 3 of the 4 points of task 1 and 2 of the 3 of task 11, which you tick yourself.
- Strong: 8 of 9 on the first try, the defect's line among them, and every written point.
- Tolerances: each number task says how close counts as right.
- Opening solutions early: a task whose solution you open before answering counts as not right. Opening the full worked solutions before all eleven tasks are answered makes the attempt practice, with no level.
- After the worked solutions open: an answer given after that counts as practice, not as right, and a written task then earns no points.
Starter notebook (.ipynb) Dataset: town_year.json Briefs and model data (JSON, no answers)
The starter notebook holds both briefs' data and the supplied model, and gives no formulation and no answers. It runs in Google Colab or locally with Python 3.9 or later, NumPy and SciPy 1.9 or later. The empirical variant also needs town_year.json in the notebook's folder; its worked solution uses zoneinfo (on Windows, pip install tzdata; it falls back to 2025's clock rule without it).
Model variant · the brief
Pumping water for the least electricity cost
Prairie Town's water utility pumps groundwater into a water tower, and the town draws its water from the tower. Find tomorrow's pumping schedule that meets the town's water use at the least electricity cost for the day. All numbers in this brief are illustrative.
- Water use: forecast for each hour of tomorrow, in the table below (m³)
- Pumps: lift up to 900 m³ an hour and use 0.5 kWh of electricity per m³ pumped
- Tower: holds 800 to 4,000 m³; 2,000 m³ at the start of the day, and at least as much at the end
- Energy price: the rural electric co-op's time-of-use price: $0.06 per kWh from 22:00 to 06:00, $0.20 from 16:00 to 21:00, $0.10 otherwise
- Demand charge: $0.40 for each kW of the day's highest hourly draw
Hourly water use and price
| Hour | Water use (m³) | Price ($/kWh) |
|---|---|---|
| 00:00 | 180 | 0.06 |
| 01:00 | 160 | 0.06 |
| 02:00 | 150 | 0.06 |
| 03:00 | 150 | 0.06 |
| 04:00 | 170 | 0.06 |
| 05:00 | 250 | 0.06 |
| 06:00 | 420 | 0.10 |
| 07:00 | 610 | 0.10 |
| 08:00 | 640 | 0.10 |
| 09:00 | 560 | 0.10 |
| 10:00 | 480 | 0.10 |
| 11:00 | 450 | 0.10 |
| 12:00 | 440 | 0.10 |
| 13:00 | 430 | 0.10 |
| 14:00 | 420 | 0.10 |
| 15:00 | 430 | 0.10 |
| 16:00 | 470 | 0.20 |
| 17:00 | 560 | 0.20 |
| 18:00 | 640 | 0.20 |
| 19:00 | 650 | 0.20 |
| 20:00 | 560 | 0.20 |
| 21:00 | 430 | 0.10 |
| 22:00 | 320 | 0.06 |
| 23:00 | 230 | 0.06 |
Empirical variant · the brief
What can the town count on at its peaks?
Prairie Town's planners want to know how far its wind and solar farms can be counted on when the town needs power most. Report what the town can and cannot count on, and how far your results depend on the dataset's scaling.
- Data: town_year.json (8,760 hours of 2025), the course's year file: the real 2025 hourly demand, wind and solar of the Southwest Power Pool grid (EIA-930), each as a shape in thousandths of its own highest 2025 hour
- Metadata: the file's
metablock gives the source, the time convention and how bad hours were filled - Scaling: as lesson 0: demand × 450 MW, the wind farm × 150 MW, the solar farm × 200 MW, so SPP's highest hour means a farm at its full size
- Compare: each farm's output in the 100 hours of highest demand, and in the 100 hours of highest net load (demand minus wind and solar), with its average over the year
- Ties: where hours tie, take the earlier one first
Part B · the supplied model, with one planted defect
The supplied model: what should Prairie Town build (wind, solar, a gas combined-cycle plant, a gas peaker) to meet demand on three representative days of 2025, each weighted by the days of the year it stands for? One planted defect.
On paper
- Weights:
w_d = the days of the year that day d stands for (121, 122, 122; they sum to 365). - Goal:
min Σ_g A_g K_g + Σ_d w_d Σ_t [ (Σ_g c_g p_g,d,t) + V u_d,t ] ($ a year) - Balance:
Σ_g p_g,d,t + u_d,t = D_d,t (MW, every day and hour) - Wind and solar:
p_g,d,t ≤ a_g,d,t K_g (a: output per MW built, 0 to 1) - Gas plants:
p_g,d,t ≤ K_g - Domains:
K_g ≥ 0, p_g,d,t ≥ 0, u_d,t ≥ 0
The symbols, with their units
| Symbol | Meaning | Unit |
|---|---|---|
g |
a technology: wind, solar, gas combined-cycle (cc), gas peaker (pk) | – |
d, t |
a representative day, and an hour of it (t = 0 to 23, one hour each) | – |
w_d |
the days of the year that day d stands for | days |
A_g |
capital cost, already annualized | $ per MW of capacity per year |
K_g |
capacity built: a decision | MW |
c_g |
running cost | $/MWh |
p_g,d,t |
output in hour t of day d: a decision | MW (held for one hour, so also MWh) |
u_d,t |
demand left unserved: a decision | MW (also MWh in its hour) |
V |
the cost of unserved demand, $10,000 | $/MWh |
D_d,t |
demand | MW |
a_g,d,t |
output per MW built, 0 to 1 (wind and solar) | MW per MW |
Units of the goal: MW held for one hour × $/MWh = $ for each hour; summed over a day's 24 hours and multiplied by w_d days, $ a year, like A_g K_g.
In code (the starter notebook runs it)
- DAYS = {"winter": 121, "shoulder": 122, "summer": 122} # days of 2025 each day stands for
- weight = {d: DAYS[d] / 365 for d in DAYS} # share of the year
- cost = {"wind": 0, "solar": 0, "cc": 40, "pk": 100} # running cost, $ per MWh
- capital = {"wind": 100_000, "solar": 70_000, "cc": 80_000, "pk": 50_000} # $ per MW-year, annualized
- V = 10_000 # $ per MWh of demand left unserved
- minimize( sum(capital[g] * K[g] for g) + sum(weight[d] * (sum(cost[g] * p[g,d,t] for g) + V * u[d,t]) for d, t) )
- for d, t: sum(p[g,d,t] for g) + u[d,t] == demand[d][t] # balance, MW
- for g in ("wind", "solar"), d, t: p[g,d,t] <= avail[g][d][t] * K[g] # output per MW built
- for g in ("cc", "pk"), d, t: p[g,d,t] <= K[g]
- report(K, annual_cost=objective, demand_in_year=sum(weight[d] * demand[d][t] for d, t))
- Costs: illustrative round numbers: capital already annualized ($ per MW of capacity per year); running costs as in lesson 0
- Demand: the three real days' SPP shape × 450 MW
- Wind and solar: output per MW built: the SPP shapes scaled to EIA's 2025 U.S. capacity factors (33.8% and 24.0%) with the course's scale method
- Days: Thursday 16 January 2025 for December to March (121 days); Wednesday 2 April 2025 for April, May, October and November (122 days); Monday 15 September 2025 for June to September (122 days)
What the code prints when run
| Built: Wind farm | 0.0 MW |
|---|---|
| Built: Solar farm | 0.0 MW |
| Built: Gas combined-cycle | 0.0 MW |
| Built: Gas peaker | 308.7 MW |
| Annual cost | $18.1 million |
| Demand in the year | 6,757 MWh |
| Demand left unserved in the year | 203 MWh |
With JavaScript on, you can run this model here with the solver in your browser. The starter notebook runs the same code.
Without JavaScript nothing here is locked: the worked solutions are further down the page. Do the tasks first, and keep your answers; the level rule is in the rubric section.
Model variant: the tasks
Your formulation Part A · Formulate
Write your formulation of the water brief: sets, parameters with units, decision variables, the objective and every rule. A short version here is enough; keep the full one in your notebook.
Self-rated against 4 points, shown after you submit.
Least cost of the day Part A · Solve
Solve your model. What is the least electricity cost of the day, energy and demand charge together? Within 0.1% (about 50 cents) counts as right.
Answer with a number and a unit.
The highest draw Part A · Read the solution
In your least-cost schedule, what is the pumps' highest hourly draw of electricity? Within 0.5% (about 1 kW) counts as right.
Answer with a number and a unit.
Water pumped at the peak price Part A · Read the solution
How much water does your schedule pump in the five peak-price hours, 16:00 to 21:00? Within 1% (about 3 m³) counts as right.
Answer with a number and a unit.
A larger tower Part A · Marginal value
Solve again with a tower 100 m³ larger (4,100 m³). By how much does the day's cost fall? Within 2% (about 14 cents) counts as right.
Answer with a number and a unit.
The planted defect Part B · Find a defect
Run the supplied model (the button above, or the starter notebook) and read its code. Which line holds the planted defect?
- a. Line 2: weight = DAYS[d] / 365
- b. Line 4: the annualized capital costs
- c. Line 6: the objective
- d. Line 8: the wind and solar limits
The check that shows it Part B · Find a defect
Which line of the supplied model's report shows the defect most directly?
- a. Built: a gas peaker only
- b. Demand in the year: 6,757 MWh
- c. Every hour balances
- d. Annual cost: $18.1 million
The fixed model Part B · Fix and re-solve
Fix the defect and solve again. What is the plan's annual cost? Within 0.5% (about $0.5 million) counts as right.
Answer with a number and a unit.
Upper bound by hand Part C · Validate
Without the solver: what would the day cost if the pumps simply matched each hour's water use (pump as you go)? That plan is feasible, so the optimum cannot cost more. Within 0.5% (about $3.70) counts as right.
Answer with a number and a unit.
Lower bound by hand Part C · Validate
Without the solver: a lower bound, if every m³ could be pumped at the cheapest price and the draw spread evenly over the 24 hours. Within 0.5% (about $1.90) counts as right.
Answer with a number and a unit.
Your validation statement Part C · Validate and submit
State whether your optimum lies between your two bounds, one special case your model reproduces exactly, and what these checks cannot show.
Self-rated against 3 points, shown after you submit.
Empirical variant: the tasks
Your analysis design Part A · Design the analysis
Write your design before computing: the question's type, the metrics with units, how you scale the data and pick the hours (with ties), and what the analysis leaves out.
Self-rated against 4 points, shown after you submit.
Wind's mean output in the dataset Part A · Compute
In the dataset as scaled, what is the wind farm's mean output over 2025 as a percentage of its 150 MW, that is, of SPP's highest 2025 wind hour? Within 0.5% of the value (about 0.3 percentage points) counts as right.
Answer with a number and a unit.
Wind in the highest-demand hours Part A · Compute
What is the wind farm's average output in the 100 hours of highest demand, as a share of its 150 MW? Within 2% of the value (about 1.2 percentage points) counts as right.
Answer with a number and a unit.
Solar in the highest-demand hours Part A · Compute
And the solar farm's average output in the same 100 hours, as a share of its 200 MW? Within 2% of the value (about 1.4 percentage points) counts as right.
Answer with a number and a unit.
Both farms at net-load peaks Part A · Compute
In the 100 hours of highest net load (demand minus wind and solar), what do the two farms give together, on average? Within 2% (about 1 MW) counts as right.
Answer with a number and a unit.
The planted defect Part B · Find a defect
Run the supplied model (the button above, or the starter notebook) and read its code. Which line holds the planted defect?
- a. Line 2: weight = DAYS[d] / 365
- b. Line 4: the annualized capital costs
- c. Line 6: the objective
- d. Line 8: the wind and solar limits
The check that shows it Part B · Find a defect
Which line of the supplied model's report shows the defect most directly?
- a. Built: a gas peaker only
- b. Demand in the year: 6,757 MWh
- c. Every hour balances
- d. Annual cost: $18.1 million
The fixed model Part B · Fix and re-solve
Fix the defect and solve again. What is the plan's annual cost? Within 0.5% (about $0.5 million) counts as right.
Answer with a number and a unit.
Against a published benchmark Part C · Validate
EIA reports a 2025 capacity factor of 33.8% for the U.S. utility-scale wind fleet. By how many percentage points does your figure from task 2 exceed it? Within 2% of the value (about 0.4 percentage points) counts as right.
Answer with a number and a unit.
What the gap tells you Part C · Validate
What does that gap tell you?
- a. The dataset is wrong and should not be used.
- b. EIA's value is wrong.
- c. The dataset's percentages are shares of SPP's highest 2025 hour, not of capacity, and SPP's fleet and wind differ from the U.S. average; these data alone cannot split the gap between those causes.
- d. Wind in 2025 was unusually strong everywhere.
Your validation statement Part C · Validate and submit
Name the benchmark and its date, read the gap, and say which of your results survive a rescaling of wind to EIA's 33.8% and which do not.
Self-rated against 3 points, shown after you submit.
With JavaScript on, this page gives you the eleven tasks of your variant one at a time, checks each number you enter, keeps your times in this browser, and keeps the worked solutions shut until all eleven tasks are answered.
The water brief and the supplied model's costs are illustrative. The dataset and the supplied model's three days are real 2025 Southwest Power Pool shapes (EIA-930) scaled to Prairie Town; the benchmark is EIA's 2025 wind capacity factor (Electric Power Monthly, Table 6.07.B). Draws on M1, M3, B3 and R5. Nothing you type leaves this browser unless you copy it.
Worked solutions
Opens once all eleven tasks are answered. The checkpoint asks for your own formulation, analysis and checks first, so the worked solutions wait for them. Opening them now makes this attempt practice, with no level.
Model variant: the water tower as a linear program
Sets and inputs. Hours \(t = 0, \dots, 23\), each lasting \(\Delta t = 1\) h. Water use \(w_t\) (m³ in hour \(t\)); price \(\pi_t\) ($/kWh); \(k = 0.5\) kWh/m³; pump limit \(\bar Q = 900\) m³/h; tower limits \(\underline S = 800\) and \(\bar S = 4{,}000\) m³; start \(S_0 = 2{,}000\) m³; demand charge \(c = \$0.40\)/kW.
Decisions. Water pumped \(q_t\) (m³ in hour \(t\)), the tower’s level at the end of each hour \(s_t\) (m³), and the day’s highest draw \(P\) (kW).
\[\min \; \sum_t \pi_t\, k\, q_t \;+\; c\,P\]
\[s_t = s_{t-1} + q_t - w_t \;\;(s_{-1} = S_0), \qquad \underline S \le s_t \le \bar S,\]
\[0 \le q_t \le \bar Q\,\Delta t, \qquad P_t = k\,q_t / \Delta t \le P, \qquad s_{23} \ge S_0, \qquad P \ge 0 .\]
Units. \(\pi_t k q_t\) is $/kWh × kWh/m³ × m³ = $; \(cP\) is $/kW × kW = $. The hour’s draw \(P_t\) is its energy \(k q_t\) (kWh) divided by \(\Delta t = 1\) h, in kW; with \(\Delta t = 1\) h the code’s coefficients are the same numbers. The model has 49 variables, 24 tower rows, 24 draw rows and one end-of-day row. \(P\) plays the part of a built capacity in M3: one number every hour must stay under, paid once.
| Result | Value |
|---|---|
| Least cost of the day | $526.90 = $424.90 energy + $102.00 demand charge |
| Highest draw | 255 kW (510 m³ an hour) |
| Pumped at the peak price, 16:00 to 21:00 | 330 m³ |
| Saving from a tower 100 m³ larger | $6.83 a day |
| Lower bound by hand | $375.67 |
| Upper bound by hand (pump as you go) | $731.80 |
| Special case: no demand charge, no limits | $294.00 = 4,900 kWh × $0.06 |
- Highest draw: never more than 255 kW (510 m³ an hour), well under the pumps' 900.
- The schedule: it fills the tower at night and by day, and stops for most of the peak-price evening.
- Peak-price pumping: every least-cost schedule pumps exactly 330 m³ at the peak price, so the tower can end the day at 2,000 m³.
- Forbidding it costs more: $528.00, because the highest draw must rise to 310 kW.
- Validation: $526.90 lies between the hand bounds, $375.67 and $731.80, and the special case is matched exactly.
- What that cannot show: the checks show the model is plausible; that its schedule is the cheapest rests on the formulation and the solver.
- Not unique: other schedules cost exactly the same (the tower level at 17:00 can be anywhere from 3,530 to 3,860 m³), so compare costs, not schedules.
One least-cost schedule, hour by hour
| Hour | Use (m³) | Pumped (m³) | Tower at the end (m³) | Price ($/kWh) |
|---|---|---|---|---|
| 00:00 | 180 | 510 | 2,330 | 0.06 |
| 01:00 | 160 | 510 | 2,680 | 0.06 |
| 02:00 | 150 | 510 | 3,040 | 0.06 |
| 03:00 | 150 | 510 | 3,400 | 0.06 |
| 04:00 | 170 | 510 | 3,740 | 0.06 |
| 05:00 | 250 | 510 | 4,000 | 0.06 |
| 06:00 | 420 | 290 | 3,870 | 0.10 |
| 07:00 | 610 | 510 | 3,770 | 0.10 |
| 08:00 | 640 | 510 | 3,640 | 0.10 |
| 09:00 | 560 | 510 | 3,590 | 0.10 |
| 10:00 | 480 | 510 | 3,620 | 0.10 |
| 11:00 | 450 | 510 | 3,680 | 0.10 |
| 12:00 | 440 | 510 | 3,750 | 0.10 |
| 13:00 | 430 | 510 | 3,830 | 0.10 |
| 14:00 | 420 | 510 | 3,920 | 0.10 |
| 15:00 | 430 | 510 | 4,000 | 0.10 |
| 16:00 | 470 | 0 | 3,530 | 0.20 |
| 17:00 | 560 | 0 | 2,970 | 0.20 |
| 18:00 | 640 | 0 | 2,330 | 0.20 |
| 19:00 | 650 | 0 | 1,680 | 0.20 |
| 20:00 | 560 | 330 | 1,450 | 0.20 |
| 21:00 | 430 | 510 | 1,530 | 0.10 |
| 22:00 | 320 | 510 | 1,720 | 0.06 |
| 23:00 | 230 | 510 | 2,000 | 0.06 |
Empirical variant: the analysis and its benchmark
- Design first: a descriptive screen; metrics in % of each farm's size and in MW; 100% means SPP's highest 2025 hour, so the year's mean is not a capacity factor; the top hours sorted from the highest, the earlier hour first on ties.
- Load and check: 8,760 hours, no gaps; demand peaks at 450 MW and totals 2,469 GWh; wind and solar never above their sizes; the time index is hour-ending, from the file's
start_utc. - Compute: averages over the year and over the two sets of 100 hours.
| Hours | Wind (% of 150 MW) | Solar (% of 200 MW) | Both (MW) |
|---|---|---|---|
| The whole year | 52.8% | 23.4% | 126.0 |
| 100 highest demand | 58.1% | 69.0% | 225.1 |
| 100 highest net load | 29.6% | 4.3% | 52.9 |
- At the demand peaks (summer afternoons): both farms give more than their year averages.
- At the net-load peaks (evenings, winter nights and mornings): wind gives 0.56 of its average, and solar almost nothing. These are the hours the rest of the fleet must cover.
- Against the benchmark: the dataset's wind mean, 52.8% of its highest hour, is 19.0 percentage points above EIA's 2025 U.S. capacity factor of 33.8%; solar's 23.4% is close to EIA's 24.0%.
- What the gap shows: a definition difference (shares of the highest hour, not of capacity), plus SPP's own fleet and wind. These data cannot split the two, so the comparison checks a definition; it does not validate the numbers.
- Like for like, SPP's 2025 wind output (110.7 TWh, EIA-930) over its wind capacity as EIA counts it (33,385 MW, EIA-860M) is 37.9%: 4.1 points above the U.S. fleet's 33.8%. The definition explains 14.9 of the 19.0 points.
- What survives, for the same hours: rescaled linearly to 33.8% (each hour × 0.338 ÷ 0.5275), wind's MW and percentages fall by one factor, so its ratio to its own average in these 100 net-load hours stays 0.56.
- If the hours are picked again after rescaling, less wind raises net load in windy hours: 82 of the 100 hours stay, and the ratio becomes 0.71. Both are valid; say which you did.
- What it leaves out: one weather year, outages, imports and an adequacy model; averages over top hours screen, they do not measure a capacity credit.
Part B: the defect explained
- Symptom: a gas peaker only, demand left unserved, and a year that holds 6,757 MWh of demand: about one day of the town's.
- Root cause, line 2:
weight = DAYS[d] / 365turns the days each representative day stands for into shares of the year. The paper says the weight is the number of days. With shares, the running costs of one average day meet a whole year of capital costs, so fuel looks almost free and capital-light plants win. - The check that shows it: the year's total against an independent reference: the model's demand in the year, 6,757 MWh, against the town's 2,466 GWh. Units say the same: capital in $ a year, running costs in $ a day.
- The fix:
weight = DAYS(121, 122, 122 days). Solve again.
| Report line | Supplied (defect) | Fixed |
|---|---|---|
| Built: Wind farm | 0.0 MW | 548.4 MW |
| Built: Solar farm | 0.0 MW | 210.7 MW |
| Built: Gas combined-cycle | 0.0 MW | 151.9 MW |
| Built: Gas peaker | 308.7 MW | 54.3 MW |
| Annual cost | $18.1 million | $106.8 million |
| Demand in the year | 6,757 MWh | 2,466,275 MWh |
| Demand left unserved in the year | 203 MWh | 0 MWh |
| Cost per MWh of demand | $2,682.20 | $43.31 |
The fixed plan is the answer to the model as written, not a recommendation: its costs are illustrative, and three typical days keep no extreme day, so the plan meets the peaks of those days, not the year's (M3 keeps the extremes).
Rubric
Your work, criterion by criterion
| Criterion | Not yet | Developing | Proficient | Strong |
|---|---|---|---|---|
| Formulation or design | No formulation, or rules in words only. | Rules written, but units missing or one rule (the tower's link between hours, the highest draw, the end of day; or the scaling and the tie rule) left out. | Every set, input and decision with its unit; every rule of the brief written once, linearly; the design stated before computing. | Also says what the model or analysis leaves out and why that does not change the answer to the brief. |
| Results | The model or analysis does not run. | It runs, but a key number is off by more than the tolerance. | The key numbers within tolerance, each read from your own run. | Also a marginal value (or a ratio) explained in words, with the rule or hours behind it. |
| The defect | Not found. | Found by trial, without a check that shows it. | The line, the check that shows it, the fix and the fixed number. | Also why the symptom looked the way it did (a cheap-capital plan, a year the size of a day). |
| Validation | None. | A comparison without a stated reference. | One result against an independent reference, with the outcome stated. | Also what the check cannot show, and which results depend on it. |
The checkpoint's level
- Proficient: at least 6 of the 9 auto-marked tasks right on the first try, including the defect's line (task 6); at least 3 of the 4 points of your formulation or design and 2 of the 3 points of your validation statement.
- Strong: at least 8 of 9 on the first try, the defect's line on the first try, and every point of both written tasks.
- Developing: at least 4 of 9 on the first try.
- Not yet: anything else. The checkpoint shows readiness to start the Researcher tier; it certifies nothing.
- Solutions opened early: a task whose worked solution you open before answering counts as not right on the first try. If the worked solutions above open before all eleven tasks are answered (early, by an earlier attempt, or in the other variant), the attempt is practice and gets no level.
- Answered late: an answer given after the worked solutions opened counts as practice, not as right; a written task submitted after it earns no points.
The written tasks are self-rated against their points. A teacher or mentor can rate them again with the table above, from the copied summary, which includes what you typed.
| Competence | Developing | Proficient (the bar) | Strong |
|---|---|---|---|
| Trustworthy analysis Look for: Your notebook reruns from top to bottom; your validation names its reference and its outcome; your defect report names the line, the check, the fix and the fixed number. |
Results cannot be rerun. | Reruns from a clean clone (or a complete audit trail); verification log; one validation against real data or an independent reference. | Independent reproduction by someone else; validation on data not used to build the analysis. |
Numbers, sources and what’s next
Numbers used in the tasks
| Number | What it means | Source |
|---|---|---|
| 2025 hourly shapes | Demand, wind and solar of the Southwest Power Pool grid: the empirical variant's dataset and the supplied model's three days. | EIA-930 · accessed 2 Nov 2026 |
| 33.8% and 24.0% | Capacity factors of the U.S. utility-scale wind and solar fleets in 2025: the empirical benchmark, and the supplied model's scaling. | EIA, Electric Power Monthly, Table 6.07.B · 2025 annual values, accessed 2 Nov 2026 |
| 37.9% | SPP's 2025 wind capacity factor, like for like: 110.7 TWh of output (EIA-930) over 33,385 MW of wind capacity as EIA counts it (time-adjusted net summer capacity). | EIA-860M · December 2025 inventory, accessed 5 Nov 2026 |
| Water brief, costs | Water use, pump and tower sizes, energy per m³, tariff and demand charge; the supplied model's costs. | Illustrative |
Keep going
Sources and further reading
- EIA. Hourly Electric Grid Monitor (Form EIA-930): the Southwest Power Pool data behind the dataset and the three representative days.
- EIA. Electric Power Monthly, Table 6.07.B: capacity factors for utility-scale generators.
- EIA. Preliminary Monthly Electric Generator Inventory (Form EIA-860M), December 2025: SPP's operating wind units, for the like-for-like check.
- HiGHS. Documentation of the open-source solver used on this page and, through SciPy, in the notebooks.
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.