shading fraction makes sense need to fix optimiser

This commit is contained in:
Lucas Tan 2025-04-03 23:36:04 +08:00
parent 5792640d30
commit 2cae51ccbf
3 changed files with 37 additions and 17 deletions

View File

@ -27,7 +27,7 @@ def optimise_vertical_panel_pitch(c):
# perform minimization # perform minimization
initial_pitch = c["array"]["spacing"] initial_pitch = c["array"]["spacing"]
result = minimize( result = minimize(
objective, initial_pitch, bounds=[(0, 5)], tol=1e-8, options={"eps": 0.5} objective, initial_pitch, bounds=[(0, 20)], tol=1e-8, options={"eps": 1}
) )
optimal_pitch = result.x[0] optimal_pitch = result.x[0]
c["array"]["spacing"] = optimal_pitch c["array"]["spacing"] = optimal_pitch

View File

@ -128,9 +128,9 @@ def get_solar_data(c):
def sanity_check_minimum_pitch(c): def sanity_check_minimum_pitch(c):
solar_positions, _ = get_solar_data(c) solar_positions, _ = get_solar_data(c)
zenith = solar_positions["zenith"].values zenith = solar_positions["zenith"].values
solar_positions["shadow_length"] = ( solar_positions["shadow_length"] = (c["panel"]["dimensions"]["length"]) * np.tan(
c["panel"]["dimensions"]["length"] + c["environment"]["height"] zenith / 180 * np.pi
) * np.tan(zenith / 180 * np.pi) )
return solar_positions return solar_positions
@ -150,10 +150,17 @@ def calculate_energy_production_vertical(c):
shaded_row_rotation = 90 shaded_row_rotation = 90
shading_row_rotation = 90 shading_row_rotation = 90
axis_tilt = 0 axis_tilt = 0
axis_azimuth = 90 axis_azimuth = 180
morning_projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle(
solar_zenith=solar_positions["apparent_zenith"],
solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth,
axis_tilt=axis_tilt,
)
morning_shaded_fraction = pvlib.shading.shaded_fraction1d( morning_shaded_fraction = pvlib.shading.shaded_fraction1d(
solar_zenith=solar_positions["zenith"], solar_zenith=morning_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"], solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth, axis_azimuth=axis_azimuth,
shaded_row_rotation=shaded_row_rotation, shaded_row_rotation=shaded_row_rotation,
@ -165,8 +172,14 @@ def calculate_energy_production_vertical(c):
) )
morning_shaded_fraction = morning_shaded_fraction * no_of_shaded_rows / no_of_rows morning_shaded_fraction = morning_shaded_fraction * no_of_shaded_rows / no_of_rows
afternoon_projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle(
solar_zenith=solar_positions["apparent_zenith"],
solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth + 180,
axis_tilt=axis_tilt,
)
afternoon_shaded_fraction = pvlib.shading.shaded_fraction1d( afternoon_shaded_fraction = pvlib.shading.shaded_fraction1d(
solar_zenith=solar_positions["zenith"], solar_zenith=afternoon_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"], solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth + 180, axis_azimuth=axis_azimuth + 180,
shaded_row_rotation=shaded_row_rotation, shaded_row_rotation=shaded_row_rotation,
@ -185,8 +198,8 @@ def calculate_energy_production_vertical(c):
# calculate irradiance on plane of array # calculate irradiance on plane of array
poa_front = pvlib.irradiance.get_total_irradiance( poa_front = pvlib.irradiance.get_total_irradiance(
surface_tilt=90, surface_tilt=90,
surface_azimuth=axis_azimuth, surface_azimuth=90,
solar_zenith=solar_positions["zenith"], solar_zenith=morning_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"], solar_azimuth=solar_positions["azimuth"],
dni=clearsky_data["dni"], dni=clearsky_data["dni"],
ghi=clearsky_data["ghi"], ghi=clearsky_data["ghi"],
@ -198,8 +211,8 @@ def calculate_energy_production_vertical(c):
poa_rear = pvlib.irradiance.get_total_irradiance( poa_rear = pvlib.irradiance.get_total_irradiance(
surface_tilt=180 - 90, surface_tilt=180 - 90,
surface_azimuth=axis_azimuth + 180, surface_azimuth=90 + 180,
solar_zenith=solar_positions["zenith"], solar_zenith=afternoon_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"], solar_azimuth=solar_positions["azimuth"],
dni=clearsky_data["dni"], dni=clearsky_data["dni"],
ghi=clearsky_data["ghi"], ghi=clearsky_data["ghi"],
@ -254,10 +267,17 @@ def calculate_energy_production_horizontal(c):
shaded_row_rotation = 0 shaded_row_rotation = 0
shading_row_rotation = 0 shading_row_rotation = 0
axis_tilt = 0 axis_tilt = 0
axis_azimuth = 180 # south facing axis_azimuth = 90 # south facing
projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle(
solar_zenith=solar_positions["apparent_zenith"],
solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth,
axis_tilt=axis_tilt,
)
shaded_fraction = pvlib.shading.shaded_fraction1d( shaded_fraction = pvlib.shading.shaded_fraction1d(
solar_zenith=solar_positions["zenith"], solar_zenith=projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"], solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth, axis_azimuth=axis_azimuth,
shaded_row_rotation=shaded_row_rotation, shaded_row_rotation=shaded_row_rotation,
@ -271,8 +291,8 @@ def calculate_energy_production_horizontal(c):
poa = pvlib.irradiance.get_total_irradiance( poa = pvlib.irradiance.get_total_irradiance(
surface_tilt=0, surface_tilt=0,
surface_azimuth=axis_azimuth, surface_azimuth=180,
solar_zenith=solar_positions["zenith"], solar_zenith=projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"], solar_azimuth=solar_positions["azimuth"],
dni=clearsky_data["dni"], dni=clearsky_data["dni"],
ghi=clearsky_data["ghi"], ghi=clearsky_data["ghi"],

View File

@ -1,7 +1,7 @@
array: array:
peak_power_demand: 900 # in kWac peak_power_demand: 900 # in kWac
DC_AC_ratio: 1.2 # ratio of DC to AC power DC_AC_ratio: 1.2 # ratio of DC to AC power
spacing: 0.4 # spacing between adjacent panel rows in m spacing: 3 # spacing between adjacent panel rows in m
edge_setback: 1.8 # distance from the edge of the roof to the array edge_setback: 1.8 # distance from the edge of the roof to the array
roof_slope: 0 roof_slope: 0
slope: 0 # degrees from horizontal (+ve means shaded row is higher than the row in front) slope: 0 # degrees from horizontal (+ve means shaded row is higher than the row in front)
@ -16,7 +16,7 @@ environment:
roof: roof:
dimensions: dimensions:
# dimensions all in m # dimensions all in m
length: 50 length: 100
width: 40 width: 40
albedo: 0.2 # % of light reflected from the surface albedo: 0.2 # % of light reflected from the surface
tilt: 0 # degrees from horizontal tilt: 0 # degrees from horizontal