
简介这套Matlab微电网仿真代码面向电力相关专业师生与微电网初步规划人员聚焦功率协同调度与经济运行场景通过预设控制策略统筹光伏、风机、柴油发电机及储能电池的实时出力在满足动态负荷与安全约束的前提下兼顾购电成本、燃料消耗及储能损耗等经济指标。包内共5个文件以m主程序、Python脚本、txt说明及配置文件为主压缩包仅6KB轻量易用。代码包含完整调度流程从负荷与可再生能源出力预测输入到多目标优化建模支持线性规划或启发式算法接口再到功率分配指令生成并提供各单元出力曲线、SOC变化、成本分项统计等可视化结果。变量命名规范、结构清晰便于替换本地数据、调整权重系数或嵌入自定义优化器适用于高校教学演示、科研方案验证及技术可行性分析。已有25人学习/下载适合需要快速理解微电网经济调度框架的入门与进阶读者。 微电网功率协同调度与Matlab仿真代码的构建是新能源渗透率越来越高之后绕不开的一个话题。很多朋友拿到一个微电网项目第一反应是先把光伏、储能、负荷模型搭起来跑通潮流再说。但真到了“经济运行”这一层面对柴油发电机、储能、电网购售电、可调负荷这些单元到底谁出力、什么时候出力、SOC控制在什么区间才是真正让仿真代码价值翻倍的地方。这篇内容我打算围绕一套我实际搭建过的Matlab仿真框架来展开讲清楚功率协同调度是怎么落到代码里的经济运行目标函数怎么设计以及在实际调试中那些文档里不写但你一定会撞上的坑。1. 微电网调度的本质先搞清楚协同什么、优化什么微电网的功率协同调度看起来是个“怎么分配功率”的问题但拆开看其实包含两个层面。第一个层面是时间维度上的协调也就是日前计划、日内滚动修正、实时响应这三个时间尺度的配合。第二个层面是空间维度上的协调也就是柴油机、储能、联络线、分布式光伏风电这些不同响应速度、不同成本特性的单元之间的配合。很多初学仿真代码的朋友容易犯一个错误就是只盯着“优化算法”本身比如粒子群、遗传算法、灰狼优化把目标函数一贴、约束一写就跑仿真出图。这样做出来的结果往往有两个问题。一是完全没有体现“协同”两个字各单元各自为政储能在放电的同时柴油机还在满发电网购电和售电策略互相打架。二是运行成本算得不细没有考虑启停成本、折旧损耗、惩罚项导致结果的工程价值很低。在我自己搭建的这套Matlab仿真代码里核心管理对象是三类可调度单元加一类不可调度单元柴油发电机可连续调节出力但存在燃料成本、启停成本、爬坡速率约束、最小出力限制储能系统可充可放但受SOC上下限、充放电功率限制、循环寿命损耗约束联络线与大电网交互可买电可卖电但受变压器容量和电价政策约束光伏/风电优先消纳但存在弃光弃风惩罚的权衡协同调度的本质就是在一个目标函数里把这些单元的功率指令同时决策出来让总运行成本最低同时满足负荷需求、潮流约束、设备物理限制。目标函数可以是经济性单目标也可以加入碳排放、新能源消纳率、电压偏差等作为多目标但基础框架一定是从“经济性最优”起步的。1.1 为什么不能用传统潮流计算替代经济调度我见过不少工业背景的朋友习惯用潮流计算的思路来理解微电网运行。他们会做这样的仿真给定一个负荷曲线光伏和风电按预测值出力剩下不够的由储能补充储能不够再由柴油发电机顶上再不够就买电。这种规则驱动的“顺序分配”方法在结构简单、单元少的系统上勉强能跑但本质上它没有优化过程。举个最简单的反例。如果负荷在中午12点达到峰值光伏出力也在12点达到峰值按顺序分配的逻辑储能几乎不用出力柴油机也不用启动。但电价曲线往往是中午高、凌晨低如果中午光伏大发时储能还以某个功率在充电把光伏电量存起来留到晚上电价高或负荷高时释放虽然后者增加了储能的充放损耗但整体购电成本反而降低。这种跨时段套利行为只有把“整个调度周期的目标函数”作为优化对象才能真正体现出来。顺序分配是局部视角协同调度是全局视角。这也是为什么仿真代码里要建优化模型而不是简单写if-else控制逻辑。1.2 从“可行调度”到“经济运行”的差距这里特别想强调一个概念调度可行不等于经济最优。很多仿真代码跑出来的结果功率平衡约束是满足的各单元出力也在限值内但仔细看数据会发现柴油发电机在低负载率区间运行燃料效率极差而储能明明可以在电价低谷充满、高峰释放却全程没有合理利用。从可行调度走向经济运行关键在三个地方目标函数要反映真实成本结构而不能只是“买电成本燃料成本”的粗略加总约束条件要完整刻画设备特性比如储能的SOC连续性约束、柴油机的爬坡约束求解过程要采用合适的优化算法与时间尺度配合而不是一锤子买卖2. 经济运行建模目标函数与约束怎么落到数学表达式微电网经济运行的核心是把物理系统和经济规则翻译成一个标准的优化问题骨架。在这个问题上最常用的样板是“混合整数线性规划”因为柴油机的启停状态是0/1整数变量其他功率量可以近似为连续变量。Matlab里用yalmip工具箱配合求解器或者直接用自带的intlinprog都能处理这类模型。2.1 目标函数分项拆解一个典型微电网日运行成本函数可以按时间步累加写成下面几个大项。第一项是柴油发电机成本。它包含燃料成本和启停成本。燃料成本通常近似为出力的二次函数但MILP求解器要求线性表达式所以要用分段线性化处理。如果出力范围是15kW到100kW可以切成三四段每段用不同的线性斜率近似燃料-功率曲线。启停成本则是每启动一次给一个固定费用比如5元/次它会直接影响调度结果——如果某个时段柴油机只需要开半小时优化算法可能会权衡启停成本与运行收益决定不启动。第二项是储能运行损耗成本。储能并没有直接燃料成本但每一次充放电都折损循环寿命折算成度电成本大概是0.5-1元/kWh取决于电池类型。这个值要放进目标函数里否则优化算法会倾向于高频次、大功率地调用储能仿真结果看似风光实际项目里电池两三年就得换。第三项是联络线购售电成本。购电时用分时电价的正值售电时用上网电价收入目标函数里取负号。很多地区实行峰谷电价峰时1.2元/kWh、谷时0.3元/kWh这本身就构成储能的套利空间。这里有一个容易忽略的细节购电价和售电价往往不对称购电价高于售电价所以微电网不会出现“白天买电晚上卖电”这种不合理的倒挂行为除非有政策补贴。第四项是弃风弃光惩罚项。新能源消纳是微电网的一个核心目标如果不加惩罚项优化算法为了省钱可能直接弃掉高价时段的部分光伏出力。给一个略高于发电成本的惩罚系数就可以引导算法尽量消纳。注意惩罚系数不是越大越好它本质上是在经济成本和绿电消纳之间的权衡旋钮你可以通过调整这系数生成一组Pareto前沿来满足不同决策偏好。2.2 约束条件完整清单经济运行模型的约束我的经验是宁可多写不要漏写。漏掉一个爬坡约束柴油机出力曲线就会在仿真里出现“从20kW瞬间跳到100kW”这种物理上不可能的结果漏掉SOC连续性约束储能就会像永动机一样今天放电明天满电。我整理了一份我在代码里实际使用的约束清单功率平衡约束每个时段的柴油机出力储放功率光伏消纳购电-售电-储能充电功率 负荷需求柴油机出力上下限与爬坡约束出力在[Pmin, Pmax]之间相邻时段的变化速率不超过爬坡限值储能SOC递推公式SOC(t1) SOC(t) - Pb(t)*Δt/容量充放电效率分开考虑储能充放电功率限值充电、放电各有上限储能SOC上下限一般设为0.1-0.9防止过充过放联络线传输功率上下限受变压器容量限制柴油机启停约束PminU(t) ≤ P(t) ≤ PmaxU(t)其中U(t)是0/1变量启停逻辑约束启动次数、最小运行/停机时间等根据需求可选约束条件写完之后最重要的一步是用数值检验一下可行性。我建议先用“所有变量上下限取中点”的方式手工构造一个可行解代入模型验证一下约束是否自洽。如果连手工可行解都找不到说明约束之间可能存在不可行区域这种情况在代码调试中相当常见。2.3 为什么我把求解器选项从默认改成了显式指定Matlab里优化模型搭好之后求解器选择直接影响仿真速度和精度。用yalmip时默认求解器可能会是linprog或quadprog但线性化之后的MILP问题还是用gurobi或者cplex效果最稳。如果没有商业求解器授权用Matlab自带的intlinprog也可以跑小规模问题但规模上到几十个时段乘几十个节点时求解时间会明显拉长。我在代码里会显式指定求解器并设置参数。比如用gurobi时options sdpsettings(solver,gurobi,verbose,0,gurobi.MIPGap,0.001);MIPGap设为0.1%的意思是求解器找到的解与理论上最优解的差距不超过0.1%就停。对工程仿真来说这个精度足够而且能大幅缩短求解时间。如果追求严格的全局最优可以设成0.0001但那种情况下求解时间可能从几秒变成几十秒划不来。3. 功率协同调度的求解思路从集中式优化到MPC滚动修正模型建好了接下来就是仿真框架的搭建。功率协同调度在时间尺度上的做法通常分成“日前计划”和“日内滚动”两层这跟电力系统调度里的开环日前发电计划和闭环AGC自动发电控制思路同源只是规模缩小到了微电网。3.1 日前计划的仿真流程日前计划的做法是把未来24小时按15分钟或1小时间隔离散成96或24个时段输入光伏功率预测、负荷预测、分时电价、柴油机参数一次性求解全天所有时段的功率指令。用Matlab写这个流程代码结构大致是定义时段T读取或生成负荷曲线、PV曲线定义决策变量柴油机出力P_dg(t)、储能充放功率P_bat(t)、联络线交易P_grid(t)、弃光量P_curtail(t)等用yalmip的sdpvar定义变量用constraints[]拼约束写出目标函数objectiveoptimize(constraints, objective, options)提取value()结果并绘图这种做法的优势是流程简单、计算快。我实测一个24时段、5个单元的小型微电网intlinprog基本秒出结果gurobi更是零延迟。如果你是在做课程设计或者论文模型验证这个粒度完全够用。3.2 日内滚动修正为什么能明显提升鲁棒性不过如果只做日前计划仿真就是“开环”的它默认预测是完美的实际运行中光伏突然被云挡住、负荷突然飙升这些情况完全没处理。工程上要体现“协同调度”的修正能力需要加一层MPC滚动修正。MPC在微电网中的实现逻辑可以这样理解假设控制周期为1小时在t时刻基于当前实际状态储能SOC、柴油机运行状态对未来N个时段比如未来4小时做一次优化但只执行第一个时段的指令。到了t1时刻根据新测得的实际状态重新优化再执行第一个时段指令如此滚动。在Matlab里实现MPC滚动不需要Simulink那一套纯脚本就能做。核心结构是一个for循环套优化求解for t 1:T % 更新当前SOC、机组状态、最新预测 % 定义从t到tN的决策变量 % 构建约束与目标函数 % 求解并只取第一时段指令 % 将第一时段结果存入历史记录 % 用实际反馈更新下一轮初始状态 end这样做的好处是仿真结果更贴近实际光伏预测误差、负荷波动对系统的影响会被逐时段修正。我跑过一个对比实验同样的模型纯日前计划在光伏实际出力只有预测值60%的场景下系统会频繁切到买电模式成本高企而MPC滚动修正能把额外购电成本控制在很低水平。3.3 几种常见分布式协同算法的边界除了集中式优化微电网功率协同还有一个热点方向是分布式优化典型代表是交替方向乘子法、一致项控制等。这类方法的思路是不设中央控制器各单元通过局部通信迭代求全局最优。但说实话在Matlab仿真阶段除非你研究的就是分布式控制算法本身否则我不建议在入门框架里直接上这些算法。原因有两点一是分布式算法调参很痛苦步长、惩罚参数都影响收敛性一旦发散很难判断是模型问题还是算法参数问题二是分布式算法最终得到的解是近似最优解跟集中式的精确最优解有偏差这会给后续写论文带来“对比基准不清晰”的麻烦。我个人的建议是先用集中式优化把模型和代码跑通得到一套合理的基准结果。如果论文要对比分布式方法把集中式结果作为全局最优基准分布式方法作为对比算法这样逻辑链条最清晰也最有说服力。4. Matlab仿真代码的搭建要点数据、模型、求解器与可视化现在说正题代码本身。我以一个典型的设计题目“含光伏、储能、柴油发电机、联络线的独立微电网24小时经济运行”为例分享一个可直接套用的代码框架。4.1 输入数据怎么准备首先定义时间参数和系统参数。下面是一组可用于测试的参考参数单位已换算为标幺或便于运算的数值参数数值说明负荷峰值100 kW数据中心或工业负荷典型值光伏装机80 kW预测曲线按日典型形状生成储能容量200 kWh磷酸铁锂类型SOC限0.1-0.9储能最大功率50 kW充放功率对称柴油机出力范围15-100 kW最小技术出力15kW柴油机爬坡率30 kW/h相邻时段变化限值联络线功率限值60 kW变压器容量谷时段电价0.3 元/kWh23:00-7:00峰时段电价1.2 元/kWh8:00-12:00, 17:00-21:00负荷和光伏曲线可以直接用正态分布迭加正弦基波来生成也可以用实测数据的散点插值。仿真代码里我一般人为设定负荷曲线然后给光伏曲线加一个±15%的随机扰动来模拟预测误差。4.2 决策变量与约束的yalmip写法下面是代码的核心骨架展示变量的定义、约束拼接和求解T 24; % 24小时 % 决策变量 P_dg sdpvar(1, T, full); % 柴油机出力 U_dg binvar(1, T, full); % 柴油机启停状态 P_bat_d sdpvar(1, T, full); % 储能放电功率 P_bat_c sdpvar(1, T, full); % 储能充电功率 P_grid sdpvar(1, T, full); % 购电功率正值 P_curtail sdpvar(1, T, full); % 弃光功率 SOC sdpvar(1, T1, full); % SOC变量T1个点 constraints []; % 功率平衡约束 for t 1:T constraints [constraints, P_dg(t) P_bat_d(t) P_pv(t) - P_bat_c(t) P_grid(t) - P_curtail(t) P_load(t)]; end % 柴油机上下限与启停耦合 for t 1:T constraints [constraints, 15*U_dg(t) P_dg(t) 100*U_dg(t)]; % 爬坡约束首时段不设 if t 1 constraints [constraints, -30 P_dg(t) - P_dg(t-1) 30]; end end % 储能约束 for t 1:T constraints [constraints, 0 P_bat_c(t) 50, 0 P_bat_d(t) 50]; constraints [constraints, P_bat_c(t) P_bat_d(t) 50]; % 避免同时充放 constraints [constraints, SOC(t1) SOC(t) - (P_bat_d(t)/0.95 - P_bat_c(t)*0.95)/200]; end constraints [constraints, 0.1 SOC 0.9, SOC(1) 0.5, SOC(T1) 0.5]; % 联络线约束 constraints [constraints, 0 P_grid 60]; constraints [constraints, 0 P_curtail 0.3*P_pv(t)];这里有一个细节需要特别提醒P_bat_c P_bat_d 50这一条约束很多人以为充放电功率上限各50kW同时充放100kW也不会超过物理限制但实际工程里PCS变换器的总功率是共享的不可能一边充50kW一边放50kW。加上这个约束既合理又避免求解器出现“一边充一边放”的数学可行但物理荒谬的解。4.3 目标函数的完整表达式目标函数写成一天的累计成本objective 0; fuel_cost 0; % 柴油机燃料成本分段线性化 % 这里简化用线性近似成本系数a,bcost a*P b*U for t 1:T fuel_cost fuel_cost 0.85*P_dg(t) 3.5*U_dg(t); start_cost 0; if t 1 start_cost 8 * max(U_dg(t) - U_dg(t-1), 0); end objective objective fuel_cost start_cost ... 0.65 * (P_bat_d(t) P_bat_c(t)); % 储能损耗折算 end % 联络线购售电成本 for t 1:T if t 8 t 12 || t 17 t 21 price 1.2; else price 0.3; end objective objective price * P_grid(t); end % 弃光惩罚 objective objective 1.5 * sum(P_curtail);燃料成本里我用了线性近似实际也可以做更精细的分段线性化思路是把出力区间切成若干段每段用不同的斜率系数通过凸组合表示。4.4 结果可视化的几个关键图Matlab仿真的最后一环是可视化这一步做得好代码的价值会直接翻倍。我通常画四张图功率分配堆叠图用面积图展示负荷曲线如何被柴油机、储能、光伏、购电覆盖横轴是小时纵轴是功率储能SOC曲线看SOC是否在安全区间内是否体现了低价充高价放的合理行为柴油机启停状态和出力曲线看机组是否频繁启停结合目标函数中的启停惩罚验证是否有异常振荡各单元成本占比饼图/柱状图一目了然看到成本分布堆叠图的Matlab代码示例figure; % 用area绘制堆叠图从上到下依次为光伏、购电、储能放电、柴油出力 area(t, [P_pv_val; P_grid_val; P_bat_d_val; P_dg_val], LineWidth, 1.2); hold on; plot(t, P_load_val, k-, LineWidth, 2, DisplayName, 负荷); xlabel(时间(h)); ylabel(功率(kW)); legend(光伏,购电,储能放电,柴油机,负荷);执行完这个图如果你看到储能主要是夜间充电、日间放电柴油机只是在早晚高峰短时启动光伏出力几乎没有弃电那说明你的调度策略在仿真里是健康运行的。5. 调试与落地中容易翻车的几个细节代码跑通之后很多人就开始准备写论文或者做汇报了但我得提醒几句仿真代码的调试阶段才是真正拉开水平差距的地方。下面几条都是我实际踩过或者带学生时反复被问到的坑。5.1 “精确平衡”约束导致不可行怎么排查功率平衡约束如果写的是严格等于在极端场景下非常容易导致整个优化问题不可行。比如光伏预测值很高负荷很低储能SOC已经满格柴油机已经关停即使联络线买电最小功率为0这时候功率平衡方程左边依然过剩系统找不到任何可行解。排查办法很朴素把约束逐个松弛看哪条约束导致问题从可行变不可行。我的建议是在模型里预留一个“松弛变量”给功率平衡约束加一个很小的软约束惩罚slack sdpvar(1, T, full); constraints [constraints, P_balance(t) 0 slack(t)]; constraints [constraints, -0.05 slack(t) 0.05]; objective objective 10000*sum(abs(slack));这样既保证模型软性可行又能在结果里一眼看出哪些时段失衡方便定位问题。5.2 求解器数值稳定性与参数标幺化微电网模型的数值尺度跨度经常很大。储能的SOC是0到1的小数柴油机出力是几十、上百的数值目标函数里成本和惩罚系数可能上千。这种尺度差异会让求解器产生数值问题出现“模型不可行”或“解不收敛”的假象。我建议在建模阶段做一次简单的标幺化把功率基准取100kW能量基准取200kWh电价、成本项也统一除以某个基准值。这样所有变量的数量级都落在相近的区间求解速度和解的质量都会有明显改善。实际中这个细节经常被忽略而一旦标幺化很多莫名其妙的报错会自动消失。5.3 储能的SOC终点约束要不要强制恢复初始值采用“SOC(1)0.5, SOC(T1)0.5”这个约束意味着优化会强制一天结束的时候电池电量回到初始值。这样做的好处是给第二天留出同样的调节空间仿真结果便于逐日对比。但它也有代价如果某天峰谷价差明显优化可能更倾向于把电池“用尽”强制恢复到0.5反而损失了部分套利收益。我的建议是单日仿真加这个约束多日连续仿真不加。多日仿真时SOC是连续传递的没有必要每天都满血复活。如果你在论文里审稿人问“为什么SOC曲线最后一天被强制拉回”你可以用这个逻辑解释。5.4 储能不能同时充放的常见误区这个坑前面提过一次但值得单独强调。不少初写代码的同学会不自觉地写出这样一组约束0 P_bat_c 50、0 P_bat_d 50然后发现求解结果里储能经常“同时充电又放电”。从数学上这两个约束不冲突因为充电功率是50放电功率也是50两边都可以取正值。解决办法除了加一个总功率约束之外还可以引入0/1变量区分充放状态U_bat binvar(1, T, full); constraints [constraints, P_bat_c 50*U_bat, P_bat_d 50*(1-U_bat)];两种方式都可以我个人更推荐物理含义清晰的总功率约束因为求解速度更快少了一组整数变量。5.5 可视化时“图好看”不如“图能解释策略”我见过一些仿真报告图很精美但仔细一看储能SOC曲线在电价高峰时段反而是上升的柴油机在负荷低谷时段还在高负载率运行。这种结果多半是目标函数里成本系数没调对或者约束过于松弛导致的。好看的图如果不能反映正确的调度逻辑在评审时反而会暴露模型缺陷。画完图之后我建议做一个自检动作把每一时段的价格曲线、目标函数里的单位成本项、各单元的功率曲线放在同一张图上叠加对比。如果价格高的时候储能在放电、价格低的时候储能在充电那说明模型是理性地响应了经济信号。如果出现反常现象先检查成本系数再检查约束逻辑不要急着改图。我自己从头到尾搭过好几套类似的微电网经济运行仿真代码最深的体会是不管是做学生项目还是工程预研代码本身的复杂度不高但建立“目标函数-约束-物理层”的一致性才是真正需要静下心啃的部分。先花时间把负荷、光伏的时序数据备齐把成本单价和物理参数标幺化再谈优化算法和图表美化否则后面每修一个参数都可能引发连锁调整。如果你是在做毕业设计或者发小论文建议把日前计划先跑熟再扩展MPC滚动修正最后根据导师要求引入分布式算法或多目标扩展。这套路径走下来比一开始就堆砌高级算法要稳妥得多。本文还有配套的精品资源点击获取