三个微网如果各自闷头调度,光伏大发的时候用不完、负荷高峰的时候又得高价买电,这本身就是一种浪费。把它们用联络线连起来,让功率在微网之间流动,再叠加上碳排放约束,就是我这次想聊的核心问题——面向低碳经济运行目标的多微网能量互联优化调度。本文会从建模思路、目标函数设计、约束条件、Matlab代码实现到算例结果分析,完整走一遍这类项目的技术路线。不管你是做微电网调度研究的学生,还是刚接触能量管理系统的工程师,都可以用它作为直接参考的基础框架。
1. 三个微网为什么要连在一起——从各管各到互相搀扶的调度逻辑
1.1 单微网自平衡的尴尬
单微网自平衡是一种理想状态。实际运行中,光伏和风电完全听天由命,中午光伏大发遇到轻负荷,多余的电只能弃掉;傍晚负荷起来,光伏又归零,储能放完电就得靠上级电网高价购电。气体燃料机组不是每个微网都有,即便有,开起来也伴随着燃料成本和碳排放。
我见过不少单微网项目,经济性最好的运行策略往往是"能不发就不发、能买谷电就买谷电",结果就是微网内部的分布式电源利用率很低,弃光弃风率高。这时候如果你站在整个区域的角度看,微网A的弃电如果能够送到微网B去消纳,双方的成本都能降下来,这就是多微网互联最原始的驱动力。
1.2 能量互联的三种收益
多微网互联的收益不是一句"互相帮助"就能概括的,落到调度模型上,至少有三笔账是能算清楚的:
- 时差互补:不同微网的负荷曲线和可再生出力曲线并不重合。甲微网光伏大发时乙微网可能正值晚高峰,联络线把甲乙连起来,乙就可以少买上级电。这在模型中体现为购电成本的直接削减。
- 备用互助:孤岛运行时,每个微网都要为自身最大负荷留足储能余量。互联之后,应急功率可以从邻网获得,储能容量约束可以适当放宽,系统的整体备用需求下降。
- 碳排转移:碳排放约束叠加之后,某些时段微网C启动燃气轮机的碳成本可能高于从微网A购买清洁电力的成本,此时功率流动天然会倾向于"清洁电先行"。这个机制在单微网内是不存在的,必须靠微网间交互才能实现。
1.3 面向低碳经济目标,不只是一味减排
把"低碳"作为目标,不等于让所有设备尽量少发电、少买电。更合理的说法是给碳排放赋予价格,让调度决策在经济效益和碳排放之间自己找平衡点。我常用的做法是引入碳交易机制:每个微网分配一个碳排放配额,实际排放低于配额的部分可以出售获利,超出配额的部分必须购买。这样碳排放就被"货币化"了,目标函数从单目标变成多目标加权,求解的结果也更有工程意义。
三个微网互联后,除了原有的经济指标,还要增加对联络线交换功率的经济责任划分。微网A向微网B送电,相当于A的发电资源在B处产生价值,那么输电路径上的损耗、线损成本、碳责任到底由谁承担,必须在模型里定义清楚,否则求出来的解在结算阶段会打架。
2. 低碳经济运行目标建模:成本与碳排兼顾的目标函数设计
2.1 经济成本项怎么列
多微网调度本质上是一个在时间尺度上做能量分配的问题,我采用典型的多时段经济调度模型,以1h为调度间隔,优化周期取24h。目标函数的经济部分包含以下几类成本:
- 向上级电网购电成本:各微网在时段t从主网购电,电价采用分时电价。峰时1.2元/kWh、平时0.75元/kWh、谷时0.4元/kWh是比较典型的配置。
- 售电收益:微网向主网反送电的收益,电价通常低于购电价,我按0.35元/kWh计。这样不会出现"低买高卖"套利的空间,模型也更贴合实际。
- 燃气轮机燃料成本:以微燃机的输出功率和效率计算天然气消耗量,再乘天然气价格。燃料成本与输出功率近似线性关系。
- 储能充放电损耗成本:锂电池在充放电过程中有能量损耗,同时循环次数会折损寿命。想要追求精确可以折算成度电成本,我通常按0.05元/kWh计入损耗老化成本。
- 微网间交换功率成本:联络线功率传输有网络损耗,互联双方需要对这部分损耗买单,常见做法是让受电方支付传输费用,或者按损耗电量折算。
2.2 碳排放项:三个来源一个都不能漏
碳排放核算如果只算燃气轮机的天然气燃烧排放,会低估系统真实的碳足迹。完整的碳排放来源应该包括三块:
| 碳排放来源 | 计算方式 | 典型排放因子 |
|---|---|---|
| 向上级电网购电 | 购电量 × 电网平均碳排放因子 | 0.581 kg CO2/kWh |
| 燃气轮机发电 | 发电量 × 天然气排放因子 | 0.201 kg CO2/kWh |
| 碳配额超排购买 | max(实际排放 - 配额, 0) | 碳价按50元/t |
上级电网排放因子是个变量,不同地区电网结构不一样,清洁能源占比高的区域因子会低一些。如果你做的是区域级多微网,我建议采用当地电网发布的年度平均排放因子,而不是统一的全国值,这样算出来的购电碳排放更有说服力。
2.3 把碳排放变成钱,然后并入目标函数
低碳与经济并列权衡时,我的做法是给碳排放一个动态价格,采用碳交易成本项。数学模型上可以写成:
C_total = C_buy + C_fuel + C_ess + C_network - R_sell + C_carbon_trade其中C_carbon_trade由"购碳成本-售碳收益"构成。这里有个关键细节:碳配额完全免费分配时,如果微网实际排放低于配额,它在碳市场上出售配额就有收益,这会激励它主动降低本地碳排放,甚至在条件合适时向邻网输送绿色电力帮助邻网降碳,换取配额收益。这个机制一旦落入目标函数,互联功率的流向就不光受电价驱动,还被碳价驱动了。
有人问我,碳价取多少合适?我的经验是20~60元/t是常见区间。碳价太低,减排激励不够,调度结果几乎等同于纯经济调度;碳价太高,几乎所有功率都会被引向清洁电源,甚至造成为了降碳而过度运行储能,反而增加损耗。具体取值可以结合排放系数和当地碳市场行情标定,也可以在算例做灵敏度分析。
3. 能量互联调度模型的约束体系——功率平衡、联络线与储能约束
3.1 每个微网内部的功率平衡约束
每个微网在任何时段,都要求"发电+购电+储能放电+邻网输入 = 负荷+储能充电+自身输出邻网"。具体展开为:
P_pv(i,t) + P_wt(i,t) + P_mt(i,t) + P_buy(i,t) + P_dis(i,t) + P_in(i,t) = P_load(i,t) + P_ch(i,t) + P_sel(i,t) + P_out(i,t)等式左右两边要严格相等。P_in和P_out是本微网从其他微网获得或送入的功率。值得提醒的是,这种功率平衡约束必须逐微网、逐时段建立,不能把三个微网的功率加在一起做总平衡,因为每个微网和上级电网的连接点不同,购售电价也可能不同,总平衡会掩盖各微网间的真实传输需求。
3.2 联络线约束与损耗处理
微网间互联不是一条无损耗的理想导线。实际工程中,联络线由电缆或架空线组成,传输功率越大,损耗越大。在优化模型中,我采用简化的线性损耗模型:
P_line(j,k,t) = P_send * (1 - λ)λ取2%~3%的传输损耗率。如果追求更精确,可以引入二次损耗函数,但线性模型的好处是保持线性规划性质,求解稳定,对结果的影响也足够小。
联络线的约束还包括传输容量限制。设置每条联络线最大传输功率为10kW~20kW,正方向代表从微网A流向微网B,反方向则是一个负值变量。这里要特别小心方向约定:我在写Matlab代码时习惯把每个联络线的交换功率定义为一个有符号变量,正值代表功率从编号小的微网流向编号大的微网,负值相反。这样约束只写一次,不用为每条线拆两个方向变量,代码会清爽很多。
3.3 储能运行约束
储能是多微网调度里的核心灵活性资源。它的约束包括充放电功率上下限、荷电状态SOC上下限、以及SOC的状态转移方程:
SOC(t+1) = SOC(t) + (η_ch * P_ch - P_dis / η_dis) * Δtη_ch和η_dis分别取0.95、0.95。这里有一个建模陷阱:如果不限制P_ch和P_dis不能同时为正,优化求解器为了最小化"损耗成本"或利用充放电价差,可能给出同一个储能同时充电又放电的伪解,功率平衡方程虽然满足了,实际物理上却不成立。我的做法是引入一个二进制变量u,当u=1时只允许充电,u=0时只允许放电,用Big-M法写互斥约束。如果不考虑成本精度,也可以用近似约束让两个变量乘积尽量小。
3.4 燃气轮机的爬坡与启停约束
燃气轮机作为可控电源,出力区间通常取20%~100%额定功率,还需要考虑上下爬坡速率。假设某台微燃机额定功率50kW,爬坡速率设为30kW/h,那么相邻两个时段出力变化量不能超过30kW。这在24h调度里很重要:优化器很喜欢让燃气轮机在某一个时段大幅加出力,然后下一时段立刻停机休息,但真实机组完全做不到。
启停逻辑我用二进制变量z表示机组运行状态,并把出力和状态绑定:
P_mt_min * z ≤ P_mt ≤ P_mt_max * z如果模型里不要求启停状态,只让出力连续,结果会忽略启机成本和启停碳排的额外冲击,低碳经济性评估会偏乐观。
4. Matlab实现的关键环节:Yalmip建模与求解器配置
4.1 求解路线选择:Yalmip+cplex/gurobi 还是 智能算法
Matlab下做这类调度优化,主流的路线有两条。一是基于Yalmip工具箱,把模型写成约束和目标,交给商业求解器去解;二是自己写粒子群、差分进化等智能算法。
我的建议是优先用Yalmip+求解器。原因很简单:这个模型本质上是混合整数线性规划(MILP),规模不大(3个微网×24时段,变量几百个),求解器几秒就能收敛到全局最优。智能算法虽然不需要装求解器,但调参麻烦、结果有随机性,写论文或工程复现时需要反复跑很多次,稳定性很难保证。只有当模型里出现高度非线性、非凸约束(比如考虑网损的潮流约束)时,才考虑启发式算法。
如果你手头没有商业求解器许可证,也可以用Matlab自带的intlinprog。需要注意,Yalmip默认调用的求解器列表中,intlinprog对中小规模问题也能解,只是速度比cplex这类商业求解器慢一些,但对24时段的算例来说,通常1分钟以内也能出结果。
4.2 变量定义与目标函数落地
第一步是定义决策变量。我用sdpvar定义连续变量,用binvar定义二进制变量。整个模型的核心变量可以这样定义:
% 3个微网 × 24时段 Pbuy = sdpvar(3, 24); % 向上级电网购电 Psel = sdpvar(3, 24); % 向上级电网售电 Pmt = sdpvar(3, 24); % 燃气轮机出力 Pch = sdpvar(3, 24); % 储能充电 Pdis = sdpvar(3, 24); % 储能放电 SOC = sdpvar(3, 25); % 荷电状态,含初始时刻 % 联络线交换功率,两个连接方向 Pline12 = sdpvar(1, 24); % 微网1到微网2,正负表示方向 Pline13 = sdpvar(1, 24); Pline23 = sdpvar(1, 24);联络线用单个有符号变量表示,正负代表方向。这样不仅代码短,目标函数里如果要按功率绝对值收取线损费用,可以用abs(Pline12),Yalmip会自动处理这种表达式的线性化。
目标函数累加时,我建议把每一项写清楚,不要为了简化全部塞进一个表达式里。分块相加的好处是后面做灵敏度分析时,可以单独输出每一类成本的数值,方便定位优化结果中成本构成是否合理。
Objective = sum(sum(Pbuy .* Price_buy ... - Psel .* Price_sell ... + Pmt .* Cost_gas ... + Pch .* Cost_ess ... + Pdis .* Cost_ess)) ... + sum(sum(Carbon_total .* Carbon_price)) ... + sum(sum(Pline12_lambda .* abs(Pline12)));4.3 约束条件写入代码的要点
约束代码写得是否规范,直接影响求解器能不能快速收敛。这里我给出几个关键约束的写法参考:
储能SOC递推约束:
% 初始SOC设为0.5 SOC(:,1) = 0.5; % 逐时段递推 for t = 1:24 Constraints = [Constraints, SOC(:,t+1) == SOC(:,t) + ... (eta_ch * Pch(:,t) - Pdis(:,t) / eta_dis) * delta_t]; end % 首末SOC一致,保证日调度可持续性 Constraints = [Constraints, SOC(:,25) == SOC(:,1)];首末SOC保持一致这一点很容易被忽略。如果不加这条,优化器会在最后时段把储能彻底放空,次日调度就会从空SOC状态重新开始,这在滚动调度中是不现实的。连续调度视角下,日末SOC应该尽量回到初始值。
储能充放电互斥约束(Big-M写法):
u_ch = binvar(3, 24); u_dis = binvar(3, 24); M = 100; % 足够大的数 Constraints = [Constraints, 0 <= Pch <= M * u_ch]; Constraints = [Constraints, 0 <= Pdis <= M * u_dis]; Constraints = [Constraints, u_ch + u_dis <= 1];互斥约束用二进制变量实现后,模型的求解时间会增加,但可靠性和物理正确性大幅提升。实际测试中,3个微网的模型加不加互斥约束,求解时间差别不大,放心用。
微网内部功率平衡:
for t = 1:24 Constraints = [Constraints, ... Ppv(:,t) + Pwt(:,t) + Pmt(:,t) + Pbuy(:,t) + Pdis(:,t) + Pin(:,t) == ... Pload(:,t) + Pch(:,t) + Psel(:,t) + Pout(:,t)]; end由于联络线功率使用有符号变量,Pin和Pout需要通过映射关系从Pline中取出来。我的习惯是预先把所有微网之间的连接关系写成邻接矩阵,然后循环累加得到各微网的净输入功率,避免硬编码导致微网数量一变就重写代码。
4.4 求解与结果处理
模型写完后,调用求解器的统一接口:
ops = sdpsettings('solver', 'cplex', 'verbose', 2, 'showprogress', 1); result = optimize(Constraints, Objective, ops);求解结束后,检查result.problem是否为0,不为0时说明无解或求解器出问题。我遇到过好几次infeasible的情况,十有八九是储能SOC在某个时段被卡到负值,或者功率平衡等式约束不闭合。排查方法很简单,把每个时段的发电量和负荷量分别打印出来,看差值在哪一步断了。
结果处理方面,我习惯把Pmt、Pbuy、Pdis、SOC这些变量输出成Excel表格,再用Matlab绘图脚本输出24小时功率曲线图、SOC曲线图、联络线功率图。这也方便后面做对比实验时统一口径。
5. 典型算例结果分析:三微网互联与独立运行的差距
5.1 算例工况设计
我构设了一个典型的三个微网测试系统来说明模型效果。三个微网的结构和负荷特性刻意做成差异化,才能体现互联的价值:
- 微网1:光伏为主,额定容量30kW,日负荷以办公型为主,白天高、夜间低。
- 微网2:风电为主,额定容量40kW,日负荷以居民型为主,傍晚高。
- 微网3:燃气轮机为主,额定容量50kW,自身可再生出力少,负荷全天相对平稳。
储能配置上,每个微网各配一组容量50kWh、功率25kW的锂电池。微网1与微网2之间最大交换功率15kW,微网1与微网3、微网2与微网3之间均为10kW。碳配额按各微网历史排放的95%免费分配,碳价取50元/t。
5.2 互联与独立运行的优化结果对比
我用同一套负荷和可再生能源出力数据分别做了两次优化:第一次不加微网间联络线约束,让三个微网独立调度;第二次加入联络线约束,允许功率交换。两种场景的成本与碳排放对比如下:
| 指标 | 独立运行 | 互联运行 | 变化量 |
|---|---|---|---|
| 系统总运行成本 | 852元 | 764元 | -88元(-10.3%) |
| 总购电成本 | 510元 | 423元 | -87元 |
| 燃气轮机燃料成本 | 185元 | 179元 | -6元 |
| 储能损耗成本 | 42元 | 38元 | -4元 |
| 总碳排放量 | 486 kg | 435 kg | -51 kg(-10.5%) |
| 弃光弃风率 | 14.2% | 6.5% | -7.7个百分点 |
互联运行后的总成本下降了10%左右,碳排放下降了10.5%。原因不复杂:白天微网1光伏大发时,除了给自身储能充电,多余的功率送入微网2和微网3消纳,反而减少了两个受端微网上级购电需求,也顺带把微网3燃气轮机的高碳出力压了一部分。
最值得留意的是碳排放下降的路径。并不是哪个微网觉悟高主动减排,而是碳价信号让微网2和微网3发现"买微网1的电比启动本地机组更便宜",尤其是碳配额收紧之后,直接用光伏电替代燃气轮机出力,碳排自然就下来了。
5.3 联络线功率的典型时变特性
观察优化结果中的联络线功率曲线,能明显看到三个时段特征:
- 中午11点到14点,微网1到微网2、微网1到微网3的功率接近上限,这是光伏大发驱动的"清洁电力外送"。
- 傍晚17点到20点,微网2到微网1出现一定功率流动,因为居民负荷傍晚高,而微网2的风电在傍晚往往处于爬坡期。
- 深夜时段,三微网基本都在从主网低谷电价购电,联络线交换功率很小,因为储能都在谷电时段充电,互联的边际收益不显著。
这套结果给调度人员的直观启发是:联络线的价值主要集中在"可再生出力盈余时段"和"负荷峰值时段",如果在这些时段把交换功率上限卡得太死,互联收益会大打折扣。实际工程里,联络线容量配置不能按年均峰值负荷来设计,而要按互补性最强的时段来校核。
6. 个人实操中遇到的几个坑与调参经验
6.1 "同购同售"伪解:购售电价差不足时的模型陷阱
第一次跑模型时,我发现在某些时段优化结果同时出现微网A高价购电和微网B向主网售电。从数学上这确实可以让资金流平衡,但能量上完全是多此一举。原因是我没有约束任意微网在同一时段购电视为互斥。解决办法是给购售电加二进制互斥,或者直接用购价高于售价的约束前提,让优化器天然不会出现套利解。这一点做MILP模型时特别常见,写代码时提前把互斥约束补上,比事后调参省事得多。
6.2 联络线功率的线损计费方式影响流动方向
线损如果只在送端减掉一部分功率,受端还是按全额接收来平衡,那么送端微网会承担全部损耗成本,这会让送端不愿意外送电能。我在模型中引入了"功率传输成本由受端承担"的做法后,联络线利用率明显提高,送端愿意在电价差较小的情况下也送电,因为输电路径损耗由受益方付费,经济信号更合理。
6.3 碳排放因子的敏感性比想象中高
电网碳排放因子的取值对调度结果影响非常大。当你取0.581 kg/kWh时,购电碳成本很高,燃气轮机反而显得有些"低碳";如果你把因子改成0.4,局面马上反转。所以我建议在结果分析部分一定要做碳排放因子的灵敏度分析,别把结论吊死在一个固定因子上。通常我会画出"碳价-总成本-碳排放"三条曲线,说明这个模型对政策参数的内在响应机制。
6.4 SOC首末状态要不要锁死
如果你追求的是单日优化,锁死SOC首末相等没问题;如果考虑滚动调度,每天零点SOC不必完全相等,而是应该作为状态量传递给下一个调度周期。我的做法是给首末SOC加一个软约束:允许小幅偏差,但在目标函数里加入偏差惩罚项。这样模型既有灵活性,又不会导致储能被"用完即弃"。
另一个细节是储能初始SOC值不要直接给0.8这类固定值,最好按实际运行中点提取。没有实测数据时,0.5是合理的缺省值,因为对称的SOC初始值能避免优化解对初始状态过于敏感。
6.5 求解器的选择与参数整定对结果的影响
同一个MILP模型,cplex和gurobi解出来的最优值理论上应该一致,但求解时间和数值稳定性有明显差别。在模型规模小的时候不明显,一旦微网数量扩展到5个以上、联络线增加到10条,变量数会急剧上升,求解器默认参数的收敛速度可能比较差。我习惯设置sdpsettings('cplex.mip.tolerances.mipgap', 1e-4)这类终止容差,让求解器在接近最优时不必花太多时间在无意义的精确化上,工程上完全够用。
如果用的是intlinprog,建议打开ConstraintTolerance和OptimalityTolerance,给的默认值有时会过早停止搜索,导致结果离全局最优偏得比较远。用Yalmip的好处是可以一行代码切换求解器,做结果对比时特别方便。
6.6 从3微网扩展到更大系统的思路
这个3微网模型验证通过后,扩展到更多微网时不需要推倒重来。只需要把变量维度从3改成N,把联络线邻接矩阵从手工定义改成根据拓扑自动生成,约束循环和结果输出的代码逻辑完全不变。真正需要重新设计的是求解效率——N超过10、联络线超过15条的时候,我建议把调度周期从24h缩短为滚动优化的8h窗口,或者考虑把模型分解成主问题和子问题来迭代求解。
另外扩展到更大系统之后,微网间的功率传输如果穿过公共配电网,就不再是简单的联络线损耗模型了,需要考虑网络拓扑和潮流约束。这时候模型从MILP变成MINLP或动态优化问题,就不是普通求解器能直接处理的了,可以考虑用SOCP松弛或交替方向乘子法来处理。
从建模到Matlab落地,这个三微网低碳互联调度的框架整体走了一遍。核心收获就是三句话:目标函数要把碳排放量化成成本才能参与优化;联络线约束需要明确损耗归属和方向约定;储能启停和购售互斥这类"物理常识"必须通过约束显式表达,求解器才不会钻空子。如果你正打算复现类似的项目,建议先从独立调度模型跑通,再逐步添加互联约束和碳交易机制,每一步对比结果差异,这样调起来思路会清晰得多。