Source code for pvpltools.module_efficiency

"""
This module contains implementations of several PV module efficiency models.

These models have a common purpose, which is to predict the efficiency at
maximum power point as a function of the main operating conditions:
effective irradiance and module temperature.

A function to fit any of these models to measurements is also provided.

Copyright (c) 2019-2020 Anton Driesse, PV Performance Labs.
"""

import inspect

import numpy as np
import pandas as pd
from scipy.optimize import curve_fit

from pvpltools.iec61853 import BilinearInterpolator


[docs] def fit_efficiency_model(irradiance, temperature, eta, model, p0=None, **kwargs): """ Determine the parameters of a module efficiency model by non-linear least-squares fit. This is a convenience function that calls the scipy curve_fit function with suitable parameters and defaults. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. eta : numeric The efficiency of the module at the specified irradiance and temperature. model : function A PV module efficiency function such as `adr`. It must take irradiance and temperature as the first two arguments and the model-specific parameters as the remaining arguments. p0 : array_like, optional Initial guess for the parameters, which may speed up the fit process. kwargs : Optional keyword arguments passed to `curve_fit`. Returns ------- popt : array Optimal values for the parameters so that the sum of the squared residuals of ``model(irradiance, temperature, *popt) - eta`` is minimized. pcov : 2-D array The estimated covariance of popt. See `curve_fit` for details. Raises ------ (These errors and warnings are from `curve_fit`.) ValueError if either `ydata` or `xdata` contain NaNs, or if incompatible options are used. RuntimeError if the least-squares minimization fails. OptimizeWarning if covariance of the parameters can not be estimated. See also -------- pvpltools.module_efficiency.adr scipy.optimize.curve_fit Author: Anton Driesse, PV Performance Labs """ if p0 is None: # determine number of parameters by inspecting the function # and set initial parameters all to 1 sig = inspect.signature(model) p0 = np.zeros(len(sig.parameters) - 2) if 'method' not in kwargs: kwargs['method'] = 'trf' def model_wrapper(xdata, *params): return model(*xdata, *params) popt, pcov = curve_fit(model_wrapper, xdata=[irradiance, temperature], ydata=eta, p0=p0, **kwargs ) return popt, pcov
[docs] def adr(irradiance, temperature, k_a, k_d, tc_d, k_rs, k_rsh): ''' Calculate PV module efficiency using the ADR model. The efficiency varies with irradiance and operating temperature and is determined by 5 model parameters as described in [1]_. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. k_a : float Absolute scaling factor, which is equal to the efficiency at reference conditions. This factor allows the model to be used with relative or absolute efficiencies, and to accommodate data sets which are not perfectly normalized but have a slight bias at the reference conditions. k_d : negative float “Dark irradiance” or diode coefficient which influences the voltage increase with irradiance. tc_d : float Temperature coefficient of the diode coefficient, which indirectly influences voltage. Because it is the only temperature coefficient in the model, its value will also reflect secondary temperature dependencies that are present in the PV module. k_rs and k_rsh : float Series and shunt resistance loss factors. Because of the normalization they can be read as power loss fractions at reference conditions. For example, if k_rs is 0.05, the internal loss assigned to the series resistance has a magnitude equal to 5% of the module output. Returns ------- eta : numeric The efficiency of the module at the specified irradiance and temperature. Notes ----- The efficiency values may be absolute or relative, and may be expressed as percent or per unit. This is determined by the efficiency data used to derive values for the 5 model parameters. The first model parameter k_a is equal to the efficiency at STC and therefore indicates the efficiency scale being used. k_a can also be changed freely to adjust the scale, or to change the module class to a slightly higher or lower efficiency. References ---------- .. [1] A. Driesse and J. S. Stein, "From IEC 61853 power measurements to PV system simulations", Sandia Report No. SAND2020-3877, 2020. .. [2] A. Driesse, M. Theristis and J. S. Stein, "A New Photovoltaic Module Efficiency Model for Energy Prediction and Rating", forthcoming. Author: Anton Driesse, PV Performance Labs ''' g = np.asanyarray(irradiance) t = np.asanyarray(temperature) # normalize the irradiance G_REF = 1000 s = g / G_REF # obtain the difference from reference temperature T_REF = 25 dt = t - T_REF # equation 29 in JPV s_o = 10**(k_d + (tc_d * dt)) s_o_ref = 10**(k_d) # equation 28 and 30 in JPV # the constant k_v does not appear here because it cancels out v = np.log(s / s_o + 1) v /= np.log(1 / s_o_ref + 1) # equation 25 in JPV eta = k_a * ((1 + k_rs + k_rsh) * v - k_rs * s - k_rsh * v**2) return eta
[docs] def heydenreich(irradiance, temperature, a, b, c, gamma_pmp): """ Calculate PV module efficiency using the Heydenreich model. The efficiency varies with irradiance and operating temperature and is determined by three parameters for irradiance dependency and one for temperature dependency as described in [1]_. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. a, b, c : float Three model parameters usually determined by regression. gamma_pmp : float The temperature coefficient of power, which may be taken from the module datasheet or also determined by regression. Returns ------- eta : numeric The efficiency of the module at the specified irradiance and temperature. See also -------- fit_efficiency_model adr Notes ----- A comprehensive comparison of efficiency models is found in [2]_ and [3]_. References ---------- .. [1] W. Heydenreich, et al., "Describing the world with three parameters: a new approach to PV module power modelling," in 23rd European PV Solar Energy Conference and Exhibition (EU PVSEC), 2008, pp. 2786-2789. .. [2] A. Driesse and J. S. Stein, "From IEC 61853 power measurements to PV system simulations", Sandia Report No. SAND2020-3877, 2020. .. [3] A. Driesse, M. Theristis and J. S. Stein, "A New Photovoltaic Module Efficiency Model for Energy Prediction and Rating", forthcoming. Author: Anton Driesse, PV Performance Labs """ from numpy import log, exp, square g = np.asanyarray(irradiance) t = np.asanyarray(temperature) dt = t - 25 eta = ( # power loss in R series a * g + # power gain from voltage * current b * log(g + 1) + # power loss in R shunt (constant Rsh) c * (square(log(g + exp(1))) / (g + 1) - 1) ) eta *= 1 + gamma_pmp * dt return eta
[docs] def motherpv(irradiance, temperature, a, b, c, d, gamma_ref, aa, bb): """ Calculate PV module efficiency using the MotherPV model. The efficiency varies with irradiance and operating temperature and is determined by 7 parameters as described in [1]_. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. a, b, c, d, aa, bb : float Six model parameters usually determined by regression. gamma_pmp : float The temperature coefficient of power, which may be taken from the module datasheet or also determined by regression. Returns ------- eta : numeric The efficiency of the module at the specified irradiance and temperature. See also -------- fit_efficiency_model adr Notes ----- A comprehensive comparison of efficiency models is found in [2]_ and [3]_. References ---------- .. [1] A. G. de Montgareuil, et al., "A new tool for the MotherPV method: modelling of the irradiance coefficient of photovoltaic modules," in 24th European Photovoltaic Solar Energy Conference (EU PVSEC), 2009, pp. 21-25. .. [2] A. Driesse and J. S. Stein, "From IEC 61853 power measurements to PV system simulations", Sandia Report No. SAND2020-3877, 2020. .. [3] A. Driesse, M. Theristis and J. S. Stein, "A New Photovoltaic Module Efficiency Model for Energy Prediction and Rating", forthcoming. Author: Anton Driesse, PV Performance Labs """ from numpy import log g = np.asanyarray(irradiance) t = np.asanyarray(temperature) s = g / 1000 dt = t - 25 eta = 1 + a * (s - 1) + b * log(s) + c * (s - 1) ** 2 + d * log(s) ** 2 gamma = gamma_ref * (1 + aa * (s - 1) + bb * log(s)) eta *= 1 + gamma * dt return eta
[docs] def pvgis(irradiance, temperature, k1, k2, k3, k4, k5, k6): """ Calculate PV module efficiency using the PVGIS model. The efficiency varies with irradiance and operating temperature and is determined by 6 parameters as described in [1]_. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. k1, k2, k3, k4, k5, k6 : float Six model parameters usually determined by regression. Returns ------- eta : numeric The efficiency of the module at the specified irradiance and temperature. See also -------- fit_efficiency_model adr Notes ----- A comprehensive comparison of efficiency models is found in [2]_ and [3]_. References ---------- .. [1] T. Huld, et al., "A power-rating model for crystalline silicon PV modules," Solar Energy Materials and Solar Cells, vol. 95, pp. 3359-3369, 2011. .. [2] A. Driesse and J. S. Stein, "From IEC 61853 power measurements to PV system simulations", Sandia Report No. SAND2020-3877, 2020. .. [3] A. Driesse, M. Theristis and J. S. Stein, "A New Photovoltaic Module Efficiency Model for Energy Prediction and Rating", forthcoming. Author: Anton Driesse, PV Performance Labs """ from numpy import log g = np.asanyarray(irradiance) t = np.asanyarray(temperature) g = g / 1000 dt = t - 25 eta = ( 1 + k1 * log(g) + k2 * log(g) ** 2 + dt * (k3 + k4 * log(g) + k5 * log(g) ** 2) + k6 * dt**2 ) return eta
[docs] def mpm6(irradiance, temperature, c1, c2, c3, c4, c6=0.0): """ Calculate PV module efficiency using the MPM6 model (without windspeed). The efficiency varies with irradiance and operating temperature and is determined by 5 parameters as described in [1]_. A sixth parameter captures the effect of windspeed but is not used in this implementation. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. c1, c2, c3, c4, c6 : float Five model parameters usually determined by regression. Returns ------- eta : numeric The efficiency of the module at the specified irradiance and temperature. See also -------- mpm5 fit_efficiency_model adr Notes ----- The author of MPM6 recommends the fitting constraint c6 <= 0. A comprehensive comparison of efficiency models is found in [2]_ and [3]_. References ---------- .. [1] S. Ransome and J. Sutterlueti, "How to Choose the Best Empirical Model for Optimum Energy Yield Predictions," in 44th IEEE Photovoltaic Specialist Conference (PVSC), 2017, pp. 652-657. .. [2] A. Driesse and J. S. Stein, "From IEC 61853 power measurements to PV system simulations", Sandia Report No. SAND2020-3877, 2020. .. [3] A. Driesse, M. Theristis and J. S. Stein, "A New Photovoltaic Module Efficiency Model for Energy Prediction and Rating", forthcoming. Author: Anton Driesse, PV Performance Labs """ g = np.asanyarray(irradiance) t = np.asanyarray(temperature) g = g / 1000 dt = t - 25 eta = ( # "actual/nominal" c1 # loss due to temperature + c2 * dt # loss at low light / due to Voc + c3 * np.log10(g) # loss at high light / due to Rs + c4 * g # loss due to Rsh + c6 / g ) return eta
[docs] def mpm5(irradiance, temperature, c1, c2, c3, c4): """ Call `mpm6` with one less parameter. See `mpm6` for more information. """ return mpm6(irradiance, temperature, c1, c2, c3, c4, c6=0.0)
[docs] def fit_bilinear(irradiance, temperature, eta): """ Prepare a bilinear interpolant for module efficiency. This function allows the class `pvpltools.iec61853.BilinearInterpolator` to be used in a way that is compatible with other efficiency models in this module. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. eta : numeric The efficiency of the module at the specified irradiance and temperature. Returns ------- interpolator : object A callable `BilinearInterpolator` object See also -------- pvpltools.module_efficiency.bilinear pvpltools.iec61853.BilinearInterpolator Notes ----- Unlike the other efficiency models, bilinear interpolation only works with a regular grid of measurements. Missing values at low irradiance high temperature and vice versa are filled using the method described in [1]_ and [2]_. References ---------- .. [1] A. Driesse and J. S. Stein, "From IEC 61853 power measurements to PV system simulations", Sandia Report No. SAND2020-3877, 2020. .. [2] A. Driesse, M. Theristis and J. S. Stein, "A New Photovoltaic Module Efficiency Model for Energy Prediction and Rating", forthcoming. Author: Anton Driesse, PV Performance Labs """ # (re)construct the matrix as a grid for the BilinearInterpolator data = pd.DataFrame([irradiance, temperature, eta]).T grid = data.pivot( columns=data.columns[0], index=data.columns[1], values=data.columns[2] ) # now create the interpolator object interpolator = BilinearInterpolator(grid) return interpolator
[docs] def bilinear(irradiance, temperature, interpolator): """ Calculate PV module efficiency using bilinear interpolation/extrapolation. This function allows the class `pvpltools.iec61853.BilinearInterpolator` to be used in a way that is compatible with other efficiency models in this module. Parameters ---------- irradiance : non-negative numeric, W/m² The effective irradiance incident on the PV module. temperature : numeric, °C The module operating temperature. interpolator : object A callable `BilinearInterpolator` object Returns ------- eta : numeric The efficiency of the module at the specified irradiance and temperature. See also -------- module_efficiency.fit_bilinear pvpltools.iec61853.BilinearInterpolator References ---------- .. [1] A. Driesse and J. S. Stein, "From IEC 61853 power measurements to PV system simulations", Sandia Report No. SAND2020-3877, 2020. .. [2] A. Driesse, M. Theristis and J. S. Stein, "A New Photovoltaic Module Efficiency Model for Energy Prediction and Rating", forthcoming. Author: Anton Driesse, PV Performance Labs """ return interpolator(irradiance, temperature)