2024电工杯A题保姆级分析完整思路+代码+数据教学
A题题目:园区微电网风光储协调优化配置
接下来我们将按照题目总体分析-背景分析-各小问分析的形式来
总体分析:
题目要求对园区微电网进行风光储协调优化配置,具体涉及三个园区(A、B、C)的独立运营和联合运营情况。目标是通过合理配置储能系统,尽量提高风光电量的负荷占比,减少弃电,同时考虑投资及其收益。具体需要解决以下几个问题:
问题1:各园区独立运营储能配置方案及经济性分析
-
未配置储能时各园区的购电量、弃风弃光电量、总供电成本和单位电量平均供电成本分析。
-
配置50kW/100kWh储能系统后的经济性、最优运行策略及购电计划分析。
-
判断50kW/100kWh方案是否最优,若不是,制定最优储能配置方案并论证其优越性。
问题2:联合园区储能配置方案及经济性分析
-
未配置储能时联合园区的总购电量、总弃风弃光电量、总供电成本和单位电量平均供电成本分析。
-
制定联合园区的储能最优配置方案及其运行策略、购电计划,分析经济性。
-
比较联合运营与独立运营的经济收益,并分析主要影响因素。
问题3:园区风、光、储能的协调配置方案及经济性分析
-
考虑负荷增长50%后的独立运营和联合运营方案,制定风光储协调配置方案。
-
按全年12个月典型日风光发电数据,结合分时电价制定购电计划并分析经济性。
背景分析:
随着可再生能源(如风电和光伏发电)的普及,如何高效利用这些不稳定的电力资源成为一个重要课题。微电网系统通过结合风电、光伏发电与储能系统,能够在一定程度上解决风光发电的波动性和间歇性问题,优化电力资源配置,提高可再生能源的利用率。
具体背景:
-
园区微电网结构:
-
三个园区(A、B、C)各自独立接入主电网。
-
每个园区均有其最大负荷及风光发电装机容量(园区A:750kW光伏,447kW负荷;园区B:1000kW风电,419kW负荷;园区C:600kW光伏、500kW风电,506kW负荷)。
-
经济性考量:
-
可再生能源优先供给园区负荷,电力不足部分从主电网购电(购电价格1元/kWh)。
-
由于风光发电的波动特性,可能出现弃电现象(风电、光伏电量超过负荷且不能售回主电网)。
-
储能系统配置:
-
配置磷酸铁锂电池储能系统(功率单价800元/kW,能量单价1800元/kWh,SOC范围10%-90%,充/放电效率95%,寿命10年)。
-
通过配置储能系统,能够缓解负荷与发电功率的不匹配,减少弃电量。
问题分析:
-
独立运营的经济性分析:
-
未配置储能时的经济性:购电量、弃电量、总供电成本及平均供电成本。
-
配置储能系统后的经济性:储能运行策略及购电计划,分析是否改善经济性。
-
联合运营的经济性分析:
-
未配置储能时,三个园区联合运营的经济性:总购电量、总弃电量、总供电成本及平均供电成本。
-
制定联合运营的储能最优配置方案,并分析其经济性。
-
比较独立运营与联合运营的经济收益,分析主要影响因素。
-
风光储协调配置方案:
-
考虑负荷增长50%后的独立运营和联合运营方案。
-
使用全年12个月的典型日发电数据,结合分时电价制定购电计划,分析经济性。
通过以上分析,最终来优化储能配置,提高风光发电的利用率,降低总供电成本,实现经济效益的最大化。
数据集分析:
我们以附件1为例,对其进行数据预处理和EDA(探索性数据分析),我们分为以下几步(python代码)
-
读取数据
-
数据预处理
-
检查缺失值
-
数据类型转换
-
EDA
-
各园区负荷数据的基本统计描述
-
各园区负荷数据的可视化
1. 读取数据
import pandas as pd
# 读取附件1:各园区典型日负荷数据
file_path = '/mnt/data/附件1:各园区典型日负荷数据.xlsx'
load_data = pd.read_excel(file_path, sheet_name=None)
# 查看数据表名称
sheet_names = load_data.keys()
print("数据表名称:", sheet_names)
# 提取每个园区的数据
load_data_A = load_data['园区A']
load_data_B = load_data['园区B']
load_data_C = load_data['园区C']
# 显示每个园区数据的前几行
print("园区A负荷数据前几行:")
print(load_data_A.head())
print("\n园区B负荷数据前几行:")
print(load_data_B.head())
print("\n园区C负荷数据前几行:")
print(load_data_C.head())
2. 数据预处理
检查缺失值和数据类型转换
# 检查各园区数据的缺失值情况
print("园区A缺失值情况:")
print(load_data_A.isnull().sum())
print("\n园区B缺失值情况:")
print(load_data_B.isnull().sum())
print("\n园区C缺失值情况:")
print(load_data_C.isnull().sum())
# 检查数据类型
print("\n园区A数据类型:")
print(load_data_A.dtypes)
print("\n园区B数据类型:")
print(load_data_B.dtypes)
print("\n园区C数据类型:")
print(load_data_C.dtypes)
# 如有必要,进行数据类型转换(此处假设数据类型已经正确,不需要转换)
3. 探索性数据分析(EDA)
基本统计描述
# 各园区负荷数据的基本统计描述
print("园区A负荷数据基本统计描述:")
print(load_data_A.describe())
print("\n园区B负荷数据基本统计描述:")
print(load_data_B.describe())
print("\n园区C负荷数据基本统计描述:")
print(load_data_C.describe())
负荷数据可视化
import matplotlib.pyplot as plt
# 设置绘图风格
plt.style.use('seaborn-darkgrid')
# 可视化园区A的负荷数据
plt.figure(figsize=(12, 6))
plt.plot(load_data_A['时间'], load_data_A['负荷'], label='园区A负荷')
plt.xlabel('时间 (小时)')
plt.ylabel('负荷 (kW)')
plt.title('园区A典型日负荷曲线')
plt.legend()
plt.show()
# 可视化园区B的负荷数据
plt.figure(figsize=(12, 6))
plt.plot(load_data_B['时间'], load_data_B['负荷'], label='园区B负荷', color='orange')
plt.xlabel('时间 (小时)')
plt.ylabel('负荷 (kW)')
plt.title('园区B典型日负荷曲线')
plt.legend()
plt.show()
# 可视化园区C的负荷数据
plt.figure(figsize=(12, 6))
plt.plot(load_data_C['时间'], load_data_C['负荷'], label='园区C负荷', color='green')
plt.xlabel('时间 (小时)')
plt.ylabel('负荷 (kW)')
plt.title('园区C典型日负荷曲线')
plt.legend()
plt.show()
问题一分析:
这个问题包含三个部分:
-
未配置储能时的经济性分析
-
配置储能后的经济性分析
-
储能系统配置方案优化
下面详细分析每个部分需要解决的问题和方法。
1.1 未配置储能时的经济性分析
需要解决的问题:
-
计算各园区的购电量。
-
计算各园区的弃风弃光电量。
-
计算总供电成本和单位电量平均供电成本。
-
分析影响经济性的关键因素。
步骤:
-
从负荷数据和风光发电数据中提取各园区的典型日数据。
-
计算各时刻的风光发电总量。
-
比较风光发电总量与负荷需求,计算购电量和弃电量。
-
计算总供电成本和单位电量平均供电成本。
1.2 配置储能后的经济性分析
需要解决的问题:
-
配置50kW/100kWh储能系统后的经济性分析。
-
制定储能最优运行策略及购电计划。
-
分析配置储能后的运行经济性是否改善及其原因。
步骤:
-
引入储能系统,考虑储能系统的功率和容量限制,以及充放电效率。
-
在负荷需求大于风光发电时,优先使用储能系统提供电力,不足部分从电网购电。
-
在风光发电大于负荷需求时,优先充电至储能系统,超出部分视为弃电。
-
计算配置储能系统后的购电量、弃电量、总供电成本和单位电量平均供电成本。
-
比较未配置储能和配置储能情况下的经济性。
1.3 储能系统配置方案优化
需要解决的问题:
-
判断50kW/100kWh储能方案是否最优。
-
如果不是,制定各园区最优的储能功率、容量配置方案。
-
论证所制定方案的优越性。
步骤:
-
通过不同储能配置方案的模拟,比较各配置方案的经济性指标。
-
确定在各园区经济性最优的储能功率和容量配置。
-
分析最优配置方案的优越性,包括投资成本与运行成本的综合考虑。
下面给大家第一问需要的代码,包括未配置储能时的经济性分析和配置储能后的经济性分析:
读取数据和初步预处理
import pandas as pd
# 读取附件1:各园区典型日负荷数据
file_path = '/mnt/data/附件1:各园区典型日负荷数据.xlsx'
load_data = pd.read_excel(file_path, sheet_name=None)
# 提取每个园区的数据
load_data_A = load_data['园区A']
load_data_B = load_data['园区B']
load_data_C = load_data['园区C']
# 读取附件2:各园区典型日风光发电数据
file_path_gen = '/mnt/data/附件2:各园区典型日风光发电数据.xlsx'
generation_data = pd.read_excel(file_path_gen, sheet_name=None)
# 提取每个园区的发电数据
generation_data_A = generation_data['园区A']
generation_data_B = generation_data['园区B']
generation_data_C = generation_data['园区C']
计算未配置储能时的经济性
# 定义购电成本
grid_cost = 1 # 元/kWh
# 计算未配置储能时的购电量、弃风弃光电量和供电成本
def calculate_no_storage(load, generation):
load['购电量'] = 0
load['弃电量'] = 0
load['供电成本'] = 0
for i in range(len(load)):
generation_total = generation['风电功率'][i] + generation['光伏功率'][i]
if generation_total >= load['负荷'][i]:
load['弃电量'][i] = generation_total - load['负荷'][i]
else:
load['购电量'][i] = load['负荷'][i] - generation_total
load['供电成本'][i] = load['购电量'][i] * grid_cost
total_cost = load['供电成本'].sum()
total_load = load['负荷'].sum()
avg_cost = total_cost / total_load if total_load != 0 else 0
return total_cost, avg_cost, load['购电量'].sum(), load['弃电量'].sum()
# 园区A
total_cost_A, avg_cost_A, total_grid_A, total_discard_A = calculate_no_storage(load_data_A, generation_data_A)
print(f"园区A未配置储能时总供电成本: {total_cost_A} 元, 单位电量平均供电成本: {avg_cost_A} 元/kWh, 总购电量: {total_grid_A} kWh, 总弃电量: {total_discard_A} kWh")
# 园区B
total_cost_B, avg_cost_B, total_grid_B, total_discard_B = calculate_no_storage(load_data_B, generation_data_B)
print(f"园区B未配置储能时总供电成本: {total_cost_B} 元, 单位电量平均供电成本: {avg_cost_B} 元/kWh, 总购电量: {total_grid_B} kWh, 总弃电量: {total_discard_B} kWh")
# 园区C
total_cost_C, avg_cost_C, total_grid_C, total_discard_C = calculate_no_storage(load_data_C, generation_data_C)
print(f"园区C未配置储能时总供电成本: {total_cost_C} 元, 单位电量平均供电成本: {avg_cost_C} 元/kWh, 总购电量: {total_grid_C} kWh, 总弃电量: {total_discard_C} kWh")
计算配置储能后的经济性
# 定义储能系统参数
storage_power = 50 # kW
storage_capacity = 100 # kWh
storage_efficiency = 0.95
soc_min = 0.1
soc_max = 0.9
# 计算配置储能后的购电量、弃风弃光电量和供电成本
def calculate_with_storage(load, generation):
load['购电量'] = 0
load['弃电量'] = 0
load['供电成本'] = 0
soc = storage_capacity * soc_max # 初始SOC设为最大值
for i in range(len(load)):
generation_total = generation['风电功率'][i] + generation['光伏功率'][i]
load_needed = load['负荷'][i]
if generation_total >= load_needed:
surplus = generation_total - load_needed
if soc < storage_capacity * soc_max:
charge_power = min(surplus, storage_power) * storage_efficiency
soc += charge_power
if soc > storage_capacity * soc_max:
soc = storage_capacity * soc_max
surplus -= charge_power / storage_efficiency
load['弃电量'][i] = surplus
else:
deficit = load_needed - generation_total
if soc > storage_capacity * soc_min:
discharge_power = min(deficit, storage_power) / storage_efficiency
soc -= discharge_power
if soc < storage_capacity * soc_min:
soc = storage_capacity * soc_min
deficit -= discharge_power * storage_efficiency
load['购电量'][i] = deficit
load['供电成本'][i] = load['购电量'][i] * grid_cost
total_cost = load['供电成本'].sum()
total_load = load['负荷'].sum()
avg_cost = total_cost / total_load if total_load != 0 else 0
return total_cost, avg_cost, load['购电量'].sum(), load['弃电量'].sum()
# 园区A
total_cost_A_with_storage, avg_cost_A_with_storage, total_grid_A_with_storage, total_discard_A_with_storage = calculate_with_storage(load_data_A, generation_data_A)
print(f"园区A配置储能后总供电成本: {total_cost_A_with_storage} 元, 单位电量平均供电成本: {avg_cost_A_with_storage} 元/kWh, 总购电量: {total_grid_A_with_storage} kWh, 总弃电量: {total_discard_A_with_storage} kWh")
# 园区B
total_cost_B_with_storage, avg_cost_B_with_storage, total_grid_B_with_storage, total_discard_B_with_storage = calculate_with_storage(load_data_B, generation_data_B)
print(f"园区B配置储能后总供电成本: {total_cost_B_with_storage} 元, 单位电量平均
当然,第一问想要做的出彩,可以使用以下方法:
混合整数线性规划(Mixed-Integer Linear Programming, MILP)
混合整数线性规划适用于包含整数变量的优化问题。储能系统配置中的开关状态、充放电决策可以用整数变量表示,通过MILP求解最优配置方案。
元启发式算法(Metaheuristic Algorithms)
例如,遗传算法(Genetic Algorithm)、粒子群优化(Particle Swarm Optimization, PSO)等,这些算法能够有效搜索复杂的非线性和非凸优化空间,找到近似最优解。
仿真建模与蒙特卡洛模拟(Simulation Modeling and Monte Carlo Simulation)
这里给大家讲解一下粒子群优化如何做这道题目:
PSO算法概述
PSO通过模拟鸟群觅食行为来优化问题,主要包括以下步骤:
-
初始化一群粒子,每个粒子表示一个潜在解。
-
更新每个粒子的速度和位置,使其趋向于自身和群体的最佳位置。
-
评估每个粒子的适应度值,根据适应度值更新全局最佳位置。
-
重复以上步骤直到满足终止条件(如达到最大迭代次数或适应度值变化小于设定阈值)。
Python实现
下面是一个使用PSO算法优化储能系统配置方案的示例代码。假设我们需要优化储能系统的功率和容量,以最小化总供电成本。
import numpy as np
import pandas as pd
from pyswarm import pso
# 读取数据
file_path = '/mnt/data/附件1:各园区典型日负荷数据.xlsx'
load_data = pd.read_excel(file_path, sheet_name=None)
load_data_A = load_data['园区A']
file_path_gen = '/mnt/data/附件2:各园区典型日风光发电数据.xlsx'
generation_data = pd.read_excel(file_path_gen, sheet_name=None)
generation_data_A = generation_data['园区A']
# 定义PSO优化目标函数
def cost_function(x):
storage_power, storage_capacity = x
storage_efficiency = 0.95
soc_min, soc_max = 0.1, 0.9
grid_cost = 1
T = len(load_data_A)
soc = storage_capacity * soc_max # 初始SOC设为最大值
total_cost = 0
for t in range(T):
generation_total = generation_data_A['风电功率'][t] + generation_data_A['光伏功率'][t]
load_needed = load_data_A['负荷'][t]
if generation_total >= load_needed:
surplus = generation_total - load_needed
if soc < storage_capacity * soc_max:
charge_power = min(surplus, storage_power) * storage_efficiency
soc += charge_power
if soc > storage_capacity * soc_max:
soc = storage_capacity * soc_max
surplus -= charge_power / storage_efficiency
else:
deficit = load_needed - generation_total
if soc > storage_capacity * soc_min:
discharge_power = min(deficit, storage_power) / storage_efficiency
soc -= discharge_power
if soc < storage_capacity * soc_min:
soc = storage_capacity * soc_min
deficit -= discharge_power * storage_efficiency
total_cost += deficit * grid_cost
return total_cost
# PSO参数
lb = [10, 50] # 储能功率和容量的下界
ub = [200, 500] # 储能功率和容量的上界
maxiter = 100 # 最大迭代次数
swarmsize = 30 # 粒子群大小
# 执行PSO优化
best_x, best_cost = pso(cost_function, lb, ub, swarmsize=swarmsize, maxiter=maxiter)
print(f"最优储能功率: {best_x[0]} kW")
print(f"最优储能容量: {best_x[1]} kWh")
print(f"最小总供电成本: {best_cost} 元")
通过上述代码,我们使用PSO算法优化了储能系统的功率和容量配置,找到了使总供电成本最小化的最优配置方案。可以根据具体问题和数据调整PSO算法的参数(如粒子群大小、最大迭代次数)来获得更优的结果。
问题2-3后续更新
其中更详细的思路、各题目思路、代码、讲解视频、成品论文及其他相关内容,可以点击下方名片获取哦!