
把含可再生能源的配电网空调负荷优化控制这个课题从建模到Matlab代码实现完整跑通我前后折腾了挺长时间。这类项目在毕业设计和需求响应仿真里出场率很高核心思路就是用空调负荷的热惯性去抵消光伏、风电的波动性让配电网在安全约束内跑得更经济、更平稳。这篇总结把整个技术路径、数学模型、代码框架和调试经验都写出来给正在做同类课题的同行做个参考。这个课题本质上解决的是一个“源荷不匹配”的问题。分布式光伏在中午大发但这时候基础负荷往往不高晚上负荷冲上来光伏又归零于是出现净负荷曲线“鸭子”一样的形状。空调负荷因为有大楼热惯性可以短时间调节功率而不影响用户舒适度刚好能充当虚拟储能。项目要做的事情就是在潮流、电压、温度舒适度这些约束下求出一组最优的空调功率时序让净负荷曲线更平滑、弃光更少、运行费用更低。我下面按课题拆解的思路来写从方案选型、数学模型、Matlab实现、算例分析到调参经验每一步都会讲清楚“为什么这么做”尽量少留坑。1. 项目整体思路与技术路径拆解1.1 这个课题到底在优化什么先说清楚问题。配电网接入可再生能源之后传统“负荷刚性、电源可控”的假设就不成立了。光伏出力完全跟着天气走一个晴朗的夏天中午分布式光伏出力可能占到峰值负荷的三分之一甚至更高而家庭用电在这时候却处于低谷多出来的电往哪送要么倒送上级电网造成潮流反向要么导致局部节点电压越上限要么只能被迫弃光。空调在这里面是个很特殊的负荷。一方面城市夏季空调负荷占比很高高峰时段经常超过四成量级足够大另一方面空调制冷的对象是房间而房间本身是一个大热容体墙体、家具、空气都在储存热量把空调短时间调低甚至关掉十分钟室温只会缓慢上升用户基本感知不到。这就是“热惯性”也是空调负荷能够参与优化调度的物理基础。于是问题变成一个优化问题给定配电网网络参数、光伏出力曲线、基础负荷曲线、空调负荷参数找出一组最优的空调运行功率时序使得某个或者某几个运行指标最优同时满足潮流约束、电压约束、空调功率约束和室内温度舒适度约束。1.2 建模方案怎么选型我最早在这个课题上纠结的是空调负荷模型。空调负荷模型大致分两类一类是状态队列模型把空调看成大量开关状态的聚合体适合描述大规模空调群的启停行为另一类是等效热参数模型简称ETP模型用一个等效电阻和一个等效电容把房间的热动态描述成一阶微分方程物理含义直观参数也容易标定。对这个课题来说ETP模型更合适因为要嵌入优化问题一阶线性差分方程的约束形式非常友好Yalmip里面直接用线性约束就能描述。配电网潮流建模方面辐射状配电网最常用的是Distflow分支潮流方程也就是从根节点开始按支路逐级递推有功、无功和电压关系。相比完整的牛顿拉夫逊潮流Distflow形式规整还能通过二阶锥松弛转成凸优化问题用Cplex这类商业求解器能很快求出全局最优解。如果完全不考虑潮流约束只做负荷侧的功率平衡那问题就太简化了得到的方案拿到配电网层面往往电压越限都不能约束。1.3 求解方法选择与原因分析在求解方法上这个课题有两条路线。第一条是解析优化路线通过Yalmip工具箱建模调用Cplex、Gurobi这类数学规划求解器优点是全局最优、结果可复现、代码清晰缺点是Cplex/Gurobi需要额外安装和授权对离散变量多的模型求解速度会下降。第二条是智能算法路线用粒子群PSO、遗传算法GA这类启发式算法把空调功率编码成粒子位置在适应度函数里嵌套潮流计算优点是不需要商业求解器、灵活性高、可以随意改目标函数缺点是结果有随机性、容易陷入局部最优而且每代种群都要跑一次潮流计算量明显更大。我最终的做法是两条路线都实现了。主程序用Yalmip加Cplex作为标准答案用来校验模型和生成基准结果另外写了PSO版本方便没有商业求解器授权的同学直接跑。实际对比下来规模不大的情况下两者结果差距在5%以内但PSO每次运行结果会轻微波动这是正常现象。2. 核心数学模型与关键约束解析2.1 可再生能源出力建模光伏出力的建模首先要拿到一个典型日的出力曲线。工程做法是用历史辐照度数据通过Beta分布模拟每个时刻的辐照度再乘以光伏装机容量和转换效率得到出力更简单的做法是直接采用某典型晴天的归一化出力曲线再把峰值大小按装机容量缩放。很多文献里会直接给出一条“光伏典型日出力曲线”数值是0到1之间的标幺值比如早上6点开始上升、中午12点到13点达到峰值、下午18点降到0。这种曲线建模简单用于优化控制研究完全够用。如果做的是日内滚动优化就需要用短期预测数据把误差以一定比例叠加到预测曲线上考察控制策略的鲁棒性这一步可以放到后续扩展里做。风电出力模型类似通常用威布尔分布描述风速再用风速-功率转换曲线得到出力。我这里不展开太多重点提醒一点无论用哪种分布模型最后优化程序里读入的都是一组24小时或者96个时段的离散出力序列后面的潮流计算只关心这个序列。2.2 空调负荷一阶ETP热力学模型ETP模型的核心方程是房间热平衡方程。室外温度、室内温度和空调制冷量共同决定室内温度的变化速率。方程可以写成C · dT_in/dt (T_out - T_in) / R Q_ac其中T_in是室内温度T_out是室外温度C是房间等效热容R是等效热阻Q_ac是空调制冷量。方程表示房间温度的变化等于围护结构传入的热量加上空调带走的热量之差除以热容。对时间做离散化之后得到递推形式T_in(t1) T_out(t1) - Q_ac(t) · R - [T_out(t) - Q_ac(t) · R - T_in(t)] · e^(-Δt / (R·C))这个式子看起来复杂实际上就是上一时刻的室内温度向室外温度和空调共同决定的稳态温度以指数规律逼近。Δt是优化时间步长一般取15分钟或者1小时。因为控制周期大多是小时级所以Δt通常等于调度时间间隔。空调的电功率和制冷量之间通过能效比COP联系Q_ac COP · P_ac。COP一般在2.5到4之间取决于空调的能效等级。在这里把COP当作常数处理大大简化优化模型如果考虑COP随温度变化问题就变成非线性了。2.3 配电网Distflow潮流模型配电网是辐射状结构Distflow方程按支路递推。对每条支路ij已知节点j的负荷功率和支路功率节点i的功率平衡方程为P_i sum(P_j r_ij · (P_j^2 Q_j^2) / V_i^2) P_load_i - P_pv_i P_ac_i传统形式的Distflow由于包含电压平方项是非凸约束。实际实现时通常忽略网损项或者对它做线性化。对于配电网优化调度这种场景忽略网损的误差一般在1%到2%以内对结果趋势没有影响。如果追求精确可以把Distflow改写为二阶锥形式在Yalmip中用SOCP约束描述Cplex可以直接求解。简化后的潮流约束是线性的节点有功、无功平衡分别是V_i^2 V_j^2 - 2(r_ij · P_ij x_ij · Q_ij)节点i的有功功率P_gen_i - P_load_i - P_pv_i P_ac_i - sum(P_ij) 0电压上下限约束则是V_min ≤ V_i ≤ V_max这里的符号要统一我把空调负荷当成可调的负的有功负荷叠加在节点注入上。在写代码时空调功率增加代表该节点从电网吸收更多功率光伏出力为负代表注入功率。2.4 目标函数设计与权系数整定这个课题的目标函数一般包含三个分量。第一个是系统运行成本主要是从上级电网购电的费用也可以加上网损费用。第二个是电压质量指标用所有节点在所有时刻的电压偏差平方和衡量。第三个是可再生能源消纳指标用弃光量或者弃风量来衡量目标函数里加一个弃光惩罚项。把它们写成加权和形式min J w1 · C_elec w2 · sum((V_i,t - V_ref)^2) w3 · sum(P_curtail_t)权重系数的确定是关键步骤也是最容易踩坑的地方。三个分量的数量级差异可能相差几个数量级比如购电成本是数万元电压偏差平方和的数值可能只有0.01如果不做归一化直接加权相加电压项就被淹没了。合理的做法是先分别运行单目标优化得到每个指标的大致范围然后取权重让各分量的量级接近。或者更简单把电压偏差乘一个1000或者10000的系数再相加。空调功率的舒适度约束写法如下T_min s_low_t ≤ T_in(t) ≤ T_max s_up_t其中s_low和s_up是非负松弛变量。松弛变量对应的惩罚系数设得比权重稍大确保系统只在无解情况下才允许温度越限而不是为了降低成本随意牺牲舒适度。3. Matlab代码实现与关键环节3.1 代码整体框架与文件规划我建议把代码拆成几个文件别全部堆在一个脚本里。我的工程目录结构如下main.m % 主程序控制流程 load_case33.m % IEEE 33节点配电网参数 load_typical_day.m % 24h基础负荷和光伏出力数据 ac_parameters.m % 空调负荷参数设置 build_opt_model.m % Yalmip建模与求解 build_pso_model.m % PSO求解 plot_results.m % 结果可视化主程序main.m负责调度以上所有函数流程是加载算例和负荷数据设置空调参数调用优化函数得到空调功率时序后重新计算潮流和各类指标最后画图。3.2 数据初始化与核心参数在ac_parameters.m里面设置空调参数我用的参数如下表所示这些参数取自常见文献实际使用可以根据自己的研究对象调整参数数值说明空调额定功率2.5 kW单台空调最大功率能效比COP3.0制冷量与电功率之比等效热阻R5.5 °C/kW房间围护结构热阻等效热容C0.18 kWh/°C房间综合热容温度下限T_min24 °C舒适度约束下限温度上限T_max28 °C舒适度约束上限初始室内温度27 °C仿真初始时刻温度基础负荷数据我使用了两种方式。一种是从IEEE节点负荷数据直接扩展到24小时按日负荷系数乘一个日负荷曲线另一种是典型夏季日负荷曲线和光伏出力曲线放在同一个表格里程序直接读取。这里提醒一下如果节点数量多、时刻多建议把所有数据组织成矩阵别用cell数组后面写约束和画图都方便。3.3 Yalmip建模与求解Yalmip建模的核心步骤是定义变量、写约束、写目标、调用求解器。下面是关键代码框架%% 定义变量 T 24; % 24个调度时段 n_bus 33; % 33节点系统 P_ac sdpvar(n_bus, T); % 各节点空调功率单位kW T_in sdpvar(n_bus, T); % 各节点室内温度 V_sq sdpvar(n_bus, T); % 电压平方作为变量 %% 约束条件 Constraints []; for t 1:T % 空调功率上下限 Constraints [Constraints, 0 P_ac(:,t) P_ac_max]; % 室内温度舒适度约束 Constraints [Constraints, T_min T_in(:,t) T_max]; end % 室内温度动态约束ETP模型线性化 for t 1:T-1 for k 1:n_bus % 简化递推形式T_in(t1) a*T_in(t) b*T_out(t) c*P_ac(k,t) Constraints [Constraints, T_in(k,t1) a_coef*T_in(k,t) ... b_coef*T_out(t) c_coef*P_ac(k,t)]; end end这里有个细节需要特别说明。ETP递推公式是线性的因为Q_ac和P_ac成正比所以T_in(t1)可以写成上一时刻T_in、当前时刻T_out和P_ac的线性组合系数由R、C和Δt决定。这也是我选择ETP模型的重要原因——模型线性化之后整个问题要么是LP要么是QCP求解非常快。潮流约束部分用Distflow线性化形式for t 1:T % 各节点注入功率 P_inj P_pv(:,t) - P_load(:,t) - P_ac(:,t); % 节点功率平衡简化辐射状递推 Constraints [Constraints, P_inj A_incidence * P_line(:,t)]; Constraints [Constraints, V_sq(:,t) V_sq_ref B_incidence * P_line(:,t)]; Constraints [Constraints, V_min^2 V_sq(:,t) V_max^2]; end目标函数按照第二节的方式定义。这里建议把三个目标分量分别求出数值打印在命令行方便检查权系数是否合理。求解器调用如下ops sdpsettings(solver, cplex, verbose, 2, showprogress, 1); result optimize(Constraints, Objective, ops); % 检查求解状态 if result.problem 0 P_ac_opt value(P_ac); T_in_opt value(T_in); else disp(求解失败); disp(result.info); end3.4 粒子群算法版本与Yalmip版本的区别PSO版本的核心是适应度函数设计。粒子位置是一个n_bus*T的矩阵每个元素代表对应节点对应时刻的空调功率。适应度函数内部完成三件事计算目标函数值、调用潮流计算验证网络约束、施加惩罚项。 然后进行P、G更新 状态有点奇怪我重新组织。适应度函数结构大致如下function fitness ac_cost_func(x, case_data) P_ac reshape(x, n_bus, T); % 1. 计算温度动态 T_in update_temp(P_ac, case_data); % 2. 计算目标函数购电成本电压偏差弃光惩罚 cost compute_cost(P_ac, T_in, case_data); % 3. 约束越限惩罚 pen sum(max(0, T_in - T_max)) sum(max(0, T_min - T_in)); fitness cost 1e4 * pen; endPSO的惯性权重我建议从0.9线性递减到0.4学习因子c1和c2都取2.0种群规模取30到50迭代次数取100到150。运行之前要做一次量级校准先跑一次随机解看看cost和pen各自的量级再设置惩罚系数否则惩罚太小会得到不可行解惩罚太大会让搜索陷入局部最优。4. 算例测试与结果分析4.1 测试场景设置我的测试算例采用IEEE 33节点配电网总负荷约3.7MW在节点13、21、29接入三组分布式光伏总装机容量2.1MW。夏季典型日设其中30%的基础负荷可以看作可控空调负荷分布在住宅性节点上。时间尺度选24小时调度间隔1小时。仿真分为两个场景场景A无优化控制空调按室外温度自然运行相当于传统负荷不参与调节。场景B空调优化控制空调功率由优化模型给出目标是在满足舒适度约束的前提下最大化消纳光伏、降低购电成本和改善电压。4.2 核心结果对比优化前后的系统净负荷曲线差异非常明显。无控制时中午12点左右光伏出力达到峰值但基础负荷较低净负荷出现明显低谷甚至反向弃光现象严重晚上19点到21点负荷高峰到来光伏出力已经为零系统从上级电网购电大幅度升高。优化控制后空调在中午时段加大功率运行相当于提前把房间温度拉低把光伏多发的电“存”进房间里到了傍晚负荷高峰空调再降功率运行利用中午预冷的效果维持室温在舒适范围内。净负荷曲线变得平坦峰值负荷最大可降低约12%到18%光伏消纳率从80%左右提升到95%以上。指标对比大致如下表指标无优化控制空调优化控制日购电成本相对值100%82%~90%光伏消纳率78%~85%94%~99%电压偏差平方和0.350.12温度越限累计时间0 h0.5~1 h视松弛系数4.3 参数敏感性分析空调负荷占比对结果影响最大。我把占比从10%调到50%跑了一组对比占比越高净负荷削峰效果越明显光伏消纳率提升越快但代价是温度越限的风险增加。占比30%到40%是一个比较甜点区间调控空间大且舒适度受损小。温度约束范围同样很关键。24~28度是最常用的区间把它放宽到23~29度系统运行成本可以再降低5%左右因为空调有了更大的“蓄冷”空间。反过来温度区间缩到25~27度优化空间很小成本下降不明显求解反而更容易遇到无解情况。5. 常见问题与调参经验实录5.1 Yalmip提示找不到求解器这个是最常见的报错Yalmip提示No suitable solver found。原因是电脑没有安装Cplex或者Gurobi或者Yalmip不知道求解器在哪里。解决办法有两个。一是装一个免费的求解器比如SCS或者SedumiYalmip自带支持二是在调用Cplex之前先用solver test检查一下。我在几台机器上踩过这个坑。这里提醒一下Cplex装完之后要在Matlab里把路径添加好然后在命令行运行ybaby或者yalmiptest如果显示找不到多半是环境变量没配。如果只用线性规划完全可以用系统自带的linprog来解LP问题如果是二次约束问题就需要外部求解器了。我在Gurobi和Cplex之间切换过Gurobi对SOCP的支持更顺手但Cplex的学术授权更好拿。5.2 优化问题提示不可行温度约束过紧是最常见的原因。如果T_min设为24、T_max设为26加上室外温度35度空调功率又有上限很可能不存在可行解。解决方法是给温度约束加松弛变量把硬约束变成软约束s_up sdpvar(n_ac, T); s_low sdpvar(n_ac, T); Constraints [Constraints, T_min - s_low T_in T_max s_up]; Constraints [Constraints, s_up 0, s_low 0]; Objective Objective 100 * (sum(s_up(:)) sum(s_low(:)));松弛变量的惩罚系数不要设得太大否则会影响目标函数的梯度但也不能太小太小则系统会为了省钱随意越限。我一般先设100看结果如果温度越限量不大就保持如果基本不越限就稍微调小到10~50。5.3 空调温度模型发散ETP模型递推过程中出现温度振荡或者发散通常是时间步长和热时间常数的量级不匹配。房间的时间常数是RC大约1小时左右。如果调度间隔取1小时离散误差不容忽视如果取15分钟精度就好很多。另外要注意递推系数是否正确用e^(-dt/(RC))这个指数项dt单位要统一成小时。调试办法是单独写一个测试脚本给一组固定空调功率把温度递推跑一遍看最终温度是否趋近于稳态温度T_out - Q_ac*R。如果稳态温度和手算对不上问题一定在递推公式系数上。5.4 粒子群算法结果不稳定PSO结果每次运行不同是非常正常的。如果差别特别大先检查惩罚系数是否合适再看种群规模和迭代次数。我用的参数是惯性权重0.9线性降到0.4个体学习因子和全局学习因子都是1.5到2.0之间种群50、迭代150。还是不稳的话可以连续运行20次把最优结果作为最终结果输出。最稳妥的做法是先用Yalmip算一次把解记下来再用PSO去逼近两者对得上就说明模型没写错。5.5 运行速度优化技巧如果模型规模大运行慢可以考虑三个技巧。第一约束用矩阵形式整体写不要用一层层for循环逐个节点逐个时刻添加约束Yalmip支持矩阵约束写起来简洁构建速度也快很多。第二把潮流约束中电压平方变量做线性近似能大幅降低求解难度。第三如果模型不含连续温度动态、只取稳态温度问题甚至可以退化成线性规划求解时间从秒级降到毫秒级。6. 我实际调试中的体会这个项目做下来最大的感受是模型尽量简单、目标尽量清晰。一开始我把空调负荷、光伏、潮流、电压质量全部塞进一个模型里目标函数加权项有五个结果调参调到崩溃。后来先做纯负荷侧优化不看潮流约束跑通后再逐步加入潮流约束和电压惩罚一层一层往上加每一步都能定位是哪个地方出了问题。空调负荷的ETP参数对结果影响很大尤其是等效热阻R和热容C。实际做研究时如果找不到实测数据可以在文献里找区间然后做敏感性分析说明自己选的参数合理。不要在这里过度纠结重点始终是优化控制框架本身。这个课题后续可以扩展的方向很多加入储能、电动汽车充电负荷、多时间尺度滚动优化都是自然的延伸。我在做完这个基础版本之后又加了分布式光伏预测误差场景对比了确定性优化和鲁棒优化的效果这部分做出来对投稿或者毕业设计加分都挺有用。如果你正在做类似的课题建议先把这篇文章里的基础版本完整跑通再去叠加高级功能对模型的掌控感会完全不一样。