37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
from Utilities.Shading import calculate_energy_production_vertical
|
|
from scipy.optimize import minimize
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def optimise_vertical_panel_pitch(c):
|
|
def objective(pitch):
|
|
"""
|
|
Objective function to minimize the energy production from vertical panels.
|
|
|
|
Args:
|
|
pitch (float): The pitch of the vertical panels in degrees.
|
|
|
|
Returns:
|
|
float: The negative of the energy production from vertical panels.
|
|
"""
|
|
pitch += c["panel"]["dimensions"]["thickness"]
|
|
c["array"]["spacing"] = pitch
|
|
logging.info(f"Optimizing with pitch: {pitch}m")
|
|
vertical_energy, _ = calculate_energy_production_vertical(c)
|
|
total_energy_yield = vertical_energy.sum()
|
|
logger.info(f"Total energy yield for pitch {pitch}m: {total_energy_yield}kWh")
|
|
return -total_energy_yield
|
|
|
|
# perform minimization
|
|
initial_pitch = c["array"]["spacing"]
|
|
result = minimize(
|
|
objective, initial_pitch, bounds=[(0, 20)], tol=1e-8, options={"eps": 1}
|
|
)
|
|
optimal_pitch = result.x[0]
|
|
c["array"]["spacing"] = optimal_pitch
|
|
logger.info(f"Optimal pitch found: {optimal_pitch}m")
|
|
vetical_energy, no_of_panels = calculate_energy_production_vertical(c)
|
|
return (optimal_pitch, vetical_energy, no_of_panels)
|