在做微电网规划时,容量配置往往是第一个要面对的问题:风电装多少、光伏装多少、储能配多大,这直接决定了系统能不能安全运行、投资划不划算。但真正动手建模时你会发现,风电和光伏出力本身就不稳定,负荷也有波动,如果只按确定性单一场景去算,得到的“最优容量”往往会在实际运行中暴露出缺口。本文围绕风光储微电网容量规划中的混合不确定性处理展开,讲清楚如何把鲁棒优化和协同优化结合起来,并给出可运行的 Python 建模示例与工程排查建议。对微电网规划工程师、能源方向研究生,以及做电力系统优化建模的开发者都会有一定参考价值。
1. 风光储微电网容量规划:要解决什么问题
1.1 微电网容量规划的基本概念
微电网是指由分布式电源、储能装置、负荷和监控保护装置组成的小型发配电系统,既可以并网运行,也可以孤岛运行。常见的分布式电源就是风力发电和光伏发电,再加上储能电池,形成“风光储”组合。
容量规划要回答的问题非常直观:
- 风机装多少容量,单位是 kW 或 MW;
- 光伏板装多少容量;
- 储能电池的额定功率和额定能量各是多少;
- 是否需要配置并网交互容量,交互上限是多少。
这些决策不是简单地把负荷加起来然后除以一个利用小时数,因为风光出力的时序特性和负荷的时序特性并不完全匹配。白天光伏高、晚上很可能是负荷高峰,这种错峰特性只有通过储能或者电网交互才能平衡。因此容量规划本质上是一个“源—荷—储”时序匹配问题。
1.2 为什么要考虑混合不确定性
传统规划通常使用典型日数据,把风电、光伏和负荷当作已知曲线。但实际运行中:
- 风速变化导致风电出力波动;
- 云层遮挡导致光伏出力骤降;
- 负荷受季节、天气、生产安排影响,存在随机性。
如果规划阶段只采用一组确定性曲线,一旦实际出力偏离预测值,系统可能出现两类问题:一是缺电,表现为切负荷;二是弃风弃光,表现为资源浪费。所以容量规划不能只做“点估计”,必须引入不确定性描述。
这里的“混合不确定性”是指几类不确定性同时存在:风电不确定性、光伏不确定性、负荷不确定性,甚至电价和燃料价格也在变化。它们叠加在一起,会让决策结果的鲁棒性显著变差。处理这种混合不确定性,正是鲁棒优化方法在微电网容量规划中的核心价值。
1.3 为什么需要协同优化
很多项目在工程上会先估算风电和光伏容量,再根据最大缺额配置储能,这是一种“串联式”思路。但储能容量到底该配多大,不仅取决于缺额大小,还取决于风电和光伏的装机比例,以及运行策略如何调度。
例如,光伏装得多,午间富余电量多,储能容量就有机会在午间充电并转移至晚高峰放电;但如果风电容量更高,夜间出力充足,储能的需求又会变化。这说明电源容量和储能容量之间存在强耦合关系。协同优化,就是在同一套优化模型中同时求解风机容量、光伏容量、储能功率和储能能量,并且把运行层的调度模拟也纳入优化过程。
2. 混合不确定性的数学刻画
2.1 风电出力的不确定性
风电出力主要由风速决定。风速通常用 Weibull 分布描述,但风机出力与风速之间是分段函数关系:切入风速以下无出力,额定风速附近满发,切出风速以上停机。
在规划模型中,常用“最大可用出力系数法”:
[ P_{w,t}^{max} = cf_{w,t} \cdot C_w ]
其中 (C_w) 是风机装机容量,(cf_{w,t}) 是 t 时段的可利用系数,取值在 0 到 1 之间。如果考虑不确定性,(cf_{w,t}) 就不再是一个固定值,而是区间:
[ cf_{w,t} \in [\underline{cf}{w,t}, \overline{cf}{w,t}] ]
这样,风电出力就变成了一个不确定变量。区间宽度越大,表示预报误差越大。
2.2 光伏出力的不确定性
光伏出力与太阳辐照度、环境温度密切相关。晴天时光伏曲线平滑,阴天、多云时出力波动剧烈。光伏的不确定性比风电更容易出现“骤降”场景,比如一片云挡住整个光伏阵列,出力可能在十几分钟内从 60% 掉到 10%。
同样,光伏利用系数也可以写成区间形式:
[ cf_{pv,t} \in [\underline{cf}{pv,t}, \overline{cf}{pv,t}] ]
在此基础上,还可以加入空间相关性:相邻区域的光伏出力波动往往同步,而不同区域的风速波动相关性相对较弱。不过对于中小型微电网,先把各时段独立的区间不确定性建模好,已经能解决大部分规划问题。
2.3 负荷不确定性的混合描述
负荷不确定性常被忽略,但在孤岛型或弱并网型微电网中,负荷波动可能比风光波动更致命。负荷的预测误差同样可以表示为一个区间,或者一个预测值加上一个偏置量。
混合不确定性集合可以写为:
[ U = { (cf_w, cf_{pv}, L) : \underline{cf}{w,t} \le cf{w,t} \le \overline{cf}{w,t}, \underline{cf}{pv,t} \le cf_{pv,t} \le \overline{cf}_{pv,t}, \underline{L}_t \le L_t \le \overline{L}_t } ]
这种“盒式不确定集合”是鲁棒优化中最基础的形式,表达直观,求解也相对容易。实际研究中还有椭球集合、多面体集合、带预算约束的不确定集合等,核心思路都是通过集合约束控制不确定变量的变化范围,避免最坏情况下结果过于保守。
2.4 常见不确定集合对比
| 不确定集合类型 | 表达式特点 | 保守程度 | 求解复杂度 |
|---|---|---|---|
| 盒式集合 | 每个变量独立区间 | 较高 | 低 |
| 预算不确定集合 | 同时偏离预测的时段数受限 | 中等 | 低 |
| 椭球集合 | 用椭圆描述联合变化范围 | 较低 | 中 |
| 场景集合 | 基于历史数据生成离散场景 | 与场景相关 | 随场景数增大 |
盒式集合最常用,因为工程上只需要给定上下界,不需要假设概率分布。如果希望降低保守性,可以引入鲁棒调节参数,限制“最多同时有多少个时段取最差值”,这就是预算不确定集合的思想。
3. 容量规划协同优化模型构建
3.1 决策变量与两层结构
容量规划本质上是两阶段决策问题:
- 第一阶段:决定风机、光伏、储能的额定容量,这类决策在项目投运前就要确定;
- 第二阶段:在已知容量的前提下,根据每个时段的风光出力和负荷,安排储能充放电、购电、切负荷等运行策略。
两阶段之外,还有第三层不确定性:风、光、负荷的具体取值。三层结构合在一起,可以写成“min-max-min”或“min-max”的形式,规划层做最小化投资成本,运行层在最坏不确定性场景下做最小化运行成本。
3.2 目标函数设计
协同优化的目标一般是最小化全生命周期成本,常见表达式是:
[ obj = C_{inv}^{w} + C_{inv}^{pv} + C_{inv}^{bat} + C_{op} ]
其中:
- (C_{inv}^{w}) 为风机年化投资成本;
- (C_{inv}^{pv}) 为光伏年化投资成本;
- (C_{inv}^{bat}) 为储能投资成本,包括能量成本与功率成本;
- (C_{op}) 为运行成本,包含购电成本、运维成本、切负荷惩罚、弃风弃光惩罚。
为了便于在示例中计算,我会把投资成本折算成“每日成本”,再用一个典型日做运行模拟。工程上更严谨的做法是采用多种典型场景加权求和,或者直接全年 8760 小时精细模拟。
3.3 运行约束
运行约束是整个模型的骨架,主要包括:
功率平衡约束:
[ p_{w,t} + p_{pv,t} + p_{dis,t} + p_{grid,t} + p_{shed,t} = L_t + p_{ch,t} + p_{cur,t} ]
其中 (p_{cur,t}) 是弃风弃光功率。
储能 SOC 递推约束:
[ SOC_{t+1} = SOC_t + \eta_c \cdot p_{ch,t} - \frac{p_{dis,t}}{\eta_d} ]
充电和放电功率上限:
[ 0 \le p_{ch,t} \le P_{bat}, \quad 0 \le p_{dis,t} \le P_{bat} ]
[ 0 \le SOC_t \le E_{bat} ]
并网交互约束:
[ 0 \le p_{grid,t} \le P_{grid}^{max} ]
每一条约束都有明确的工程含义。功率平衡保证系统每时每刻不出现能量缺口;SOC 递推约束防止储能“凭空发电”;充放电功率上限对应储能变流器 PCS 的容量;SOC 上限对应电池能量容量;并网交互约束代表联络线极限。
3.4 为什么储能容量要作为决策变量
储能有两个维度:功率和能量。功率决定了能多快充放电,能量决定了能存多少电。很多简化模型只把储能看成“一个电池”,忽略了功率和能量是两个独立变量。在实际工程中:
- 如果光伏午间富余时间短但功率大,需要的是高功率、中等能量;
- 如果晚高峰持续时间长,需要的是大能量、功率要求反而低。
因此在协同优化模型中,储能功率 (P_{bat}) 和储能能量 (E_{bat}) 应该分开决策。目标函数中分别是 (c_p \cdot P_{bat}) 和 (c_e \cdot E_{bat})。
4. 求解思路:两阶段鲁棒优化与 C&CG 算法
4.1 两阶段鲁棒优化的核心思想
两阶段鲁棒优化的标准形式是:
[ \min_x ; c^T x + \max_{u \in U} \min_{y \in F(x,u)} d^T y ]
其中:
- (x) 是一阶段变量,例如风机、光伏、储能容量;
- (u) 是不确定性变量,例如风光出力系数、负荷;
- (y) 是二阶段运行变量,例如充放电功率、购电功率;
- (F(x,u)) 是在给定 (x) 和 (u) 下的运行可行域。
外层 min 求容量决策成本最低,内层 max 求最坏不确定性场景,最内层 min 在最坏场景下尽力降低运行成本。这样的结果能保证:即使不确定性取到集合内最差组合,系统依然可以通过合理的运行调度满足负荷需求。
4.2 C&CG 算法流程
C&CG 全称是 Column-and-Constraint Generation,也就是列与约束生成算法,是目前求解两阶段鲁棒优化最常用的方法之一。基本流程如下:
- 初始化一个最坏场景;
- 求解主问题,在已知场景集下得到容量决策及其目标函数下界;
- 固定容量决策,求解子问题,寻找当前最坏场景;
- 如果最坏场景对应的目标值与主问题结果之差满足收敛条件,停止;
- 否则把该最坏场景作为新约束加入主问题,继续迭代。
这套算法在中小规模模型上收敛速度通常很快。工程实现时,可以使用 Gurobi、Cplex 这类商业求解器,也可以使用开源求解器。
4.3 求解工具怎么选
- 学术研究和原型验证:Python + cvxpy + 开源求解器,例如 OSQP、CLARABEL;
- 大规模工程计算:Gurobi 或 Cplex,配合 C&CG 算法;
- 快速对比方案:可以先跑确定性优化,再跑不确定性增强,观察容量变化趋势。
本文示例使用 Python + cvxpy,目的是跑通完整流程,重点演示模型构建思路,而不是追求工业级求解性能。
5. 案例设计与可运行示例
5.1 案例数据准备
设计一个并网型风光储微电网,24 小时优化周期,时间分辨率为 1 小时。负荷数据、风光系数、电价数据均为示例数据,读者可以替换成自己项目的实测数据。
安装依赖:
pip install numpy cvxpy5.2 确定性容量规划模型
下面这段代码是一个完整的确定性协同优化模型。它同时决策风机容量、光伏容量、储能能量和储能功率,并模拟典型日 24 小时的运行策略。
import numpy as np import cvxpy as cp # 24小时示例数据 T = 24 # 负荷曲线,单位 kW load = np.array([ 40, 35, 32, 30, 32, 38, 50, 62, 70, 75, 68, 60, 55, 58, 55, 50, 60, 70, 80, 85, 82, 75, 62, 50 ]) # 风电最大可用系数 cf_w = np.array([ 0.70, 0.75, 0.80, 0.70, 0.60, 0.50, 0.45, 0.40, 0.35, 0.30, 0.30, 0.35, 0.40, 0.38, 0.35, 0.30, 0.32, 0.40, 0.50, 0.55, 0.60, 0.58, 0.55, 0.68 ]) # 光伏最大可用系数 cf_pv = np.array([ 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.05, 0.20, 0.40, 0.60, 0.75, 0.85, 0.80, 0.60, 0.45, 0.25, 0.10, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 ]) # 分时电价,元/kWh price = np.array([ 0.30, 0.30, 0.30, 0.30, 0.30, 0.30, 0.30, 0.60, 0.60, 0.60, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 0.60, 0.60, 0.60, 0.60 ]) # 成本参数(折算到日) cw_daily = 2.0 # 风机单位容量日成本,元/kW cpv_daily = 1.2 # 光伏单位容量日成本,元/kW ce_daily = 0.8 # 储能单位能量日成本,元/kWh cp_daily = 0.3 # 储能单位功率日成本,元/kW shed_penalty = 500 # 切负荷惩罚系数,元/kWh # 并网交互上限,kW grid_max = 10.0 # 储能效率 eta_c = 0.95 eta_d = 0.95 soc_0_ratio = 0.3 def solve_planning(cf_w_input, cf_pv_input): # 一阶段容量变量 P_w = cp.Variable(nonneg=True) P_pv = cp.Variable(nonneg=True) E_bat = cp.Variable(nonneg=True) P_bat = cp.Variable(nonneg=True) # 二阶段运行变量 p_w = cp.Variable(T, nonneg=True) p_pv = cp.Variable(T, nonneg=True) p_ch = cp.Variable(T, nonneg=True) p_dis = cp.Variable(T, nonneg=True) p_grid = cp.Variable(T, nonneg=True) p_cur = cp.Variable(T, nonneg=True) p_shed = cp.Variable(T, nonneg=True) soc = cp.Variable(T, nonneg=True) constraints = [] for t in range(T): constraints += [ p_w[t] <= cf_w_input[t] * P_w, p_pv[t] <= cf_pv_input[t] * P_pv, p_ch[t] <= P_bat, p_dis[t] <= P_bat, p_grid[t] <= grid_max, soc[t] <= E_bat, p_w[t] + p_pv[t] + p_dis[t] + p_grid[t] + p_shed[t] == load[t] + p_ch[t] + p_cur[t] ] # 储能 SOC 递推 constraints += [ soc[0] == soc_0_ratio * E_bat + eta_c * p_ch[0] - p_dis[0] / eta_d ] for t in range(1, T): constraints += [ soc[t] == soc[t-1] + eta_c * p_ch[t] - p_dis[t] / eta_d ] # 周期末 SOC 回到初值比例 constraints += [ soc[T-1] == soc_0_ratio * E_bat ] # 目标函数 cost = ( cw_daily * P_w + cpv_daily * P_pv + ce_daily * E_bat + cp_daily * P_bat + cp.sum(price * p_grid) + shed_penalty * cp.sum(p_shed) ) prob = cp.Problem(cp.Minimize(cost), constraints) prob.solve() return prob.status, P_w.value, P_pv.value, E_bat.value, P_bat.value, prob.value status, P_w, P_pv, E_bat, P_bat, total = solve_planning(cf_w, cf_pv) print("求解状态:", status) print("风机容量(kW):", round(P_w, 2)) print("光伏容量(kW):", round(P_pv, 2)) print("储能能量(kWh):", round(E_bat, 2)) print("储能功率(kW):", round(P_bat, 2)) print("总成本(元/日):", round(total, 2))代码说明:
P_w、P_pv是风机和光伏的额定容量;E_bat是储能电池的可用电量;P_bat是储能变流器功率;p_ch和p_dis是每小时的充电、放电功率;p_cur是弃电功率,当风光出力过剩且储能充满时允许丢弃;p_shed是切负荷功率,加了很高的惩罚系数,因此正常求解不会主动切负荷。
5.3 鲁棒优化版本
考虑混合不确定性时,我们把风电和光伏的可用系数从点估计改为区间估计。例如,假设风电系数预测误差为 15%,光伏系数预测误差为 25%,那么鲁棒方案取区间下界作为调度输入,强制系统在最坏出力场景下依然满足负荷平衡。
alpha_w = 0.85 alpha_pv = 0.75 cf_w_robust = cf_w * alpha_w cf_pv_robust = cf_pv * alpha_pv status_r, P_w_r, P_pv_r, E_bat_r, P_bat_r, total_r = \ solve_planning(cf_w_robust, cf_pv_robust) print("鲁棒方案求解状态:", status_r) print("鲁棒风机容量(kW):", round(P_w_r, 2)) print("鲁棒光伏容量(kW):", round(P_pv_r, 2)) print("鲁棒储能能量(kWh):", round(E_bat_r, 2)) print("鲁棒储能功率(kW):", round(P_bat_r, 2)) print("鲁棒总成本(元/日):", round(total_r, 2))这里的处理方式属于“保守鲁棒”思路,即直接取最坏区间端点参与求解。优点是模型简单,缺点是没有考虑各个时段最坏情况同时发生的可能性,结果可能偏保守。
更精细的做法是两阶段鲁棒优化,把不确定性变量留在子问题里交给求解器寻优。下面给出 C&CG 算法的核心流程示意:
# 两阶段鲁棒优化 C&CG 算法简化流程 # 实际应用时建议配合 Gurobi/Cplex 使用 def ccg_optimization(): # 初始化最坏场景集合 worst_cases = [initial_case] UB = float("inf") LB = float("-inf") eps = 1e-3 k = 0 while UB - LB > eps: # 1. 求解主问题:在已发现的最坏场景下优化容量 x, obj_master = solve_master(worst_cases) LB = obj_master # 2. 求解子问题:固定容量,寻找新的最坏场景 u, obj_sub = solve_subproblem(x) # 3. 更新上界 UB = min(UB, LB + obj_sub - c_constant) # 4. 把新场景加入主问题 if not is_converged(UB, LB): worst_cases.append(u) k += 1 return xC&CG 的收敛性和效率在国内外研究中已经得到充分验证。具体到代码实现,主问题和子问题都需要显式建模,并且要求求解器支持二次甚至线性目标下的稀疏矩阵运算。对于初学者,建议先掌握确定性模型,再逐步加入不确定性集合。
5.4 运行结果解读
示例输出打印结果如下,不同数据和参数会得到不同数值:
求解状态: optimal 风机容量(kW): 42.5 光伏容量(kW): 76.3 储能能量(kWh): 36.8 储能功率(kW): 18.4 总成本(元/日): 320.5通过读取各变量值,可以发现几个规律:
- 光伏容量通常大于风电容量,因为示例中白天负荷较高,光伏可以就地消纳;
- 储能能量和功率不是随意组合,它们取决于晚高峰缺电量和缺电持续时间;
- 如果并网交互上限提高,储能容量大概率下降,因为电网可以承担一部分削峰填谷任务。
这些都属于正常现象,关键是理解模型为什么给出这样的结果,而不是背下一组固定数字。
6. 结果对比与协同优化价值分析
6.1 确定性方案与鲁棒方案对比
从模型的逻辑推演,可以得出以下对比结论:
| 对比维度 | 确定性方案 | 鲁棒优化方案 |
|---|---|---|
| 风光容量 | 相对更小,预测越乐观容量越小 | 往往会调高风光容量或储能容量来对冲风险 |
| 储能容量 | 偏低 | 偏高 |
| 预期总成本 | 较低 | 较高 |
| 实际运行风险 | 存在缺电或弃电风险 | 抗风险能力更强 |
| 不确定性处理 | 忽略误差 | 显式建模误差区间 |
两组方案的成本差可以理解为“鲁棒性溢价”。工程上需要结合项目实际情况选择合理的保守程度:对偏远地区孤岛微电网,鲁棒性要求更高;对并网条件好、调度灵活的场合,可以适当降低保守程度。
6.2 协同优化 vs 串联式配置
串联式做法通常是:
- 先按负荷峰值估算风机和光伏容量;
- 再根据夜间最大缺额配置储能;
- 最后用仿真软件验证。
这种做法最大的问题在于:储能容量可能在第一步已经被“锁定”了错误范围。协同优化则把储能作为待决策变量参与整体寻优,储能能有效减少风光弃电,也能降低晚高峰购电成本,它的价值会在目标函数中自动体现。相比之下,协同优化得到的结果是系统性最优,而非局部最优。
7. 常见问题与排查思路
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 求解器提示模型不可行 | 约束过强,例如并网上限与切负荷惩罚不匹配 | 检查功率平衡约束,适当放开并网上限,或检查 SOC 递推公式正负号 |
| 储能始终不配置 | 储能成本过高,或峰谷电价差不足 | 提高峰时电价,或降低储能单位成本参数,观察容量变化 |
| 光伏容量结果异常偏大 | 光伏成本低但发电时段集中,弃电未被惩罚 | 在目标中增加弃电惩罚项,或限制弃电率 |
| 求解时间过长 | 时段数太多或场景数太多,模型规模过大 | 对全年数据做典型日聚类,减少代表性场景数量 |
| C&CG 收敛慢 | 子问题非线性,或初值场景选择不合适 | 改用线性化手段,或先用确定性结果作为初始场景 |
| 运行结果出现同时充放电 | 没有引入互补约束,线性规划可能出现充电放电同时为正的数值解 | 加入二元变量强制二选一,或对充放电效率做非对称处理 |
在实际项目中,遇到不可行问题优先检查等式和边界约束,尤其是储能 SOC 递推公式。SOC 初值比例和末值比例如果设置不合理,会让储能“只放不充”或“只充不放”,导致约束无法满足。
8. 工程实践与建模建议
8.1 数据质量决定模型上限
容量规划模型再精细,如果输入的风光资源数据不可靠,结果也没有工程价值。建议优先使用当地至少一年的实测数据,并做季节典型日或场景聚类。聚类后的典型日要保留负荷峰值、光伏峰值和风光低谷等极端场景,不能只取平均值。
8.2 不确定性参数要有依据
盒式不确定集合中的上下界不能拍脑袋。一种常见做法是取历史预测误差的分位数,例如过去一年中 90% 的误差不超过某个值,就以该值作为区间边界。这样既保留了鲁棒性,又不会过度保守。
8.3 运行策略要和规划模型配套
规划阶段使用的运行策略,要和项目投运后的实际调度策略尽量一致。如果在规划模型中默认储能可以在每个时段随意充放电,而实际调度却因为控制策略限制而无法实现,那么规划结果就会偏乐观。建议在模型中预留最小充放电时间、日循环次数等工程约束。
8.4 逐步递进建模
不要把第一个模型写得太复杂。推荐路径是:
- 先跑确定性容量规划模型,确保代码正确;
- 增加区间不确定性,观察容量变化趋势;
- 再引入两阶段鲁棒优化框架;
- 最后考虑多场景、多季节、多目标扩展。
这种由简到繁的方式,能帮助你在每一步快速定位问题。如果直接从两阶段鲁棒开始写,遇到不收敛或不可行时很难判断是模型逻辑问题还是求解器参数问题。
8.5 安全与权限边界
涉及生产数据或企业级微电网项目时,要注意数据脱敏。任何容量配置方案在应用于实际工程前,都应经过仿真平台验证和专家评审。储能系统设计还需符合本地电气安全规范,不能只依赖单次优化结果。
9. 总结与下一步学习路线
本文围绕风光储微电网容量规划,重点做了三件事:第一,用通俗方式解释了混合不确定性的来源和数学刻画方法;第二,建立了包含风机、光伏、储能容量决策与运行策略协同的规划模型;第三,给出了基于 Python 和 cvxpy 的可运行示例,并介绍了向两阶段鲁棒优化扩展的思路。
如果你刚入门,建议先把 5.2 节中的确定性模型跑通,修改负荷、风光系数和电价数据,观察模型输出如何变化。这一步能帮你建立对“源—荷—储”协同优化的直观认识。
如果你已经有建模基础,下一步可以尝试两阶段鲁棒优化,把不确定集合从简单的区间形式扩展为带预算约束的多面体集合,并对比不同保守程度下的规划方案。还可以进一步研究风光出力的时间相关性、储能寿命衰减模型,以及多微电网之间的功率共享问题。
容量规划只是微电网设计的开始,后续还要做运行控制、能量管理、保护配置等工作。但一个建立在混合不确定性基础上的鲁棒协同容量方案,能为后续所有环节提供可靠的数据边界,这也是这类研究在工程中越来越受重视的原因。