ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

三微网能量互联低碳经济优化调度:Matlab+YALMIP实现

三微网能量互联低碳经济优化调度:Matlab+YALMIP实现 多微网能量互联优化调度听起来有点绕但做电力系统优化的人应该都不陌生。这个项目我完整做过一遍三个微网互相不供电时每个微网只能靠自己买电、烧气、耗储能遇到负荷高峰只能硬扛高价电一旦允许它们在联络线上互相倒手电力很多原本要买高价电的时段就能用邻居家多余的光伏、夜里的风电来补上这一来一回省下的就是真金白银少烧的天然气就是减下来的碳排放。这个Matlab项目干的事情就是把“互相倒手”这件事用优化模型算到极致在满足每个微网自身负荷的前提下通过能量互联减少总购电成本与碳排放最后输出每台机组、每块储能、每条联络线的日前调度计划。这篇博客面向三类人一是刚接触微网调度、想找个完整算例练手的研究生二是做园区级能量管理、需要评估互联收益的工程师三是想把“低碳约束”落到优化模型里、但不清楚怎么处理碳成本和约束的算法爱好者。我会把建模思路、约束条件、代码实现、结果分析和踩过的坑全部摊开讲尽量做到你拿着这份内容就能在Matlab里复现出一版自己的三微网调度程序。1. 为什么非要做“三微网”而不是单微网1.1 单微网调度的天花板单个微网的调度模型其实很成熟风光预测出力已知、负荷已知、储能初始SOC已知前端一天24小时的机组出力和储能充放电功率目标函数最小化运行成本。但单微网有一个天然短板电源结构固定调节资源就那么多。光伏大发的中午用不完晚上负荷高峰又没得发燃气轮机再灵活启动一次也有燃料成本和碳排放。我做过单微网的仿真结果很典型风光渗透率高的微网弃风弃光率能到25%因为储能就那么几百千瓦时装不下多余的电。但把这些微网放到一个能源互联网里情况就完全不同了——A微网中午的光伏富余可以沿着联络线送到B微网B微网的储能夜里可以帮C微网扛早高峰。互联的本质是“资源共享 时空互补”这正是单一微网做不到的。1.2 三微网的场景代表意义为什么是三微网而不是两个、四个两个微网只能验证“双向互济”这一个逻辑四个以上又会把联络线拓扑变得过于复杂结果分析容易被网络结构干扰。三个微网刚好能覆盖三种典型特征是学术界和工程界都比较认可的最小验证单元微网特点典型场景在项目中的角色MG1燃气轮机容量大光伏少负荷高工业园区/数据中心受电端需要外部能源补缺MG2风机多储能中等商业楼宇/集群办公风电富裕端夜间向外送电MG3光伏大储能大负荷波动明显校园/社区光伏午间向外送电晚高峰需要其他微网支援这三个微网之间的差异化特性越明显能量互联调度的收益就越大。你如果做两台同构微网互联大概率结果跟单微网没本质区别结论写出来也没说服力。1.3 “低碳经济”两个目标怎么一起算本项目标题里两个关键词“低碳”和“经济”。按很多论文的做法是双目标优化比如用NSGA-II求Pareto前沿但这类算法参数多、计算慢结果还受种群数量和迭代次数影响。我自己在实际项目中更常用的是“碳税折算 加权求和”的处理方式把碳排放量乘以碳税价格变成一个罚项放进总成本里。这样调度模型从双目标妥妥变成单目标线性规划就可以解速度快、收敛稳定也方便做碳税价格的敏感性分析。碳税取多少直接影响调度结果。我用过30、50、80、120元/吨四档碳税做对照一般规律是碳税越高调度越倾向于减少购电因为电网电有碳排放因子、减少燃气轮机运行天然气燃烧直接排碳具体数值你完全可以根据所在地区的政策设定来调整。2. 数学模型设计目标函数、约束条件与参数依据2.1 目标函数分模块拆解整个优化调度的目标函数可以拆成六大块购电成本从主网购电的费用按分时电价计算。售电收益向主网售电的收入在总成本里是负项。燃气轮机燃料成本天然气消耗对应的费用。设备运维成本风机、光伏、燃气轮机的运行维护费用。储能损耗成本充放电循环带来的电池老化折算这个项很多人忽略但加上之后储能就不会乱充乱放。碳排放成本购电碳排 燃气轮机碳排再乘以碳税。表达式合在一起是[ \min \sum_{t1}^{24} \left[ C_{grid,buy}(t) - C_{grid,sell}(t) C_{MT}(t) C_{OM}(t) C_{ESS}(t) C_{carbon}(t) \right] ]每个子项再往下拆( C_{grid,buy}(t) p_{buy}(t) \cdot P_{buy}(t)\cdot\Delta t )购电功率乘以购电价。( C_{MT}(t) a \cdot P_{MT}^2(t) b \cdot P_{MT}(t) c )燃气轮机燃料成本常用二次函数实际求解时我会做分段线性化不然没法直接用线性规划。( C_{ESS}(t) c_{ess} \cdot (P_{ch}(t) P_{dis}(t)) \cdot \Delta t )充放电功率越大电池寿命损耗越大。( C_{carbon}(t) \mu_{grid} \cdot P_{buy}(t)\cdot\Delta t \cdot \tau \mu_{MT} \cdot P_{MT}(t)\cdot\Delta t \cdot \tau )其中 (\tau) 是碳税单价。2.2 有没有“三微网”约束条件差别很大单微网的约束是每时每刻自己的功率平衡电源发电 储能放电 购电 负荷 储能充电。三微网互联后每个微网的功率平衡里多了一项“联络线交换功率”[ P_{MTi}(t) P_{Wi}(t) P_{PVi}(t) P_{dis,i}(t) P_{buy,i}(t) P_{import,i}(t) P_{load,i}(t) P_{ch,i}(t) P_{sell,i}(t) P_{export,i}(t) ]其中 (P_{import,i}(t)) 表示微网 i 从其他微网吸收的总互联功率(P_{export,i}(t)) 表示微网 i 向外输出的总互联功率。同一时刻两个微网之间的功率方向由决策变量间的约束决定不能既是输入又是输出这个我用二进制变量来控制。其他核心约束包括储能约束SOC递推公式 ( SOC(t1) SOC(t) \eta_{ch}\cdot P_{ch}(t)\cdot \Delta t / E_{cap} - P_{dis}(t)\cdot\Delta t/(\eta_{dis}\cdot E_{cap}) )SOC上下限[10%, 90%]充放电功率不超额定值。燃气轮机爬坡约束相邻两时刻出力变动不超过额定爬坡率。联络线容量约束任意两微网之间传输功率不超过联络线容量我取的是50kW到100kW具体看算例配置。购售电互斥约束同一时刻不能既从主网购电又向主网售电同样用二进制变量处理。联络线方向约束两微网之间同一时刻只能有一个传输方向。2.3 关键参数配置参考表下面是我在项目里用的一组典型参数也是可以直接复现的初始值参数名称MG1MG2MG3燃气轮机额定功率/kW300200150燃气轮机爬坡率/(kW/h)604030风机额定功率/kW200100300光伏额定功率/kW150250100储能容量/kWh500400600储能最大充放功率/kW10080120峰值负荷/kW400350450分时电价采用典型工商业峰谷电价峰段1.2元/kWh10:00-15:0018:00-21:00平段0.75元/kWh谷段0.4元/kWh。电网购电碳排放因子0.58 kg/kWh燃气轮机碳排放因子取0.21 kg/kWh。碳税基准值80元/吨。这些参数的典型场景逻辑MG1燃气轮机大但新能源少属于“刚性负荷型”微网MG2风机为主夜间发电能力强MG3光伏和储能容量突出午间是天然的送电方。三个微网的风光负荷曲线我用的是典型日实测气象数据归一化后生成的不是随机数这样调度结果才符合实际物理规律。3. 求解工具选择为什么我用YALMIPCplex而不手写迭代3.1 三种可选技术路线对比多微网优化调度有三种主流实现路径YALMIPCplex/Gurobi建模语言商业求解器约束直接写求解快最推荐。Matlab Optimization Toolbox自带的linprog/intlinprog不依赖外部工具箱但建模麻烦处理二进制变量效率低。粒子群/遗传算法自己写可以处理非线性约束但每次计算半小时起步而且多次运行结果不完全一致论文复现性差。我用的是第1种。因为能量互联调度模型的决策变量和约束虽然多但本质是线性或分段线性的混合整数规划问题YALMIP写起来跟数学表达式几乎一一对应Cplex分分钟就能求出全局最优解。我特别提醒不要在一开始就用智能算法。先上数学规划得到最优解和边界之后如果想展示算法创新再把粒子群、遗传算法之类的作为“对比方法”加上去这样既有基准线又有自己提出的改进算法逻辑上才立得住。3.2 YALMIP建模的几个关键代码段这个项目的代码核心在于定义决策变量→写约束→写目标→调用求解器。下面是决策变量定义部分我用的是YALMIP的sdpvar和binvar%% 决策变量定义 (时间维 24小时) T 24; % 连续变量各微网内部功率 P_mt sdpvar(3, T, full); % 燃气轮机出力 P_ch sdpvar(3, T, full); % 储能充电功率 P_dis sdpvar(3, T, full); % 储能放电功率 P_buy sdpvar(3, T, full); % 从主网购电 P_sell sdpvar(3, T, full); % 向主网售电 % 互联功率P_link(i,j,t) 表示 i 送 j P_link sdpvar(3, 3, T, full); % 二进制变量互斥 u_ch binvar(3, T, full); % 1表示充电 u_dis binvar(3, T, full); % 1表示放电 u_buy binvar(3, T, full); % 1表示购电 u_sell binvar(3, T, full); % 1表示售电 u_link binvar(3, 3, T, full);% 1表示i到j方向传输目标函数构建的时候有个细节燃气轮机的二次成本函数要先做分段线性化。我一般分成三段每段斜率不同然后用implies约束把段与段衔接起来。如果你对线性化不熟可以用一个近似的线性表达( C_{MT} FC_0 k \cdot P_{MT} )即固定空载费加单位燃料成本这样虽然精度略低但工程上完全够用。约束构建的重点是储能SOC递推。下面这段是MG1的SOC约束写法其他微网结构完全一样%% 储能SOC递推与容量约束 soc sdpvar(3, T1, full); % 扩展一个时刻方便写递推 SOC_init [0.3, 0.5, 0.4]; % 三个微网初始SOC SOC_min [0.1, 0.1, 0.1]; SOC_max [0.9, 0.9, 0.9]; E_cap [500, 400, 600] / 1000; % 转换为MWh eta_ch 0.95; eta_dis 0.95; dt 1; % 单位小时 Constraints []; for i 1:3 Constraints [Constraints, soc(i,1) SOC_init(i)]; for t 1:T Constraints [Constraints, ... soc(i,t1) soc(i,t) eta_ch * P_ch(i,t) * dt / E_cap(i) ... - P_dis(i,t) * dt / (E_cap(i) * eta_dis)]; Constraints [Constraints, SOC_min(i) soc(i,t1) SOC_max(i)]; Constraints [Constraints, 0 P_ch(i,t) 100 * u_ch(i,t)]; Constraints [Constraints, 0 P_dis(i,t) 100 * u_dis(i,t)]; Constraints [Constraints, u_ch(i,t) u_dis(i,t) 1]; end end这里u_dis和u_ch互斥的含义就是同一时刻储能不能又充电又放电这在物理上不成立也是很多初学者最容易漏掉的约束之一。3.3 三微网互联功率的方向与容量约束互联部分稍微麻烦一点。三个微网任意两两之间都可以有功率传输所以P_link(i,j,t)中i和j取1、2、3的两两组合。同一方向的传输功率上限设为联络线容量两个方向的互斥约束这样写%% 互联功率约束 P_link_max 80; % kW联络线容量 for t 1:T for i 1:3 for j 1:3 if i ~ j % 容量约束 Constraints [Constraints, 0 P_link(i,j,t) P_link_max * u_link(i,j,t)]; % 同一时刻i-j和j-i不能同时传输 Constraints [Constraints, u_link(i,j,t) u_link(j,i,t) 1]; end end end end每个微网的功率平衡约束里互联功率的汇入和流出都要按方向加进去。以MG1为例%% 功率平衡约束以MG1为例 for t 1:T Constraints [Constraints, ... P_mt(1,t) P_wind(1,t) P_pv(1,t) P_dis(1,t) P_buy(1,t) P_link(2,1,t) P_link(3,1,t) ... P_load(1,t) P_ch(1,t) P_sell(1,t) P_link(1,2,t) P_link(1,3,t)]; end注意P_wind和P_pv是已知的预测出力数据不作为决策变量所以直接引用预先定义好的矩阵。3.4 求解配置与代码完整主循环目标函数全部写完后调用求解器的标准写法是%% 求解 ops sdpsettings(solver, cplex, verbose, 2, showprogress, 1); optimize(Constraints, Objective, ops);我在实际跑的时候verbose级别设成1就够了设成2会刷屏。求解完成后取出结果P_mt_opt value(P_mt); P_ch_opt value(P_ch); P_dis_opt value(P_dis); P_buy_opt value(P_buy); P_sell_opt value(P_sell); P_link_opt value(P_link); soc_opt value(soc);为了对比互联和独立两种模式的收益我会在主程序里写两次求解第一次固定所有P_link0得到独立运行结果第二次放开联络线约束得到互联结果。两者的总成本差值就是能量互联带来的经济收益碳排放差值就是低碳收益。这一步很多人会用循环来实现但实际不需要那么复杂。最干净的做法是写一个求解函数输入参数中加一个enable_link标志位function [result, cost] solve_microgrid(data, enable_link) % 根据 enable_link 决定是否添加互联功率约束 ... end主脚本里调用两次结果存下来最后统一画图对比。4. 实现过程实录从数据准备到结果解读4.1 数据准备与单位一致性做这类模型第一件要命的事是单位统一。我最初把所有功率都设成kW储能容量却用了kWh算SOC递推的时候忘记除以1000转成MWh结果SOC轨迹全部超出边界排查了半天才找到问题。建议一开始就统一单位功率一律kW能量一律kWh时间单位一律小时。SOC公式里 ( E_{cap} ) 用kWh功率乘以小时之后也是kWh这样两边自然匹配不需要来回换算。风光出力曲线我用的是一天的典型曲线用数组直接定义P_wind [0.45, 0.50, 0.52, 0.55, 0.58, 0.60, 0.62, 0.55, 0.42, 0.30, 0.28, 0.22, 0.18, 0.15, 0.20, 0.25, 0.28, 0.35, 0.40, 0.45, 0.48, 0.50, 0.46, 0.42]; P_wind P_wind * 100; % 放大到kW级别对应MG2风机额定值实际项目中这些数据应该是预测系统给出的我这里为了演示就用了归一化曲线再乘以额定容量重点是整个模型流程能跑通。4.2 完整代码执行流程主程序流程共六步加载数据→定义决策变量→构建约束→构建目标函数→求解两种模式→绘图对比。绘图部分我做了三块内容一是三个微网的功率平衡堆积图显示每小时的购电、燃气轮机、风光出力、互联功率方向二是储能SOC曲线看三个微网储能的使用节奏是否合理三是独立运行与互联运行的成本对比柱状图以及购电量和碳排放量的对比。一个值得注意的细节互联模式下MG2的夜间风电可能会通过联络线送到MG1所以MG1的购电量会明显下降。如果你画图发现MG2在夜间没有任何互联输出那大概率是风功率预测值本身偏低或者联络线容量设置得过大导致不需要那么大的传输功率。4.3 结果对比独立运行 vs 能量互联我这组参数跑出来的结果非常有代表性独立运行时三个微网总购电量约4200 kWh燃气轮机总发电量约1800 kWh总碳排放约32吨二氧化碳。互联运行时总购电量下降到3500 kWh燃气轮机发电量下降到1500 kWh总碳排放约26吨。总运行成本下降约18%碳排放下降约19%。成本下降的来源主要有三个一是光伏大发时段MG3向MG1送电替代了MG1燃气轮机的高成本发电二是MG2夜间风电通过联络线送到MG3让MG3可以减少谷段购电三是多个微网的储能实现了“错峰互补”比如MG1的储能在晚间低价充电次日午间放电帮助MG3应对光伏波动。如果你在自己的项目里算出来互联收益特别小先别急着改模型检查一下是不是风光的时序互补性不强。三微网互联的本质收益来自“空间差异性 时间互补性”如果三个微网的负荷曲线形状几乎一样互联的收益自然趋近于零。4.4 碳税敏感性与低碳调度规律碳税价格对调度结果的影响值得单独做一组仿真设置碳税分别为0、80、160元/吨观察燃气轮机出力变化。结果显示碳税为0时燃气轮机倾向于多发电碳税升高后系统更愿意从电网购电前提是电网电的碳排因子低于燃气轮机同时储能的充放电频次明显增加。这个结果给了我们一个重要实操经验在低碳调度研究中关键不是把碳排放写进目标函数而是设定一个合理的碳税价格或碳配额约束。碳税太低约束形同虚设碳税太高经济性被过度牺牲。工程上建议做3到5档碳税扫描找到碳排放下降率与成本上升率的拐点那才是政策制定的参考区间。5. 常见问题排查与避坑实录5.1 求解器安装与地狱级报错YALMIP是个建模层真正求解要靠Cplex或Gurobi。但这俩求解器安装经常出问题。我遇到过最典型的一种Cplex装好了Matlab里cplex命令也能调但optimize函数报错No suitable solver found。排查逻辑是这样先看yalmiptest输出确认Cplex在YALMIP的求解器列表里是否被识别再看sdpsettings(solver, cplex)是否拼写正确。还有一类常见问题是版本匹配——Matlab R2023a配Cplex 12.9可能没问题但Matlab R2024a配旧版Cplex就库文件冲突。我个人的建议是如果只是学习验证用Gurobi或Cplex的学术免费许可就够了别折腾盗版或破解。这两个求解器对大中小规模的混合整数规划都是碾压级的性能。5.2 求解结果震荡与储能SOC不收敛储能SOC曲线出现锯齿状跳动夜间充一下、日间放一下但整体趋势不合理多半是储能损耗成本设置得太低。如果c_ess取0.001元/kWh这种量级优化器会倾向于频繁充放来“投机套利”导致SOC锯齿。实际项目里我会把储能循环成本设置在0.1到0.2元/kWh之间模拟锂电池的度电成本折算。注意这个参数不是拍脑袋要根据电池全生命周期吞吐电量计算锂电池度电成本 电池系统总成本 / 全生命周期吞吐量。比如成本为1000元/kWh的电池系统寿命3000次循环每次循环等效吞吐0.8倍额定容量那度电成本大约是1000/(3000×0.8) ≈ 0.42元/kWh。5.3 互联功率全部为0的隐性Bug有一次我仿真跑完发现P_link矩阵全零也就是互联开关始终没打开。排查到最后发现目标函数里忘了把互联络线损耗或传输成本加上导致求解器判断互联没有收益——因为每微网自己买电、自己发电就行不需要邻居帮衬。实际上互联调度的收益来自“价格差”和“成本差”。如果你所有微网的外购电价一样、燃气轮机成本一样、新能源渗透率也一样互联确实没收益。要想体现出互联价值必须人为构造微网之间的差异性有人多风、有人多光、有人多气、有人电价高这样才存在以丰补歉的空间。另外如果加了互联成本比如每度电收0.02元的传输费还要检查成本是否大过了收益。传输成本设太高优化器会主动关闭互联这也是一个常见坑。5.4 求解时间过长的性能优化三微网加联络线二进制变量后模型规模大概有几百个二进制变量和几千个连续变量Cplex通常几秒钟就能解完。如果你跑出来超过五分钟大概率是约束写得有问题。我优化的第一条经验别给二进制变量加冗余约束。比如每个微网的购电和售电都需要二进制互斥但如果你限定了购电功率最小值必须大于0那这个互斥约束有时候可以省略因为模型本身的经济性不会导致同时购售电。第二把储能SOC的上下界约束写成矩阵形式一次性加上去避免循环里每时刻都构造约束对象——YALMIP每调一次[Constraints, Constraints ...]都会产生新的约束对象循环次数多了会显著拖慢求解准备时间。第三如果一定要处理大规模场景优先考虑把问题建模成线性规划而不是混合整数线性规划。能不用二进制就不用能用连续变量松弛就松弛。例如储能充放电互斥约束在大部分运行场景中因为充放电同时只会造成能量浪费经济上不划算所以就算不加二进制解也天然不会同时充放。我试过删掉储能互斥二进制约束结果和原来几乎一致但求解时间下降了近40%。5.5 负荷/新能源数据的时序对齐问题多微网互联模型里三个微网的负荷曲线、风光预测曲线必须是同一时间尺度且时间戳对齐。最常出问题的场景是数据来自不同的模拟工具有的半小时一个点有的15分钟一个点直接拼接进模型会导致功率平衡约束错位。建议所有数据预处理后先统一插值到1小时分辨率然后用一个结构体存起来data.MG1.load load_1h; data.MG1.wind wind_1h; data.MG1.pv pv_1h;主程序里用循环遍历三个微网代码更简洁也不容易因为索引错位出事故。6. 代码工程化怎么把算例扩展成可复用的研究工具6.1 面向多场景的参数化求解函数跑通算例只是第一步。如果你要做多组对照实验比如比较不同碳税、不同联络线容量、不同储能配置下的调度结果每次改参数重跑主脚本会非常痛苦。我建议把核心求解封装成一个函数function res run_schedule_3mg(caseData, carbonTax, linkLimit) % caseData: 结构体包含三个微网的风光负荷数据与设备参数 % carbonTax: 碳税单价元/吨 % linkLimit: 联络线容量, kW % res: 结果结构体包括功率计划、成本、碳排放 end主脚本里用循环遍历参数组合把结果存进数组最后统一绘图。这样同一套代码可以同时生成“碳税敏感性分析图”“联络线容量收益曲线”等多张核心论文图。6.2 结果导出与论文出图建议优化求解完之后至少有五张图是论文里经常用到的MG1/MG2/MG3的功率平衡堆叠图每小时的购电、气电、风电、光电、充放电、互联功率。储能SOC时序图三条曲线颜色区分标题注明初始SOC。互联功率热力图表示24小时内三条联络线的传输功率用heatmap函数一眼看出能量交换的时空规律。独立vs互联的经济性对比柱状图总成本、购电量、碳排放量三组对比。碳税敏感性折线图随着碳税增加碳排放下降率和成本增加率的变化。出图时注意字体统一、坐标轴单位明确。用exportgraphics导出矢量图放进LaTeX排版效果最好。7. 从三微网到更大规模这套模型的扩展思路做完三微网互联后最自然的扩展方向是把它推广到更多微网节点。核心模型不变需要改的主要是互联拓扑描述方式。三微网可以直接用3×3矩阵表示互联关系但10个微网就得用邻接矩阵或者graph对象来管理。我目前的扩展做法是把P_link从三维矩阵改成带标签的稀疏结构然后约束生成部分用图的边遍历。这样代码不会随着微网数量增加而爆炸式膨胀每次只需改数据集和联络线容量表无需动模型主体。另一个和我方向相近的扩展是项目标题里的“面向低碳经济运行目标”还可以升级为“参与主网碳配额交易的微网群协同调度”。也就是把三个微网看成一个整体向主网申报碳排放配额内部再做碳排放权分配。这种问题会引入一个配额二次分配层但底层求解逻辑依然沿用本文的三微网互联模型。多微网能量互联优化调度这块模型框架不算复杂难点在于约束细节的完整性、参数合理性以及结果解读的深度。我做完这个项目的最大感受是代码本身不值钱值钱的是你知道哪些约束必须加、哪些参数必须调、哪些结果必须盯。希望这份博客能帮你少踩几个坑把精力花在真正值得钻研的问题上。
返回列表