Source code for energy_demand.technologies.diffusion_technologies

"""Funtions related to the diffusion of technologies
"""
import math
import numpy as np

[docs]def linear_diff(base_yr, curr_yr, value_start, value_end, yr_until_changed): """Calculate a linear diffusion for a current year. If the current year is identical to the base year, the start value is returned Arguments ---------- base_yr : int The year of the current simulation curr_yr : int The year of the current simulation value_start : float Fraction of population served with fuel_enduse_switch in base year value_end : float Fraction of population served with fuel_enduse_switch in end year yr_until_changed : str Year until changed is fully implemented Returns ------- fract_cy : float The fraction in the simulation year """ # Total number of simulated years sim_years = yr_until_changed - base_yr + 1 if curr_yr == base_yr or sim_years == 0 or value_end == value_start: fract_cy = value_start else: #-1 because in base year no change fract_cy = ((value_end - value_start) / (sim_years - 1)) * (curr_yr - base_yr) + value_start return fract_cy
[docs]def sigmoid_function(x_value, l_value, midpoint, steepness): """Sigmoid function used for fitting and plotting. Arguments --------- x_value : float X-Value l_value : float The curv'es maximum value midpoint : float The midpoint x-value of the sigmoid's midpoint steepness : dict The steepness of the curve Return ------ y-value : float Y-Value Warning ------- Because 2000 is substracted, the start year can not be before 2001. """ return l_value / (1 + np.exp(-steepness * ((x_value - 2000.0) - midpoint)))
[docs]def sigmoid_diffusion( base_yr, curr_yr, end_yr, sig_midpoint, sig_steepness ): """Calculates a sigmoid diffusion path of a lower to a higher value with assumed saturation at the end year Arguments ---------- base_yr : int Base year of simulation period curr_yr : int The year of the current simulation end_yr : int The year a fuel_enduse_switch saturaes sig_midpoint : float Mid point of sigmoid diffusion function can be used to shift curve to the left or right (standard value: 0) sig_steepness : float Steepness of sigmoid diffusion function The steepness of the sigmoid curve (standard value: 1) Returns ------- cy_p : float The fraction of the diffusion in the current year Note ---- It is always assuemed that for the simulation year the share is replaced with technologies having the efficencies of the current year. For technologies which get replaced fast (e.g. lightbulb) this is corret assumption, for longer lasting technologies, this is more problematic (in this case, over every year would need to be iterated and calculate share replaced with efficiency of technology in each year). Always returns positive value. Needs to be considered for changes in negative """ if curr_yr == base_yr: return float(0) elif curr_yr == end_yr: return float(1) else: # Translates simulation year on the sigmoid graph reaching from -6 to +6 (x-value) if end_yr == base_yr: y_trans = 5.0 else: y_trans = -5.0 + (10.0 / (end_yr - base_yr)) * (curr_yr - base_yr) # Get a value between 0 and 1 (sigmoid curve ranging from 0 to 1) cy_p = 1.0 / (1 + math.exp(-1 * sig_steepness * (y_trans - sig_midpoint))) return float(cy_p)