PEREZ

This function computes the diffuse irradiance on a tilted surface using the Perez model.

The model estimates sky diffuse irradiance (excluding ground-reflected irradiance) from surface orientation, sun angles, relative airmass, and irradiance components. Users can optionally select different sets of empirical coefficients via the model argument.

Excel Usage

=PEREZ(surface_tilt, surface_azimuth, dhi, dni, dni_extra, solar_zenith, solar_azimuth, airmass, perez_model)
  • surface_tilt (float, required): Panel tilt from the horizontal (degrees).
  • surface_azimuth (float, required): Panel azimuth (degrees).
  • dhi (float, required): Diffuse horizontal irradiance, must be >=0 (W/m^2).
  • dni (float, required): Direct normal irradiance, must be >=0 (W/m^2).
  • dni_extra (float, required): Extraterrestrial normal irradiance (W/m^2).
  • solar_zenith (float, required): Solar apparent zenith angle (degrees).
  • solar_azimuth (float, required): Solar azimuth angle (degrees).
  • airmass (float, required): Relative (not pressure-corrected) airmass values. Must be >=0 (unitless).
  • perez_model (str, optional, default: “allsitescomposite1990”): Name of the Perez coefficient set to use.

Returns (float): The sky diffuse component (W/m^2), or an error string.

Example 1: Calculate sky diffuse for basic inputs

Inputs:

surface_tilt surface_azimuth dhi dni dni_extra solar_zenith solar_azimuth airmass perez_model
30 180 100 800 1367 40 180 1.5 allsitescomposite1990

Excel formula:

=PEREZ(30, 180, 100, 800, 1367, 40, 180, 1.5, "allsitescomposite1990")

Expected output:

118.793

Example 2: Perez sky diffuse using the 1988 composite coefficients

Inputs:

surface_tilt surface_azimuth dhi dni dni_extra solar_zenith solar_azimuth airmass perez_model
25 180 110 750 1330 42 175 1.35 allsitescomposite1988

Excel formula:

=PEREZ(25, 180, 110, 750, 1330, 42, 175, 1.35, "allsitescomposite1988")

Expected output:

135.151

Example 3: Perez sky diffuse using the Sandia 1988 coefficients

Inputs:

surface_tilt surface_azimuth dhi dni dni_extra solar_zenith solar_azimuth airmass perez_model
40 135 90 680 1325 55 140 1.8 sandiacomposite1988

Excel formula:

=PEREZ(40, 135, 90, 680, 1325, 55, 140, 1.8, "sandiacomposite1988")

Expected output:

115.115

Example 4: Perez sky diffuse for a higher-airmass morning case

Inputs:

surface_tilt surface_azimuth dhi dni dni_extra solar_zenith solar_azimuth airmass perez_model
50 90 130 520 1390 70 100 2.7 usacomposite1988

Excel formula:

=PEREZ(50, 90, 130, 520, 1390, 70, 100, 2.7, "usacomposite1988")

Expected output:

198.361

Python Code

Show Code
from pvlib.irradiance import perez as result_func

def perez(surface_tilt, surface_azimuth, dhi, dni, dni_extra, solar_zenith, solar_azimuth, airmass, perez_model='allsitescomposite1990'):
    """
    Determine diffuse irradiance from the sky on a tilted surface using one of the Perez models.

    See: https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.irradiance.perez.html

    This example function is provided as-is without any representation of accuracy.

    Args:
        surface_tilt (float): Panel tilt from the horizontal (degrees).
        surface_azimuth (float): Panel azimuth (degrees).
        dhi (float): Diffuse horizontal irradiance, must be >=0 (W/m^2).
        dni (float): Direct normal irradiance, must be >=0 (W/m^2).
        dni_extra (float): Extraterrestrial normal irradiance (W/m^2).
        solar_zenith (float): Solar apparent zenith angle (degrees).
        solar_azimuth (float): Solar azimuth angle (degrees).
        airmass (float): Relative (not pressure-corrected) airmass values. Must be >=0 (unitless).
        perez_model (str, optional): Name of the Perez coefficient set to use. Valid options: 1990 Composite, 1988 Composite, Sandia 1988, USA 1988, France 1988, Phoenix 1988, El Monte 1988, Osage 1988, Albuquerque 1988, Cape Canaveral 1988, Albany 1988. Default is 'allsitescomposite1990'.

    Returns:
        float: The sky diffuse component (W/m^2), or an error string.
    """
    try:
        tilt = float(surface_tilt)
        azim = float(surface_azimuth)
        dh = float(dhi)
        dn = float(dni)
        dn_e = float(dni_extra)
        zen = float(solar_zenith)
        s_azim = float(solar_azimuth)
        am = float(airmass)

        mod = str(perez_model) if perez_model is not None else "allsitescomposite1990"

        if am < 0:
            return "Error: airmass must be >= 0"
        if dh < 0 or dn < 0:
            return "Error: Irradiance values (dhi and dni) must be >= 0"

        res = result_func(
            surface_tilt=tilt,
            surface_azimuth=azim,
            dhi=dh,
            dni=dn,
            dni_extra=dn_e,
            solar_zenith=zen,
            solar_azimuth=s_azim,
            airmass=am,
            model=mod,
            return_components=False
        )

        return float(res)
    except Exception as e:
        return f"Error: {str(e)}"

Online Calculator

Panel tilt from the horizontal (degrees).
Panel azimuth (degrees).
Diffuse horizontal irradiance, must be >=0 (W/m^2).
Direct normal irradiance, must be >=0 (W/m^2).
Extraterrestrial normal irradiance (W/m^2).
Solar apparent zenith angle (degrees).
Solar azimuth angle (degrees).
Relative (not pressure-corrected) airmass values. Must be >=0 (unitless).
Name of the Perez coefficient set to use.