ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

多微网能量互联低碳经济调度:Matlab+Yalmip建模实践

多微网能量互联低碳经济调度:Matlab+Yalmip建模实践 做多微网优化调度这几年我最常被问到的一个问题是微网规模这么小单点优化就够了为什么非要多微网互联答案其实很简单——单微网扛不住所有的源荷波动只有让多个微网在能量层面互相支援把低谷时段的富余电送到高峰负荷的微网整个系统才能既省钱又降碳。这也是“多微网能量互联优化调度”这个方向的核心价值所在。这篇内容围绕面向低碳经济运行目标的多微网能量互联优化调度展开基于MatlabYalmip搭建一套完整的联合调度框架。我会把数学模型、约束线性化处理、代码结构、求解器配置、算例设计全部拆开讲并结合自己在跑数据时踩过的坑给出实操建议。适合正在做微电网优化调度研究、或者想从单微网向多微网扩展的硕博研究生和工程师参考。1. 为什么盯上“多微网能量互联”这个方向1.1 单微网调度已经碰到瓶颈单微网调度本质上是内部的源荷平衡问题光伏出力大时多余的电要么存进储能要么弃掉负荷高峰时要么燃气轮机多发电要么从上级电网购电。这套逻辑在微网规模不大时很有效但它有个天然的软肋——单一微网的可调节资源总量有限极端天气或负荷突变时内部资源根本拉不平。举个实际例子。某个微网装了不少光伏晴天午间出力溢出储能充到顶了还剩不少电只能眼看着弃掉同一时刻隔壁微网正赶上负荷高峰燃气轮机满发还不够。两边的源荷特性恰好互补但因为没有互联通道只能各自为战。这种场景在真实园区里非常常见不同微网的负荷曲线、新能源装机比例、储能配置差异越大独立运行的资源浪费就越明显。把多个微网通过联络线连接起来让功率在微网之间流动本质上是用空间换时间——把不同微网的余缺在互联层面对冲减少对上级电网的依赖也减少弃风弃光。1.2 能量互联的经济性逻辑能量互联的经济性来自两个层面。第一是替代购电。上级电网的电价往往分峰谷时段峰时电价可能比谷时贵两到三倍。如果互联微网中某个微网谷时有富余电峰时送出去两个微网都能受益。对送端来说多余的电本来要弃掉卖出一点是一点对受端来说从邻网买电比从电网购电便宜这就是双赢。第二是减少备用容量。独立运行时每个微网都要为自己的负荷峰值预留足够的发电和储能容量互联之后峰值负荷可以由多个微网共同承担系统的总备用容量可以适当降低这部分容量成本省下来非常可观。但要注意互联不是无成本的。联络线有功率极限功率流动有损耗协调控制需要额外的通信和调度机制。经济性必须建立在互联收益 协调成本的前提下这也是优化调度模型必须算清楚的核心问题。1.3 低碳目标怎么放进调度模型传统的经济调度只关心燃料成本和购电成本把碳排放当成固定背景板。现在做低碳调度碳排放要么作为目标函数里的一个独立成本项要么作为约束条件设定排放上限。我在这套模型里用的是碳交易机制给每个微网分配初始碳配额实际排放低于配额可以把富余配额卖掉获利超过配额需要花钱购买碳排放权。这里的关键点是碳价如何设置。固定碳价是最简单的做法但实际碳市场中碳价是波动的而且超排量越大购买成本越高呈现阶梯式递增的特点。模型里我采用阶梯碳价来模拟这种边际成本上升的特性让优化结果更贴近真实市场。另外还要注意碳排放不只来自燃气轮机的直接排放上级电网购电也隐含着间接排放——电网侧的煤电、气电都会排碳。如果只算微网内部的直接排放会低估购电的真实碳成本导致调度结果偏向多购电、少发电这与低碳目标背道而驰。2. 低碳经济调度的数学建模目标函数与约束拆解2.1 目标函数的三层成本结构整个优化调度的目标函数我设计成三层叠加每一层对应一个决策维度。第一层是发电成本包括燃气轮机的燃料成本和启停成本。燃气轮机的燃料成本通常用二次函数描述为了用MILP求解我做了分段线性化处理。第二层是运维成本包括储能充放电的损耗成本、光伏和风电的运行维护成本。光伏和风电的边际成本很低但为了体现设备磨损按出力比例加一个很小的运行维护系数。第三层是碳交易成本这是低碳目标的核心载体。用一个分段函数表示阶梯碳价实际碳排放量在配额以内时碳交易成本为负——相当于卖出配额获得收益超出配额后超出部分按阶梯碳价购买超额越多单价越高。目标函数形式如下[\min C \sum_t \sum_{i} \left( C_{mt,i,t} C_{om,i,t} C_{co2,i,t} \right) \lambda \sum_t P_{grid,t} \cdot p_t]其中 ( C_{mt,i,t} ) 是微网 ( i ) 在时段 ( t ) 的燃气轮机发电与启停成本( C_{om,i,t} ) 是运维成本( C_{co2,i,t} ) 是碳交易成本最后一项是向上级电网购电的费用。这里省略了联络线传输损耗成本主要是为了方便初始建模实际工程中如果联络线较长可以加一个传输效率系数进行修正。2.2 必须写进去的硬约束模型再漂亮约束写不对也白搭。我梳理了五类核心约束缺一不可。功率平衡约束是每个微网每个时段的记账本光伏出力、风电出力、燃气轮机出力、储能放电、从其他微网购电之和等于负荷功率、储能充电、向其他微网购电方的送出功率之和。这组约束保证微网内部各时段的能量守恒。联络线传输约束包括联络线容量约束和功率方向约束。我用两个非负变量分别表示受电和送电功率两者的差值就是净交换功率这样才能在MILP框架里表达方向。同时要保证同一时刻一条联络线不能既送电又受电这个用二进制变量加一个大M约束实现。储能约束包括充放电功率上下限、SOC荷电状态递推关系和初始终值约束。SOC递推是带有时段耦合的等式约束当前SOC等于上一时段SOC加上充电电量乘以充电效率再减去放电电量除以放电效率。这也是整个模型中最容易出现数值问题的约束。燃气轮机约束包括出力上下限、爬坡约束和最小启停时间约束。最小启停时间约束在工程上很重要但会引入额外的二进制变量和约束数量初始版本可以先不加等基础模型跑通再扩展到完整约束。碳配额约束主要描述每个微网的初始碳配额以及实际碳排放量之间的关系。实际排放量通过燃气轮机燃料消耗和购电量的间接排放计算纳入碳交易平衡。2.3 含整数变量的线性化处理方式碳排放成本涉及分段函数储能充放电存在效率非线性和状态耦合。这些直接丢给求解器会导致模型收敛困难所以必须做线性化处理。分段碳价函数我用0-1变量和不等式束来实现。先把碳排放量分成几段区间每段有对应的边际碳价然后用大M法激活相应的区间约束最后把所有区间的碳排放成本线性叠加。储能充放电存在同时充又同时放的物理矛盾虽然数学上SOC递推约束会惩罚这种无意义行为但为了求解稳定性我还是加了充放电互斥约束充电状态和放电状态是互斥的二进制变量功率也要乘上对应的状态变量。这里有一个经验如果模型规模不大可以不强制加互斥约束把充放电效率设置成理想值让线性规划自己收敛到合理结果。但一旦加入碳交易和非线性成本求解器可能为了凑目标函数值出现诡异的充放循环这时互斥约束就很有必要了。3. Matlab实现从数据结构到求解器配置3.1 算例基础数据怎么组织数据组织是整个代码实现中最不起眼但最影响效率的部分。我用的方式是把每个微网的物理信息定义为结构体数组。% 微网基本参数结构体 mg(1).pv [0, 0, 12, 25, 45, 60, 85, 110, 130, 145, ...]; % 24h光伏出力(kW) mg(1).wind [35, 40, 38, 30, 28, 25, 30, 35, 42, 50, ...]; % 24h风电出力(kW) mg(1).load [120, 110, 105, 100, 95, 90, 110, 130, 150, 160, ...]; % 24h负荷(kW) mg(1).mt_max 200; % 燃气轮机最大出力(kW) mg(1).mt_min 20; % 燃气轮机最小出力(kW) mg(1).ramp 80; % 爬坡速率(kW/h) mg(1).es_energy 300; % 储能容量(kWh) mg(1).es_pmax 90; % 储能最大充放电功率(kW) mg(1).co2_quota 250; % 每日碳配额(kg)我习惯把24小时的新能源出力和负荷曲线单独放到Excel或者CSV里Matlab用readtable统一读取再分派到各个微网结构体中。这样换场景时只需要改数据文件不用动代码逻辑。特别推荐定义三个微网时故意做出差异化微网1光伏主导、微网2风电主导、微网3负荷峰谷差大但储能容量充足。差异越大互联调度的空间互补效果越明显算例分析也更有说服力。3.2 核心建模代码骨架代码框架上我采用Yalmip建模。先明确规模再定义决策变量然后逐条输入约束最后调用求解器。% 定义基础时间维度 T 24; N 3; % 微网数量 % 决策变量 P_mt sdpvar(N, T, full); % 燃气轮机出力 P_pv sdpvar(N, T, full); % 光伏实际出力 P_wind sdpvar(N, T, full); % 风电实际出力 P_ch sdpvar(N, T, full); % 储能充电功率 P_dis sdpvar(N, T, full); % 储能放电功率 SOC sdpvar(N, T, full); % 荷电状态 P_buy sdpvar(N, T, full); % 从上级网购电 P_import sdpvar(N, T, full); % 从其他微网购电 P_export sdpvar(N, T, full); % 向其他微网购电方的送电 u_mt binvar(N, T, full); % 燃气轮机启停状态 u_ch binvar(N, T, full); % 充电状态指示 u_dis binvar(N, T, full); % 放电状态指示 % 约束集合 Constraints []; for t 1:T for i 1:N % 功率平衡约束 Constraints [Constraints, ... P_pv(i,t) P_wind(i,t) P_mt(i,t) P_dis(i,t) P_buy(i,t) P_import(i,t) ... mg(i).load(t) P_ch(i,t) P_export(i,t)]; % 光伏风电实际出力不超过预测上限 Constraints [Constraints, P_pv(i,t) mg(i).pv(t)]; Constraints [Constraints, P_wind(i,t) mg(i).wind(t)]; Constraints [Constraints, P_pv(i,t) 0, P_wind(i,t) 0]; end end功率平衡约束是模型的核心。这里的P_import和P_export是每个微网与其他微网的总交换功率实际多微网场景里如果有多个互联节点需要拆成节点对的形式。三个微网互联时建议用P_ij的二维变量表示从第 ( i ) 个微网流向第 ( j ) 个微网的功率约束会更清晰。3.3 求解器选择与参数配置模型建好后求解器选型直接影响求解速度和稳定性。我推荐CPLEX或者Gurobi两者都支持Yalmip接口。Gurobi在线性规划和混合整数规划上的默认参数调得比较好前几年学术用途可以用免费licenseCPLEX在工业界用得更广泛各有优势。求解器配置上有两个参数特别值得重视。第一个是MIP gap。默认情况下求解器会非常执着地逼近全局最优多微网模型一旦加大规模24个时段加多个微网全局最优的证明过程可能要几个小时。实际工程中1%到2%的MIP gap带来的成本误差几乎可以忽略但求解时间能缩短一个数量级。ops sdpsettings(solver, gurobi, verbose, 2); ops.gurobi.MIPGap 0.01; % 1%的gap ops.gurobi.TimeLimit 600; % 时间上限600秒 ops.gurobi.MIPFocus 1; % 平衡可行解质量与下界提升速度第二个是启动策略。多微网互联模型存在较强的时段耦合直接冷启动求解器需要大量分支定界节点。我的做法是先用线性规划松弛版本求一次解把连续变量的值作为MIP的初始可行解喂给求解器能有效减少分支定界初期的搜索空间。3.4 结果提取与数据可视化前处理求解完成后结果提取有一些隐性陷阱。Yalmip返回的变量是sdpvar对象必须用value()函数取值。取值后还要注意数组的维度顺序我定义的维度是(微网, 时段)后续做时序图时直接按行取不同微网的数据就行。% 提取结果 P_mt_opt value(P_mt); P_ch_opt value(P_ch); P_dis_opt value(P_dis); SOC_opt value(SOC); P_import_opt value(P_import); P_export_opt value(P_export);可视化方面我通常画四组图各微网的功率平衡堆叠图、联络线交换功率时序图、储能SOC曲线、各成本项占比饼图。堆叠图用area函数交换功率图用带正负的柱状图表示送出和受入看起来最直观。4. 算例设计与结果验证互联到底带来什么4.1 三种对比场景设计为了把互联和低碳两个因素的影响拆开我设计了三个对比场景。场景A是基准场景三个微网独立运行不进行能量互联各自的功率缺额全部从上级电网购买碳排放不纳入调度目标。场景B是互联场景三个微网通过联络线互联允许功率互济但目标函数里只有经济成本不包含碳交易成本。场景C是低碳互联场景在场景B的基础上叠加阶梯碳交易机制碳排放成本进入目标函数。三个场景使用了完全相同的新能源出力、负荷曲线和储能配置唯一的变化是互联通道和碳交易机制这样才能干净地分离出各自的贡献。为了让算例有区分度我在新能源出力上做了典型日设计上午和中午光伏出力大夜间风电出力大负荷峰值出现在傍晚。这样白天和夜间的互补特征会在结果里很明显地体现出来。4.2 结果数据对比跑完三个场景后我把关键指标整理成了一张表。场景日总运行成本(元)总碳排放(kg)弃风弃光率向上级电网购电量(kWh)A 独立运行3860218018.5%1020B 互联无碳339020509.2%760C 互联碳交易352017207.6%690场景B相比场景A总成本下降了约12%弃风弃光率从18.5%降到了9.2%购电量也下降了。这说明互联调度通过微网间的功率互济减少了过剩新能源的浪费也降低了从上级电网高价购电的需求。场景C的成本比场景B略有上升但碳排放下降明显。这就是低碳调度和经济调度的权衡——纳入碳交易后燃气轮机的发电量被压低了部分时段改为从其他微网或上级电网购电以规避高额碳成本碳排放因此降了16%。在实际应用中碳价越高场景C的低碳效果越强但运行成本也会越高最终的最优碳价取决于政策环境和用户的目标偏好。4.3 联络线功率曲线揭示的互补关系把场景C的联络线功率画出来能看到非常清晰的互补调度模式中午光伏高峰时段光伏充裕的微网向负荷较高的微网送电傍晚负荷高峰时段储能容量大的微网向其他微网放电深夜风电出力大而负荷低时风电富余微网向相邻微网送电。这个现象说明多微网互联的本质是源荷时空互补。只要各微网的源荷特性不完全同步互联调度就能找到比独立运行更优的功率流路径。互补性越强互联收益越大这也是为什么设计算例时故意拉开三个微网特性的原因。5. 实操中的高频坑点与解决思路5.1 量纲一致性是最隐蔽的坑我第一次跑这类模型时把功率单位用kW能量单位用kWh碳配额单位用kg碳价单位用元/kg看起来都合理但储能SOC递推公式里出问题了。SOC的递推需要把功率乘以时间步长才能得到能量变化。如果调度步长是1小时功率kW乘以1小时就是kWh刚好和储能容量单位一致如果步长改成15分钟功率乘以0.25小时数值上就是0.25倍的关系。单位不统一的话储能永远充不满或者瞬间充满结果完全失真。建议在代码开头统一设定一个基础单位体系最好在注释里写明每个变量的物理单位。我见过不少研究者因为单位问题白跑一整天数据曲线看起来合理但其实储能SOC已经超过100%或多轮充放循环。5.2 储能SOC的积分漂移问题SOC递推约束是等式约束理论上求解器会精确满足。但MILP求解器在终止于MIP gap时SOC路径可能产生累积误差尤其是在加入充放电互斥约束后充电和放电状态频繁切换SOC曲线容易出现锯齿状波动。一个有效的处理手段是加一个终点回归约束调度周期结束后SOC必须回到初始值。这样既保证了调度的周期性可重复性也防止了SOC漂移带来的成本失真。当然如果研究动态调度不要求周期闭环那就不需要这个约束但要额外考虑SOC越限的风险。5.3 MILP求解时间过长怎么办多微网互联模型加上碳交易分段约束和储能状态约束后整数变量数量增长很快。三个微网、24个时段燃气轮机启停变量就有 (3 \times 24 72) 个0-1变量加上储能充放互斥变量总量轻松破百。虽然这个规模对CPLEX来说不算难但扩展到大微网群或者其他时间尺度时求解时间会急剧膨胀。我常用的三个降维手段一是松弛最小启停约束把燃气轮机的启停变量从两状态变成三状态启动、运行、停机收敛速度会快很多二是对联络线功率按分区固定一部分时段的交换值只优化剩余时段的交换功率三是先用经济调度结果做MIP start给求解器一个高质量初始解。5.4 变量维度不匹配的快速检查方法多微网模型变量多、维度杂最容易出隐性问题。sdpvar定义错了维度到optimize()阶段才会报维度不匹配错误排查起来非常痛苦。我的检查习惯是模型定义完成之后先用一个极小的测试场景比如2个时段、2个微网跑通整个流程看约束数量和变量维度是否正确再扩展到完整24时段。另外Constraints变量里每一项约束都是一个向量或者矩阵可以用length(Constraints)大概判断约束总数是否异常比如数据维度不对时约束数会翻倍或者减半。6. 进一步扩展从三微网到多微网集群的方向三微网模型是把问题讲清楚的最小单元结构清楚、结果直观但工程落地时往往要面对更大规模的多微网集群。扩展方向有三条一是分层调度架构上层做全网协同下层做微网自治之间通过迭代交换边界功率信息二是接入多时间尺度日前调度用小时级日内滚动用15分钟甚至5分钟级三是加上需求响应让一部分柔性负荷成为可调资源和储能、燃气轮机一起参与优化。这些扩展都在现有模型基础上做增量改动核心的互联建模方式和碳交易机制思路是可以直接继承的。后续如果大家有兴趣我可以单独展开分层调度的迭代策略和滚动优化的实现细节。最后说一个实操中的体会低碳经济调度的代码难点从来不在某个单一约束或单一变量而在于把所有物理约束和碳约束完整的耦合起来。调试时建议一个微网一个微网地叠加先在单微网框架下跑通目标函数和约束确认结果符合物理直觉后再加互联通道最后再引入碳交易。逐层递进问题定位会容易得多。这套思路我沿用了数个实际项目基本上每次都能在半天之内从零跑到可用结果。
返回列表