@sh.add_function(
dsp, inputs_kwargs=True,
outputs=['speed_distance_corrected_co2_emission_value']
)
def calculate_speed_distance_corrected_co2_emission_value(
phases_co2_emissions, phases_times, batteries_phases_delta_energy,
theoretical_phases_distances, phases_distances, alternator_efficiency,
engine_type, fuel_type, motive_powers, theoretical_motive_powers, times,
phases_indices, engine_max_power, speed_distance_correction=True,
is_hybrid=False, cycle_type='WLTP'):
"""
Calculates the CO2 emission value corrected for speed & distance [CO2g/km].
:param is_hybrid:
Is the vehicle hybrid?
:type is_hybrid: bool
:param cycle_type:
Cycle type (WLTP or NEDC).
:type cycle_type: str
:param phases_co2_emissions:
CO2 emission of cycle phases [CO2g/km].
:type phases_co2_emissions: numpy.array
:param phases_times:
Cycle phases times [s].
:type phases_times: numpy.array
:param batteries_phases_delta_energy:
Phases delta energy of the batteries [Wh].
:type batteries_phases_delta_energy: numpy.array
:param theoretical_phases_distances:
Theoretical cycle phases distances [km].
:type theoretical_phases_distances: numpy.array
:param phases_distances:
Cycle phases distances [km].
:type phases_distances: numpy.array
:param alternator_efficiency:
Alternator efficiency [-].
:type alternator_efficiency: float
:param engine_type:
Engine type (positive turbo, positive natural aspiration, compression).
:type engine_type: str
:param fuel_type:
Fuel type (diesel, gasoline, LPG, NG, ethanol, methanol, biodiesel,
propane).
:type fuel_type: str
:param motive_powers:
Motive power [kW].
:type motive_powers: numpy.array
:param theoretical_motive_powers:
Theoretical motive power [kW].
:type theoretical_motive_powers: numpy.array
:param times:
Time vector.
:type times: numpy.array
:param phases_indices:
Indices of the cycle phases [-].
:type phases_indices: numpy.array
:param engine_max_power:
Engine nominal power [kW].
:type engine_max_power: float
:param speed_distance_correction:
Apply speed distance correction?
:type speed_distance_correction: bool
:return:
CO2 emission value corrected for speed & distance [CO2g/km].
:rtype: float
"""
if is_hybrid:
return sh.NONE
p_co2, p_dist = np.array(phases_co2_emissions), phases_distances
if cycle_type == 'WLTP' and speed_distance_correction:
p_co2 = np.column_stack((p_co2, _rcb_correction(
batteries_phases_delta_energy, phases_distances, fuel_type,
engine_type, alternator_efficiency
))) * np.nan_to_num(phases_distances / phases_times)[:, None]
from sklearn.linear_model import LinearRegression
mdl = LinearRegression()
cpmp = functools.partial(
calculate_phases_co2_emissions, times, phases_indices,
phases_distances=phases_times
)
y, p_co2 = p_co2.sum(axis=1).ravel(), p_co2[:, 0].ravel()
x = cpmp(np.maximum(-.02 * engine_max_power, motive_powers))
mdl.fit(x[:, None], y)
p2 = -mdl.intercept_ / mdl.coef_ if mdl.coef_ else -float('inf')
dp_mp = cpmp(np.maximum(p2, motive_powers))
mdl.fit(dp_mp[:, None], y)
dp_mp -= cpmp(np.maximum(p2, theoretical_motive_powers))
p_co2 -= mdl.coef_ * dp_mp
p_co2 *= np.nan_to_num(phases_times / theoretical_phases_distances)
p_dist = theoretical_phases_distances
return calculate_co2_emission_value(p_co2, p_dist)