This is the Curves module for learning curves.
| Description | Unit | |
|---|---|---|
| VmCostLC (LCTECH, YTIME) |
Learning curve cost multiplier | \(1\) |
This is the LearningCurves realization of the Curves module.
NOTE: LCTECH is equivalent to the existing PGRENSW set but is defined here for clarity within the Learning Curves module.
sets
LCTECH(PGALL) "Technologies with learning curves - subset of PGALL"
/
PGSOL "Solar PV"
PGCSP "Concentrated Solar Power"
PGAWND "Wind onshore"
PGAWNO "Wind offshore"
/
LCSOL(LCTECH) "Solar technologies subset"
/
PGSOL
PGCSP
/
LCWND(LCTECH) "Wind technologies subset"
/
PGAWND
PGAWNO
/
;
Equations
Q10CostLC(LCTECH,YTIME) "Learning curve cost multiplier calculation"
Q10CumCapGlobal(LCTECH,YTIME) "Global cumulative capacity calculation"
;
Variables
VmCostLC(LCTECH,YTIME) "Learning curve cost multiplier (1)"
V10CumCapGlobal(LCTECH,YTIME) "Global cumulative capacity (GW)"
;
GENERAL INFORMATION * Learning Curves module This equation implements the learning curve for wind and solar technologies with stopping mechanism. The learning curve follows the equation: multiplier = (Cap_current / Cap_initial)^ε where ε is calculated from learning rate: ε = log(1-LR)/log(2)
STOPPING MECHANISM: Only a fraction of costs are subject to learning curves. - LearnableFraction: Technology-specific manufacturing costs that improve with experience - FixedFraction: Basic materials, labor, installation costs that remain constant - MinCostFraction: Absolute floor preventing unrealistic cost reductions
The cost multiplier applies only to the learnable portion of total costs. Final cost = [LearnableFraction × CostMultiplier + (1-LearnableFraction)] × InitialCost Learning curve cost multiplier equation with numerical safeguards Timing: Cost multiplier for YTIME based on capacity growth in previous period (YTIME-1 vs YTIME-2) This reflects that learning happens from past experience and affects current period costs Safeguards: Add small epsilon to denominator to avoid division by zero
Q10CostLC(LCTECH,YTIME)$(TIME(YTIME))..
VmCostLC(LCTECH,YTIME)
=E=
(V10CumCapGlobal(LCTECH,YTIME-1) / (V10CumCapGlobal(LCTECH,YTIME-2))) ** i10AlphaLC(LCTECH);
Global cumulative capacity tracking equation Tracks total cumulative capacity installations since base year Cumulative = Previous cumulative + New installations this period (converted MW to GW)
Q10CumCapGlobal(LCTECH,YTIME)$(TIME(YTIME))..
V10CumCapGlobal(LCTECH,YTIME)
=E=
V10CumCapGlobal(LCTECH,YTIME-1) +
sum(allCy$(runCy(allCy)), V04NewCapElec(allCy,LCTECH,YTIME));
This file contains input data for the Learning Curves module.
COST BREAKDOWN METHODOLOGY: Total cost is split into two components: 1. Learnable fraction: Subject to learning curve cost reductions (technology/manufacturing costs) 2. Fixed fraction: Not affected by learning (materials, labor, grid connection, etc.)
Formula: FinalCost = LearnableFraction × CostMultiplier × InitialCost + (1-LearnableFraction) × InitialCost Simplified: FinalCost = [LearnableFraction × CostMultiplier + (1-LearnableFraction)] × InitialCost
This prevents unrealistic cost reductions while maintaining learning benefits.
Parameters
i10AlphaLC(LCTECH) "Learning curve factor alpha for technology (1)"
i10LearningRate(LCTECH) "Learning rate for technology (1)"
i10InitCostRefLC(allCy,LCTECH,YTIME) "Initial cost reference for learning curves from PowerGeneration (kUS$2015/KW)"
i10LearnableFraction(LCTECH) "Fraction of cost subject to learning curve (1)"
i10MinCostFraction(LCTECH) "Minimum cost as fraction of initial cost (1)"
;
i10LearningRate("PGSOL") = 0.20; !! 20% cost reduction per doubling for Solar PV
i10LearningRate("PGCSP") = 0.20; !! 20% cost reduction per doubling for CSP
i10LearningRate("PGAWND") = 0.10; !! 10% cost reduction per doubling for Onshore Wind
i10LearningRate("PGAWNO") = 0.10; !! 10% cost reduction per doubling for Offshore Wind
Learnable fraction - what portion of total cost can be reduced by learning Typically manufacturing/technology costs (~60-80%) vs. fixed costs (materials, labor, grid connection)
i10LearnableFraction("PGSOL") = 0.75; !! 75% of solar PV costs subject to learning
i10LearnableFraction("PGCSP") = 0.75; !! 75% of CSP costs subject to learning
i10LearnableFraction("PGAWND") = 0.60; !! 60% of onshore wind costs subject to learning
i10LearnableFraction("PGAWNO") = 0.60; !! 60% of offshore wind costs subject to learning
Minimum cost floor - prevents unrealistic cost reductions Based on fundamental material and labor costs that cannot be reduced indefinitely
i10MinCostFraction("PGSOL") = 0.25; !! Solar PV cannot go below 25% of initial cost
i10MinCostFraction("PGCSP") = 0.25; !! CSP cannot go below 25% of initial cost
i10MinCostFraction("PGAWND") = 0.40; !! Onshore wind cannot go below 40% of initial cost
i10MinCostFraction("PGAWNO") = 0.40; !! Offshore wind cannot go below 40% of initial cost
Use the base year costs as the reference point for learning curves
i10InitCostRefLC(allCy,LCTECH,YTIME)$TFIRST(YTIME) = i04GrossCapCosSubRen(allCy,LCTECH,YTIME);
Calculate learning curve parameters from learning rates With C(t) = (Cap(t)/Cap(t-1))^ε and LR = 1 - 2^(-ε) Solving for ε: ε = -log(1-LR) / log(2) (negative for cost reduction)
i10AlphaLC(LCTECH) = -log(1 - i10LearningRate(LCTECH)) / log(2);
VARIABLE INITIALISATION Set bounds for cost multiplier with conservative values to avoid max() function Lower bound set to prevent excessive cost reductions while ensuring solver compatibility Using simple conservative bound instead of complex max() calculation Cost = (LearnableFraction * CostMultiplier + (1-LearnableFraction)) * InitialCost
VmCostLC.LO(LCTECH,YTIME) = 0.1; !! Conservative 10% minimum cost multiplier (90% max reduction)
VmCostLC.UP(LCTECH,YTIME) = 2.0; !! Allow some cost increase for numerical stability
Initialize cost multiplier to 1.0 for base year (no cost reduction initially)
VmCostLC.FX(LCTECH,"%fBaseY%") = 1.0;
Initialize cumulative capacity with historical data from base year only Sum installed capacity across all countries for learning curve technologies Keep units consistent: imInstCapPastNonCHP is in GW, V10CumCapGlobal should be in GW to match V04NewCapElec
V10CumCapGlobal.FX(LCTECH,"2010") = sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2010"));
V10CumCapGlobal.FX(LCTECH,"2011") = V10CumCapGlobal.L(LCTECH,"2010") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2011"));
V10CumCapGlobal.FX(LCTECH,"2012") = V10CumCapGlobal.L(LCTECH,"2011") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2012"));
V10CumCapGlobal.FX(LCTECH,"2013") = V10CumCapGlobal.L(LCTECH,"2012") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2013"));
V10CumCapGlobal.FX(LCTECH,"2014") = V10CumCapGlobal.L(LCTECH,"2013") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2014"));
V10CumCapGlobal.FX(LCTECH,"2015") = V10CumCapGlobal.L(LCTECH,"2014") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2015"));
V10CumCapGlobal.FX(LCTECH,"2016") = V10CumCapGlobal.L(LCTECH,"2015") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2016"));
V10CumCapGlobal.FX(LCTECH,"2017") = V10CumCapGlobal.L(LCTECH,"2016") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2017"));
V10CumCapGlobal.FX(LCTECH,"2018") = V10CumCapGlobal.L(LCTECH,"2017") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2018"));
V10CumCapGlobal.FX(LCTECH,"2019") = V10CumCapGlobal.L(LCTECH,"2018") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2019"));
V10CumCapGlobal.FX(LCTECH,"2020") = V10CumCapGlobal.L(LCTECH,"2019") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2020"));
V10CumCapGlobal.FX(LCTECH,"2021") = V10CumCapGlobal.L(LCTECH,"2020") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2021"));
V10CumCapGlobal.FX(LCTECH,"2022") = V10CumCapGlobal.L(LCTECH,"2021") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"2022"));
V10CumCapGlobal.FX(LCTECH,"%fBaseY%") = V10CumCapGlobal.L(LCTECH,"2022") + sum(allCy$(runCy(allCy)), imInstCapPastNonCHP(allCy,LCTECH,"%fBaseY%"));
Limitations There are no known limitations.
| Description | Unit | A | |
|---|---|---|---|
| i10AlphaLC (LCTECH) |
Learning curve factor alpha for technology | \(1\) | x |
| i10InitCostRefLC (allCy, LCTECH, YTIME) |
Initial cost reference for learning curves from PowerGeneration | \(kUS\$2015/KW\) | x |
| i10LearnableFraction (LCTECH) |
Fraction of cost subject to learning curve | \(1\) | x |
| i10LearningRate (LCTECH) |
Learning rate for technology | \(1\) | x |
| i10MinCostFraction (LCTECH) |
Minimum cost as fraction of initial cost | \(1\) | x |
| Q10CostLC (LCTECH, YTIME) |
Learning curve cost multiplier calculation | x | |
| Q10CumCapGlobal (LCTECH, YTIME) |
Global cumulative capacity calculation | x | |
| V10CumCapGlobal (LCTECH, YTIME) |
Global cumulative capacity | \(GW\) | x |
| description | |
|---|---|
| allCy | All Countries Used in the Model |
| LCSOL(LCTECH) | Solar technologies subset |
| LCTECH(PGALL) | Technologies with learning curves - subset of PGALL |
| LCWND(LCTECH) | Wind technologies subset |
| PGALL(STECH) | Power Generation Plant Types |
| runCy(allCy) | Countries for which the model is running |