2024年华中杯数模竞赛A题完整解析(附代码)

基于动态优化的太阳能路灯光伏板朝向以最大化能量收集研究

摘要


随着可再生能源技术的发展,太阳能作为一种清洁的能源被广泛应用于城市基础设施,如路灯照明系统。太阳能路灯的效率不仅依赖于光伏板的性能,还受到安装位置、朝向和倾角的影响。因此,设计最优的光伏板朝向和倾角是提高太阳能路灯效率的关键。

问题1要求计算2025年每月15日光伏板在不同倾角下接收到的太阳直射辐射强度和总能量。根据地理位置和日照数据,我们首先计算了太阳的赤纬角和时角,进而估算每个倾角下光伏板的直射辐射强度。

问题2要求设计最优的光伏板朝向,以最大化日均太阳直射辐射总能量。通过模拟不同方位角和倾角的组合,我们发现最优朝向是面向正南,倾角为30°。

问题3需要考虑光伏板接收太阳直射强度的时间长度,以确保蓄电池的高效储能。我们设计了一个动态调整模型,根据季节变化自动调整光伏板的倾角和方位角。

本文针对太阳能路灯光伏板的朝向设计问题进行了深入研究。考虑到太阳能路灯光伏板接收太阳辐射的效率直接影响到电能的转换和储存效率,本研究首先分析了太阳辐射的基础理论,进而构建了一个数学模型来优化光伏板的朝向和倾角。

通过对2025年每月15日光伏板接收太阳直射强度和辐射总能量的计算,确定了光伏板的最优倾角和方向。此外,本文还利用实际气象数据和地理位置,考虑到日照时间和太阳直射强度的变化,设计了一种动态优化模型,以确保整年各时段光伏板均能以最高效率运行。

本研究的结果不仅可以为相关城市的太阳能路灯安装和维护提供理论指导,同时也为类似的太阳能应用系统的优化设计提供了新的思路和方法。

关键词:光伏板;直射辐射;动态调整;并行计算;动态优化

问题重述


随着全球对可再生能源需求的增加,太阳能作为一种清洁、可再生的能源来源,其在城市基础设施中的应用越来越广泛,尤其是在路灯照明系统中。太阳能路灯的效率不仅依赖于光伏板的物理和化学性能,更受到其安装位置、朝向和倾角的极大影响。因此,系统地设计最优的光伏板朝向和倾角,是实现高效能量转换和存储、延长设备使用寿命、减少维护成本的关键。
在这里插入图片描述

本文针对如何设计太阳能路灯的光伏板朝向和倾角进行研究,目标是在特定地理位置和典型气象条件下最大化太阳直射辐射的接收。通过这种优化,旨在提高光伏板的能量转换效率和电池的储能效率,从而增强整个系统的经济性和环境友好性。

问题分析


针对问题一:计算光伏板在不同倾角下的太阳直射强度和辐射总能量

  • 目标:计算2025年每月15日在晴天条件下,面积为1m²的光伏板朝向正南方且水平倾角分别为20°、40°、60°时受到的最大太阳直射强度和太阳直射辐射总能量。
  • 方法:
  1. 使用天文算法计算太阳位置(包括赤纬角、太阳高度角和太阳时角)。
  2. 根据光伏板的朝向和倾角,使用几何关系计算太阳光线与光伏板法线之间的角度,从而计算入射光的有效强度(考虑余弦损失)。
  3. 积分计算整个日照时间内的辐射总能量。

针对问题二:设计最优朝向以获取最大的太阳直射辐射日均总能量

  • 目标:设计固定安装的光伏板朝向,使得在晴天条件下受到的太阳直射辐射日均总能量最大。
  • 方法:
  1. 构建一个模型来模拟不同方位角和倾角对光伏板接收太阳能的影响。
  2. 运用优化算法(如遗传算法、模拟退火算法等)搜索最优的方位角和倾角。
  3. 评估不同方案下的日均总能量,选择最优方案。

针对问题三:优化光伏板的朝向以延长高效光照时间并增大蓄电量

  • 目标:设计光伏板的固定安装朝向,使得上午大于150 W/m²、下午大于100 W/m²的有效光照时间尽可能长,并计算这种条件下的日均总能量和高效时间长。
  • 方法:
  1. 模拟一天中不同时间的太阳高度角和太阳时角变化。
  2. 计算在不同方位角和倾角下,上午和下午达到或超过设定强度阈值的时间长度。
  3. 使用多目标优化方法同时优化日均总能量和高效光照时间。

模型假设


为了简化模型并专注于主要影响因素,我们做出以下假设:

  1. 光伏板主要接收的是太阳的直射辐射,忽略由云层和其他大气成分引起的辐射散射。
  2. 假设光伏板的性能在整个预测期内保持恒定,不考虑老化和环境因素的影响。
  3. 地区的日照时长和太阳轨迹在研究期间是稳定和可预测的,基于历史和气象数据的模式。
  4. 忽略地面反射和其他非直射光源的影响。

符号说明


在这里插入图片描述

代码

问题一

import pandas as pd

# 加载并显示两个工作表的数据
sheet1_data = pd.read_excel("附件.xlsx", sheet_name='Sheet1')
sheet2_data = pd.read_excel("附件.xlsx", sheet_name='Sheet2')

