Skip to content

Tutorial 4. Introducing asymmetry

We now introduce asymmetrical uncertainties, which is one of the main reasons to apply the Monte Carlo simulations for P90 calculations.

We begin with two asymmetric sources: GHI and availability.

For GHI, we apply a skewed-Gaussian distribution with the parameters shown in the table below.

InputValueξωαGHI, Loaded from file, 1.029, 0.04, -5

This skewed Gaussian fits the inter-annual variability (IAV) of the GHI measured over 27 years at Mokpo, Korea, as published by Kim et al. from the Korean Institute of Energy Research [1]. To our knowledge this represents a site with a high asymmetry in the GHI IAV. (Some sites have negligible asymmetry.)

The figure below plots their measurements (histogram) and example Gaussian curve (orange line) as plotted in [1], and it compares it to our skewed-Gaussian fit (red line).

Note that our best fit to the histogram has ξ = 1.038, but we instead apply ξ = 1.029 in the simulation. We do that to shift the distribution to the left so that its P50 equals 1. We can then apply this asymmetric distribution to our TMY data for GHI without modifying its P50.

Output uncertainty

For the availability, we apply a Weibull function with these parameters:

InputValuex₀λkpAvailability, 1, 1, 0.024, 1.6, -1

This distribution matches the best-fit Weibull function that Chawla from Natural Power determined for the availability from 1800 months of data measured at 68 projects in the USA [2]. The graph below is an image taken from their white paper.

Output uncertainty

We can now find the yield uncertainty when just these two sources of uncertainty are applied to our default SAT system.

First load the inputs by copying this text block into Step 3:

# Set uncertainty simulation constants
simulation_options = build_simulation_options(
number_of_years=1,
number_of_simulations=10000
)
# Load weather: sydney.pvw file is an example weather file
weather_file_path = "Data/sydney.pvw"
weather_data = load_weather_data_from_pvw_file(weather_file_path)
# Assign system inputs
operational_settings = build_operational_settings(
availability=1
)
#Otherwise use all defaults
optical_settings = build_optical_settings()
module_info = build_module_info()
system_info = build_system_info()
electrical_settings = build_electrical_settings()
thermal_settings = build_thermal_settings()
# Set output options
result_options = build_result_options(
bin_min=0.85,
bin_delta=0.01,
p_values=[1, 5, 10, 25, 75, 90, 95, 99]
)

And then load the distributions by copying the text block below into Step 6. Notice that we still use a simToSim distribution for the GHI, even though it represents inter-annual variation. That’s because we’re solving a single year in this example. We’ll introduce the solving of multiple years in the next tutorial.

distribution_list = [
create_distribution(DistributionInput.GHI, simToSim=['SkewedGaussian', 1.029, 0.04, -5]),
create_distribution(DistributionInput.Availability, simToSim=['Weibull', 1, 0.024, 1.6, False]),
]
print("Distribution list created.")

The resulting histogram is plotted below. It has an obvious asymmetry, whereby the downside tail is longer than the upside.

For example, its P90 ratio is 0.959 whereas its P10 ratio is 1.030; and its P95 ratio is 0.946 whereas its P5 is 1.036.

Output uncertainty

Of course, there are many other significant sources of uncertainty that have not been included here. So, we emphasise again that this output does not represent the actual uncertainty distribution of a PV plant, or its actual degree of asymmetry.

[1] S.Y. Kim et al. “Prefeasibility study of photovoltaic power potential based on a skew-normal distribution,” Energies 13, p.676, 2020.

[2] D. Chawla, “A database assessment of solar project availability in the United States,” white paper, Natural Power, 2024.