Skip to content

Commit 04b86f7

Browse files
authored
Merge pull request #1125 from EnergySystemsModellingLab/update-npv-docs
update appraisal documentation
2 parents 50f31d2 + c5d5234 commit 04b86f7

File tree

1 file changed

+239
-38
lines changed

1 file changed

+239
-38
lines changed

docs/model/investment.md

Lines changed: 239 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@ investments.
4141
- \\( \text{FOM}_{opt,r} \\): Annual fixed Operations & Maintenance costs per unit of capacity for
4242
\\( opt \\) in \\( r \\).
4343

44-
- \\( FinancingInDecomDec_{ex} \\) (binary flag). This user-defined option specifies whether to
45-
include estimated financing costs in the economic viability threshold when considering the
46-
decommissioning of an existing asset. This can only be used on profit-evaluable assets. Used
47-
with \\( PercentDebt_{ex} \\). Where financing costs are included, the percentage debt is
48-
multiplied by the original capex, and the result is annualised.
49-
5044
- For new candidate assets:
5145

5246
- \\( \text{CAPEX}_{ca,r} \\): Upfront capital expenditure required per unit of new capacity for
@@ -69,33 +63,48 @@ providing investment and dynamic decommissioning decisions.
6963

7064
### Pre-calculation of metrics for each supply option
7165

72-
> Note: This section contains a reference to "scopes", a feature that is not yet implemented
73-
7466
- Annualised fixed costs per unit of capacity (\\( AFC_{opt,r} \\)): For new candidates, this is
7567
their annualised CAPEX plus FOM. For existing assets, the relevant fixed cost is its FOM.
7668

77-
- Costs per unit of activity in each time slice, calculated as follows:
69+
- Calculate the specific process and commodity flow costs (\\(\text{SPCF}\_{t})\\):
70+
71+
\\[
72+
\text{SPCF}\_{t} = \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c] +
73+
cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big)
74+
\\]
75+
76+
#### Coefficients of activity
77+
78+
- Calculate net revenue per unit of activity \\(AC\_{t}^{NPV} \\) (Tool A):
79+
\\[
80+
\begin{aligned}
81+
AC\_{t}^{NPV} = &-cost\_{\text{var}}[t] \\\\
82+
&- \text{SPCF}\_{t} \\\\
83+
&+ \sum\_{c} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c] \Big)
84+
\cdot \lambda\_{c,r,t} \\\\
85+
&+ \varepsilon \\\\
86+
\end{aligned}
87+
\\]
88+
\\(\varepsilon \approx 1\times 10^{-14}\\) is added to
89+
each \\(AC\_{t}^{NPV} \\) to allow assets which are breakeven (or very close to breakeven) to be
90+
dispatched.
7891

92+
- Calculate cost per unit of activity \\( AC\_{t}^{LCOX} \\) (Tool B). Note that the commodity
93+
of interest (primary output \\( c\_{primary} \\)) is excluded from the price term:
7994
\\[
8095
\begin{aligned}
81-
AC_t = & \quad cost\_{\text{var}}[t] \\\\
82-
&+ \sum\_{c} \Big( cost\_{\text{input}}[c] \cdot input\_{\text{coeff}}[c]
83-
+ cost\_{\text{output}}[c] \cdot output\_{\text{coeff}}[c] \Big) \\\\
84-
&+ \sum\_{c} \Big( input\_{\text{coeff}}[c] - output\_{\text{coeff}}[c] \Big)
96+
AC\_{t}^{LCOX} = & \quad cost\_{\text{var}}[t] \\\\
97+
&+ \text{SPCF}\_{t} \\\\
98+
&- \sum\_{c \neq c\_{primary}} \Big( output\_{\text{coeff}}[c] - input\_{\text{coeff}}
99+
[c] \Big)
85100
\cdot \lambda\_{c,r,t} \\\\
86-
&+ \sum\_{s,c} in\\_scope[s] \cdot \Big\\{ \\\\
87-
&\quad \quad (cost\_{\text{prod}}[s,c] - \mu\_{s,c}^{\text{prod}})
88-
\cdot output\_{\text{coeff}}[c] \\\\
89-
&\quad \quad + (cost\_{\text{cons}}[s,c] - \mu\_{s,c}^{\text{cons}})
90-
\cdot input\_{\text{coeff}}[c] \\\\
91-
&\quad \quad + (cost\_{\text{net}}[s,c] - \mu\_{s,c}^{\text{net}})
92-
\cdot (output\_{\text{coeff}}[c] - input\_{\text{coeff}}[c]) \\\\
93-
&\Big\\}
94101
\end{aligned}
95102
\\]
96103

