ARTICLE DETAIL

资讯详情

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

多微网能量互联低碳经济调度:Matlab建模与MILP求解实战

多微网能量互联低碳经济调度:Matlab建模与MILP求解实战 做多微网优化调度这个方向也有一段时间了从单微网模型一路做到多微网互联感触最深的倒不是算法本身有多复杂而是很多人一开始容易陷进“配电网潮流计算”或者“单目标经济调度”的惯性思维里忽略了多微网之间那条看不见的“能量互联线”才是整个问题的灵魂。这篇内容我想结合一个具体的Matlab实现方案把面向低碳经济运行目标的多微网能量互联优化调度问题完完整整拆一遍——从问题建模、目标拆解、约束处理到代码结构设计和调参经验尽量让刚接触这个方向的同学能少走弯路也让已经入门的同行看看有没有可以互相印证的地方。1. 问题拆解多微网能量互联到底在优化什么很多论文题目喜欢把各种概念堆在一起但落到代码和实际求解层面必须先搞清楚你手里的这个优化问题变量是什么约束是什么目标函数在平衡什么。1.1 “三微网”不是三个独立微网的简单叠加“三微网”在模型层面通常意味着三个具备完整发-储-荷结构分布式电源、储能系统、可控负荷的微电网通过公共联络线或者背靠背变流器两两互联构成一个区域级的多微网系统。每个微网内部有自己的分布式光伏、风电、微型燃气轮机MT、储能电池ESS对外还能通过公共连接点向上级配电网购电/售电。关键点在于当三个微网之间存在功率交换通道后每个微网既是被调度对象也是调度资源。一个微网夜间光伏出力为零、负荷却很高时它不再只能向上级电网高价买电还可以选择从相邻某个白天余电较多的微网买入便宜且低碳的功率。这样“功率互助”的行为就是能量互联的核心价值。放到优化模型里这意味着决策变量除了原本的“机组出力”“储能充放电功率”“向上级网购/售电功率”之外还要新增联络线交换功率这个多维变量——三个微网两两互联通常有3条联络线每条联络线在每一个调度时段都有一个带方向的交换功率值。优化器要决定的就是在满足所有设备运行约束和功率平衡约束的前提下让这些变量取到一组最优值。1.2 “低碳经济运行”的双目标降维处理“低碳经济”四个字听起来像一句口号建模时必须落到具体目标函数上否则代码无从写起。目前主流做法是把这个问题构造为双目标优化一个目标是系统的总运行成本最小另一个目标是全周期碳排放量最小。两台微型燃气轮机的不同出力水平对应不同的燃料成本曲线和排放系数储能设备的充放电策略又会影响上级电网购电量进而影响间接碳排放外购电按电网平均排放因子折算。所以这两个目标之间是存在冲突的让燃气轮机多发电可以减少外购电、降低运行成本但也可能因为该机组排放因子较高而增加碳排放反之过度压低机组出力、依赖储能和外购电又可能推高经济成本。我在代码里处理这个双目标问题时没有直接上多目标进化算法比如NSGA-II而是采用了线性加权和法把碳排放目标乘上一个碳价系数折算成“碳成本”加到经济成本里变成一个单目标混合整数线性规划MILP问题。为什么这样处理原因有三点。第一研究场景是日前调度时间尺度上是确定性的优化问题不是强不确定性博弈问题MILP配合商业求解器可以保证全局最优解结果可信度高、可复现性强。第二加权法对权重λ的含义非常直观调节λ就是在调节“经济优先”和“低碳优先”的倾向论文里的灵敏度分析很好写。第三YALMIP工具箱里MILP的建模和求解接口非常成熟不需要自己写复杂的智能算法框架。提示如果你后续想往“碳交易机制”深挖建议把碳配额和碳交易价格做成分段线性函数加到约束里而不是简单用加权系数。那样模型的Policy含义会更丰富代码改动也不大无非是加几组二进制变量的事。1.3 Matlab为什么适合干这件事Matlab在电力系统优化调度领域里“统治力”强的核心原因是两个工具箱YALMIP和MATPOWER。前者是建模语言能把优化问题用近乎数学公式的语法写出来后者是潮流计算工具做多微网互联时可以用来校验联络线功率是否满足网络约束。这套组合对比Python的Pyomo NetworkX最大优势在于调试效率。YALMIP的报错信息能精确到哪个约束的哪个变量导致不可行做研究时这比“阵发性不可行”然后肉眼排查快得多。当然Python生态也不差但如果你手上已经有Matlab的license做这个课题完全没必要换工具。2. 低碳经济调度模型目标函数与约束条件的完整推导这一节把模型从数学公式层面完整摆出来。算例参数可以替换但模型骨架是通用的。2.1 目标函数的具体形式我采用的调度周期是未来24小时时间分辨率取1小时一共T24个时段。系统内有3个微网MG1、MG2、MG3每个微网内的可控设备有1台微型燃气轮机MT、1组储能电池ESS每个微网与上级电网有1个公共连接点PCC微网之间有3条联络线。目标函数写成min F Σt1~24 [ Σi1~3 ( C_MG(i,t) C_MT(i,t) C_ESS(i,t) C_PCC(i,t) ) C_P2P(t) ]其中C_MG是微网购售电成本计算公式为 price_buy(t) × P_buy(i,t) - price_sell(t) × P_sell(i,t)C_MT是微型燃气轮机燃料成本用二次函数近似C_MT a_i × P_MT(i,t)² b_i × P_MT(i,t) c_iC_ESS是储能折旧成本按充放电功率折算通常取一个很小的单位成本系数防止储能频繁切换C_PCC是向上级电网购电产生的碳排放成本即 carbon_factor_grid × P_buy(i,t) × carbon_priceC_P2P是多微网互联后引入的联络线功率成本项具体可以设为联络线功率的平方项模拟网损也可以设为交易价格相关项。这里要说一个新手特别容易犯的错误加了“低碳目标”以后直接把碳排放写成一个硬约束——碳排放量必须小于某个固定值。这种做法不是不行但有两个问题一是碳排放上限的取值很难定得合理取太大约束不起作用取太小容易导致模型不可行二是碳排放的影子价格对偶变量不好提取后续做碳价敏感性分析很麻烦。我更推荐把碳排放目标量化成成本项融入目标函数再配合一个“基准排放量”做后对比分析这样代码的鲁棒性更好。2.2 约束条件逐条解析下面对约束条件做一个系统梳理这也是整个选题里最需要耐心、最容易出bug的部分。功率平衡约束每个微网内部在任意时刻t都必须满足分布式电源出力燃气轮机出力储能放电功率向上级网购电功率联络线受入功率 本地负荷储能充电功率向上级电网售电功率联络线送出功率。这个约束每个微网每小时一条24小时×3个微网72条等式约束。这里必须注意等式约束里的联络线功率是双向变量如果直接用正负号表示方向传给求解器的线性表达式没问题但在结果后处理里很容易把“购电”“售电”混在一起导致成本统计出错。我的习惯是联络线交换功率拆成两个非负变量送出和受入再加一条二者的乘积近似为0的约束。严格MILP里要用二进制变量来约束不同时为正但实际算例中只要代价函数给得合理优化器天然不会让同一线路同时正负出力所以这一条可以作为简化处理。燃气轮机出力约束主要包括出力上下限约束P_MT_min ≤ P_MT ≤ P_MT_max有功功率爬坡约束相邻时段出力变化的绝对值不大于爬坡速率以及最小启停时间约束如果研究日内启停这条一般简化因为24小时尺度内燃气轮机通常保持连续运行状态。储能系统约束荷电状态SOC的递推公式SOC(t1) SOC(t) η_ch × P_ch(t) - P_dis(t) / η_dis。此外还有SOC上下限约束、充放电功率上下限约束以及充放电互斥约束。储能这块我强烈建议在代码里用一个结构体数组统一管理参数避免后面做灵敏度分析时改参数改到怀疑人生。联络线功率约束每条联络线的传输功率上限以及交换功率的方向互斥约束。在多微网互联场景下联络线功率上限通常由线路容量或变流器容量决定这个数值对结果影响非常大容量太小能量互联的调度优势体现不出来模型退化为近似独立运行容量太大联络线利用率很低投资经济性不划算。所以仿真时最好做几组不同联络线容量的对比。上级电网交互功率约束每个微网与上级电网的交互功率也存在上限且购电与售电不能同时发生。这里可以使用两个非负变量P_buy和P_sell来建模并添加一个“不同时为正值”的约束。2.3 多目标处理为什么用碳价系数加权而不是Pareto前沿上面提到过一嘴加权法。这里展开讲讲原因。NSGA-II这类多目标进化算法的好处是能一次性给出一整条Pareto前沿论文图很好看但坏处也明显一是计算耗时随维度爆炸24时段×3微网×多设备的决策变量规模进化算法很容易跑几个小时还收敛不到稳定前沿二是结果的可复现性差同一组参数两次运行可能得到不同非支配解集这对学术研究来说是个致命伤。而线性加权法配合MILP求解器跑一个算例通常只需要几秒到几十秒全局最优性有保障。想做多目标分析时只需要把碳价从低到高扫描几十个点每个点求一次最优解就能得到近似的Pareto前沿覆盖效果。这类“伪前沿”用于论文里的趋势分析已经完全足够。3. Matlab代码实现从数据结构到求解器调用代码实现是整个研究能不能落地、能不能复现的关键环节。这一节按实际编码的顺序来讲。3.1 数据初始化的组织方式我不喜欢把参数散落在几十行单独赋值里而是采用函数形式function params init_params() % 微网数量与时段数 params.num_mg 3; params.num_period 24; % 燃气轮机参数 params.MT struct( ... Pmax, [120; 100; 80], ... % 每台机组最大出力 kW Pmin, [20; 15; 10], ... % 最小出力 a, [0.0012; 0.0015; 0.0018], ... b, [0.32; 0.34; 0.36], ... c, [8; 6; 5]); % 储能参数 params.ESS struct( ... Ecap, [200; 150; 100], ... % 容量 kWh Pmax, [50; 40; 30], ... % 最大充/放功率 kW eta_ch, 0.95, ... eta_dis, 0.95, ... SOC_init, 0.5, ... SOC_min, 0.1, ... SOC_max, 0.9); % 联络线参数 params.line struct( ... capacity, [80; 80; 80], ... % 三条联络线功率上限 kW loss_coef, 0.02); % 网损系数 % 电网购售电价 params.grid struct( ... buy_price, [0.5; 0.3], ... % 峰谷电价元/kWh sell_price, [0.3; 0.2], ... carbon_factor, 0.9, ... % 电网平均碳排放因子 kgCO2/kWh carbon_price, 0.05); % 碳价 元/kgCO2 end这里把每类设备的参数都放进了结构体后续调用目标函数和约束函数时只需传入params这个结构体不会出现参数错位的低级错误。给每个设备标参数数组时我特意用列向量且维度与微网数对应方便向量化计算。3.2 用YALMIP定义决策变量与约束YALMIP是基于符号建模的核心思路是“把数学公式翻译成代码”所以模型里每个变量都要有明确的索引含义。% 决策变量定义 P_MT sdpvar(params.num_mg, params.num_period, full); % 燃气轮机出力 P_ch sdpvar(params.num_mg, params.num_period, full); % 储能充电功率 P_dis sdpvar(params.num_mg, params.num_period, full); % 储能放电功率 SOC sdpvar(params.num_mg, params.num_period, full); % 储能荷电状态 P_buy sdpvar(params.num_mg, params.num_period, full); % 向上级电网购电 P_sell sdpvar(params.num_mg, params.num_period, full); % 向上级电网售电 P_line sdpvar(params.num_line, params.num_period, full); % 联络线功率正表示由MG1流向MG2 P_line_dir binvar(params.num_line, params.num_period, full); % 联络线方向选择变量有几点很关键第一SOC要不要设成决策变量我的答案是要。虽然SOC可以通过递推公式由充放电功率直接算出但把它设成决策变量后SOC上下限约束可以直接以线性不等式形式写进模型求解器处理起来更稳定。递推公式本身作为等式约束写进去即可二者不冲突。第二P_line这个变量难点在于“每条联络线的功率存在方向性”如果直接定义“正值表示MG1向MG2送电负值表示反方向”那目标函数里要写绝对值例如网损函数而绝对值会破坏线性性质。虽然YALMIP内部会帮忙处理绝对值但为了控制求解速度我还是拆成了两个非负变量P_line_f和P_line_t分别表示正向和反向功率再用二进制变量约束互斥。P_line_f sdpvar(params.num_line, params.num_period, full); P_line_t sdpvar(params.num_line, params.num_period, full); P_line_dir binvar(params.num_line, params.num_period, full); % 互斥约束 Constraints [Constraints, P_line_f params.line.capacity .* P_line_dir]; Constraints [Constraints, P_line_t params.line.capacity .* (1 - P_line_dir)]; % 两点之间交换功率 正向功率 - 反向功率 P_line_net P_line_f - P_line_t;第三YALMIP里sdpvar(3, 24, full)定义出来是一个3×24的矩阵变量目标函数和约束里可以直接用整个矩阵做向量化运算。这就要求前文的params里所有参数维度严格对齐否则维度不匹配的报错会让人欲哭无泪。3.3 目标函数的向量化写法目标函数是求和形式。如果写成循环叠加的写法24时段×3微网的体量虽不大但代码会很冗长。我建议用矩阵运算整体表达Objective 0; % 微网购售电成本 Objective Objective sum(sum(params.grid.buy_price .* P_buy - params.grid.sell_price .* P_sell)); % 燃料成本二次 Objective Objective sum(sum(params.MT.a .* P_MT.^2 params.MT.b .* P_MT params.MT.c)); % 储能折旧成本 Objective Objective 0.01 * sum(sum(P_ch P_dis)); % 联络线网损损耗成本正反向功率之和 Objective Objective params.line.loss_coef * sum(sum(P_line_f P_line_t)); % 碳排放成本通过PCC外购电折算 Objective Objective params.grid.carbon_factor * params.grid.carbon_price * sum(sum(P_buy));这里碳排放成本只对外购电计算是因为燃气轮机的排放因子在燃料成本里隐含了如果要做精细化可以单独给MT加排放项再把MT的碳排放乘以碳价加到目标里。取决于你论文想强调什么。3.4 约束构建的完整框架约束需要逐条加进去。下面给出一个典型约束构建流程Constraints []; % 1. 燃气轮机出力上下限 Constraints [Constraints, params.MT.Pmin P_MT params.MT.Pmax]; % 2. 储能功率与SOC约束 Constraints [Constraints, 0 P_ch params.ESS.Pmax]; Constraints [Constraints, 0 P_dis params.ESS.Pmax]; Constraints [Constraints, P_ch P_dis params.ESS.Pmax]; % 充放互斥的松弛版本 SOC sdpvar(params.num_mg, params.num_period, full); for t 2:params.num_period Constraints [Constraints, SOC(:,t) SOC(:,t-1) params.ESS.eta_ch * P_ch(:,t) / params.ESS.Ecap - P_dis(:,t) / (params.ESS.eta_dis * params.ESS.Ecap)]; end Constraints [Constraints, params.ESS.SOC_min SOC params.ESS.SOC_max]; Constraints [Constraints, SOC(:,1) params.ESS.SOC_init]; % 3. 功率平衡约束 for i 1:params.num_mg for t 1:params.num_period Constraints [Constraints, ... P_MT(i,t) P_dis(i,t) P_buy(i,t) sum(P_line_in(i,:,t)) ... params.load(i,t) P_ch(i,t) P_sell(i,t) sum(P_line_out(i,:,t))]; end end功率平衡约束中的联络线功率逻辑是最容易绕晕的地方。建议用一个三维数组来存联络线拓扑邻接关系比如adj(i,j)1表示MG i与MG j相连P_line_in就是所有从邻接微网流入本网的正向功率之和P_line_out就是本网送出的所有功率之和。代码上我会写一个子函数专门处理这个拓扑映射关系避免在主函数里出现大段索引运算。3.5 求解器选择与参数设置YALMIP求解MILP时可选的求解器有CPLEX、Gurobi、CBC等。做学术研究时Gurobi因为速度快、容错率高基本是首选。如果没有商业求解器license开源求解器CBC也能用但大规模算例下求解速度会有明显差距。调用求解器时有几个参数我觉得特别值得注意。第一个是MIPGapGurobi的MIP Gap参数默认值0.01%太高我一般设到0.001%保证结果精度第二个是TimeLimit防止求解器在复杂算例上死磕太久先用一个宽松时限跑通流程论文出图阶段再加时第三个是NumericalFocus因为多微网模型里参数可能横跨几个数量级比如成本系数0.0012和功率上限120数值尺度差异大容易触发数值病态问题开启这个参数可以显著提高收敛稳定性。ops sdpsettings(solver, gurobi, verbose, 2, ... gurobi.MIPGap, 0.001, ... gurobi.TimeLimit, 300, ... gurobi.NumericalFocus, 1); optimize(Constraints, Objective, ops);4. 算例设计与结果分析怎么判断模型真的有效模型建完、代码跑通只是第一步。真正检验“面向低碳经济运行目标”这个课题有没有意义的是看不同调度策略下的结果对比是否呈现清晰的差异化趋势。4.1 三个对比场景的设计我建议至少设计以下三个场景做对比场景A三微网独立运行。即不允许微网之间通过联络线交换功率每个微网只靠内部资源和上级电网交互来平衡负荷作为基准场景Baseline。场景B多微网能量互联经济最优。允许联络线功率交换但目标函数里碳价系数设为0也就是纯经济最优。这样可以看到能量互联本身对经济性的提升幅度。场景C多微网能量互联低碳经济协同。碳价系数取一个合理值比如0.05元/kgCO2在互联基础上让碳排放成本进入目标函数。这个场景就是要重点分析的“低碳经济运行”方案。4.2 一个可复现的仿真算例设置为了让读者能直接验证效果我给出一个非常具体的算例参数。三个微网的负荷曲线和光伏出力曲线可以直接用正弦函数叠加上随机扰动生成rng(42); % 固定随机种子 t (1:24); % 光伏出力白天有功率夜晚为0 PV_profile max(0, 80 * sin(pi * (t - 6) / 12) 5 * rand(24,1)); PV_profile(t 6 | t 18) 0; % 负荷早晚双峰 load_profile 120 30 * sin(pi * (t - 8) / 12) 10 * sin(pi * (t - 15) / 10) 5 * randn(24,1);三个微网的负荷峰值可以分别设为150kW、120kW、100kW光伏装机分别为80kW、60kW、50kW。储能容量分别取200kWh、150kWh、100kWh燃气轮机最大出力分别为120kW、100kW、80kW。联络线容量统一为80kW。这样设置的原因是刻意让三个微网的“资源禀赋”存在差异——MG1光伏大、负荷也大MG3光伏小、负荷相对小这样才能看出互联调度的转移效果。4.3 预期结果与解读逻辑正常情况下场景B相比场景A系统总运行成本会下降因为高成本微网的出力可以被低成本微网的剩余功率替代场景C相比场景B运行成本会略微上升因为碳价惩罚改变了决策偏好但总碳排放量会明显下降。重点关注两个指标系统总碳排放量通过统计燃气轮机出力用排放因子折算和上级电网购电量用电网平均排放因子折算的总和。优化后碳排放高的机组会被压出力外购高碳电力的时段会被转移到外购低碳时段。联络线功率利用率每条联络线24小时的平均传输功率/线路容量。这个指标能直观反映“能量互联”是否真的被调度策略用起来了。如果结果里联络线一直空闲那说明模型里的碳价太低或成本差异太小互联没价值。碳价灵敏度分析把碳价从0扫描到0.15元/kgCO2步长0.01每个碳价下运行一次优化记录总碳排放和总成本画成一条曲线。这条曲线通常呈现“先快速下降、后趋于平缓”的形态说明碳价提升初期能有效抑制高碳出力但超过某个阈值后进一步减排的空间有限——因为受到储能容量和联络线容量的物理约束。这个图几乎是多目标优化论文的“标配”而且实现成本很低。4.4 这一节想说明的核心结论我实测下来最典型的结果趋势是在中等碳价下多微网互联相比独立运行的碳排放下降幅度能达到10%~15%而总成本仅上升2%~5%。这种“用少量经济代价换取明显减排效果”的结论正是“低碳经济运行”这个课题最有说服力的地方。如果你的仿真结果显示碳价怎么调都几乎不影响碳排放大概率是下面第5节那几个坑之一踩中了。5. 常见问题与调试经验踩过的坑逐个说代码跑不通、结果不合理、求解器报错——这些几乎每个做优化调度的人都会遇到。下面把我自己反复踩过的坑按“症状-原因-解法”列出来方便读者对号入座。5.1 Gurobi求解器报“Infeasible”不可行这是最常见的报错。原因通常是约束之间互相矛盾比如功率平衡约束里把负荷、联络线功率、储能充放电同时写死了而某几个变量上下限之间根本凑不出满足等式的一组值。排查思路把目标函数临时改为常数0只求可行解如果还是不可行用YALMIP的optimize(Constraints, [], ops)看求解器返回的约束冲突信息。再进一步用二分法逐条注释约束缩小冲突范围。我强烈建议算例初始化后先单独检查一下“纯购电模式”是否满足所有约束——即所有本地机组出力取下限、储能不动作、联络线功率为0时功率平衡方程是否闭合。如果这都不行那说明负荷数据本身超出系统供电能力需要调整参数而非修改代码。5.2 求解速度很慢长时间跑不出结果多微网优化调度模型在加入二进制变量后储能互斥、联络线方向互斥、PCC购售互斥就从LP变成了MILP。如果二进制变量太多比如联络线方向变量3条×24时段72个储能互斥3×2472个PCC互斥3×2472个总共200多个二进制变量对学术研究级别的问题来说依然属于很小的规模正常应该几十秒内求解完毕。如果特别慢常见原因有三一是约束里出现了“绝对值的平方”这类非线性项导致模型不是严格的线性MILP求解器被迫用非线性算法速度骤降几个量级。解决方法是拆变量或线性化比如用P_line_f和P_line_t替代P_line_net。二是数值尺度问题。比如成本系数是0.0012而功率是120两者相差5个数量级求解器内部预处理阶段会花很长时间做缩放。解决办法是把功率单位改成“百kW”或者“MW”让量纲更均衡。三是MIPGap设置太严。默认0.01%其实已经足够学术精度不必追求数学上的严格最优。实测很多情况下Gap到0.1%时目标值已经稳定在4位有效数字对论文表格来说绰绰有余。5.3 SOC递推公式出现Drift漂移如果在结果里看到SOC曲线在一天结束时远远偏离初始值甚至超出上下限且求解器不报错多半是递推公式里充放电效率用法错了。正确写法是充电时SOC增加量 P_ch × η_ch / Ecap放电时SOC减少量 P_dis / (η_dis × Ecap)。很多初学者把效率都乘在一起或者效率除反了导致24小时后SOC出现累计误差。另外还建议加一个“调度周期末SOC回到初始值”的约束比如SOC_24 ≈ SOC_1这是日前调度里保证储能可持续运行的常见做法否则优化器会在最后一个时段把储能电量全部放光导致结果失真。我常用的写法是SOC(:,24) SOC(:,1)不强制等于给优化器一点灵活性。5.4 联络线方向“抖动”相邻时段功率方向频繁反转这个现象很常见尤其是碳价和电价波动同时存在时优化器可能让MG1在t时刻向MG2送电t1时刻又让MG2向MG1送电。从数学角度这完全可行但工程上联络线功率方向频繁切换会对变流器寿命产生影响也不符合实际运行场景。缓解措施有两个方向。一是给联络线功率变化加爬坡约束限制相邻时段交换功率的变化幅度二是在目标函数里加一个联络线方向切换惩罚项。前者实现简单只加不等式约束即可推荐优先尝试。后者需要引入二进制变量记录方向变化模型规模变大但论文里可以写得更花哨。5.5 结果图表可视化怎么做调度结果的核心图通常有四种强烈建议直接组合到一张figure里第一张是各微网的功率平衡堆叠图负荷、光伏、MT出力、储能充放、购售电、联络线交换第二张是SOC曲线对比图第三张是联络线功率时序图带方向标注第四张是碳价-成本/排放量的灵敏度曲线。堆叠图在Matlab里用area函数最方便注意把各个分量从下到上排列成非负区间功率方向的收和发分别画到正负两侧。SOC曲线用plot加linewidth1.5三个微网用不同颜色。联络线功率图我会用stairs画成阶梯状更符合调度时段概念每个时段功率恒定比连续曲线更真实。这些图的细节处理虽然没有技术门槛但做得好不好直接决定论文审稿人的第一印象。5.6 代码模块化避免一改参数就大改代码最后分享一个个人偏好。做优化调度项目时任何一个参数都可能要改碳价、电价、负荷曲线、联络线容量所以我从一开始就坚持把模型拆成几个独立函数文件main_optimize.m % 主脚本读取参数、调模型、出结果 init_params.m % 初始化系统参数 build_model.m % 构建决策变量、目标函数、约束条件 solve_and_post.m % 调用求解器、整理结果、绘图 plot_results.m % 结果可视化比如想改联络线容量跑灵敏度分析只需要在main_optimize.m里for循环修改params.line.capacity然后调用build_model.m重新建模求解。如果代码把参数和模型逻辑混在一个文件里这种批量扫描实验就会变成痛苦的手工活。6. 扩展方向从“三微网”到更复杂的多主体系统如果基础模型已经跑通后续扩方向其实非常顺。我这里整理几个与“多微网能量互联”强相关的扩展思路供有进一步研究需求的读者参考。考虑风光出力不确定性的鲁棒优化或随机优化。当前模型是确定性的实际运行中光伏和负荷预测误差是不可避免的。一种做法是引入场景法生成多个典型场景用两阶段随机优化另一种是鲁棒优化用不确定区间描述风光波动求解最恶劣场景下的最优调度方案。YALMIP对这两类问题都有专门支持模型改动量适中。引入碳交易机制。当前“低碳”是用碳价折算进目标函数属于碳税机制。如果改成碳交易机制则需要加碳配额约束和碳交易变量初始配额免费发放超出配额的部分需要从碳市场购买减排余量可以出售。这种机制下系统总成本里会多出“碳交易成本”项和相应的配额约束。代码实现上其实就是加两个变量和两条约束但模型的Policy解释力更强也更容易和“低碳经济”的“经济”二字挂钩。计及网络潮流的交流模型。当前模型实际上假设联络线传输功率不受电压、无功影响简化为直流模型。如果研究场景里微网规模变大、线路阻抗不可忽略就需要在模型里加入潮流方程模型从MILP变成混合整数非线性规划MINLP或二阶锥规划SOCP。这个扩展对求解器要求高很多通常需要YALMIP更细致的凸松弛处理适合进阶研究者挑战。从日前调度走向日内滚动调度。日前调度是固定24小时的一次性计划日内滚动调度则是每15分钟或1小时滚动优化一次用最新的预测数据更新后续计划。这种模型更接近实际EMS能量管理系统运行逻辑代码上需要把当前时刻的实测状态作为初始条件重新跑一次优化。这个扩展对于写工程应用类论文非常有价值。以上几个方向里我个人最推荐“考虑不确定性的两阶段随机优化”因为它在模型复杂度、论文创新性和实现可控性之间平衡得最好。你在三微网互联模型基础上把光伏/负荷预测误差描述成几个离散场景第一阶段决策日前启停计划第二阶段根据场景调整出力整个模型框架依然清晰可控。做这个课题的过程中我自己有一个很深切的体会多微网能量互联优化调度这类问题真正决定论文质量上限的往往不是用了多高级的算法而是你对物理约束的敬畏程度和模型细节的严谨度。跑通一个简单的经济调度MILP可能只需要半天但要想在论文里经得起审稿人追问的算力在储能SOC递推、联络线方向互斥、碳价灵敏度扫描这些细节上花的时间一点都不会比算法设计少。最后分享一个小技巧当你第一次跑通代码、得到一张还算漂亮的结果图时先别急着开心赶紧把当前所有代码版本存下来做个tag。后续你大概率会因为某个参数调整把代码改得面目全非到时候如果想回溯到某个特定版本的实验结果有一个干净的版本管理节点能帮你省下巨量的时间。多微网调度这个方向模型更新迭代很快好的版本管理习惯会让整个研究过程顺畅很多。
返回列表