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.
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.
For the availability, we apply a Weibull function with these parameters:
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.
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 constantssimulation_options = build_simulation_options( number_of_years=1, number_of_simulations=10000)
# Load weather: sydney.pvw file is an example weather fileweather_file_path = "Data/sydney.pvw"weather_data = load_weather_data_from_pvw_file(weather_file_path)
# Assign system inputsoperational_settings = build_operational_settings( availability=1)
#Otherwise use all defaultsoptical_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 optionsresult_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.
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.