97-
When using the LCOX objective, the calculation is adjusted to exclude the commodity of interest
98-
(\\( \lambda\_{c,r,t} \\) are set to zero).
104+
- The third term in both activity coefficients accounts for commodity price flow costs, which are
105+
the net costs or revenues associated with the commodity flows. In the LCOX case the commodity of
106+
interest is excluded from this term because the cost of production shouldn't depend on the market
107+
price of the commodity being produced.
99108

100109
### Initialise demand profiles for commodity of interest
101110

@@ -130,20 +139,19 @@ providing investment and dynamic decommissioning decisions.
130139

131140
#### Tool A: NPV
132141

133-
This method is used when decision rule is single objective and objective is annualised profit for
134-
agents' serving commodity \\( c \\). This method iteratively builds a supply portfolio by selecting
142+
This method is used when the decision rule is `single` and the objective is annualised profit for
143+
agents serving commodity \\( c \\). It iteratively builds a supply portfolio by selecting
135144
options that offer the highest annualised profit for serving the current commodity demand. The
136145
economic evaluation uses \\( \pi_{prevMSY} \\) prices and takes account of asset-specific
137146
operational constraints (e.g., minimum load levels) and the balance level of the target commodity
138147
(time slice profile, seasonal or annual). For each asset option:
139148

140149
- **Optimise capacity and dispatch to maximise annualised profit:** Solve a small optimisation
141150
sub-problem to maximise the asset's surplus, subject to its operational rules and the specific
142-
demand tranche it is being asked to serve. \\(\varepsilon \approx 1×10^{-14}\\) is added to each
143-
\\(AC_t \\) to allow assets which are breakeven (or very close to breakeven) to be dispatched.
151+
demand tranche it is being asked to serve.
144152

145153
\\[
146-
maximise \Big\\{ - \sum_t act_t \* (AC_t + \varepsilon)
154+
maximise \Big\\{\sum_t act_t AC\_{t}^{NPV}
147155
\Big\\}
148156
\\]
149157

@@ -155,12 +163,25 @@ operational constraints (e.g., minimum load levels) and the balance level of the
155163
- A demand constraint, where output cannot exceed demand in the tranche, which adapts based on the
156164
commodity's balance level (time slice, season, annual).
157165

158-
- Capacity is constrained to \\( CapMaxBuild \\) for candidates, and to known capacity for
166+
- Capacity is constrained up to \\( CapMaxBuild \\) for candidates, and to known capacity for
159167
existing assets.
160168

161-
- **Calculate a profitability index:** This is the total annualised surplus (\\( - \sum_t
162-
act_t \* AC \\)) divided by the annualised fixed cost (\\(
163-
AFC \* cap \\)).
169+
- **Decide on metric:** The type of metric used to compare profitability is dependent on the value of
170+
\\(\text{AFC}\\). If \\(\text{AFC} = 0\\) within the tolerance provided by the `float_cmp` crate,
171+
the associated investment option is always prioritised over options with \\(\text{AFC} > 0\\).
172+
173+
- **If \\(\text{AFC} > 0\\), Use the profitability index \\(\text{PI}\\) metric:** This is the total
174+
annualised surplus divided by the annualised fixed cost.
175+
\\[
176+
\text{PI} =
177+
\frac{\sum\_t act\_t \cdot \text{AC}\_t^{\text{NPV}}}{\text{AFC} \cdot \text{cap}}
178+
\\]
179+
180+
- **If \\(\text{AFC} = 0\\), Use the total annualised surplus metric \\(\text{TAS}\\):**
181+
\\[
182+
\text{TAS} =
183+
\sum\_t act\_t \cdot \text{AC}\_t^{\text{NPV}}
184+
\\]
164185

165186
#### Tool B: LCOX
166187

@@ -175,12 +196,12 @@ commodities are set to zero, and the commodity of interest is assumed to have ze
175196
For each asset option:
176197

177198
- **Optimise capacity and dispatch to minimise annualised cost:** Solve a small optimisation
178-
sub-problem to maximise the asset's surplus, subject to its operational rules and the specific
199+
sub-problem to minimise the asset's annualised cost, subject to its operational rules and the specific
179200
demand tranche it is being asked to serve.
180201

181202
\\[
182203
minimise \Big\\{
183-
AF \* cap + \sum_t act_t \* AC_t + VoLL \* UnmetD_t
204+
\text{AFC} \times cap + \sum\_t act\_t \times AC\_{t}^{LCOX} + VoLL \times UnmetD\_t
184205
\Big\\}
185206
\\]
186207

@@ -193,15 +214,195 @@ For each asset option:
193214
each timeslice of the tranche, which adapts based on the commodity's balance level (time slice,
194215
season, annual).
195216

196-
- Capacity is constrained to \\( CapMaxBuild \\) for candidates, and to known capacity for
217+
- Capacity is constrained up to \\( CapMaxBuild \\) for candidates, and to known capacity for
197218
existing assets.
198219

