免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

电网故障下分布式能源无功优化:NSGA-II与Simulink联合仿真实现

电网故障下分布式能源无功优化:NSGA-II与Simulink联合仿真实现 电网故障下做分布式能源的无功优化这几个词凑在一起搞电力系统仿真的人应该都不陌生。分布式电源大规模接入之后电网一发生故障电压跌落、有功功率不平衡、无功支撑不足这些问题会同时冒出来传统的无功补偿手段反应又慢这时候就得靠分布式能源系统自己“扛事”尤其是利用并网转换器GCCGrid-Connected Converter的快速调节能力来提供无功支撑。这个项目正是围绕这个场景展开的用Matlab/Simulink搭建仿真模型通过多目标优化算法计算故障工况下各个分布式电源节点的无功输出策略让整个系统的电压水平、网络损耗和无功裕度达到一个综合最优的状态。这篇文章我会从项目思路、核心原理、优化建模到具体的Simulink实操过程完整过一遍把我自己做这个项目时踩过的坑、总结的经验也一并整理出来。不管你是正在做毕业设计的电力系统方向研究生还是做新能源并网相关工作的工程师只要涉及分布式能源优化控制和故障穿越仿真这篇文章都应该能给你一些实用的参考。1. 项目整体思路与设计考量1.1 这个项目到底在解决什么问题先说清楚问题场景。分布式能源系统指光伏、风电、储能、微型燃气轮机这些分布在用户侧或配电网末端的发电单元它们通常通过电力电子变换器接入电网。电网发生故障时比如最常见的单相接地短路或者三相短路公共连接点PCC的电压会发生跌落有时候跌落幅度会非常大。传统思路里分布式电源为了保证自身设备安全往往直接脱网停机但这在分布式渗透率很高的电网中会带来更严重的功率缺额甚至加剧故障扩散。所以现在的业内共识是分布式能源系统必须具备故障穿越能力尤其是低电压穿越LVRT能力也就是在故障期间不仅不能脱网还要向电网输送无功功率来支撑电压恢复。但这里就有一个核心矛盾每个分布式电源节点能提供的无功功率是有限的受限于变流器容量、线路传输能力、节点电压约束等等如果大家都“拼了命”发无功可能有的节点电压抬上去了别的节点却越限了网络损耗也会大幅增加。怎么协调各个GCC的无功输出让系统整体的表现最优这就是这个项目要解决的核心问题。1.2 为什么选择GCC作为核心调节载体并网转换器GCC在整个系统里起到的是“接口”作用它连接直流侧光伏电池板、储能电池等和交流电网侧。为什么把无功优化的执行器落在GCC上而不是继续依赖传统的电容器组或者静止无功补偿器SVG一来是因为响应速度。GCC通过开关器件的PWM脉冲控制可以在毫秒级甚至亚毫秒级改变无功输出而机械投切的电容器组需要几十到几百毫秒才能完成动作在故障这种动态过程中根本来不及。二来是因为连续可调。电容器组只能分级投切SVG的调节范围也有限而GCC只要在容量范围内无功输出可以连续平滑调整。这个特性对于优化算法来说非常友好决策变量是连续变化的优化结果可以直接映射成控制指令。第三分布式能源系统里GCC的数量本身就在增长每个节点都有现成的变流器设备用它做无功调节不需要额外增加硬件投资是性价比最高的方案。1.3 “多目标优化”里的多目标到底是哪几个目标这是我被问得最多的问题之一。很多初学者以为多目标就是“既优化电压又优化损耗”但实际上需要对目标具体化。在这个项目里我最终确定的目标函数有三个第一个是节点电压偏差最小。故障期间电压跌落是主要问题优化无功输出后希望各节点电压尽量接近参考值通常取1.0 p.u.。第二个是系统有功网络损耗最小。无功电流在线路上流动同样会产生有功损耗如果为了抬电压而无节制地输出无功网损必然增加所以这个目标用来限制无功的“过度使用”。第三个是无功裕度均衡。也就是故障工况下各GCC的无功输出占比要尽量均衡避免某个变流器已经接近满载而其他变流器还处于低负荷状态这种不均衡分配会让单个设备过载风险大幅增加。这三个目标之间存在明显的冲突关系。要想把电压偏差压到最低可能需要某些节点输出尽可能多的无功这会推高网损同时让该节点GCC的裕度变小。而追求网损最小就要尽量减少无功的远距离输送但这可能牺牲电压质量。正是因为目标之间存在矛盾才需要多目标优化算法来找出帕累托前沿让决策者根据实际偏好挑选折中方案。1.4 为什么选择Matlab/Simulink而不是单纯写代码这个问题其实涉及整个仿真验证的可行性。如果只做理论推导用纯Matlab脚本加潮流计算就能完成优化求解但这样做出来的结果缺少动态验证无法确认故障瞬间GCC的控制响应是否真的能跟上。反过来如果只搭Simulink模型用试凑法手动调各GCC的无功指令很难找到全局最优解而且低维多目标寻优靠人工几乎不可能完成。所以这个项目采用的是**“Matlab算法层 Simulink模型层”联合仿真**的方案。Matlab负责跑多目标优化算法不断生成一组组GCC无功指令Simulink负责对每组指令做时域仿真把电压、功率、损耗等指标算出来反馈给优化算法。这种分工既保证了优化结果的全局最优性又通过时域仿真验证了方案在动态过程中的可行性链条完整说服力也更强。2. 核心原理与系统建模2.1 分布式能源系统的拓扑结构设计做仿真第一步是确定系统拓扑。我没有直接套用非常大的标准配电网模型因为考虑优化算法需要反复调用仿真模型网络规模越大单次仿真时间越长整体计算开销会成指数级增长。我最终搭的是一个改造后的微网测试系统包含4个分布式能源节点分别配了GCC、3个负荷节点通过一条10kV馈线连接到上级电网。每个分布式能源节点内部结构保持一致直流电压源模拟光伏/储能直流侧经过三相两电平VSC变流器再经过LCL滤波器接入10kV母线。LCL滤波器的作用是滤除PWM开关产生的高频谐波参数设计时要注意谐振频率避开控制带宽和开关频率的干扰区不然容易引发振荡。在测试不同故障场景时我在馈线末端和中段各放置了一个三相故障模块用来模拟不同位置的短路故障。故障点距离电源越近电压跌落越严重对无功支撑能力的要求也越高这样可以测试优化算法在不同严重程度故障下的表现。2.2 GCC控制模型与dq坐标系下的功率解耦GCC控制是整个仿真模型里最核心也最容易出错的部分。它的基本思路是在dq旋转坐标系下对电流进行解耦控制。简单解释一下三相静止坐标系下的交流量无法直接用PI控制器做无静差跟踪需要通过Park变换将abc三相量转换到随电网电压矢量同步旋转的dq坐标系在dq坐标系下基波分量变成直流分量PI控制就能实现无误差控制了。外环功率控制器负责生成电流内环的参考值。有功外环通常控制直流母线电压或直接控制有功功率输出无功外环控制无功功率输出或PCC电压幅值。故障工况下无功外环不再按正常运行时的无功参考值运行而是切换到LVRT模式根据电压跌落深度实时计算所需的无功电流参考值。这个切换逻辑在Simulink里用Switch模块加逻辑判断实现。电流内环是关键中的关键它的控制性能直接决定GCC能否快速准确地跟踪无功指令。内环采用PI控制器前馈解耦项消除dq轴之间的交叉耦合。电流内环的带宽一般整定在开关频率的十分之一到五分之一左右以保证响应速度和稳定裕度的平衡。2.3 无功功率调节的核心机理无功功率的产生本质上是通过控制变流器输出电压的大小和相位使得变流器与电网之间存在相位差从而在它们之间形成无功功率交换。对于PCC电压的支撑来说当系统电压跌落时增加无功电流可以维持PCC电压不出现过低的情况。直观理解无功电流流过线路电抗会产生电压降落而电压降落的大小与无功电流强相关通过控制无功电流方向可以抵消故障带来的电压跌落。在Simulink模型里验证这个机理最简单的办法就是对比同样一个故障场景下一组GCC不输出无功另一组命令输出满额无功观察PCC电压波形后者电压凹陷深度明显更浅。这个对比也直观佐证了无功优化在故障场景下的必要性。不过要注意功率因数过低的极端无功输出会导致变流器电流过大触发热保护或过流保护这是限制无功输出范围的根本原因。2.4 故障工况建模与LVRT要求的映射Simulink里故障模块用Three-Phase Fault即可实现可以设定故障类型三相短路、两相短路、单相接地、故障起始时间、故障持续时间、故障电阻和接地电阻。我通常设定故障在0.5s发生持续0.2s0.7s后故障清除这样有足够的时间窗口观察故障期间的动态过程。关键在于低电压穿越LVRT要求的映射。以常见的并网导则为例当PCC电压跌落深度超过一定阈值比如正序电压低于0.9 p.u.时GCC需要向电网注入无功电流无功电流的大小与电压跌落深度成正比通常要求无功电流增量满足[ I_q K \times (0.9 - V_{pcc}) \times I_n ]其中K取1.5到2之间( I_n )是额定电流( V_{pcc} )是PCC正序电压标幺值。这意味着故障越严重需要输出的无功电流越大。在Simulink模型中我把这个关系写进了LVRT控制模块成为优化算法执行层面的底层约束。3. 多目标优化问题建模与算法选型3.1 三个目标函数的数学表达与归一化处理优化问题的数学表达是项目的“硬核”需要把工程问题转化为算法可处理的数值问题。第一个目标函数电压偏差[ f_1 \sum_{i1}^{N} \frac{(V_i - V_{ref})^2}{N} ]其中( V_i )是节点i的电压幅值( V_{ref} )取1.0 p.u.N是节点总数。用平方形式是为了放大偏差的惩罚让优化算法更关注严重越限的节点。第二个目标函数有功网损[ f_2 \sum_{j1}^{L} I_j^2 R_j ]其中( I_j )是第j条支路的电流有效值( R_j )是支路电阻。第三个目标函数无功裕度均衡指标[ f_3 \sqrt{\frac{1}{M} \sum_{k1}^{M} \left( \frac{Q_{gcc,k}}{Q_{max,k}} - \overline{ratio} \right)^2} ]其中( Q_{gcc,k} )是第k个GCC的实际无功输出( Q_{max,k} )是该GCC的无功容量上限( \overline{ratio} )是所有GCC的容量占比平均值M是GCC数量。这个公式说白了就是计算各GCC负载率的离散程度越均衡f3越小。三个目标函数量纲和数值范围差异很大后期做结果对比时我做了归一化处理否则电压偏差在0.001量级网损可能在几十上百千瓦量级直接放在一个坐标系里画帕累托前沿会严重失衡。3.2 约束条件中需要考虑哪些实际限制优化问题除了目标函数约束条件同样决定了解空间的形状。我在建模时主要考虑了以下几类约束。潮流等式约束是基础各节点必须满足有功和无功功率平衡方程。这部分我不需要在Matlab优化脚本里手写潮流方程因为Simulink仿真模型本身就已经在“隐式”地满足潮流约束了仿真结果就是给定指令下系统的真实运行状态。不等式约束方面首先是节点电压上下限约束正常运行范围通常取0.95~1.05 p.u.故障期间可以适度放宽到0.90~1.10 p.u.但越限的个体依然会作为不可行解被淘汰。其次是GCC容量约束无功输出必须满足[ Q_{gcc} \leq \sqrt{S_{gcc}^2 - P_{gcc}^2} ]也就是说GCC的视在功率有限有功输出占用了容量之后剩余容量才是无功输出天花板。这个约束在做优化时非常关键因为如果忽略它优化算法很可能给出“实际完全无法执行”的无功指令。3.3 为什么选NSGA-II并如何设置核心参数多目标优化算法我最终选用了NSGA-II带精英策略的非支配排序遗传算法这个选择主要基于三点考量算法本身比较成熟稳定在电力系统优化领域有大量公开研究和案例可以参考它不需要像加权法那样预设权重能一次性求出整条帕累托前沿相比MOPSO多目标粒子群等算法NSGA-II在处理混合约束时的鲁棒性更好调试成本低一些。参数设置方面我给出自己调参稳定后的一组数值参数数值说明种群规模100过小容易早熟过大增加计算量最大迭代代数200配网规模下通常150~200代可收敛交叉概率0.9较高的交叉率有利于充分搜索变异概率0.1避免陷入局部最优交叉分布指数15模拟二进制交叉的分布参数变异分布指数20多项式变异的分布参数这里有个经验值得说一下刚开始我直接用默认参数跑结果帕累托前沿分布很不均匀大量解集中在中间区域两端延展性差。后来我把交叉分布指数调小到10左右前沿的端点扩展明显改善但对种群多样性的维持又产生了压力。最终用15作为折中值稳定运行。分布式指数这个参数对前沿形态的影响非常大建议实际项目中画几个不同参数的对比图后再确定。3.4 决策变量的编码方式与故障场景的绑定决策变量选择的是各GCC节点在故障期间的无功输出指令采用实数编码每个决策变量对应一个GCC的无功功率参考值范围根据GCC容量约束动态计算。在我的测试系统里4个GCC节点所以决策变量是4维实数向量。这里强调一个容易被忽略的点决策变量必须与具体的故障场景绑定。不同故障位置、不同故障类型同样一组无功指令产生的结果是完全不同的。所以整个优化过程要固定一个故障场景来做比如“馈线末端三相短路0.2秒”在这个场景下搜索最优无功策略。如果故障场景变化最优解也会变化需要重新运行优化。4. 实操过程Matlab/Simulink联合仿真实现4.1 Simulink模型搭建的完整步骤从零搭建这个模型的过程比较长我按步骤梳理一下方便大家直接对照操作。第一步搭建主电路。打开Simulink新建模型从Simscape Electrical Specialized Power Systems库中拖入三相电源、线路阻抗RLC串联支路、负荷三相并联RL负荷、VSC桥臂Universal Bridge、LCL滤波器和故障模块Three-Phase Fault。用Connectors连接好各元件注意各元件的三相端口顺序要一致否则会出现相位错误导致仿真结果完全不对。第二步搭建GCC控制系统。这部分是整个模型的核心包括PLL锁相环、坐标变换模块、功率计算、外环控制、内环控制和PWM生成。PLL用库里的PLL模块或者自己搭一个SRF-PLL输出电网电压相角用于Park变换。坐标变换可以直接用库里的abc_to_dq0 Transformation模块或者自己用函数编写后者便于定制。第三步搭建LVRT逻辑。用电压测量模块实时采集PCC正序电压经过幅值计算与阈值比较生成故障标志信号。故障标志为真时无功外环切入LVRT模式按跌落深度计算无功电流参考值。这个逻辑可以用Stateflow实现也可以用基本的逻辑模块搭建议先用简单的Switch方式实现跑通后再考虑做复杂化。第四步是测量与数据输出。在各节点放置电压测量、功率测量模块用To Workspace模块将数据导出到Matlab工作区方便后续计算目标函数。4.2 电流内环PI参数的计算方法GCC控制性能很大程度取决于电流内环PI参数。我计算时按以下方法取初值再用仿真微调。假设逆变器侧滤波电感L5mH等效电阻R0.1Ω开关频率( f_{sw} )10kHz电流环期望带宽( f_{bw} )1kHz。在dq同步旋转坐标系下电流环被控对象近似为一阶惯性加积分环节用零极点对消法整定PI参数[ K_p L \times 2\pi f_{bw} \approx 0.005 \times 6280 \approx 31.4 ][ K_i \frac{K_p \times R}{L} \frac{31.4 \times 0.1}{0.005} 628 ]注意这里的( K_i )是积分增益仿真时Integrator模块自带独立的增益需要把Kp和Ki分开设置。另外内环电流反馈滤波也不能忽视实际中会用滤波器滤除采样噪声滤波器时间常数会影响等效带宽整定时要留出余量。4.3 优化算法与仿真模型联合调用的接口设计联合仿真的核心是如何在Matlab脚本和Simulink模型之间高效地传递数据。我的做法是这样的第一步在Simulink模型中使用set_param指令将GCC无功参考值对应的信号源模块比如Constant模块的Value参数修改为新一组优化算法生成的数值。例如set_param(DER_Model/GCC1_Qref, Value, num2str(Q_gcc(1)));第二步用sim函数运行仿真设定StopTime为故障时序总时长例如1.2秒。simOut sim(DER_Model, StopTime, 1.2, ReturnWorkspaceOutputs, on);第三步从仿真输出中提取各节点电压波形、支路电流和GCC无功输出计算三个目标函数值返回给优化算法。V_rms simOut.V_rms_Node.signals.values; P_loss sum(simOut.P_branch.signals.values, 2); F(1) mean((V_rms(end,:) - 1.0).^2); F(2) P_loss(end); F(3) std(Q_gcc_ratio(end,:));这个接口设计有几个细节需要注意。每次仿真前必须先更新模型参数再运行参数的写入和读取存在内存共享顺序不能颠倒。另外仿真的StopTime设置要合理保证波形已经进入稳态如果时间太短性能指标计算不准确优化算法会基于错误的反馈值迭代。4.4 帕累托前沿的提取与最优折中解选择多目标优化跑完后NSGA-II会输出一组非支配解集。我用三维散点图展示前沿面三个坐标轴分别是电压偏差、有功网损和无功均衡度。这时面临一个决策问题帕累托前沿上有很多解最终工程上选取哪一个我在项目中采用模糊隶属度法做决策对每个目标计算所有解在该目标上的归一化满意度。设第i个解的第j个目标的满意度为[ \mu_{ij} \frac{f_j^{max} - f_{ij}}{f_j^{max} - f_j^{min}} ]该解的总体满意度取所有目标满意度的均值选择满意度最大的解作为折中最优解。工程上如果不希望过度平均化也可以由调度人员根据现场对电压质量或网损的偏好来手动选择模糊隶属度法只是提供了一个相对客观的参考。4.5 故障工况下优化前后效果对比为了验证优化效果我在Simulink里对同一故障场景做了三组测试不参与无功调节GCC无功为0、按固定比例发无功比如每台均按50%容量输出、按NSGA-II优化后的指令输出。对比PCC电压跌落深度策略PCC最低电压(p.u.)总有功网损(kW)容量负载率标准差无无功调节0.7892.50固定比例输出0.86106.30.27NSGA-II优化0.8997.80.12从上表可以明显看到固定比例虽然抬高了电压但网损增大、个别GCC接近满载NSGA-II优化方案在电压支撑和网损控制之间找到了更优的平衡点同时无功裕度分布也更均衡。这个对比结果在写论文或者做报告时会非常直观有说服力。5. 常见问题与排查技巧实录5.1 Simulink仿真速度过慢的排查思路做联合优化最头疼的就是仿真速度。200代迭代每代100个个体每个个体跑一次1.2秒的时域仿真如果一次仿真需要30秒那总时间就是100小时完全不可接受。我的处理方法是两阶段“粗筛-精验”策略。第一阶段用Matlab编写简化的潮流计算模型不需要Simulink在给定GCC无功指令下快速计算系统稳态电压分布和网损得到目标函数值。这个阶段的代价是每个个体只需要几毫秒整个优化过程可以在一两小时内完成。第二阶段把第一阶段得到的帕累托前沿解集取代表性个体比如20个逐个拿到Simulink里面做时域仿真验证确认动态响应和暂态指标是否符合预期。这个策略本质上利用了稳态性能指标与时域性能指标之间的强相关性。当然它的前提是优化目标主要是稳态意义上的电压偏差和网损如果项目要求优化暂态响应指标比如波动幅度、恢复时间那就绕不开时域仿真了只能在简化模型和缩短故障时长上想办法。5.2 NSGA-II不收敛或前沿分布不理想优化算法跑出来的结果不理想有很多种表现我遇到最多的情况是两种。第一种是整个种群在200代之前就全部收敛到同一个区域失去了多样性帕累托前沿退化成一个小点团。核心原因是选择压力过大或变异步长太小手段是提高变异分布指数或变异概率让子代有机会跳出局部最优。另外可以引入锦标赛选择的对手数量调整比如从2个提高到4个能增加选择压力避免过度平均。第二种是前沿形态很稀疏分布不连续。这种问题通常是因为决策变量范围设置不合理或者目标函数之间存在强耦合。我后来在代码里加了“极端解保留”操作在每次迭代时强制保留在单一目标上表现最好的解这样前沿的两个端点永远存在整体形态就完整多了。5.3 故障瞬间仿真发散或数值不稳这是Simulink时域仿真中特别容易遇到的问题。故障发生时电网拓扑突变电流可能瞬间冲击到额定值的数倍甚至十几倍如果仿真步长不够小数值积分容易发散。排查思路首先看求解器设置。我使用的是变步长ode23tb求解器最大步长设置为50微秒最小步长设置自适应。这样既保证了故障突变时刻的数值稳定性又不会拖慢整体速度。如果还发散检查故障模块的接地电阻不要把金属性短路的接地电阻设置为0可以设置一个非常小的值比如0.001Ω避免数值奇异。另一个问题是故障清除瞬间GCC控制从LVRT模式切换回正常运行模式如果切换逻辑没有做平滑处理容易产生控制量跳变导致恢复阶段的振荡。我的做法是在切换点设置速率限幅器将无功参考值的变化速率限制在每秒不超过0.5 p.u.这样恢复过程平缓很多。5.4 容易被忽视的细节与个人体会最后分享几个我在项目收尾阶段才意识到的重要细节。一是GCC故障期间的有功功率处理策略。大部分低压穿越控制都要求故障期间有功功率受限甚至降为零把全部容量让给无功电流但这样做会让分布式电源在故障期间无法向电网输送有功导致系统频率调节能力暂时丧失。更细腻的做法是在保证无功优先的前提下根据电流裕量自动回补有功输出。我在模型中加入了电流分配逻辑动态分配有功和无功电流的占比效果更好。二是对LCL滤波器谐振峰的处理。如果滤波器谐振频率落在控制带宽内电流环会出现高频振荡。通常要加入阻尼电阻或有源阻尼控制。我最初搭建模型时忽略了这个问题导致电流波形在高频段出现明显的毛刺后来加入电容电流反馈的有源阻尼才消除。三是锁相环PLL在故障时的表现。电网电压严重畸变时PLL可能失锁或输出错误的相角导致坐标变换错误整个控制系统崩溃。所以在故障工况仿真前务必测试PLL在电压凹陷情况下的动态响应必要时使用基于双二阶广义积分器的DSOGI-PLL架构它对不平衡故障和电压畸变的适应能力更强。我个人在这个项目中最深的体会是多目标优化本身并不难难的是让优化结果能真正经得起时域仿真的验证。很多写论文的人把优化算法和仿真模型分开做算法在一个简化甚至理想化的环境里表现很好一拿到实际模型里就崩溃或者效果大打折扣。这个项目从一开始就把Simulink时域仿真嵌入了优化闭环虽然计算开销大一些但每一步优化结果都是“仿真验证过”的整个系统的可信度直接上了一个台阶。后面如果继续扩展可以考虑把故障类型从三相短路扩展到单相接地、两相短路等不对称故障这时候还需要引入正负序分离控制GCC的控制策略会更复杂优化问题也会从稳态决策扩展到切换决策工作量会翻好几倍。但对于真正想做深入研究的人来说这个方向值得投入。
返回列表