optimiser for pitch
This commit is contained in:
		
							parent
							
								
									25b7f5b0d4
								
							
						
					
					
						commit
						ebae0aecfe
					
				
							
								
								
									
										33
									
								
								Utilities/Optimisation.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								Utilities/Optimisation.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| 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. | ||||
|         """ | ||||
|         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, 90)]) | ||||
|     optimal_pitch = result.x[0] | ||||
|     c["array"]["spacing"] = optimal_pitch | ||||
|     logger.info(f"Optimal pitch found: {optimal_pitch}m") | ||||
|     vetical_energy = calculate_energy_production_vertical(c) | ||||
|     return (optimal_pitch, vetical_energy) | ||||
| @ -1,5 +1,4 @@ | ||||
| import numpy as np | ||||
| from ladybug_geometry.geometry3d import Point3D, Vector3D | ||||
| 
 | ||||
| 
 | ||||
| def calculate_no_of_panels(system_size, panel_peak_power): | ||||
|  | ||||
| @ -177,9 +177,8 @@ def calculate_energy_production_vertical(c): | ||||
|     afternoon_shaded_fraction = ( | ||||
|         afternoon_shaded_fraction * no_of_shaded_rows / no_of_rows | ||||
|     ) | ||||
|     logger.info( | ||||
|         f"Shaded fraction calculated for morning and afternoon solar positions." | ||||
|     ) | ||||
| 
 | ||||
|     logger.info("Shaded fraction calculated for solar positions") | ||||
| 
 | ||||
|     # calculate irradiance on plane of array | ||||
|     poa_front = pvlib.irradiance.get_total_irradiance( | ||||
| @ -264,7 +263,7 @@ def calculate_energy_production_horizontal(c): | ||||
|         axis_tilt=axis_tilt, | ||||
|     ) | ||||
|     shaded_fraction = shaded_fraction * no_of_shaded_rows / no_of_rows | ||||
|     logger.info(f"Shaded fraction calculated for solar positions.") | ||||
|     logger.info(f"Shaded fraction calculated for solar positions: {shaded_fraction}") | ||||
| 
 | ||||
|     poa = pvlib.irradiance.get_total_irradiance( | ||||
|         surface_tilt=0, | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| array: | ||||
|   system_size: 400 # in kWp | ||||
|   system_size: 900 # in kWp | ||||
|   spacing: 1 # spacing between adjacent panel rows in m | ||||
|   edge_setback: 1.8 # distance from the edge of the roof to the array | ||||
|   roof_slope: 0 | ||||
|  | ||||
							
								
								
									
										8
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								main.py
									
									
									
									
									
								
							| @ -3,10 +3,8 @@ import yaml | ||||
| import logging | ||||
| import numpy as np | ||||
| import matplotlib.pyplot as pl | ||||
| from Utilities.Shading import ( | ||||
|     calculate_energy_production_horizontal, | ||||
|     calculate_energy_production_vertical, | ||||
| ) | ||||
| from Utilities.Shading import calculate_energy_production_horizontal | ||||
| from Utilities.Optimisation import optimise_vertical_panel_pitch | ||||
| 
 | ||||
| logging.basicConfig( | ||||
|     level=logging.INFO, | ||||
| @ -30,7 +28,7 @@ logger.info("Configuration loaded successfully.") | ||||
| logger.debug(f"Configuration: {c}") | ||||
| 
 | ||||
| # calculate energy production for horizontal and vertical panels | ||||
| vertical_energy = calculate_energy_production_vertical(c) | ||||
| optimal_pitch, vertical_energy = optimise_vertical_panel_pitch(c) | ||||
| logger.info("Energy production for vertical panels calculated successfully.") | ||||
| logger.debug(f"Vertical Energy Production: {vertical_energy.sum()}") | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user