199220
- VoLL variables are active to ensure a feasible solution alongside maximum operation of the
200221
asset.
201222

202-
- **Calculate a cost index:** This is the total annualised cost (\\(
203-
AFC \* cap_r + \sum_{t} act_t \* AC_t \\)), divided by the annual output
204-
\\( \sum_t act_t \\).
223+
- **Calculate a Cost Index Metric:** This is the total annualised cost divided by the annual output.
224+
\\[
225+
\text{Cost Index} = \frac{\text{AFC} \times \text{cap}_r + \sum_t act_t
226+
\times \text{AC}_t^{\text{LCOX}}}{\sum_t act_t}
227+
\\]
228+
229+
#### Equal-Metric Fallback
230+
231+
If two or more investment options from the same tool have equal metrics, the following tie-breaking
232+
rules are applied in order:
233+
234+
1. Assets which are already commissioned are preferred over new candidate assets.
235+
2. Newer (commissioned later) assets are preferred over older assets.
236+
3. If there is still a tie, the first option in the data structure storing the metrics is selected,
237+
which is an arbitrary choice. A `debug` level log message is emitted in this case.
238+
239+
## Example: Gas Power Plant
240+
241+
The following is an illustrative example of how the NPV and LCOX approaches work, using a simple
242+
gas combined-cycle power plant as the supply option under consideration.
243+
This example demonstrates the evaluation across two time periods
244+
\\(t\_0\\) (peak period) and \\(t\_1\\) (off-peak period) with variable operating costs
245+
\\( cost\_{var}[t] \\) constant in all time periods.
246+
247+
### Model Parameters
248+
249+
#### Asset Parameters
250+
<!-- markdownlint-disable MD013 -->
251+
| Parameter | Notation | Value | Description |
252+
|--------------------------------|--------------------------------------|---------------------------|-----------------------------------|
253+
| Primary output (Electricity) | \\( output\_{coeff}[c_{primary}] \\) | 1.0 MWh per unit activity | Main commodity produced |
254+
| By-product output (Waste heat) | \\( output\_{coeff}[c_{heat}] \\) | 0.5 MWh per unit activity | Co-product from generation |
255+
| Input (Natural gas) | \\( input\_{coeff}[c_{gas}] \\) | 2.5 MWh per unit activity | Fuel consumption |
256+
| Variable operating cost | \\( cost\_{var}[t] \\) | £5/MWh of activity | Operating costs per unit activity |
257+
<!-- markdownlint-enable MD013 -->
258+
259+
All per-flow costs represented in the general formulas as \\( cost\_{input} \\) and
260+
\\( cost\_{output} \\) are assumed to be zero.
261+
262+
#### Investment Parameters
263+
264+
| Parameter | Notation | Value |
265+
|-----------------------|----------------------|-----------|
266+
| Annualised fixed cost | \\( AFC\_{opt,r} \\) | £1,000/MW |
267+
| Capacity | \\( cap \\) | 100 MW |
268+
269+
#### Market Prices by Time Period
270+
271+
| Commodity | Notation | \\(t_0\\) (Peak) | \\(t_1\\) (Off-peak) |
272+
|-------------|-------------------------------------|------------------|----------------------|
273+
| Electricity | \\( \lambda\_{c\_{primary},r,t} \\) | £90/MWh | £50/MWh |
274+
| Heat | \\( \lambda\_{c\_{heat},r,t} \\) | £25/MWh | £15/MWh |
275+
| Natural gas | \\( \lambda\_{c\_{gas},r,t} \\) | £35/MWh | £25/MWh |
276+
277+
### NPV Approach (Tool A)
278+
279+
#### Calculate Net Revenue per Unit of Activity
280+
281+
**For \\(t\_0\\) (peak period):**
282+
283+
\\[
284+
\begin{aligned}
285+
AC_{t_{0}}^{NPV} &= (1.0 \times 90) + (0.5 \times 25) + (-2.5 \times 35) - 5 \\\\
286+
&= 90 + 12.5 - 87.5 - 5 \\\\
287+
&= \text{£10/MWh}
288+
\end{aligned}
289+
\\]
290+
291+
The asset earns £10 profit for every MWh it operates during peak periods.
292+
293+
**For \\(t\_1\\) (off-peak period):**
294+
295+
\\[
296+
\begin{aligned}
297+
AC_{t\_1}^{NPV} &= (1.0 \times 50) + (0.5 \times 15) + (-2.5 \times 25) - 5 \\\\
298+
&= 50 + 7.5 - 62.5 - 5 \\\\
299+
&= \text{£} -10 \text{/MWh}
300+
\end{aligned}
301+
\\]
302+
303+
The asset loses £10 for every MWh it operates during off-peak periods.
304+
305+
#### Dispatch Optimisation
306+
307+
The optimisation maximises total net revenue across all time periods:
308+
309+
\\[
310+
\max \sum\_t act\_t \cdot AC\_t^{NPV} = act\_{t_{0}} \cdot 10 + act\_{t\_1} \cdot (-10)
311+
\\]
312+
313+
where \\( act\_t \\) is the activity (operational level) in each time slice, subject to operational
314+
constraints and demand requirements.
315+
316+
In this case, the optimiser will prefer to dispatch the asset during \\(t\_0\\) (profitable) and
317+
minimise operation during \\(t\_1\\) (unprofitable), subject to technical constraints such as minimum
318+
load requirements.
319+
320+
#### Profitability Index
321+
322+
The profitability index is calculated as:
323+
324+
\\[
325+
\text{PI} = \frac{\sum\_t act\_t \cdot AC\_t^{NPV}}{AFC \times cap}
326+
\\]
327+
328+
Suppose the dispatch optimiser determines \\( act\_{t\_{0}} = 80 \\) MWh and \\( act\_{t\_1} = 20 \\)
329+
MWh are the optimal activity levels:
330+
331+
\\[
332+
\begin{aligned}
333+
\text{PI} &= \frac{(80 \times 10) + (20 \times (-10))}{1{,}000 \times 100} \\\\
334+
&= \frac{800 - 200}{100{,}000} \\\\
335+
&= \frac{600}{100{,}000} \\\\
336+
&= 0.006
337+
\end{aligned}
338+
\\]
339+
340+
The profitability index is then compared against all other options to determine which asset provides
341+
the best return on investment for serving the demand.
342+
343+
### LCOX Approach (Tool B)
344+
345+
#### Net Cost per Unit of Activity
346+
347+
**For \\(t\_0\\) (peak period):**
348+
349+
\\[
350+
\begin{aligned}
351+
AC\_{t\_{0}}^{LCOX} &= 5 + (2.5 \times 35) - (0.5 \times 25) \\\\
352+
&= 5 + 87.5 - 12.5 \\\\
353+
&= \text{£80/MWh}
354+
\end{aligned}
355+
\\]
356+
357+
It costs £80 per MWh to operate during peak periods (net of heat by-product sales).
358+
359+
**For \\(t_1\\) (off-peak period):**
360+
361+
\\[
362+
\begin{aligned}
363+
AC\_{t\_1}^{LCOX} &= 5 + (2.5 \times 25) - (0.5 \times 15) \\\\
364+
&= 5 + 62.5 - 7.5 \\\\
365+
&= \text{£60/MWh}
366+
\end{aligned}
367+
\\]
368+
369+
It costs £60 per MWh to operate during off-peak periods, reflecting lower gas prices
370+
and lower heat by-product value.
371+
372+
#### Capacity and Dispatch Optimisation
373+
374+
The optimiser determines the most cost-effective capacity and dispatch pattern to meet demand across
375+
both time periods by minimising the total annualised cost with respect to decision variables
376+
\\( cap \\) and \\( act\_t \\):
377+
378+
\\[
379+
AFC \cdot cap + \sum\_t act\_t \cdot AC\_t^{LCOX} = 1{,}000 \cdot cap + act\_{t\_{0}}
380+
\cdot 80 + act\_{t\_1} \cdot 60
381+
\\]
382+
383+
#### Cost Index (Levelised Cost of X)
384+
385+
The Cost Index is calculated as:
386+
387+
\\[
388+
\text{Cost Index} = \frac{AFC \cdot cap + \sum\_t act\_t \cdot AC\_t^{LCOX}}{\sum\_t act\_t}
389+
\\]
390+
391+
Suppose the optimiser determines \\( cap = 100 \\) MW, \\( act\_{t\_{0}} = 150 \\) MWh,
392+
and \\( act\_{t\_1} = 80 \\) MWh are the optimal capacity and activity levels:
393+
394+
\\[
395+
\begin{aligned}
396+
\text{Cost Index} &= \frac{(1{,}000 \times 100) + (150 \times 80) + (80 \times 60)}{150 + 80} \\\\
397+
&= \frac{100{,}000 + 12{,}000 + 4{,}800}{230} \\\\
398+
&= \frac{116{,}800}{230} \\\\
399+
&= \text{£508/MWh}
400+
\end{aligned}
401+
\\]
402+
403+
The Cost Index is £508 per MWh of electricity produced.
404+
This metric is compared across all supply options to identify
405+
the lowest-cost solution for meeting demand.
205406

206407
[framework-overview]: https://energysystemsmodellinglab.github.io/MUSE2/model/index.html#framework-overview
207408
[Dispatch Optimisation Formulation]: ./dispatch_optimisation.md

0 commit comments

Comments
 (0)