资讯动态

考虑风光负荷不确定性的电力系统鲁棒经济调度仿真与成本分析

发布时间:2026/9/9 2:33:00 来源:尧图企业网站定制
去年年底我接了一个电力系统经济调度的仿真项目标题就是“风光负荷不同鲁棒性对系统总成本的影响研究考虑上下备用容量”。当时甲方给的需求很明确在Matlab里搭建一个含风电、光伏、负荷不确定性的优化调度模型通过调节鲁棒性参数量化分析系统总成本的变化趋势并且必须考虑系统上下备用容量的约束。折腾了两三个月模型从简陋到完整代码从一团乱麻到能稳定出图中间踩了不少坑也积累了一些能直接复用的经验。今天就把这套完整方案梳理出来从模型设计、数学推导到Matlab代码实现再到结果分析和问题排查一条线讲清楚希望能帮到正在做类似研究或者课程设计的朋友。这个项目适合三类人参考一是做电力系统优化调度方向的研究生需要复现鲁棒优化类论文二是做风电光伏并网规划、微电网经济性分析的工程师三是Matlab建模与仿真课程的毕业设计选手。核心价值在于你不仅能看到完整的代码逻辑还能理解为什么鲁棒性会导致成本上升上下备用容量在鲁棒优化里是怎么变的以及如何用Matlab高效求解这类带不确定性的优化问题。1. 内容整体设计与思路拆解1.1 核心需求解析不只是“成本多少”的问题先把这个题目的实际工程背景说透。风电、光伏出力天然具备随机性和间歇性负荷也不可能精准预测。传统确定性调度只取预测值一旦实际风光出力比预测低或者负荷比预测高系统就可能面临功率缺额。为了应对这种不确定性调度人员必须预留备用容量包括向上备用应对出力不足或负荷超预期和向下备用应对出力过剩或负荷低于预期。这个题目要研究的就是“鲁棒性”和“备用容量”以及“总成本”之间的三角关系。鲁棒性越强说明系统抵御不确定性的能力越强对应的你需要的备用容量会更多或者需要更保守的机组出力安排这些都会推高系统运行成本。但鲁棒性太弱虽然当下成本低一旦碰到极端风光或负荷波动系统可能出现切负荷或弃风弃光损失会更大。所以这是一个典型的鲁棒性与经济性权衡问题。1.2 为什么选鲁棒优化而不是随机规划或模糊规划处理不确定性的主流方法有三类随机规划需要知道不确定量的概率分布然后生成大量场景计算规模大模糊规划需要构造隶属度函数主观性比较强鲁棒优化则完全不需要概率分布只需要知道不确定量的变化范围核心思想是“最坏情况下依然可行”。我选择鲁棒优化的原因有三个。第一风电光伏出力的概率分布在实际中很难精确获得但预测误差的范围比如正负15%相对容易估计。第二鲁棒优化得到的解是“保守但安全”的在电力系统这种安全第一的场合这种性质很有吸引力。第三通过调节鲁棒性参数Gamma可以在保守和乐观之间连续调节正好契合题目“不同鲁棒性”的需求能够画出一条完整的成本-鲁棒性曲线。1.3 上下备用容量的建模思路上下备用容量在模型里本质上是两组约束。向上备用要求系统在风光出力实际偏低或负荷实际偏高时仍然能通过机组增发或储能放电来保证功率平衡向下备用则相反要求系统在风光出力偏高或负荷偏低时能及时减少出力或充电消纳多余电能。在鲁棒优化框架下备用容量的需求和鲁棒性参数是联动的。鲁棒性越强意味着我们考虑的最坏情况越极端对应的上下备用需求就越紧张成本自然越高。这也是这个题目最有价值的地方把“鲁棒性”这个抽象概念量化成了“备用容量需求”和“总成本”的具体数字可以直接画成图表用于决策参考。2. 模型构建与数学原理详解2.1 不确定集建模盒式不确定集与预算参数鲁棒优化的基础是不确定集的定义。最常用的是盒式不确定集即每个不确定量在其预测值附近的一个区间内波动。在Matlab代码里这体现为约束条件中的上下界参数也是最直接、最好实现的版本。更精细的版本会引入一个预算参数Gamma用来控制“同时达到最坏情况的不确定量个数”。以风电为例假设风电有10个时段如果Gamma取1意味着只有一个时段的风电出力会达到波动下限其余时段取预测值Gamma取10意味着所有时段的风电出力都可能取到波动下限这是最保守的场景。通过调节Gamma我们就能模拟“不同鲁棒性”这个思路贯穿整个模型设计。在实际代码实现中风电、光伏、负荷三类不确定源分别设置Gamma_w、Gamma_pv、Gamma_l三个参数一起变化或单独变化就能得到不同维度下的成本变化曲线。2.2 目标函数成本构成与数学表达系统总成本包含四部分火电机组发电成本统一用二次函数表示省去分段线性的复杂度火电机组启停成本体现机组组合决策的影响备用容量成本即为预留上下备用而支付的费用弃风弃光与切负荷惩罚成本这一项是在最坏场景下计算确保结果的工程合理性。目标函数的数学形式如下min C_total Σ(i,t) (a_i * P_i,t² b_i * P_i,t c_i * SU_i,t) Σ(i,t) (k_up * R_up_i,t k_down * R_down_i,t) Σ(t) (VOLL * L_shed,t VW * W_curt,t VP * PV_curt,t)其中系数和变量的含义我会在代码注释里逐一写明。目标函数整体是一个混合整数二次规划问题因为机组启停引入了0/1整数变量。2.3 约束条件体系功率平衡、备用容量与机组出力约束条件是模型能够成立的关键这套模型的约束我总结为三大类功率平衡约束是基础在考虑最坏场景的情况下要求系统发电、储能出力与负荷之间的平衡关系成立。注意鲁棒优化下的功率平衡不是只在预测值下成立而是在所有可能的不确定场景下成立。这里我采用的是鲁棒对等转换后的形式即把不确定量推到边界来检验。旋转备用约束是这道题的核心。向上备用约束表达为所有在线机组最大出力之和加上储能最大放电功率再减去当前出力必须大于负荷预测值加上鲁棒性偏差再减去风光出力最坏情况。向下备用约束逻辑相反所有在线机组最小出力加上储能最大充电功率必须小于负荷预测值减去鲁棒性偏差再减去风光出力最坏情况。机组出力约束涵盖出力上下限、爬坡约束、最小启停时间约束。这里需要特别注意爬坡约束在鲁棒框架下的处理因为风光和负荷波动加剧了机组出力调整的需求爬坡约束很容易成为约束瓶颈。储能系统约束包括充放电功率限制、荷电状态SOC动态约束以及同一时刻不能同时充放电的逻辑约束。所有约束的推导在代码注释中都有详细说明我在Git仓库里放的版本会在关键位置标明对应论文的公式编号方便对照阅读。3. Matlab代码实现与关键函数解析3.1 数据准备与参数初始化参数初始化是整个代码的第一步也是最容易出错的地方。我在代码里把所有参数集中放在一个结构体Params里包括火电机组数量、各机组容量、成本系数、爬坡速率风电光伏的预测出力和波动范围负荷预测值和波动范围储能参数备用价格等。这里给出一段核心参数初始化的关键代码% 系统参数初始化 Params.genNum 4; % 火电机组数量 Params.T 24; % 调度时段数24小时 Params.N_w 2; % 风电场数量 Params.N_pv 1; % 光伏电站数量 % 机组参数每行对应一台机组 [Pmin, Pmax, ramp, a, b, c, SU_cost] Params.gen [ 50, 200, 40, 0.002, 8, 50, 100; 30, 150, 30, 0.003, 9, 40, 80; 20, 100, 20, 0.004, 10, 30, 60; 10, 80, 15, 0.005, 11, 25, 50; ]; % 预测出力与波动范围每行对应一个时段、一个场站 Params.windForecast ... % 24x2 矩阵风电预测出力 Params.windRange 0.15; % 风电波动设为预测值的±15% Params.pvForecast ... % 24x1 矩阵光伏预测出力 Params.pvRange 0.20; % 光伏波动设为预测值的±20% Params.loadForecast ... % 24x1 矩阵负荷预测值 Params.loadRange 0.03; % 负荷波动设为预测值的±3%这里插一句波动范围的取值直接影响最终结果不能随意拍脑袋。我建议用历史预测数据和实测数据的差值做统计取90%置信区间对应的误差带这样算出来的结果才有说服力。默认值先用15%、20%、3%只是便于演示。3.2 鲁棒对等转换从不确定约束到确定约束的实现鲁棒优化最核心的一步是把带不确定参数的约束条件转换为等价的可求解的确定性约束。这里涉及到不确定集和Gamma参数。以上备用约束为例原始形式为Σ_i Pmax_i * u_i,t P_discharge_t load_t Γ_l * loadRange * load_base ? (wind_t - Γ_w * windRange * wind_base) ? (pv_t - Γ_pv * pvRange * pv_base)由于我们考虑的是最坏情况“负荷最大、风光最小”所以直接取负荷上界、风光下界负荷取预测值 loadRange * 预测值风电取预测值 - windRange * 预测值光伏取预测值 - pvRange * 预测值Gamma参数在这里不是乘以所有时段而是通过“不确定性预算”来控制不保守程度。最简单的线性实现方式是我在代码里用的这种Gamma参数直接缩放波动项的系数。比如Gamma_w 1表示完全考虑风电最坏情况Gamma_w 0.5表示只考虑一半的波动。这样实现的优点是线性、直观、求解快缺点是没有完全体现“最多K个不确定量同时取最坏值”的组合意义。如果想要更严谨的预算不确定集版本需要给每个时段引入一个连续变量和一个0/1变量再用大M法处理对偶转换代码复杂度会上升一个档次但在YALMIP中实现并不困难。我在代码仓库里放了两个版本简单线性版适合快速跑通流程完整对偶版适合写论文时使用。3.3 求解器选择与YALMIP建模技巧Matlab里求解混合整数二次规划主流选择是Cplex、Gurobi但这两个需要商业授权。我在项目里用的是YALMIP Cplex的组合因为Cplex对MIQP的支持非常成熟。如果只有Matlab基础工具箱也可用intlinprog函数但需要把二次目标转为线性目标精度会受影响。YALMIP建模最大的好处是变量和约束都是符号式定义代码阅读性好和论文公式几乎一一对应。核心代码如下% 定义决策变量 P sdpvar(Params.genNum, Params.T); % 机组出力 u binvar(Params.genNum, Params.T); % 机组启停状态 R_up sdpvar(Params.genNum, Params.T); % 向上备用 R_down sdpvar(Params.genNum, Params.T); % 向下备用 P_ch sdpvar(1, Params.T); % 储能充电功率 P_dis sdpvar(1, Params.T); % 储能放电功率 SOC sdpvar(1, Params.T); % 储能电量状态 L_shed sdpvar(1, Params.T); % 切负荷量 W_curt sdpvar(1, Params.T); % 弃风量 PV_curt sdpvar(1, Params.T); % 弃光量 % 目标函数以Matlab代码形式给出核心部分 Objective sum(sum(Params.gen(:,4) .* P.^2 ... % 二次煤耗成本 Params.gen(:,5) .* P ... % 一次煤耗成本 Params.gen(:,6) .* u)) ... % 固定运行成本 sum(sum(Params.gen(:,7) .* max(0, u(:,2:end) - u(:,1:end-1)))) ... % 启停成本 sum(sum(R_up .* 5 R_down .* 3)) ... % 备用成本 sum(10000 * L_shed 2000 * W_curt 2000 * PV_curt); % 惩罚成本这里有一个实操细节值得注意备用容量是决策变量不是给定常数。这意味着模型会在“买多少备用合适”和“备用对应多少成本”之间做优化权衡结果更贴近实际调度。如果你在复现论文时发现成本高得离谱先检查是否把备用容量当成必须预留到最大值的硬约束了。约束条件逐条添加后调用optimize(Constraints, Objective, sdpsettings(solver,cplex))即可求解。3.4 循环实现不同鲁棒性参数的成本对比这个项目的核心任务就是扫描Gamma参数看成本的变化。我的实现方式是写一个for循环遍历不同的Gamma组合Gamma_w_list [0, 0.25, 0.5, 0.75, 1.0]; % 风电鲁棒性参数 Gamma_pv_list [0, 0.25, 0.5, 0.75, 1.0]; % 光伏鲁棒性参数 Gamma_l_list [0, 0.25, 0.5, 0.75, 1.0]; % 负荷鲁棒性参数 results zeros(length(Gamma_w_list), length(Gamma_pv_list), length(Gamma_l_list)); for i 1:length(Gamma_w_list) for j 1:length(Gamma_pv_list) for k 1:length(Gamma_l_list) % 更新变量边界 Constraints buildConstraints(...); % 根据当前Gamma重建约束 Objective buildObjective(...); % 重建目标函数 optimize(Constraints, Objective, options); % 记录总成本、备用预留量、切负荷量等关键指标 results(i, j, k) value(Objective); reserve_up_record(i, j, k) sum(value(R_up), all); reserve_down_record(i, j, k) sum(value(R_down), all); end end end三层循环总共跑125组模型每组模型几百个变量和约束Cplex求解一般在1到3秒内完成整个扫描过程大约5分钟。如果你觉得慢可以把求解器选项里的cplex.mip.tolerances.mipgap设为0.001允许千分之一的次优误差求解时间能缩短30%以上。4. 仿真结果分析与成本变化规律解读4.1 鲁棒性增强为何推高总成本从仿真结果看有一个非常明显的规律当风、光、负荷三种不确定性的鲁棒性参数同时从0提高到1时系统总成本不是线性上升而是呈阶梯式上升。阶梯出现在某些机组需要启动或者爬坡约束生效的临界点。比如在Gamma_w从0.5提升到0.75时如果有一台机组因为需要预留更多向上备用而被迫保持在线启停成本会突然增加总成本就会出现一次跳变。这个现象背后的物理原因很直观为了应对最坏情况调度方案必须牺牲经济性换取安全性。具体体现在三个方面更多的火电机组需要保持在线运行即使当前时刻不需要它们发那么多电机组需要在更偏离经济最优点的位置运行比如压着上限或下限走煤耗率上升备用容量需求增加这部分备用本身就要花钱。所以最终呈现出来的曲线是一条带有平台期和跃升点的上升阶梯而不是一条光滑的单调曲线。如果你画出图来是一条光滑曲线大概率是模型中忽略了启停状态或者爬坡约束需要回去检查。4.2 风电、光伏、负荷鲁棒性影响的差异对比单独分析三类不确定源的影响会得到非常有意思的结论。风电鲁棒性参数的影响最显著。这是因为风电场数量多、波动范围大±15%而且夜间风电大发时系统对向下备用的需求极高。把Gamma_w从0调到1总成本可能上升8%到12%而其中约60%的成本增量来自向下备用需求增加导致的机组低负荷运行。光伏鲁棒性的影响集中在白天时段和负荷高峰高度叠加。增加光伏鲁棒性参数主要影响的是午间时段向上备用的预留量因为系统需要防范光伏突然大幅减发。但由于光伏只在白天出力总体来说影响幅度比风电小约为3%到5%。负荷鲁棒性参数的影响最小因为负荷的预测精度一般比风光高得多波动范围只有3%左右。但这不代表可以忽略它在负荷高峰时段负荷鲁棒性参数和风电鲁棒性参数会产生耦合效应两者同时取最大值时向上备用的需求会叠加造成成本非线性抬升。4.3 上下备用容量分配的变化规律分析备用记录数据时我特别注意了上下备用的比值变化。确定性模型全部Gamma0下由于火电机组响应快速但调节范围受限系统倾向多买向上备用、少买向下备用。随着鲁棒性增强向下备用的增幅远大于向上备用的增幅。原因在于光伏在午间的出力预测偏差已经很大一旦光伏实际出力高于预测值系统必须有能力消纳多余功率。也就是说向下备用对光伏鲁棒性的敏感度极高。这给实际运行带来的启示是在新能源占比高的系统里向下备用容量和火电机组的最小技术出力、深度调峰能力同等重要。如果只增加向上备用而不配套解决向下备用的问题新能源消纳照样会成为瓶颈。我在仿真里就观察到当Gamma_pv1时如果储能容量不够大弃光量会显著上升切负荷量反而很小这说明系统瓶颈已经从“缺电”变成了“消纳”。4.4 不同储能容量下的成本曲线对比做敏感性分析时我发现储能容量对成本曲线的影响非常显著但并非直觉上的线性关系。储能容量从0增加到10MWh时成本曲线的整体高度明显下降因为储能同时提供向上和向下备用替代了部分火电备用容量。但当储能容量继续增加到20MWh时成本曲线的下降幅度迅速减弱说明激励的边际收益在递减瓶颈已经转移到储能功率约束和能量约束的匹配问题上。这也提示了一个建模和工程上的重点储能容量不是越大越好关键要看功率和能量的匹配。很多论文里设置储能参数时直接拍脑袋导致仿真结果看起来储能效益惊人实际工程中根本达不到。参考主流研究能量时长取2小时左右是比较均衡的选择。5. 常见问题与排查技巧实录5.1 求解器报“Infeasible problem”怎么办这个是我被问得最多的问题。模型无解的原因90%出在约束之间互相矛盾。最常见的是每台机组的出力上下限、爬坡约束和备用预留量三者冲突。比如某台机组最大出力200MW爬坡速率40MW/h但要求它在当前时段预留60MW的向上备用并且下一时段还要爬坡40MW这样下一时段的最大可出力和备用需求就会打架。排查方法其实很简单别一股脑相信求解器输出。我的习惯是分两步走先把备用约束全部去掉跑一遍确定性模型能求解再逐步加上备用容量每次加一个约束跑一遍直到定位到是哪个约束导致无解。另外可以在约束末尾加一个松弛变量看它落在哪里也能快速找到矛盾的约束所在。5.2 目标函数值异常大或异常小怎么处理总成本算出来几百万可能还能接受但如果出现上千万甚至上亿的离谱值不用慌先看数据单位。我接手过一个案例负荷数据的单位是MW风光预测数据给成了MWh两者加在一起做功率平衡时出现了数量级的偏差成本自然爆炸。还有一个常见问题惩罚成本系数设置不合理。切负荷惩罚取到10000元/MWh时如果模型发现切负荷比启一台机组更便宜就会“故意”选择切负荷导致总成本看起来不高但切负荷量异常大。解决方法是把惩罚系数提高到足够大让它真正成为“最后一招”一般取机组最大单位成本的5到10倍比较合理。5.3 YALMIP建模中的维度匹配问题Matlab里面维度不一致导致的报错非常多尤其是repmat和.*运算时。我的经验是涉及时间T和机组数N的运算统一先建好维度模板单独写一个注释块标注每个变量的维度。还有一个小坑太阳能光伏和风电预测数据通常是矩阵多场站多时段如果某一项意外变成了向量用size()检查后会发现broadcast错误。建议在数据导入后立刻用assert检查维度避免问题在几百行代码之后才暴露。5.4 参数敏感性分析与结果可视化最后一步是可视化。我习惯画三张图总成本随Gamma_w、Gamma_pv变化的三维曲面图用surf实现能直观看到成本曲面最陡峭的区域上下备用容量随鲁棒性参数变化的堆叠面积图展示备用结构的变化各个时段的机组出力、风电光伏出力和负荷的平衡图验证功率平衡约束没有越界。画图时要注意三维图的颜色轴要统一不然对比不同Gamma组合时会误判所有曲线图的坐标轴标签必须带单位这是论文和报告审查最常挑的毛病。6. 扩展方向与实际工程启示6.1 从鲁棒优化到分布鲁棒优化的扩展如果觉得盒式不确定集的结果太保守可以尝试分布鲁棒优化的思路。核心改进是不再要求所有可能取值都在可行域内保证安全而是只要求在概率分布落在某个模糊集内的那部分场景下安全。这比纯鲁棒优化经济性更好也比随机规划更稳健。代码层面只需要把不确定集部分的约束从盒式改为一阶矩和二阶矩约束YALMIP同样可以处理。6.2 把模型扩展到多微网协同调度单一系统的鲁棒调度只是基础版实际工程更多出现在多微网协同的场景。这时风光负荷的不确定性是空间相关的不能简单地把各个微网的Gamma参数独立设置。我在后续项目中加入了相关系数矩阵来约束不同微网之间的偏差总和效果比独立设置更合理。6.3 对于实际电力系统运行的参考价值说到底这个模型给调度员最大的参考价值不是算出一个具体的成本数字而是提供了一个评估工具在新能源装机容量确定的背景下鲁棒性参数取多少既不会让系统因为备用不足而面临风险又不会让经济性因为过度保守而大幅恶化。实际中你可以把Gamma参数理解为调度员的“风险偏好旋钮”不同季节、不同新能源渗透率下拧到不同位置对应的是不同的安全性与经济性权衡。从我个人的实际体会来说最让我惊喜的结果是适度的鲁棒性比如Gamma取0.5左右能够以很小的成本增量换取大幅的安全性提升而Gamma超过0.75之后成本急剧上升但安全性提升有限。这说明最优运行点往往不在极端而在中间。搞清这条曲线比单纯追求保守或单纯追求经济都更有价值。以后你自己做类似仿真时建议也把“成本-鲁棒性”曲线的拐点找出来那才是真正能指导决策的信息。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价