ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

含可再生能源电网风险评估的Matlab实现:从随机建模到指标分析

含可再生能源电网风险评估的Matlab实现:从随机建模到指标分析 做电网风险评估这几年我最大的一个感受是真正到了含可再生能源这个前提条件下评估方法和传统电网相比已经不是小修小补而是整个思考方式都要换。前阵子我帮一个地区电网做大规模风电和光伏接入后的风险评估用Matlab搭了一套评估程序从随机性建模、风险评估方法选型、程序框架设计到算例结果分析完整走了一遍。这篇文章就把这套含可再生能源的电网风险评估方法程序和Matlab代码的完整思路、关键环节、参数设置和踩坑记录整理出来给正在做同类项目或者准备入手电力系统不确定性分析的读者一个可以直接参考的路径。1. 含可再生能源的电网到底坏在哪里1.1 确定性安全校核为什么不够用了传统电网做安全分析默认的前提是负荷曲线可以预测发电机出力可控可调。在这个前提下调度员只需要问一个问题如果某条线路、某台机组突然退出运行系统还能不能安全运行这就是N-1安全准则。N-1准则的逻辑是挑一个最坏的断线场景验证系统在静态和动态约束下都不过载、不失稳。这个挑最坏场景的思路在电源全部可控的时候是成立的。但接入高比例风电和光伏之后发电侧的出力变成了随机变量。风电受风速影响光伏受光照影响今天可能满发明天可能接近零出力。这时候你在做规划评估时面临的不是一个最坏场景而是由风、光、负荷联合概率分布生成的几乎无限多个场景。这种情况下确定性安全校核只有两条路可以走把边界条件定得极其保守取风光同时低出力负荷高峰这类极端场景这样一来算出来的电网极度冗余投资效率非常低换一种思维用概率来描述风险不追求所有场景都安全而是回答某个风险事件发生的概率有多大、后果有多严重。实际项目中当我看到风电装机占系统总装机的比例超过20%之后仍然有人只拿单场景校核结果做决策那种失真程度基本等于在谜底里猜谜面。1.2 风险评估的核心逻辑概率乘以后果工程风险评估的基本公式非常朴素风险 事件发生的概率 × 事件造成的后果放到电网评估场景里事件就是有功不足线路过载电压越限这类失稳或失负荷的工况后果可以是失负荷量、经济损失、越限时间等。把所有可能的不确定性输入风速、光照、负荷波动、设备故障代入模型统计各类风险事件的概率分布和期望值再换算成指标这就是含可再生能源的电网风险评估要做的事。我在搭建这套Matlab程序的时候给自己的定了一个原则先搞清楚风险长在哪里再决定写什么样的代码。程序里宁可多花时间做场景建模也不要一上来就堆潮流计算函数。因为这个领域模型对结果的决定性往往超过算法本身的优劣。2. 随机性建模是地基风电、光伏和负荷的不确定性怎么描述2.1 风速与风电出力模型风电出力的随机性源头是风速。工程上描述风速分布最常用的模型是双参数Weibull分布概率密度函数为f(v) (k/c) * (v/c)^(k-1) * exp(-(v/c)^k)其中v是风速k是形状参数一般在1.5到3之间c是尺度参数与平均风速相关。比如某风电场年平均风速7m/s取k2、c≈8用Matlab的wblrnd函数就能生成一组风速随机数这比用正态分布硬拟合风速科学得多因为正态分布会让风速出现负值这在物理上没有意义。风速到风机出力不是简单的线性关系。风机有个典型的分段出力特性低于切入风速通常3-4m/s出力为0在切入风速到额定风速之间出力随风速增大可以简化为线性或三次方关系达到额定风速后出力恒定等于额定功率高于切出风速通常25m/s风机为了保护叶片切出停机出力回落到0。这里有个工程上常见但容易犯的低级错误直接把平均风速代入功率曲线计算平均出力这会在低风速段严重高估发电量又在额定风速附近低估导致风险评估结果偏差很大。正确做法是先生成风速的随机序列或随机采样值再逐点通过功率曲线映射到出力。如果项目手里有多年历史实测数据我的建议是用经验分布或核密度估计这比任何参数分布都贴近现场。参数分布的优势是平滑、可以外推但历史数据直接驱动场景生成往往更经得起审计。2.2 光伏出力模型光伏的随机性源头主要是光照辐照度。在一个短时段内比如1小时太阳辐照度可以近似用Beta分布描述概率密度函数为f(x) (x^(a-1) * (1-x)^(b-1)) / B(a,b)其中x是归一化后的辐照度0到1之间a和b是形状参数B(a,b)是Beta函数。这个分布定义在[0,1]区间上天然适合描述辐照度占比。在不同云况下Beta分布的形状参数差异很大晴天时分布集中在高辐照区域阴天时集中在低辐照区域。光伏板出力还受温度影响工程简化模型通常用辐照度到出力的线性转换再叠加温度修正系数。我在程序里用的是P_pv P_stc * (G/G_stc) * [1 - beta_T * (T_cell - T_stc)]其中P_stc是标准测试条件下的额定功率G是当前辐照度G_stc是标准辐照度1000W/m²beta_T是温度系数T_cell是组件温度T_stc是标准温度25℃。2.3 负荷不确定性模型负荷侧的预测误差通常用正态分布描述均值为预测值标准差取预测值的1%-3%。这个分布简单好用但要注意它假设了正负偏差的对称性而实际电力系统的负荷高峰时段往往更容易出现正偏差。如果项目精度要求高还可以换用t分布来刻画更重的尾部。比单点分布建模更重要的是负荷与风光之间天然的时段相关性。冬天傍晚负荷达到高峰的时刻光伏出力恰好趋近于零晚上风速较高的时段负荷需求又处于低谷。这些时段性耦合特征比单纯用独立分布采样重要得多。工程上常用的折中办法是分时段建模把一天分成24个代表性时段每个时段单独建立风、光、负荷的概率模型场景生成时按时段切换这样时段间的相关结构自然就带上了。2.4 多点风速与光照的空间相关性如果你只描述单点分布忽略地理位置相近的风电场之间的空间相关性风险很可能会被低估。一个经典陷阱假设两个风电场各自独立那么两个风场同时停风的概率就极低但现实中相距几十公里的风场往往处于同一个天气系统里大概率会同时停风。这个相关结构在极端场景中有着决定性影响。一个简单可用的工程实现方法是用线性相关系数矩阵配合Cholesky分解生成一组独立的标准正态分布随机变量乘以相关系数矩阵的Cholesky分解结果得到带指定相关性的正态变量再通过等概率变换把正态累积分布函数值映射到目标分布的分位数上转成目标分布的风速或光照样本。这个方法不算最精确但写起来快工程上完全够用程序运行开销也可以忽略不计。我在这套Matlab代码里就是用这个方式把同一风区的多个风电场出力做了相关性耦合。3. 风险评估方法选型别一上来就写蒙特卡洛3.1 三类主流方法的对比很多人在拿到含可再生能源的电网风险评估这个任务时第一反应是写蒙特卡洛。蒙特卡洛确实好用但不是所有场景都需要它。把三类主流方法摆在一起看心里就有数了。解析法半不变量级数展开核心思路是把输入变量的矩信息通过潮流方程传播到输出变量用Gram-Charlier或Edgeworth级数近似出输出变量的概率分布。优点是计算量小速度快适合做在线评估和大范围初步筛选。缺点是遇到强非线性环节比如线路保护动作逻辑、离散的设备状态切换时近似误差会变大对尾部分布的刻画也不够到位。普通蒙特卡洛原理就是随机抽样潮流计算统计指标没有任何花哨。优点是完全不受模型复杂度限制非线性环节、离散状态、控制策略都可以直接塞进去。缺点是收敛慢它的收敛速度理论上正比于样本量的平方根倒数也就是说精度想提高一个数量级计算量要增加两个数量级。一次潮流计算0.1秒的话一万次仿真就要一千秒以上对大规模系统是个不小的压力。改进蒙特卡洛拉丁超立方采样LHS这是我在工程里最推荐的做法。LHS先把每个变量的概率区间均分成N段每段内取一个代表值然后打乱各变量代表值的排列组合后再抽样。这样N个样本对输入空间的边际分布覆盖性远好于纯随机抽样在相同样本量下方差缩减效果非常明显。方法对比可以用下面这张表说明方法计算速度精度表现实现难度适用场景解析法极快线性环节较准尾部偏差中在线评估、初筛普通蒙特卡洛慢样本足够时最准确低小型系统、教学演示LHS改进快同样本量下方差明显缩小中工程报告、规划对比3.2 选型建议和样本量怎么定如果只是做教学演示或者系统规模小几十个节点直接上普通蒙特卡洛完全没问题思路清晰、代码好写。如果是工程报告、规划方案对比我建议直接用LHS特别是需要反复跑多个场景做对比的时候能省下大量计算时间。如果系统规模在几百个节点以上可以考虑解析法做初筛筛出高风险区域后再用LHS对高风险场景做精细化评估形成两层结构。样本量的确定也是个实践问题。不是说越多越好工程上几千到几万之间基本够用。一个务实的做法是先跑500组预试验统计失负荷概率LOLP的方差系数再根据目标精度推算总样本数。方差系数小于0.05基本可以认为指标收敛了再往上加样本边际收益很低计算时间倒是一直涨。4. Matlab程序整体框架与核心代码模块拆解4.1 程序架构和模块划分整套Matlab程序我按功能拆成了几个独立模块每个模块单独一个函数文件方便调试和复用系统数据定义模块线路参数、节点负荷、发电机容量、风电场和光伏电站接入位置与装机容量随机性模型定义模块风速Weibull参数、光照Beta参数、负荷预测误差分布参数、空间相关性矩阵场景生成模块按时间段生成风光荷联合出力场景潮流计算模块调用牛顿-拉夫逊法或PQ分解法求解稳态潮流约束判断模块检查线路潮流越限、节点电压越限、系统功率平衡指标统计模块累计失负荷事件、电量不足值计算LOLP、EENS等指标结果可视化模块概率密度分布图、累计分布图、越限频率统计表。这样的模块化设计有个很直接的收益后期想把风险评估扩展成时序运行模拟只需要把场景生成模块从静态采样改成时间序列生成其他模块基本不用动。4.2 蒙特卡洛主循环的核心代码骨架风险评估主程序的核心逻辑其实就是一个大循环。我用Matlab写了一个简化但完整表达思路的骨架%% 含可再生能源的电网风险评估 - 蒙特卡洛主循环骨架 % 初始化指标 nScenarios 5000; % 场景数 lolpCount 0; % 失负荷次数累计 eensSum 0.0; % 电量不足累计MWh totalLoad sum(busLoad(:)); % 系统总负荷 for k 1:nScenarios % 1. 生成风、光、负荷场景 [Pwind, Ppv, Pload] generateScenario(weatherParam, loadParam, k); % 2. 计算净负荷负荷 - 新能源出力 netLoad totalLoad - Pwind - Ppv; % 3. 判断是否有功不足 availableGen sum(genCapacity); % 可用常规机组容量 if netLoad availableGen % 失负荷事件 lolpCount lolpCount 1; eensSum eensSum (netLoad - availableGen) * timeStep; end % 4. 如果有必要调用潮流计算检查线路过载和电压越限 % [overload, voltageViolation] runPowerFlow(busData, branchData, Pwind, Ppv, Pload); end % 输出风险指标 LOLP lolpCount / nScenarios; EENS eensSum / nScenarios; fprintf(LOLP %.4f\n, LOLP); fprintf(EENS %.2f MWh\n, EENS);核心逻辑就几步生成场景计算净负荷判断有功缺额统计指标。实际工程里还要在第四步补充潮流计算和约束校验这决定了风险评估能覆盖的范围。如果你只关心有功平衡可以简化但如果你要评估电压越限风险就必须跑完整的潮流。4.3 拉丁超立方采样LHS的实现如果安装了Statistics and Machine Learning Toolbox可以直接用lhsdesign函数生成区间[0,1]上的拉丁超立方设计再通过逆分布函数映射到目标分布。如果是裸Matlab环境手写也很简单function samples lhs_sample(distFunc, N, dim) % distFunc: 逆累积分布函数句柄比如 (u) wblinv(u, k, c) % N: 样本数量 % dim: 变量维度 u zeros(N, dim); for j 1:dim % 把区间[0,1]等分成N段 seg (0:N-1 rand(1,N)) / N; % 每段内随机位置 u(:, j) seg(randperm(N)); % 打乱顺序 end samples distFunc(u); % 等概率变换到目标分布 end这段代码的思想是每个变量在它的概率空间里被均匀切成了N个区间每段取一个代表点再打乱顺序保证变量之间的组合不是机械的一一对应。这样生成的样本能覆盖整个输入空间的各个区域尤其是尾部分布区域这对风险评估这类在意小概率高后果事件的应用非常关键。5. 参数怎么设、结果怎么看算例与指标解读5.1 算例配置评估程序搭建完成后我用IEEE 30节点系统做了一组对比算例。这个系统本身规模不大节点和支路数据在Matpower里可以直接调取适合用来验证程序逻辑。改造方式是选几个节点接入风电场和光伏电站按风电装机占比15%、20%、30%三档设置观察风险指标的变化趋势。每一档的典型参数如下参数项数值风速Weibull形状参数k2.0风速Weibull尺度参数c8.5光伏Beta分布a5.0光伏Beta分布b4.0负荷预测误差标准差2%风电场空间相关系数0.6场景数5000时段数24这些参数不是从哪个标准里抄的是根据实际风资源特性和负荷特性的典型范围设置的。做项目时如果有实测数据应该用实测数据重新标定。5.2 风险指标的定义和计算风险评估最终要落在指标上最常用的是这几个LOLPLoss of Load Probability失负荷概率系统发电可用容量小于负荷需求的概率。计算公式为失负荷事件发生次数除以总仿真场景数。EENSExpected Energy Not Served电量不足期望系统在评估周期内因发电不足导致的期望缺供电量单位是MWh。这个指标的优势是把概率和经济量挂钩。线路潮流越限概率某条线路输送功率超过额定容量的概率反映网络传输能力的充裕度。电压越限概率节点电压低于0.95pu或高于1.05pu的概率反映局部电压支撑能力。在Matlab程序里这些指标的统计逻辑完全一样跑完蒙特卡洛循环后用累计值除以场景数即可。5.3 结果怎么解读有三档渗透率算例的结果数据摆在一起能看到一个非常有代表性的规律当风电渗透率从15%升到30%LOLP并不是线性上升而是急速恶化。原因在于渗透率越高相当于系统里可用但不一定可靠的电源占比越大。15%的时候常规机组的备用容量还能兜底30%的时候净负荷的方差大幅增加极端低风时段常规机组即使满发也未必覆盖得了峰值负荷。看结果的时候还有几个容易被忽略的点单看LOLP会掩盖很多信息。LOLP0.01到底行不行要结合EENS看全年缺供电量的期望值再换算成经济损失决策者才能真正理解风险量级。要关注最严重场景的组合工况。峰值负荷日傍晚连续阴天无风时段这类多因素叠加场景概率不高但后果可能极其严重这种尾部分布特征恰恰是风险评估要捕捉的。注意LHS得到的指标比普通蒙特卡洛在相同样本量下更平滑如果结果曲线毛刺很多先检查采样方式而不是盲目增加样本量。6. 跑通之后的事六个最常踩的坑和解决办法6.1 随机数种子结果能不能复现是信任的基石用蒙特卡洛做评估最大的隐性问题是随机性。同一套程序跑两次结果不同领导或者审稿人让你重新算一遍结果对不上信任感瞬间崩塌。这个问题的根源是没有固定随机数种子。Matlab以前用rand(seed)这种老式接口现在统一用rng函数。在程序开头写一行rng(20250601); % 固定随机数种子保证结果可复现这行代码必须在生成随机场景之前调用。我每次跑新实验时都会改一下种子值但把旧的种子值和结果一起记录保存这样任何一次实验都可以完整复现。6.2 风速到出力的非线性映射陷阱这个坑特别隐蔽。有些简化版本直接把平均风速按线性的关系换算成风机出力看起来没什么问题实际上在低风速段会严重高估发电量在额定风速附近又严重低估。风险评估恰恰对小概率场景敏感风力顶到上限或者掉到零这两种极端情况更容易直接影响结果。我的处理办法是维护一个查询表把风机功率曲线离散成一万个点风速采样后直接在表里插值。这样既保留了精度又不会因为写复杂的分段函数而出错。6.3 潮流计算的初始值问题含大量分布式可再生能源的系统潮流方向和传统系统相比会发生显著变化。传统系统一般是电源向负荷单向输送潮流接入分布式电源之后部分线路可能出现反向潮流局部电压分布也完全不一样。这种情况下牛顿-拉夫逊法如果还用默认电压初值1.0pu可能会不收敛。处理办法是给潮流计算赋一个更贴近实际运行点的初值从没有新能源的基态潮流解开始逐步增加风电和光伏出力用上一个解作为当前场景的初值。这种延续法的思路虽然多了一些计算量但收敛性会好很多。6.4 把新能源当成负负荷还是独立发电机节点这是个影响结果精度的重要建模选择。风电场和光伏电站在潮流计算里可以处理成负负荷按恒功率因数注入即PQ节点也可以处理成带调压能力的发电机节点PV节点能维持机端电压。两者在稳态潮流中的作用完全不同。工程上大型风电场通常具备无功调节能力适合建模为PV节点分布式光伏很多按恒功率因数运行适合建模为PQ节点负负荷。我见过不少人把光伏全部建模成负负荷结果电压越限概率被严重高估因为忽略了逆变器实际具备的无功支撑能力。建议在程序里把新能源场站的节点类型作为一个可配置参数方便对比不同运行策略下的风险差异。6.5 忽略爬坡约束会让结果过度乐观静态风险评估只看每个场景的平衡情况但实际系统从场景A过渡到场景B要求机组有足够的爬坡速率跟上净负荷变化。风电骤减或光伏云层遮挡时净负荷可能在十几分钟内快速爬升如果只看稳态而忽略爬坡约束评估结果会偏乐观。想要更贴近工程建议把单时段的静态评估扩展成时序评估生成一整天的风、光、负荷时间序列逐时段跑潮流同时检查相邻时段间机组出力的调整量是否在爬坡限制范围内。我在程序框架里预留了这个扩展接口场景生成模块返回的是一整天的时间序列而不只是单点采样。6.6 性能优化向量化是Matlab代码提速的关键风险评估程序跑大算例时性能可能会让人崩溃。五千个场景每个场景跑一次牛顿-拉夫逊潮流计算如果内部有大量for循环在Matlab里可能耗时数小时。我的优化思路分两步第一步把场景生成部分的循环尽量向量化用矩阵批量生成风速、光照和负荷采样值替代逐点循环这个改动往往能带来数量级的加速第二步如果单次潮流计算内部存在大量重复矩阵运算考虑用matlabFunction把数值求解过程编译成可部署函数或者用parfor把场景循环改为并行计算。我实测过一个大概300个节点的系统场景生成向量化之后总运行时间从2小时降到15分钟效果非常明显。整套程序从头到尾走下来我最大的体会是Matlab代码只是载体真正决定评估质量的是随机性建模的合理性和风险指标设定的工程意义。可再生能源比例越高的电网风险评估越需要回答的不只是够不够用还有面对波动的时候系统到底有多大的韧性。把场景生成模块做好把结果指标定义清楚程序本身反而成了最不费脑子的那部分。后续如果要做扩展我建议从场景生成模块入手把它换成更精细的时序运行模拟这会比在潮流算法上抠性能带来大得多的工程价值。
返回列表