Міністерство освіти і науки України
НТУУ «КПІ ім. І. Сікорського»
Кафедра цифрових технологій в енергетиці
Моделювання систем в енергетиці
Лабораторна робота №2
Тема: Розробка імітаційної моделі діючої сонячної електростанції
Завданням роботи є створення математичного апарату для визначення сумарної сонячної радіації як складової частини моделі сонячної електростанції. Результатом роботи є визначення сумарної сонячної радіації в кожен момент часу з подальшим використанням програми в моделі прогнозування експлуатаційних характеристик сонячної електростанції.
Для виконання лабораторної роботи було обрано місто Київ. Створено програму для розрахунку інсоляції у певні дні року, внаслідок чого було побудовано графіки, для повного показання відмінностями між порами року.Графіки://
/
/Зібрані дані:/
Висновок: Під час виконання лабораторної роботи було спроектовано програму, яка допомагає аналізувати інсоляцію у різні пори року, у певні дні, та зібрати дані, що у майбутньому допоможуть для аналізу.Лістинг програми:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
SOLAR_CONSTANT = 1367
ALBEDO = 0.2
LATITUDE = 50.0 # Example latitude in degrees (e.g., Kyiv)
LONGITUDE = 30.0 # Example longitude in degrees
KT = 0.7
days_of_interest = {
"December": 355, # December 21
"April": 110, # April 20
"July": 200, # July 19
"September": 265 # September 22
}
time_of_day = np.linspace(0, 24, 100) # From 0:00 to 24:00
# Solar declination (δ) calculation
def solar_declination(day_of_year):
return 23.45 * np.sin(np.radians((360 / 365) * (day_of_year - 81)))
# Hour angle (ω) calculation
def hour_angle(hour):
return 15 * (hour - 12)
# Zenith angle (θz) calculation
def zenith_angle(latitude, declination, hour_angle):
return np.degrees(np.arccos(
np.sin(np.radians(latitude)) * np.sin(np.radians(declination)) +
np.cos(np.radians(latitude)) * np.cos(np.radians(declination)) * np.cos(np.radians(hour_angle))
))
# Solar radiation on a horizontal surface (Ih)
def solar_radiation_horizontal(zenith_angle, kt):
return kt * SOLAR_CONSTANT * np.maximum(np.cos(np.radians(zenith_angle)), 0)
# Solar radiation on an inclined surface (Ii)
def solar_radiation_inclined(horizontal_radiation, inclination_angle, albedo=ALBEDO):
return horizontal_radiation * (np.cos(np.radians(inclination_angle)) +
albedo * (1 - np.cos(np.radians(inclination_angle))) / 2)
# Generate results for all months
results = {}
for month, day in days_of_interest.items():
declination = solar_declination(day)
hourly_zenith = zenith_angle(LATITUDE, declination, hour_angle(time_of_day))
hourly_radiation = solar_radiation_horizontal(hourly_zenith, KT)
results[month] = {
"time_of_day": time_of_day,
"zenith_angle": hourly_zenith,
"horizontal_radiation": hourly_radiation,
"inclined_radiation_30": solar_radiation_inclined(hourly_radiation, 30),
"inclined_radiation_60": solar_radiation_inclined(hourly_radiation, 60),
}
# Convert to DataFrame for easier plotting
dfs = {month: pd.DataFrame(data) for month, data in results.items()}
# Plot graphs
for month, df in dfs.items():
plt.figure(figsize=(10, 6))
plt.plot(df["time_of_day"], df["horizontal_radiation"], label="Horizontal Radiation")
plt.plot(df["time_of_day"], df["inclined_radiation_30"], label="Inclined Radiation (30°)")
plt.plot(df["time_of_day"], df["inclined_radiation_60"], label="Inclined Radiation (60°)")
plt.title(f"Solar Radiation Throughout the Day ({month})")
plt.xlabel("Time of Day (hours)")
plt.ylabel("Solar Radiation (W/m²)")
plt.legend()
plt.grid()
plt.show()
dfs = {month: pd.DataFrame(data) for month, data in results.items()}
dfs_combined = pd.concat(dfs, keys=dfs.keys())
dfs_combined.to_csv("solar_radiation_data.csv", index=True)
data = pd.read_csv("solar_radiation_data.csv");
print(data.head(10))