Tutorial 1. A very simple uncertainty analysis for annual yield
We begin with the very simple example of solving the yield uncertainty, where we assume
- the only signficant uncertainties relate to GHI, soiling and availability; and
- all uncertainties are Gaussian.
This example like the simplest P90 evaluations used by the PV industry.
The analysis is applied to our default system, a single-axis tracker (SAT) with one-in-portrait monofacial modules located in Sydney, and we concern ourselves with just the first year of operation.
The table below shows our assumed sources of uncertainty in terms of their value and 95% confidence interval (CI). Note that the uncertainty in the GHI is ±5% relative, and thus a GHI of 1000 W/m² will have an uncertainty of ±50 W/m²; whereas the uncertainty in the soiling and availability is absolute, and thus their uncertainty range is (2 ± 2)% and (99 ± 1)%, respectively.
How do we load these uncertainties into SunSolve P90?
In this example, we assume the uncertainties to be Gaussian, and we therefore need to know their standard deviation. We determine that by noting that a 95% CI of ±x equates to a standard deviation of x/1.96 or, to keep things simple, of x/2. Thus, the input values and the Gaussian distributions that we’ll use are as follows:
We make two important points here:
-
SunSolve P90 always uses fractions (rather than percentages) for the inputs.
-
Since we use x₀ = 1, σ represents the relative standard devaition, and hence for soiling, σ = (2/2) / 2 = 0.5, and for availability, σ = (1/99) / 2 = 0.0050505.
These input values and distributions are contained in the code blocks below, which you can copy into code blocks of Steps 3 and 6 in SunSolve P90.
Load the inputs by copying this code block into Step 3:
# Set uncertainty simulation constantssimulation_options = build_simulation_options( number_of_years=1, number_of_simulations=5000)
# 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 inputsoptical_settings = build_optical_settings( soiling_front=0.02)
operational_settings = build_operational_settings( availability=0.99)
#Otherwise use all defaultsmodule_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.9, bin_delta=0.01, p_values=[90, 95])Load the distributions by copying this code block into Step 6:
distribution_list = [ create_distribution(DistributionInput.GHI, simToSim=["Gaussian", 1, 0.025]), create_distribution(DistributionInput.SoilingFront, simToSim=["Gaussian", 1, 0.5]), create_distribution(DistributionInput.Availability, simToSim=["Gaussian", 1, 0.0050505]),]print("Distribution list created.")The histogram below plots the results of the Monte Carlo simulation performed by SunSolve P90. It has a P90/P50 of 0.967 and a P95/P50 of 0.957. (These values are just example outputs and not meant to represent a real system.)
Since our three uncertainties were Gaussian and independent, we can also determine the yield distribution analytically by following the sum-of-squares approach. This analytical approach is plotted as the line in the figure, and it matches the SunSolve P90 output.
Well, actually, if we’re to be pedantic, and we love to be pedantic, there is a slight difference between the two approaches. This arises for two reasons:
Firstly, the soiling distribution extends below 0% (2.5% of the distribution gives a negative soiling) and the availability distribution extends above 100% (2.5% of the availability is above unity). SunSolve P90 clips these parameters to between 0 and 100%.
And secondly, SunSolve P90 accounts for a non-linearity related to GHI. Specifically, when the GHI increases, the module temperature rises, making it less efficient (i.e., the module power increases sub-linearly with GHI). This has the effect of slightly tightening the SunSolve P90 distribution.
Thus, the analytical distribution is slightly broader than the SunSolve P90 distribution. Its P90 is 0.967 rather than 0.962; and its P95 is 0.957 rather than 0.952. We’ll see more of these non-linearities in later examples.
A final note: An alternative way to set up the simulation would have been to load the following inputs and distributions. It would give identical results to the approach we described above. With this approach, σ represents the absolute standard deviation.