sheet1_data.head(), sheet2_data.head()

import numpy as np

# 定义计算赤纬角的函数
def declination_angle(day_of_year):
    return -23.44 * np.cos(np.radians((360 / 365) * (day_of_year + 10)))

# 2025年每月15日的日序号
days_2025 = np.array([15, 46, 74, 105, 135, 166, 196, 227, 258, 288, 319, 349])

# 计算赤纬角
declinations = declination_angle(days_2025)
print(f"赤纬角:{declinations}")

# 将纬度转换为度
latitude = 30 + 35/60

# 定义计算高度角的函数
def solar_altitude_angle(declination, latitude, hour_angle):
    declination_rad = np.radians(declination)
    latitude_rad = np.radians(latitude)
    return np.degrees(np.arcsin(
        np.sin(declination_rad) * np.sin(latitude_rad) + 
        np.cos(declination_rad) * np.cos(latitude_rad) * np.cos(np.radians(hour_angle))
    ))

# 计算上午9(时角 -45°)和下午3(时角 45°)的高度角
altitude_angles_9am = solar_altitude_angle(declinations, latitude, -45)
altitude_angles_3pm = solar_altitude_angle(declinations, latitude, 45)

print(altitude_angles_9am, altitude_angles_3pm)

# 定义计算光伏板与太阳射线夹角的函数
def angle_between_solar_panel_and_sun(declination, latitude, hour_angle, tilt):
    declination_rad = np.radians(declination)
    latitude_rad = np.radians(latitude)
    hour_angle_rad = np.radians(hour_angle)
    tilt_rad = np.radians(tilt)
    # 计算太阳射线与光伏板法线之间的角度
    cos_theta = (np.sin(declination_rad) * np.sin(latitude_rad) + 
                 np.cos(declination_rad) * np.cos(latitude_rad) * np.cos(hour_angle_rad)) * np.cos(tilt_rad) + \
                np.sin(hour_angle_rad) * np.cos(declination_rad) * np.sin(tilt_rad)
    return np.degrees(np.arccos(cos_theta))

# 定义计算直射辐射强度的函数
def direct_radiation_intensity(I0, angle):
    return I0 * np.cos(np.radians(angle))

# 计算各个倾角下的直射辐射强度
tilts = [20, 40, 60]
hour_angles = np.linspace(-90, 90, 73)  # 从日出到日落,每2度一个时角

# 大气层外的太阳辐射强度数据
I0_values = sheet2_data['I0W/m2)'].values

# 存储计算结果
max_intensities = pd.DataFrame(index=range(1, 13), columns=[f'Max Intensity for {tilt}°' for tilt in tilts])
total_radiations = pd.DataFrame(index=range(1, 13), columns=[f'Total Radiation for {tilt}°' for tilt in tilts])

for month, declination, I0 in zip(range(1, 13), declinations, I0_values):
    for tilt in tilts:
        intensities = []
        for ha in hour_angles:
            angle = angle_between_solar_panel_and_sun(declination, latitude, ha, tilt)
            intensity = direct_radiation_intensity(I0, angle)
            intensities.append(intensity)
        max_intensity = max(intensities)
        total_radiation = np.trapz(intensities, hour_angles)  # 使用数值积分计算总辐射能量
        max_intensities.loc[month, f'Max Intensity for {tilt}°'] = max_intensity
        total_radiations.loc[month, f'Total Radiation for {tilt}°'] = total_radiation

print(max_intensities, total_radiations)

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False   

# 创建图形和子图
fig, axes = plt.subplots(2, 1, figsize=(14, 12))

# 最大太阳直射强度图
for tilt, color in zip(tilts, ['b', 'g', 'r']):  # 使用不同颜色
    axes[0].plot(range(1, 13), max_intensities[f'Max Intensity for {tilt}°'].astype(float), label=f'{tilt}°', marker='o', linestyle='-', color=color)
axes[0].set_title('每月15日最大太阳直射强度', fontsize=16)
axes[0].set_xlabel('月份', fontsize=14)
axes[0].set_ylabel('最大直射强度 (W/)', fontsize=14)
axes[0].legend(fontsize=12)
axes[0].grid(True)
axes[0].set_xticks(range(1, 13))  # 设置x轴的刻度
axes[0].set_xticklabels(range(1, 13), fontsize=12)

# 太阳直射辐射总能量图
for tilt, color in zip(tilts, ['b', 'g', 'r']):  # 使用不同颜色
    axes[1].plot(range(1, 13), total_radiations[f'Total Radiation for {tilt}°'].astype(float), label=f'{tilt}°', marker='s', linestyle='-', color=color)
axes[1].set_title('每月15日太阳直射辐射总能量', fontsize=16)
axes[1].set_xlabel('月份', fontsize=14)
axes[1].set_ylabel('总辐射能量 (W·m²)', fontsize=14)
axes[1].legend(fontsize=12)
axes[1].grid(True)
axes[1].set_xticks(range(1, 13))  # 设置x轴的刻度
axes[1].set_xticklabels(range(1, 13), fontsize=12)

# 显示图形
plt.tight_layout()
plt.show()



完整资料获取

需要完整参考论文和代码的同学,点击下面咨询,或者关注公众号【云顶数模】哦

  • 12
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值