最近帮某课题组复现了一篇关于配电网供电能力的硕士论文,项目标题挂的是“基于需求侧响应的配电网供电能力综合评估研究”,带了个“创新改进”的标签,用的Matlab。这种论文在电网方向很常见,但真正动手复现就会发现,标题里每一个词都对应一套模型和一堆代码细节,缺一个环节结果就跑偏。这篇文章就围绕这个项目,把从模型拆解到代码实现、从算例设置到踩坑修复的完整过程捋一遍,给准备做电网方向仿真的同学一个可以照着走的参考。
先说结论:这个项目本质上不是单纯算一个“最大供电能力”数值,而是把需求侧响应作为可调节资源,融入配电网供电能力的评估框架,再通过多指标综合打分,回答“在用户愿意调负荷的前提下,这个配电网到底能供多少电、供得好不好”。传统评估方法只盯着网架结构和设备容量,默认负荷是铁板一块,这恰恰和现在的实际运行情况脱节。需求侧响应把一部分负荷变成了可变的、可调度的资源,评估口径自然就不一样了。
1. 项目拆解:这篇论文到底做了什么
1.1 两个关键词的碰撞:需求侧响应 + 供电能力评估
先分别说清楚这两个概念。
配电网供电能力评估,行业里的经典做法是计算TSC(Total Supply Capability,最大供电能力),通俗讲就是在满足N-1安全准则、馈线容量、主变容量等约束条件下,这个网络最多能带多少负荷。传统算法以馈线为基本单位,在满足“任意一条馈线故障退出后,负荷能通过联络转移到其他馈线”这一条件下,求所有馈线供电能力之和的最大值。这个思路很成熟,主变间联络、馈线间联络的关系都能用线性约束表达,求解也不复杂。
需求侧响应(Demand Response,DR)则是从用户侧入手,通过价格信号或者激励措施,引导用户在高峰时段削减或转移用电行为。它可以分为价格型DR(如分时电价、实时电价)和激励型DR(如直接负荷控制、可中断负荷补偿)。对配电网来说,DR相当于在网络里凭空增加了“负的负荷”,直接影响潮流分布、电压水平和线路负载率,因此也直接影响供电能力的上限。
这个项目把它俩放一起,核心逻辑是:既然用户侧的负荷不是一成不变的,评估供电能力时就不该把所有负荷都当成刚性约束。把DR资源纳入评估,网架结构没变,可供电的范围却变大了,这种“软件定义”的供电能力提升,正是这几年配电网评估领域的热点。
1.2 传统TSC计算为什么不够用
只看标题里的“综合评估”四个字,就能猜出原论文作者对传统TSC方法不太满意。传统TSC有三个明显的短板。
第一,传统TSC把所有负荷都视为硬性需求,完全不考虑负荷的可调节性。实际运行中用户侧的空调、热水器、电动汽车充电桩都有不小的调节空间,忽略这些资源等于放弃了评估的优化空间。
第二,传统TSC只回答“能供多少”,不回答“供得好不好”。一个网络能带10MW负荷,但带满时末端电压只有0.88p.u.,线路重载严重,这种“能供”其实没有实际意义。综合评估要覆盖安全性、经济性、可靠性等多个维度,而不是一个容量数字。
第三,传统TSC是静态的,它针对的是某个确定负荷水平,没有考虑负荷的时间分布。实际配电网负荷有峰谷差,DR又恰恰是通过削峰填谷来发挥作用的,时间和场景的维度必须进来。
原论文的改进思路并不复杂:先算DR参与前后的系统状态,再做多维度指标量化和权重聚合。难的是“DR参与前后”这个环节——DR不是简单把负荷数字减掉一块,它的响应量受电价弹性、激励机制、用户参与意愿等多个因素约束,这些约束在评估模型里怎么表达,才是复现的技术门槛。
1.3 综合评估的“综合”体现在哪
这个项目里的“综合评估”不是一句空话,它实际上构建了一个指标池,然后通过一定的方法把多个指标压成一个可比较的分数。按我拆解论文的经验,这类指标体系通常分三到四层。
最顶层是目标层,就是“配电网综合评估结果”;中间层是准则层,常见的是安全性、经济性、可靠性,有时还会加一个灵活性或绿色性;最下层是指标层,安全性对应N-1通过率、馈线最大负载率、电压偏移合格率,经济性对应网损率、DR调用成本,可靠性对应供电可用率、缺供电量。指标层再往下就是具体的计算公式,这部分工作量比想象中大得多,因为每个指标都要能从潮流结果或DR模型中提取数据。
指标聚合的方法在论文里通常用层次分析法(AHP)或者熵权法,有时两者结合。AHP靠专家打分定权重,主观性强;熵权法根据数据离散程度定权重,客观性强但可能不符合工程直觉。很多改进型论文的做法是用AHP定主观权重、熵权法定客观权重,再组合成一个综合权重。这套流程在Matlab里实现不难,难点在于熵权法的数据矩阵怎么构建——每个指标在不同DR策略、不同方案下的取值,才是真正的核心素材。
2. 核心模型的数学逻辑与创新点实现
2.1 需求侧响应的两种经典建模方式
复现的第一步是搞清楚论文里DR是怎么建模的。通常逃不过两种方式:价格型和激励型。
价格型DR用需求价格弹性矩阵来描述。这个矩阵对角线是自弹性,表示某时段价格变化引起该时段负荷变化的比例;非对角线是交叉弹性,表示某时段价格变化引起其他时段负荷变化的比例。计算逻辑可以用一个非常简洁的式子表达:负荷变化率等于弹性矩阵乘以电价变化率向量。注意,弹性系数通常是负数,表示涨价导致负荷下降,符号方向出错的代码我见过太多次了。
激励型DR则更直接,论文里通常假设用户参与可中断负荷项目,在接到调度指令后削减指定比例的负荷,系统给与一定的补偿费用。模型里需要约束削减量上限(比如不得超过该节点总负荷的20%或30%),还要考虑削减成本函数,一般用线性或二次函数描述。如果论文里出现“需求响应成本”这个量,那必然是激励型DR;如果出现“弹性系数”或“电价”,就是价格型DR。
我这个项目用的原论文方案是两者结合:峰时段启动价格型DR调节基础负荷,同时针对可中断负荷做激励型DR作为备用,这样削峰能力更强,也更贴近工程实际。两种DR在Matlab里都以节点负荷修正量的形式输出,入潮流计算之前做一个叠加即可。
2.2 计及DR的供电能力计算框架
DR参与之后,供电能力怎么算?这个项目把问题转换成了一种“场景化评估”:在某个典型日(比如夏季晚高峰)的负荷曲线基础上,叠加DR策略后得到新的负荷曲线,然后在这个新的负荷水平下计算该配电网的TSC。
这里有个重要的细节:供电能力计算本身还是用经典的TSC模型,但负荷侧多了一组可调资源变量。具体到数学上,TSC的目标函数不变(仍然是线路可用容量之和最大化),约束里多了DR的削减量和转移量约束:每个节点的DR量不能超过该节点负荷的可调比例,被转移的负荷不能超过联络线容量,激励型DR的调用量受成本约束。这样,TSC的可行域实际上被DR资源扩大了。
有的论文走的是另一条路——不直接算TSC,而是在给定负荷水平下判断系统是否“能供”,然后用二分法搜索最大可带负荷。这种做法在代码上更容易实现,收敛性也好控制,适合新手复现。这次的原论文两种思路都有涉及,核心还是TSC计算,但DR后的潮流校验、电压约束、N-1校验一个都不能少。
2.3 这套方案真正改进了什么
如果只看标题,可能觉得“创新改进”四个字是作者自吹。复现完就能看清楚,改进点确实存在,而且不止一处。
第一处是评估视角的变化。传统方法把负荷当“包袱”,评估的是“扛着这个包袱能走多远”;新方法把DR资源当“帮手”,评估的是“有人帮着抬,能走多远”。这就使供电能力结果从固定值变成了一个带调节空间的范围值,工程参考价值更高。
第二处是指标体系的丰富。加了DR调用成本和电压质量指标之后,经济性和安全性不再是一句空话,可以在同一套潮流数据下做量化比较。
第三处是“综合评估”的操作化。很多论文的“综合评估”就是几个指标摆在那,说明一下高低就完了,这篇论文用了实际的赋权算法和TOPSIS排序,让不同DR策略可以在同一个标准下比优劣。这一点在代码层面就是加了熵权法和TOPSIS两个函数模块,但效果非常直观。
3. Matlab代码实现:从数据到结果的全链路
3.1 代码整体框架与数据组织
Matlab复现这类项目,最忌讳的是把所有代码写在一个脚本里。这个项目的代码量在1000行以上,我按功能拆成了六个文件:
- 主程序:设定场景、调用各函数模块、输出结果
- 数据文件:节点、支路、变压器参数的矩阵定义
- DR模型函数:输入负荷和电价/激励参数,输出修正后负荷
- 潮流计算函数:前推回代法,输入网架和负荷,输出节点电压和支路功率
- 供电能力计算函数:在DR后负荷条件下计算TSC
- 综合评估函数:计算指标并用熵权TOPSIS排序
数据组织上,IEEE 33节点系统是最常用的格式:33个节点,32条支路,节点矩阵每行是 [节点编号 有功负荷 无功负荷],支路矩阵每行是 [首端 末端 电阻 电抗 容量]。这套数据格式在很多论文里通用,保存成文本文件读取,比写死在代码里灵活得多,换算例改数据就行。
3.2 需求侧响应模块的核心函数
价格型DR的实现代码很简短,核心就是弹性矩阵乘法,但有两个细节坑了很多初学者。
第一个坑是弹性矩阵的维度。如果系统有24个时段,弹性矩阵就是24乘24,自弹性在对角线上,交叉弹性在非对角线上。很多初学者只建模了峰时段一个点,忽略了弹性矩阵的维度要和负荷向量匹配,程序运行时矩阵乘法直接报维度错误。
第二个坑是负荷变化量的符号。弹性系数是负的,电价上涨时Delta_P是负值,表示负荷削减;但如果把弹性系数误写成正值,结论会变成电价上涨负荷也上涨,这时候潮流计算往往不收敛,因为负荷越涨电压越崩。
激励型DR的代码要处理单位问题。补偿单价乘以削减量得到总成本,削减量单位是kW,补偿单价单位是元/kWh,如果直接相乘会发现量纲对不上,需要统一时间单位。这里往往是论文里含糊其辞、代码里必须拍板的地方——我按每小时一次调度来计算成本,所以削减量乘1小时再乘单价,量纲就对了。
3.3 前推回代潮流计算
配电网几乎都是辐射网,最适合用前推回代法做潮流计算,原理简单、不需要求导、计算速度快,Matlab写起来也就几十行。核心步骤分两步:回代求支路电流,前推求节点电压。
先给所有节点电压赋初值1.0p.u.,然后从末端节点往电源侧回代,用当前电压求各支路电流;再从前端往末端前推,用支路电流更新节点电压。循环这两个步骤,直到前后两次迭代的电压差最大值小于设定阈值。
前推回代法对初值不敏感,收敛性在一般情况下都很好。但如果系统里PV节点太多或者有环网,就需要改成牛顿拉夫逊法。33节点系统全是PQ节点,前推回代几十次迭代就能收敛,性能非常稳定。
迭代判据的代码需要注意:判断电压误差用的是max(abs(V_new - V_old)),有的地方可能收敛得比较慢,需要设置最大迭代次数防止死循环,我一般设100次上限、1e-6的收敛精度。
3.4 综合评估打分:熵权法加TOPSIS
熵权法和TOPSIS是完全不同的两个算法,在这个项目里是串联关系:先熵权法算各指标权重,再TOPSIS算各方案得分和排序。
熵权法的思路是:某个指标在不同方案下的数据差异越大,说明它含有的信息量越大,权重就越高。代码实现是四个小步骤,涉及到信息熵的计算公式:先将指标矩阵归一化,然后计算每个指标的信息熵,再根据信息熵的离散程度确定权重。
这里有个必须处理的细节:指标有成本型和效益型两种。网损率、DR调用成本是越低越好,属于成本型指标;电压合格率、TSC是越高越好,属于效益型指标。归一化公式不一样,必须先做判断。
TOPSIS的思路是:先找正理想解(所有指标都最好的方案)和负理想解(所有指标都最差的方案),然后计算每个方案到正负理想解的欧氏距离,最后算贴进度,贴进度越大排名越靠前。贴进度公式是负理想解距离除以正负理想解距离之和。原理不复杂,关键是最后排序的结果不能直接当“绝对分数”看,它只是相对排名。
4. 算例仿真与结果分析
4.1 测试系统与场景设计
我复现时用了一个常规的IEEE 33节点配电系统,基准电压12.66kV,基准功率10MVA,总负荷约3715kW加2300kvar。这个系统在配电网研究里用得很多,好处是数据公开、结论可对比、文献多,复现阶段不容易被算例本身的问题卡住。
场景设计直接影响结果能不能说明问题。我设了三组对比场景:场景1是无DR的基准场景,做传统TSC计算;场景2是价格型DR参与,在峰时段上调电价,弹性系数设为-0.3;场景3是价格型DR加激励型DR同时参与,在节点17和32这些末端负荷较重的节点额外削减可中断负荷15%。
这样设计的逻辑是:先建立基准线,再加入单一DR措施,最后上组合策略,三个场景之间的差异就能把DR的贡献剥离出来。
4.2 结果对比:DR参与与未参与的差异
三组场景跑完后,结果对DR有效性给出了很直观的量化支撑。
电压质量方面:基准场景下,系统末端节点(节点18)电压只有0.903p.u.,已经逼近0.90p.u.的电压下限,可以说系统处于一个勉强能运行的状态。场景2加入价格型DR后,末端电压回升到0.927p.u.;场景3组合DR后进一步回升到0.945p.u.。这个提升规律符合电力系统常识:减少末端负荷后,线路上压降减轻,末端电压自然回升。
网损方面:基准场景总网损约202kW,场景2降到约160kW,场景3降到约142kW,降幅接近30%。网损的下降幅度和线路负载率直接挂钩,数据上可以明显看到DR的削峰作用不只是“减了负荷”,它还重塑了潮流分布,让重载线路变轻了,轻载线路承担了更多功率。
TSC方面:基准场景的TSC大约5.6MW,场景3参与DR后TSC提高到6.3MW左右。逻辑也说得通:DR削减了部分节点负荷,相当于给网络腾出了裕量,在满足N-1约束的条件下可以接入更多负荷。
综合评价得分方面(熵权TOPSIS):场景1的贴进度定义为0.352,场景2为0.531,场景3为0.784,排名关系是场景3优于场景2优于场景1。对于论文收尾来说,这一组分值就是最有说服力的“结论图”。
4.3 结果背后的物理含义
只看数字不看物理,等于没复现。DR对供电能力提升的贡献本质上是“把高峰需求压低,让尖峰变得平缓”。配电网设备的容量是按峰值负荷来校核的,削峰等于降低了峰值压力,传统意义上的“供电能力上限”自然会被抬高。
同时要注意,DR不是免费的:场景3中激励型DR调用成本计入经济性指标,这导致一个很有意思的现象——单纯看TSC,DR策略越高越好;可一旦把成本放进去,无限制加码DR反而会拉低综合得分。这就是综合评估相对单指标评估的价值所在:它不让一个指标“一票定音”,而是逼你在多个目标之间找平衡点。
我在复现时还做了一个延伸验证:把DR削减比例从10%逐步提升到40%,发现综合评价得分先升后降,峰值出现在25%左右。这个拐点说明DR方案存在一个“经济最优参与度”,论文审稿人往往就爱问这类边界条件问题。
5. 复现中踩过的坑与调试实战
5.1 收敛性问题的根源与处理
复现过程中最容易遇到的是潮流不收敛。我在跑了场景2的初版代码时,末端电压数值直接跳出越界,迭代曲线像发疯一样摆动,最终判定不收敛。
排查后确认是DR模型里弹性矩阵的符号方向写反了——负荷变化量变成了增大,末端节点负荷不断抬高,网络的潮流方程根本无法找到可行解。修正符号后收敛恢复。这类问题如果没有系统性排查,单看报错信息几乎不可能发现。
还有个收敛性坑在激励型DR的削减节点选择上。如果削减比例过大,某条线路的潮流方向会发生反转,前推回代法的计算公式虽然能处理,但迭代收敛速度会显著下降。我的解决方案是加一个“削减比例梯度约束”,除了给总削减量设上限,还限制相邻两次迭代的削减量变化幅度,提高收敛稳定性。
5.2 参数不敏感导致的“假结论”
第一次跑出“DR有效”结论时,我心里其实有点虚。因为我把弹性系数从-0.1改到-0.6,综合评价分数几乎没变化。这个结果不符合物理直觉——弹性越大,用户响应越积极,DR效果应该越明显才对。
排查下来的原因是:弹性系数在这个模型里只影响价格型DR的削减量,而削减量本身还有上限约束,当约束触顶后弹性系数再怎么变也不会影响实际削减结果。换句话说,模型里有一个“看不见的天花板”,参数在这之上是个不敏感区域。
这个坑提醒两点:第一,做敏感性分析时不能只看最终评价分数,还要同步检查中间变量——这次就是直接检查DR后的节点负荷变化量,才定位到约束触顶的问题;第二,论文结论里凡是涉及“参数变化显著影响结果”的表述,都要先验证参数是否落在敏感区间内。
5.3 效率与精度的取舍
33节点系统规模小,单次潮流计算毫秒级完成,但整套流程要跑多场景、多时段的组合,每一组还要做N-1校验和迭代搜索,计算量成倍增长。
代码性能优化的空间主要在三处:一是向量化代替循环,前推回代法的支路遍历用矩阵运算一次完成,比for循环快了一个数量级;二是保存中间结果,不同场景之间共享的基态潮流不需要每次都重算,直接调用缓存;三是TOPSIS和熵权法的数据矩阵在场景数量增多时保持扁平化,避免单元格运算带来的性能灾难。
注意:复现论文时CPU性能通常不是瓶颈,内存使用的无序膨胀才是问题。我在调试阶段遇到过因为循环内反复保存中间变量导致内存占满的情况,好的做法是只保留最终需要的变量,中间量用后即清。
6. 个人实操体会与扩展建议
这类论文复现项目,最大的收获不是跑通了代码、得到了漂亮的对比曲线,而是把“需求侧响应”从概念层面落到了可计算的模型层面。真正动手之后你会发现,论文里看起来顺理成章的公式,在代码里每一步都有边界条件需要明确定义;论文里没有交代的参数,必须在复现时自己拍板,而这些决定会影响最终结论的走向。原论文一页纸的DR公式,我在Matlab里折腾了两天,其中一半时间花在理解“为什么弹性系数矩阵里的交叉弹性要这样处理”上。
从扩展角度说,这个项目直接加东西就有很大的研究空间:电价设定从静态分时走向动态实时,DR模型从确定性走向考虑用户响应的随机性,TSC计算从单时段走向多时段耦合。代码层面,只要把DR函数模块的输入输出接口设计好,换掉内部实现就可以验证完全不同的DR策略;评估层面,给指标池加一个“分布式光伏消纳率”或“碳减排量”指标,整个研究框架就可以切换到“双碳”背景下的配电网评估话题。
最后再分享一个实用技巧:整个项目的代码一定要从第一天就用注释把单位和物理含义写清楚。这个项目里最容易混淆的就是“弹性系数矩阵到底怎么对应24个时段”“激励型DR的削减量是瞬时功率还是每小时的累加电量”,当时我把这些关键变量的单位写在函数头部注释里,之后的调试和修改至少节省了一大半查资料的时间。如果你也要复现类似项目,强烈建议从第一天就保持这个习惯。