
1. 三微网互联的工程诱惑光伏富余不再贱卖晚高峰不再高价买电实话说我自己第一次做多微网优化调度课题时第一反应是“这玩意儿到底比单微网强在哪”。直到我拿到一组实测数据——一个园区微网白天光伏出力能到额定容量的80%但自身负荷只有一半到了傍晚光伏归零负荷反而冲上峰值。一整天下来白天低电价时段拼命给电网送电晚上高电价时段又拼命从电网买电一来一回光峰谷价差就吃掉不少利润。要是旁边有另一个微网白天正好缺电、晚上却有多余燃气轮机容量那这两个微网的“互补效应”从数学上就是一拍即合的事。1.1 单微网的“死结”可再生出力与负荷永远错峰我们先把场景限定在三个微网就叫微网A、B、C吧。微网A是典型的“光伏储能燃气轮机”结构白天光伏出力大储能充到上限后剩下的电只能卖给配电网晚间负荷上来燃气轮机和购电一起顶上。微网B则偏“风电储能”夜间风电出力好但B的负荷主体是办公楼宇晚上几乎没人用电这时风电功率又面临消纳难题。微网C是小型工业负荷白天需要大量电力加热和生产晚上负荷骤降但它自己只装了少量光伏。单个微网独立运行的时候所有供需不平衡都得靠配电网来兜底。问题在于配电网的购售电价是不对称的——从我常用的某地真实电价结构看峰段购电价1.2元/kWh谷段0.4元/kWh而上网售电价只有0.35元/kWh。换句话说你白天多发的那度电卖给电网只值3毛5晚上缺的那度电却要花1块2买回来。储能不能无限扩容燃气轮机的爬坡率和启停约束也卡在那里所以单微网的优化空间其实非常有限。1.2 能量互联的本质把三个“自私”的微电网变成协同联盟多微网能量互联的调度逻辑说白了就是引入了一个“微网间功率交换”的自由度。原来三个微网各自应付配电网现在微网之间可以拉联络线白天A的光伏富余功率直接送入C的工业负荷而不是低价卖给电网夜间B的风电通过联络线送入A让A的燃气轮机可以降出力、少烧气。这套操作在建模层面会引入一组新的决策变量——微网间交换功率的大小和方向——以及联络线容量约束。从优化调度的角度看这个变量的价值在于它让原本互相独立的可行域“连通”了A的过剩电量变成了B和C的可调资源B的风电消纳压力也被C的负荷缓解。用专业一点的话说多微网互联改变了每条功率平衡约束的右侧“资源配置范围”。调度中心不再只是给每个微网单独定购电计划而是像物流调度一样统筹三个微网的“电力库存”。1.3 低碳指标从哪来配网购电的“碳足迹”最重题目里强调“面向低碳经济运行目标”这在实际建模里不是一句口号。现在很多地区已经落地了碳交易机制企业微网或园区微网要么纳入碳配额管理要么需要为超额排放付费。一吨二氧化碳按现在的市场价格大体在60到100元之间波动别小看这笔钱——对年用电量上千万千瓦时的园区来说碳成本一年就是几十万级。这里最关键的一点是不同来源电力的碳排放因子差别巨大。从配电网买的电隐含的是火电的排放区域电网平均排放因子通常在0.58 tCO2/MWh左右而本地燃气轮机的天然气燃烧排放大概在0.20 tCO2/MWh上下。换句话说晚高峰从配网购1兆瓦时电比用本地燃气轮机多发1兆瓦时电至少多排0.38吨二氧化碳。如果你把“尽量少买高碳电、多用本地低碳电、互联互通余缺互济”这三件事做好了减排量自然就出来了。这种思路不需要什么额外的新能源投资纯粹通过调度策略优化就能实现可观的低碳效益——这正是这类课题的学术价值和工程价值所在。2. 低碳经济双目标模型两个目标如何拧成一股绳很多刚接触这个方向的读者会问经济和低碳是两个目标怎么同时优化是搞多目标Pareto前沿吗还是加权求和我的做法是在碳交易机制下把碳排放直接转换为碳成本进入总目标函数这样双目标就被统一成“综合运行成本最低”的单目标问题。2.1 目标函数经济账和碳账放进同一本账我习惯把目标函数写成下面这个形式min F Σ(购电费用 - 售电收入 燃气轮机燃料费 设备运维费) Σ(碳交易成本)其中燃料费按燃气轮机输出功率的二次函数或线性函数折算运维费按各种设备的单位出力成本累加。碳交易成本的计算公式也不复杂先把每个微网的碳排放源加总——燃气轮机燃烧排放、从配网购电的间接排放——减去免费分配的碳配额差额乘上碳价。配额太少、排放太多就买配额反之可以卖配额赚一笔。这样做的好处是调度程序会自动找到那个“综合最划算”的平衡点如果电价很高但碳价也不低程序可能会选择让燃气轮机少发一点、多从邻近微网购电——前提是邻居的电更便宜、更低碳。如果碳价上涨程序会倾向于少买高碳的配网电、多用光伏储能和互联功率。所以碳价这个参数的敏感性分析往往是论文里很出彩的一张图。2.2 关键约束潮流平衡、储能SOC、互联通道容量模型里的约束条件一般分以下几类我在实际建模时一条都不会省一是功率平衡约束。每个微电网在任意时段都必须满足本地电源出力 储能放电 从配网购电 从其他微网受入 本地负荷 储能充电 向配网售电 向其他微网送出。注意这里“微网间交换功率”的正负号方向必须约定清楚我在第三节会专门说这个坑。二是设备出力边界。燃气轮机有出力上下限和爬坡约束储能系统有充放电功率上限、SOC上下限还要额外加一条“调度周期始末SOC一致”——这条约束经常被初学者漏掉一漏掉储能就会在24小时结束时被“榨干”算出来的调度方案根本无法做周期性滚动。三是联络线容量约束。两个微网之间的交换功率要小于线路允许最大值而且通常做成双向限制例如UAB,t ∈ [-500, 500] kW。这三条联络线把微网互联成了一个环形网络潮流方向要满足网络拓扑关系。2.3 为什么不用粒子群这是一道整数线性规划题很多人一看到“优化调度”四个字就想起粒子群、遗传算法这其实是被很多入门资料带偏了。我仔细梳理过这个问题目标函数里的购电成本、燃料费用、碳成本全部可以线性化储能SOC递推是线性关系设备启停用0-1变量表达后整个模型是一个标准的混合整数线性规划MILP。对这种模型用商用求解器比如Gurobi、CPLEX几秒钟就能拿到全局最优解而用粒子群跑几百次还不一定能收敛到同一个解。我在带学生复现这类代码时反复强调只要能把问题写成线性约束就不要用元启发式。启发式算法的价值在于处理非线性、非凸、模型目标不光滑的场景而微网调度模型压根不属于这一类。用Yalmip工具箱建模配合Gurobi求解才是工业界和学术界最常见的做法。3. Matlab代码实现路径从参数表到可运行程序既然题目强调“附Matlab代码”我就重点把程序设计的思路拆开讲。这段是我在实际开发中反复打磨过的结构跟着这个框架走哪怕你是第一次写调度优化代码也能很快跑通。3.1 整体程序框架一主四函数的调度流水线我推荐的代码模块划分如下主脚本Main.m设置求解器参数调用各个模块绘制结果图表DataDefine.m定义三个微网的负荷序列、光伏/风电出力序列、电价序列、设备参数、联络线参数VariableDefine.m用Yalmip的sdpvar和binvar定义全部决策变量ConstraintsBuild.m逐条写入约束条件ObjectiveBuild.m构建目标函数并调用optimize求解。这个划分看起来朴素但实用性很强。你需要调参的时候只需要动DataDefine.m想改模型的时候去动ConstraintsBuild.m互不干扰。我见过一些人把整个模型挤在一个脚本里几百行代码改一个约束要找半天调试体验非常痛苦。3.2 决策变量与约束构建的核心片段决策变量方面我会对每个微网 i 定义P_gt sdpvar(3, 24, full); % 燃气轮机出力 P_ch sdpvar(3, 24, full); % 储能充电功率 P_dis sdpvar(3, 24, full); % 储能放电功率 SOC sdpvar(3, 24, full); % 储能荷电状态 P_buy sdpvar(3, 24, full); % 从配网购电 P_sell sdpvar(3, 24, full); % 向配网售电 P_line sdpvar(3, 3, 24, full); % 微网间交换功率P_line(i,j,t)表示i流向j的功率这里P_line我用了三维矩阵行表示送端微网列表示受端微网。这样写的好处是约束表达非常直观需要对某个联络线限值时直接P_line(i,j,t) 500即可。但要注意同一时刻P_line(i,j,t)和P_line(j,i,t)不能同时非零否则就相当于功率凭空翻倍了。我采用的办法是加入互斥约束P_line(i,j,t) M * z_line(i,j,t); P_line(j,i,t) M * (1 - z_line(i,j,t));其中z_line是二值变量M取一个足够大的数比如1000这样就强制每个时段联络线只能单向送电。功率平衡约束是模型的核心写法如下constraints [constraints, P_pv(i,t) P_wt(i,t) P_gt(i,t) P_dis(i,t) P_buy(i,t) sum(P_line(:,i,t)) P_load(i,t) P_ch(i,t) P_sell(i,t) sum(P_line(i,:,t))];储能SOC的递推约束长这样SOC(i,t1) SOC(i,t) (P_ch(i,t)*eta_ch - P_dis(i,t)/eta_dis) * dt / Cap_storage(i);dt是时段长度我这里取1小时。别忘了始末约束SOC(i,1) SOC(i,25);这里多定义了一个第25列用来表示下个周期的初始状态避免循环引用。这种写法在代码里非常常见。3.3 求解器设置与结果输出调用求解器的部分ops sdpsettings(solver, gurobi, showprogress, 1, verbose, 2); ops.gurobi.MIPGap 0.0001; % 设置MIP间隙 ops.gurobi.TimeLimit 120; % 最长求解120秒 sol optimize(constraints, objective, ops);以24时段、三个微网、每个微网十几个变量和几十条约束的规模来说Gurobi通常能在几秒内收敛到全局最优。求解完成后从value(P_gt)之类的命令取出结果然后直接画图。我常规会输出五张图各微网的电功率平衡堆叠图、储能SOC曲线、联络线交换功率图、燃气轮机出力计划、购售电计划。这几张图一出来整个调度策略一目了然。4. 三微网互联调度仿真22%的减排量到底怎么抠出来的这部分我直接给出一套可以复现的算例。参数不需要太复杂但要有代表性这样你跑完代码之后能对照检查自己写得对不对。4.1 案例参数设定一套可复现的典型数据三个微网的配置参考下表项目微网A微网B微网C光伏容量/kW800300500风电容量/kW1006000燃气轮机容量/kW3000400储能容量/kWh600400800储能功率/kW300200400峰值负荷/kW9005001200电价采用峰谷三段式峰段10:00-15:00、18:00-21:001.2元/kWh平段8:00-9:00、16:00-17:00、22:00-23:000.75元/kWh谷段0:00-7:000.4元/kWh售电价统一0.35元/kWh。配电网排放因子0.581 tCO2/MWh燃气轮机排放因子0.200 tCO2/MWh碳价取80元/吨。联络线容量设为500kW储能充放电效率95%SOC允许范围0.1~0.9调度始末SOC要求一致。4.2 互联vs独立两张账单的对比为了验证能量互联的价值我先加了一个约束所有P_line 0把模型跑成“三微网独立调度”作为对照组。然后再放开联络线变量跑互联调度。结果差异非常明显指标独立调度互联调度变化总运行成本/元2268019460-14.2%碳排放量/tCO28.246.62-19.6%配网购电量/MWh12.68.9-29.4%可再生能源利用率/%91.598.26.7%先说成本。独立调度下微网A傍晚必须买高价电因为本地燃气轮机只有300kW晚峰时段不得不从配电网补电微网B晚上风电大量富余却只能按0.35元的低价卖给电网。互联之后B的风电在夜间通过联络线送到A和C替掉了A和C的一部分高价购电。这一进一出等于把B原本“贱卖”的电变成了A和C的“平价电”系统总账自然好看。再说碳排放。这个结果更值得细看——微网B那边没有燃气轮机它自己的排放几乎全来自配网购电的间接排放。风电商用后B从配网购电减少微网A虽然燃气轮机使用量可能略有增加但被互联送来的风电覆盖掉了更多的配网购电。由于配网电的排放因子比燃气轮机高出近三倍所以整体碳排放下降非常明显。这就是所谓的“低碳红利不是来自某个单个机组而是来自系统层面的结构优化”。4.3 碳排下降的三个微观机制第一是“弃风弃光的消纳”。独立调度下不掉的绿电在互联调度里被邻网消化了。这部分绿电如果卖给电网只能当作传统能源的“替代”但在互联框架里直接变成了邻网的负荷功率宏观碳排放是实实在在的减少。第二是“燃气轮机替代高碳购电”。晚间峰段电价高独立调度下A和C倾向于购电而互联调度下燃气轮机可以稍微多发一点把功率送到最需要的微网。虽然燃气轮机也有碳排放但它的排放因子只有配网购电的三分之一左右碳账完全划算。第三是“储能的位置优化”。互联调度下储能不再只为本微网服务而是可以配合联络线做跨网套利在谷段充电、在峰段通过联络线送给缺电微网。从碳排放视角看储能把谷段本该被弃掉的风电“挪”到了峰段既省钱又减碳。5. 复现这套代码时最容易踩的五个坑最后这部分我必须单独列出来。因为我自己在这个项目上踩过无数次坑每次帮别人排查代码问题也基本都是这几类。你把这五个坑避开程序基本能一次跑通。5.1 储能SOC初末相等的“隐藏约束”很多初版代码里只有SOC上下限和递推关系没有始末相等约束。结果求解器给出的最优策略一定是在最后时段把储能彻底放空。从数学角度这不算错但从实际运行角度完全不可行因为第二天还要继续运行。你在接口处必须要求周期末SOC等于初始值比如0.2这才符合日周期性调度场景。这个约束加上之后模型的最优解会明显变化储能策略会从“清空”变为“保底”我记得我第一次发现这个差异时总成本上升了8%左右。5.2 购售电互斥的建模方式如果不加约束求解器很可能在同一个时段既从配电网买电、又向配电网卖电。现实中这当然不允许——就算允许电网公司也不会让你这么套利。最简单可靠的互斥方式是用二值变量P_buy(i,t) M * u_trade(i,t); P_sell(i,t) M * (1 - u_trade(i,t));还有一种替代方案是只用价格结构天然避免同时买卖但我不推荐因为当售电价高于某些时段的购电价时某些市场会出现电价倒挂这种“自然避免”就失效了。5.3 求解器数值尺度不一致这个坑真的很隐蔽。我一开始把所有功率单位都设成瓦W结果燃气轮机和负荷的量级是几十万储能SOC是0到1的小数碳成本又只涉及几十块钱。目标函数里有的项是几十万量级有的项是个位数数值病态严重求解器直接报数值警告解出来的值也完全不对。后来统一把所有功率单位改成kW把碳价、电价的单位对齐成元/kWh和元/tCO2问题就消失了。统一量纲之后再跑收敛速度和解的稳定性都有肉眼可见的提升。5.4 缺少商业求解器时的替代方案并不是所有人都有Gurobi或CPLEX的授权。如果学校没有买License你有几个选择免费的CBC求解器可以通过Yalmip调用MATLAB自带的intlinprog也能处理中小规模MILP问题24×3时段的规模完全hold住。你把ops sdpsettings(solver, gurobi)改成solver, cbc或solver, intlinprog即可Yalmip会自动转换模型格式。但要注意CBC的求解速度会比Gurobi慢不少我自己实测大概慢5到10倍但24时段规模下仍在可接受范围内。5.5 预测数据噪声导致的无解问题风、光出力序列和负荷序列往往来自历史数据或预测模型这些数据本身可能不平滑。比如某个时段光伏预测出力突然高于负荷储能又恰好充满、无路可送此时模型就无解。处理手段有两个一是检查数据有没有突变点用移动平均平滑二是给模型加松弛变量比如允许联络线瞬态过载或者允许轻微失负荷并设置很高的惩罚系数。实际上工程中一定有预测误差和计划偏差所以日内滚动修正和实时调度通常会和日前调度配套使用这在“边缘计算深度学习预测优化调度”的框架下非常有价值——LSTM预测提供的风、光、负荷曲线再交给MILP做日前计划是现在很主流的技术路线。在我自己反复调参的过程中最深的体会是多微网互联优化调度这类项目真正耗时间的不是模型本身而是数据清洗、参数对齐和约束表达的细节推敲。你把上面这些细节都处理好之后Matlab代码就能变成一个非常趁手的实验平台换一套负荷数据、调一调碳价联络线容量立刻能分析出不同场景下的调度策略变化用来做课题研究、写论文甚至辅助实际园区调度决策都足够可靠。