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

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

The Modeler checkpoint (CK-M) of Energy Systems, Step by Step: about four hours on problems the course has not shown. Formulate and solve a water utility’s pumping schedule as a linear program, or analyse a real year of grid data; find the planted defect in a supplied capacity-expansion model; validate one result against hand calculations or a published benchmark. Worked formulations and code open when you submit. Answers and times stay in your browser.
  1. Learn
  2. CK-M
  • Modeler · L3
  • Checkpoint
  • 240 min
  • After M1 and M3 and B3 and R5
  • Completed
  1. 1Task
  2. 2Worked solution
  3. 3Rubric
  4. 4Sources

How this checkpoint works · about 240 minutes, no hints

  1. 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.
  2. 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.
  3. C · Validation (about 45 min). Check one of your results against an independent reference: hand calculations (model) or a published figure (empirical).
  4. 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 meta block 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)

  1. DAYS = {"winter": 121, "shoulder": 122, "summer": 122} # days of 2025 each day stands for
  2. weight = {d: DAYS[d] / 365 for d in DAYS} # share of the year
  3. cost = {"wind": 0, "solar": 0, "cc": 40, "pk": 100} # running cost, $ per MWh
  4. capital = {"wind": 100_000, "solar": 70_000, "cc": 80_000, "pk": 50_000} # $ per MW-year, annualized
  5. V = 10_000 # $ per MWh of demand left unserved
  6. 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) )
  7. for d, t: sum(p[g,d,t] for g) + u[d,t] == demand[d][t] # balance, MW
  8. for g in ("wind", "solar"), d, t: p[g,d,t] <= avail[g][d][t] * K[g] # output per MW built
  9. for g in ("cc", "pk"), d, t: p[g,d,t] <= K[g]
  10. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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
  7. 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
  8. 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.

  9. 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.

  10. 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.

  11. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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
  7. 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
  8. 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.

  9. 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.

  10. 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.
  11. 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

Worked code: model variant (.ipynb)

Empirical variant: the analysis and its benchmark

  1. 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.
  2. 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.
  3. 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.

Worked code: empirical variant (.ipynb)

Part B: the defect explained

  1. 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.
  2. Root cause, line 2: weight = DAYS[d] / 365 turns 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.
  3. 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.
  4. 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).

Worked code: the defect and the fix (.ipynb)

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

Back to the course map

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.

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

 

Last updated: November 2026 · Built with Quarto