Run the full three-year dispatch and fix issues it surfaced
CI / test (push) Successful in 14s

Executed battery-dispatch run over the full 2018-2020 Attachment 2
series (225.9s, 1096 rolling-horizon windows) and committed the
results: outputs/ (dispatch.csv, annual/monthly summaries, summary.json,
four figures), README.md (setup, run instructions, assumptions, the
one-paragraph approach summary) and RESULTS.md (headline numbers,
per-year table, charts, commentary).

The full run surfaced three real issues, all fixed rather than papered
over:

- validate_schedule's soc_within_bounds check used a fixed 1e-6 MWh
  tolerance for the "state of charge below zero" case, while its
  sibling soc_matches_power_flows check already scales its tolerance
  with sqrt(n) for the same reason (CBC's own solver precision
  accumulating over a long cumulative sum). Over 52,608 half-hours this
  false-failed on a 5.1e-6 MWh solver-noise dip, not a real violation.
  Scaled it the same way.
- cli.py's summary printed net_of_opex_gbp under the label "Less fixed
  opex", so the terminal output showed the post-opex profit (£193k)
  where a reader would expect the opex figure itself (£15k). Split into
  two correctly-labelled lines.
- plots.py's monthly revenue chart stacked Market 1 (always negative
  here) and Market 2 (always positive) with a single running `bottom`,
  which is only correct for same-signed series: Market 2's bar
  completely overlapped and painted over Market 1's, hiding the
  -£297k Market 1 loss entirely. Now accumulates positive and negative
  contributions on separate baselines and marks the net.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-24 16:29:40 +01:00
co-authored by Claude Sonnet 5
parent afa02864a7
commit c70c9731a6
13 changed files with 52976 additions and 9 deletions
+4
View File
@@ -0,0 +1,4 @@
year,gross_profit_gbp,profit_market_1_gbp,profit_market_2_gbp,charged_mwh,discharged_mwh,equivalent_full_cycles,captured_spread_gbp_per_mwh
2018,67799.45428,-115113.361429,182912.815709,4096.144098,3696.77005,972.834224,18.340187
2019,64299.710798,-103884.584974,168184.295772,4944.211906,4459.443748,1173.537828,14.418774
2020,76331.687725,-78420.110711,154751.798435,5561.815889,5022.246341,1321.643774,15.198714
1 year gross_profit_gbp profit_market_1_gbp profit_market_2_gbp charged_mwh discharged_mwh equivalent_full_cycles captured_spread_gbp_per_mwh
2 2018 67799.45428 -115113.361429 182912.815709 4096.144098 3696.77005 972.834224 18.340187
3 2019 64299.710798 -103884.584974 168184.295772 4944.211906 4459.443748 1173.537828 14.418774
4 2020 76331.687725 -78420.110711 154751.798435 5561.815889 5022.246341 1321.643774 15.198714