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
initial_pitch = c["array"]["spacing"]
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]
c["array"]["spacing"] = optimal_pitch

View File

@ -128,9 +128,9 @@ def get_solar_data(c):
def sanity_check_minimum_pitch(c):
solar_positions, _ = get_solar_data(c)
zenith = solar_positions["zenith"].values
solar_positions["shadow_length"] = (
c["panel"]["dimensions"]["length"] + c["environment"]["height"]
) * np.tan(zenith / 180 * np.pi)
solar_positions["shadow_length"] = (c["panel"]["dimensions"]["length"]) * np.tan(
zenith / 180 * np.pi
)
return solar_positions
@ -150,10 +150,17 @@ def calculate_energy_production_vertical(c):
shaded_row_rotation = 90
shading_row_rotation = 90
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(
solar_zenith=solar_positions["zenith"],
solar_zenith=morning_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth,
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
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(
solar_zenith=solar_positions["zenith"],
solar_zenith=afternoon_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth + 180,
shaded_row_rotation=shaded_row_rotation,
@ -185,8 +198,8 @@ def calculate_energy_production_vertical(c):
# calculate irradiance on plane of array
poa_front = pvlib.irradiance.get_total_irradiance(
surface_tilt=90,
surface_azimuth=axis_azimuth,
solar_zenith=solar_positions["zenith"],
surface_azimuth=90,
solar_zenith=morning_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"],
dni=clearsky_data["dni"],
ghi=clearsky_data["ghi"],
@ -198,8 +211,8 @@ def calculate_energy_production_vertical(c):
poa_rear = pvlib.irradiance.get_total_irradiance(
surface_tilt=180 - 90,
surface_azimuth=axis_azimuth + 180,
solar_zenith=solar_positions["zenith"],
surface_azimuth=90 + 180,
solar_zenith=afternoon_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"],
dni=clearsky_data["dni"],
ghi=clearsky_data["ghi"],
@ -254,10 +267,17 @@ def calculate_energy_production_horizontal(c):
shaded_row_rotation = 0
shading_row_rotation = 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(
solar_zenith=solar_positions["zenith"],
solar_zenith=projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth,
shaded_row_rotation=shaded_row_rotation,
@ -271,8 +291,8 @@ def calculate_energy_production_horizontal(c):
poa = pvlib.irradiance.get_total_irradiance(
surface_tilt=0,
surface_azimuth=axis_azimuth,
solar_zenith=solar_positions["zenith"],
surface_azimuth=180,
solar_zenith=projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"],
dni=clearsky_data["dni"],
ghi=clearsky_data["ghi"],

View File

@ -1,7 +1,7 @@
array:
peak_power_demand: 900 # in kWac
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
roof_slope: 0
slope: 0 # degrees from horizontal (+ve means shaded row is higher than the row in front)
@ -16,7 +16,7 @@ environment:
roof:
dimensions:
# dimensions all in m
length: 50
length: 100
width: 40
albedo: 0.2 # % of light reflected from the surface
tilt: 0 # degrees from horizontal