Tutorial 2. A simple uncertainty analysis for annual yield
Example 2 extends Example 1 by adding four more sources of uncertainty: module nameplate power, modelling error within PVsyst, inverter efficiency and DC health.
This example is similar to many P90 analyses used by the PV industry for the first year of operation, although we do not claim our uncertainties represent any real system.
Example 2 continues to assume that all uncertainty distributions are Gaussian, and it continues to analyse our default system (a monofacial SAT located in Sydney).
The sources of uncertainty are these:
Like Example 1, we calculate the standard deviations to be a half of the relative uncertainty, σ = (absolute uncertainty/value) / 2. And therefore the input values and Gaussian distributions are defined as follows:
Notice that to encompass the uncertainty in the PVsyst model, we have applied a 5% relative error in the calculated yield.
At this point, you might be wondering why we make it so complicated. Why not simply enter an input value and its 95% confidence interval?
Well, we won’t always be assuming Gaussian distributions. And as we’ll see in later examples, alternative distributions can be asymmetric and don’t have a simple relationship to the confidence interval.
In any case, you can now copy the input values and distributions from the code blocks below into SunSolve P90, overwriting the inputs contained in the code blocks of Steps 3 and 6.
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=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 inputsmodule_info = build_module_info( power_at_stc = 460,)optical_settings = build_optical_settings( soiling_front=0.02)electrical_settings = build_electrical_settings( inverter_efficiency = 0.97,)operational_settings = build_operational_settings( yield_modifier=1, availability=0.99, dc_health=0.99,)
#Otherwise use all defaultssystem_info = build_system_info()thermal_settings = build_thermal_settings()
# Set output optionsresult_options = build_result_options( bin_min=0.85, 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.ModulePower, simToSim=["Gaussian", 1, 0.02174]), create_distribution(DistributionInput.SoilingFront, simToSim=["Gaussian", 1, 0.5]), create_distribution(DistributionInput.YieldModifier, simToSim=["Gaussian", 1, 0.025]), create_distribution(DistributionInput.DCHealth, simToSim=["Gaussian", 1, 0.005051]), create_distribution(DistributionInput.InverterEfficiency, simToSim=["Gaussian", 1, 0.010309]), create_distribution(DistributionInput.Availability, simToSim=["Gaussian", 1, 0.005051]),]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.949 and a P95/P50 of 0.936 (These values are just example output and not meant to represent a real system.)
The figure also plots the yield distribution when calculated analytically using the sum-of-squares approach (as would be applied in many P90 analyses in the industry). Even more so than Example 1, the analytical analysis is broader than the SunSolve P90 results.
As well as clipping soiling at 0% and availability at 100%, there is also minor clipping of DC Health at 100%. And as well as the non-linear dependence of yield on GHI, there is now a non-linear dependence of yield on the module power, for when modules are more efficient (produce more power for the same area), they are less affected by temperature.
The analtyical distribution has a P90 ratio of 0.924 rather than 0.936, and 0.941 rather than 0.949.
Notice too that the SunSolve P90 solution has a slight asymmetry due to these effects. And that’s before we introduce any asymmetric uncertainties, which we’ll do in Example 4.