尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

含可再生能源配电网空调负荷优化控制:Matlab与MILP工程实践

含可再生能源配电网空调负荷优化控制:Matlab与MILP工程实践 夏天下午两三点配电网上空调压缩机一批接一批启动负荷曲线直接往上冲屋顶光伏这时候也正好处在出力峰值。两件事叠在一起听着是好事实际上一波动就麻烦末端节点电压跟着晃馈线容量被顶到上限一个处理不好就是局部过载。我手头这个项目名字叫“含可再生能源的配电网最佳空调负荷优化控制”说人话就是在Matlab里把空调负荷当成一种可以调度的柔性资源跟光伏出力、用电负荷放在同一个优化框子里算出一条最优的功率分配策略。既让配电网安全运行又让用户不至于热得骂人。这个话题对很多人来说可能有点陌生但其实拆开就三件事配电网、空调负荷、优化控制而把它们串起来的那根线是Matlab里的混合整数线性规划。这个方向特别适合几类人参考做配电网优化、综合能源调度方向的研究生做空调负荷聚合、虚拟电厂项目的工程师还有刚入门最优控制、想找个完整Matlab案例练手的人。下面我把建模思路、代码实现、调参过程和踩过的坑完整过一遍希望能帮你少走点弯路。1. 项目整体思路与优化对象选型1.1 为什么选空调负荷做优化对象空调负荷是夏天配电网尖峰的主要贡献者。在南方一些城市夏季空调负荷占全网最高负荷的比例能到四成甚至五成数量大、增长快是典型的“高峰负荷”。但真正让我选择它作为优化对象的不是它占比大而是它自带一个其他负荷没有的特性热惯性。房间本质上是一个大热容你把空调提前开半小时把室温从26度降到24度这半小时多消耗的电能大部分“存”在了墙体、家具和空气里。后面半小时哪怕压缩机停机室温回升也相对缓慢人体基本感知不到明显变化。这种“冷量储存”特性让空调负荷在短时间尺度上具备天然的可调性跟电池有几分相似只是电池存的是电空调把电转化成了“冷量”存进房间里。还有一个原因空调是分布式资源单台功率不大但数量极其庞大。单台空调怎么控制都没意义可一旦聚合成集群在配电网侧就能形成规模可观的柔性调节能力。我这个项目里聚合了1000台空调按单台1.5kW额定功率算总容量1.5MW已经足够让一条典型馈线的负载率发生明显变化。这就是空调负荷做优化控制的底层逻辑单体不可控集群可调度。1.2 为什么放到配电网层面来做如果只是想把空调当成削峰填谷的工具在输电网侧也可以做但配电网层面的价值更明显。光伏接入大多在配电网末端末端节点电压支撑能力弱空调集中启动时线路压降显著末端电压很容易跌破允许范围。只有在配电网模型里同时考虑电压约束和空调负荷调节才能看到“空调群优化”对配电网运行能力的实际改善效果。另外配电网层面的优化对模型简化程度要求很高。项目里我选用了IEEE 33节点系统作为算例这是配电网研究里最经典的测试系统之一节点参数公开、验证案例多。选择它不是因为拓扑复杂而是作为优化控制案例它既能体现网络拓扑对调度的影响规模又足够在普通笔记本上快速求解。如果你要做更大规模的系统思路完全一样只是变量数量会上去求解时间变长。从物理对象上看配电网是优化控制的“舞台”空调负荷是“演员”光伏是“变量因素”。三者缺一不可没有配电网模型你看不到电压约束没有空调热惯性你找不到调节空间没有光伏波动你体会不到“含可再生能源”这几个字给优化带来的额外挑战。1.3 整体技术路线与工具链整个项目按四步推进第一步建立配电网模型采用DistFlow线性化或者灵敏度矩阵第二步建立空调负荷的一阶热力学模型第三步把目标函数和约束写进Matlab用YALMIP建模、Gurobi做MILP求解第四步仿真对比不同控制策略的效果重点看负荷曲线、电压质量和光伏消纳率三个指标。工具选择上我用的是Matlab YALMIP Gurobi这套组合。YALMIP是一个建模层它能把约束和目标函数自动转换成求解器能认的标准格式Gurobi是商业求解器对混合整数线性规划的求解速度特别快几万个整数变量也能扛。Matlab自带的intlinprog也能解但规模一大就非常吃力尤其后面要跑滚动优化的时候基本跑不动。这里有必要解释一下为什么把问题建模成混合整数线性规划MILP而不是更复杂的非线性规划。温度状态方程是线性递推关系目标函数经过绝对值线性化处理后也是线性的所以整个问题的约束和目标都是线性的只需保留空调启停这个0/1整数变量。既然是MILP就不需要引入非线性求解器能用Gurobi、Cplex这类成熟工具快速求解这对实际项目来说是很大的优势。2. 模型搭建配电网、空调负荷与光伏2.1 配电网模型与网络约束对于33节点配电网我采用的是DistFlow线性化模型。DistFlow的基本形式是几条递推方程P_ij - Σ P_jk p_j Q_ij - Σ Q_jk q_j V_j^2 V_i^2 - 2(R_ij P_ij X_ij Q_ij)这里面的核心思想很直观每条支路上的功率等于节点注入功率与下游支路功率之和而电压降落则与支路有功、无功以及线路电阻、电抗直接相关。第一眼看到V^2会觉得是非线性的但配电网正常运行时光电压偏移不大可以在基准点附近做线性化处理忽略二阶小项最终得到ΔV ≈ - (1/V0) Σ (R_ij ΔP_ij X_ij ΔQ_ij)这套约束展开到96个时段后就成了优化问题里的网络约束。实际代码里我还用了另一个更省事的方法灵敏度矩阵。先在一个基准运行点跑一次潮流得到节点注入功率对电压的灵敏度矩阵S然后把电压约束直接写成V_min ≤ V0 S·ΔP ≤ V_max。这个方法在优化控制场景下精度足够而且实现起来比展开DistFlow简洁得多。两种方法各有适用场景DistFlow是机理层面的建模方式能看到每条支路的功率流动适合做研究分析和支路过载约束灵敏度矩阵是从潮流结果中提取近似线性关系胜在实现简单、求解快适合日内滚动优化这种需要反复求解的场景。项目里我两种都做了主程序用灵敏度矩阵辅助分析用DistFlow做校核两边结果吻合度在误差范围内。2.2 空调负荷的一阶ETP热力学模型空调负荷的建模我用了经典的一阶等效热参数模型简称ETP模型。这个模型的物理含义非常直观把房间等效成一个热容C把墙体、窗户等效成热阻R室外温度T_out通过R向室内传热空调制冷功率通过COP系数转化为冷量。一阶微分方程离散化后得到递推关系T_in(t1) T_in(t) dt/(R·C) · (T_out(t) - T_in(t)) - dt · COP · P_AC / C · u(t)其中u(t)是0/1启停变量。这个式子看着简单但它几乎是整个优化问题成立的基础因为它把一个看起来跟电网毫无关系的“房间温度”变成受空调功率影响的线性状态变量。有了这个线性递推关系优化器就能显式控制室温轨迹让空调在峰前提前制冷、峰时稍微“放养”。参数取值上我用了R5.6°C/kW、C0.18kWh/°C、COP3、单台额定功率1.5kW。这些数值不是随手拍的是文献里对典型住宅房间的标定结果适用于20到30平米的房间。实际工程中每间房参数不同但在聚合到几百上千台空调的量级时用平均参数代表一组空调已经有足够精度没必要一一建模。聚合还能大幅减少整数变量这是后面求解速度的关键。2.3 光伏出力建模与场景生成光伏出力与光照强度近似线性关系。项目里设置了三处光伏接入分别接在节点18、节点25、节点33总装机800kW。特意选择末端节点接入是因为末端电压支撑弱、光伏出力波动的影响最容易被放大这样算例更能体现优化的价值。光照曲线用典型日实测数据叠加Beta分布随机扰动来生成多个场景。具体做法是先用一条平滑的太阳辐射曲线作为基准再用Beta分布抽样生成修正系数乘上基准值就得到光伏出力场景然后对场景做等概率加权得到一个代表“期望情况”的光伏出力序列。这里必须强调优化中用的光伏出力是预测值误差不可能完全消除。所以项目里采用了滚动优化策略每15分钟重新跑一次优化把最新光伏预测和实测负荷刷新进模型只执行当前时段的控制指令。这样就算光伏预测偏差有20%系统也能逐步修正不会把一个小误差一步步放大成控制失败。2.4 目标函数与约束汇总优化目标分三块第一块是购电成本配电网从主网购电按时段电价结算这是经济性最直接的体现第二块是弃光惩罚光伏因为网络约束消纳不了时就得切除目标函数里给一个很大的惩罚系数让优化器优先消纳光伏第三块是用户舒适度惩罚室温偏离设定值越远惩罚越大用绝对值的线性化形式表达alpha·|T_in - T_ref|并用松弛变量转成线性约束。约束条件汇总一下节点功率平衡约束、配电网电压上下限0.95到1.05 p.u.、支路容量约束、空调启停0/1约束、室内温度软约束、光伏出力上下限、主网购电功率上下限。整套约束都是线性的配合0/1变量正好落入MILP求解框架。关于温度约束为什么要用软约束而不是硬约束温度范围设得太紧时光伏预测稍微偏一点、负荷估计稍微差一点就可能出现无解整个优化直接失败。软约束允许温度偶尔越限但越限就要付出惩罚求解稳定性大幅提升结果也更贴近实际工程中的容差思维。3. Matlab代码实现与参数调优3.1 代码结构与数据准备项目代码按功能拆成五个文件main.m负责主流程data_case33.m存放33节点系统的线路参数和负荷基准值load_data.m生成96时段的负荷曲线、光伏曲线和温度曲线build_model.m用YALMIP定义变量和约束solve_optimization.m调用Gurobi求解并输出结果。main.m的核心流程大致是这样的% 加载算例数据 mpc data_case33(); [load_curve, pv_curve, temp_curve] load_data(mpc, dt); % 建立优化模型并求解 [model, result] build_model(mpc, load_curve, pv_curve, temp_curve); sol solve_optimization(model); % 结果展示 plot_results(sol, mpc);数据准备阶段有几个细节需要留意。负荷曲线用“基础负荷空调负荷”叠加成双峰形状一个峰出现在上午10点左右另一个更大的峰出现在下午14点到15点与夏季典型用电规律一致。温度曲线用正弦形式近似最高温出现在14:00到15:00。光伏曲线在中午12点到13点达到峰值。这些小时级数据都插值到15分钟间隔和控制步长对齐方便后面建模时直接引用。3.2 核心建模代码详解优化模型的核心代码用YALMIP写成这样%% 决策变量 u binvar(n_group, T); % 空调组启停状态 T_in sdpvar(n_group, T); % 室内温度 P_AC sdpvar(n_group, T); % 空调功率 P_grid sdpvar(1, T); % 主网购电功率 P_curtail sdpvar(n_pv, T); % 光伏弃光功率 s sdpvar(n_group, T); % 温度软约束松弛量 %% 目标函数 objective sum(P_grid .* price) * dt ... 5000 * sum(P_curtail, all) * dt ... alpha * sum(s, all); %% 约束 Constraints []; for t 1:T % 空调功率由启停状态决定 Constraints [Constraints, P_AC(:,t) P_rate * u(:,t)]; % 节点功率平衡 Constraints [Constraints, ... P_grid(t) sum(P_pv(:,t) - P_curtail(:,t)) ... P_load(t) sum(P_AC(:,t))]; % 弃光功率不超过光伏出力 Constraints [Constraints, 0 P_curtail(:,t) P_pv(:,t)]; % 温度软约束 Constraints [Constraints, T_min - s(:,t) T_in(:,t) T_max s(:,t)]; Constraints [Constraints, s(:,t) 0]; end %% 空调热力学递推关系 for k 1:n_group for t 1:T-1 Constraints [Constraints, ... T_in(k,t1) T_in(k,t) ... dt/(R*C) * (T_out(t) - T_in(k,t)) ... - dt * COP * P_rate / C * u(k,t)]; end end这段代码先没有展开电压约束实际项目里电压约束用灵敏度矩阵单独加入节点注入功率和空调功率通过矩阵乘法耦合最终也落到线性约束上。另外我在完整代码里加了最小启停时间约束避免优化结果让空调每15分钟开关一次这在实际工程中会缩短压缩机寿命。完整代码比这个片段长不少但这个片段已经把核心优化骨架讲清楚了。3.3 参数设置与调参经验模型里最需要调的是舒适度惩罚系数alpha。alpha太小优化器会毫不留情地让空调一直关着用户室温往上飘alpha太大空调一直开着削峰效果就没了。我的经验是先跑一次不含舒适度惩罚的优化记录最大温度偏差然后用“1小时偏差1°C的惩罚约等于电价水平”来定初值。具体到这个算例购电电价峰值时段约1.0元/kWh空调功率1.5kW空调开启一小时的电费约1.5元。如果优化器选择关空调1小时让温度偏1°C那么温度惩罚小于1.5元它就会关。所以alpha定在0.3到0.5元/(°C·h)之间比较合适我最终用的是0.4。这个逻辑适用于大多数类似的舒适度与经济性权衡问题。还有一个关键参数是控制步长dt。我用15分钟一天96个时段这是平衡精度和求解速度的结果。如果用5分钟变量数量直接翻三倍MILP求解时间呈指数级上升如果用1小时时间粒度太粗空调热惯性在小时尺度上会导致温度波动很难压住。主要参数见下表参数取值说明R5.6 °C/kW房间等效热阻C0.18 kWh/°C房间等效热容COP3.0制冷能效比P_rate1.5 kW单台空调额定功率dt0.25 h控制步长alpha0.4 元/(°C·h)舒适度惩罚系数光伏总装机800 kW节点18/25/33空调总容量1.5 MW1000台×1.5kW4. 仿真算例与结果分析4.1 算例场景设计为了验证优化效果我设置了三个场景。场景A是无控制基准所有空调按固定设定温度26度运行压缩机根据室温自然启停这也是大多数家庭的实际运行方式。场景B是只有削峰控制目标函数只考虑购电成本和弃光惩罚完全不管舒适度看看极端情况下能削多少峰。场景C是协同优化目标函数同时包含购电成本、弃光惩罚和舒适度惩罚也就是上面描述的那套完整模型。每个场景用同一组光伏出力曲线、同一组基础负荷曲线跑一天96个时段。对比指标包括馈线峰值负荷、峰谷差、光伏消纳率、末端节点电压最低值、平均温度偏差。这样设计的目的是把“有优化”和“无优化”、“只管电网”和“兼顾舒适度”的差异一次性看清楚。4.2 负荷与光伏消纳结果从结果看场景C相对场景A馈线峰值负荷降低了约13%峰谷差减少了约18%。场景B的削峰效果更强能到20%以上但代价是空调长时间停机室内温度最高冲到28.6度用户舒适度被明显牺牲。三场景综合对比如下指标场景A无控制场景B纯削峰场景C协同优化峰值负荷削减比例0%约20%约13%峰谷差削减比例0%约25%约18%光伏消纳率约91%99%以上99%以上最高室温约26.5°C约28.6°C约27.5°C末端电压最低值约0.94 p.u.约0.95 p.u.约0.96 p.u.光伏消纳方面场景A因为有空调满负荷运行消纳率本身不算低大概91%场景B和C基本都能到99%以上。这说明空调负荷作为柔性负载和光伏出力在时间上天然匹配中午光伏多、制冷需求也大优化器只需要让空调群在中午尽量用光伏电在傍晚高峰少用电就能把弃光率压下去。这里有个很有意思的现象优化结果并不是让空调简单地在峰时全关、谷时全开而是会利用房间热惯性在峰时来临前提前把温度降到下限附近峰时再“放养”一段时间。这个行为很像预冷策略是纯人工规则控制很难实现的。4.3 电压质量与舒适度分析配电网末端节点电压是这次优化的另一个重点。场景A在晚高峰时节点33的电压最低掉到0.94 p.u.左右已经触及电压下限场景C通过削减空调负荷同一时段电压最低约0.96 p.u.回到允许范围。这说明空调负荷优化不仅影响经济运行还能在不增加投资的情况下释放配电网的电压支撑能力。舒适度方面场景C的室温全天基本控制在23.5到27.5度之间相对设定值26度的偏差大多数时段在1度以内只有下午光伏波动最剧烈的时候短暂超过1.5度。作为对比场景B的最高温度到了28.6度多数人能明显感觉热。综合来看场景C是一个“电网指标不越限、用户感受基本无感”的方案。这也是为什么最终交付选择带舒适度惩罚的协同优化而不是单纯追求削峰最大化。实际项目里用户接受度往往比理论最优削峰重要得多。5. 常见问题排查与工程化经验5.1 求解器相关的坑这个项目最容易被卡住的环节不是建模而是求解环境。YALMIP只是建模层真正解MILP要靠Gurobi或Cplex。我第一次装Gurobi的时候license一直没配好YALMIP就报“No suitable solver found”不明真相时容易误以为是模型写错了其实是求解器没被识别。先检查求解器安装和license再检查模型这个排查顺序要记住。没有商业求解器license的话有个免费替代方案用YALMIP调用SCIP或者把问题规模缩小后用Matlab自带的intlinprog。不过intlinprog对上千个整数变量、几千条约束的问题会很吃力建议至少装一个Gurobi教学版或者用SCIP做验证。另一个常见问题是YALMIP的数据类型。binvar和sdpvar混着用的时候如果某个约束里出现变量乘积比如u乘以P问题立刻变成非凸的二次约束MILP求解器直接罢工。所以建模时要仔细检查有没有变量相乘的情况有就做变量替换或者线性化这是保持问题线性的底线。5.2 模型求解速度与收敛问题求解速度我排查过一轮。最初的模型里每个节点下的空调分别建模60多个空调变量组叠加上96个时段直接膨胀到几万个整数变量Gurobi跑半小时都不收敛。后来改成按节点聚合同一节点的所有空调参数取平均统一为一个变量组整数变量数量瞬间降了一个数量级几分钟就能求出
返回列表