ARTICLE DETAIL

资讯详情

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

蒙特卡洛概率潮流实战:IEEE 33节点配电网含分布式电源评估

蒙特卡洛概率潮流实战:IEEE 33节点配电网含分布式电源评估 我们做配电网项目的朋友都知道传统的潮流计算都是“给定一个确定的值算出一个确定的结果”。但实际运行中负荷是波动的分布式电源DG的出力更是受天气影响忽高忽低用一组固定数据算出来的结果根本没法回答“这条线路一年中有多少天会过载”“哪几个节点电压越限概率最高”这类问题。这次我就用IEEE 33节点配电网做了个蒙特卡洛概率潮流实战把分布式电源出力、负荷波动同时丢进仿真里跑了几万次最后拿到了节点电压和支路功率的概率分布。这篇内容就是把整个项目从建模、算法到代码细节完整拆开适合正在做配电网规划、分布式电源接入评估的同行参考。1. 项目背景与整体思路1.1 为什么确定性潮流不够用了配电网的传统设计通常按最大负荷、最小负荷这种极限工况算潮流然后校核电压和载流量。过去配电网是单电源、辐射状网络负荷变化规律相对单一这种“拍脑袋取极端值”的办法还算够用。可一旦接入分布式光伏、风电之后情况就变了——电源从“一个变成一堆”节点注入功率从“固定的正数”变成“随机数”甚至是负数。比如中午光伏大发而负荷低谷时局部节点电压可能被抬高到上限以上而阴雨天光伏出力骤降又可能造成线路重载。这些现象都取决于DG出力和负荷的联合概率单一工况根本覆盖不了。我做这个小项目就是想用蒙特卡洛方法把这种随机性量化出来让规划人员能看到的不再是“某个断面电压是0.98pu”而是“末端节点电压低于0.95pu的概率是7.3%”。这个概率值才是决策的依据。1.2 蒙特卡洛方法为什么适合处理随机性蒙特卡洛的核心思路其实很朴素不确定性的输入变量都服从各自的概率分布那就按这些分布大量抽样每组抽样做一次确定性潮流计算最后把成千上万次的结果汇总成统计量。相当于我们用“暴力枚举”的方式逼近真实世界的随机过程。它的好处主要有三点。第一原理简单每次仿真只需置换输入样本内部仍然调用成熟的潮流算法程序结构非常清晰。第二对模型几乎没什么限制负荷相关性、DG的时序相关性、非线性负荷特性都能直接塞进去。第三收敛性与样本量相关理论上样本数足够大时统计结果会趋近真实概率分布误差可控。缺点是计算量大——但33节点这个规模一次前推回代也就几毫秒一万次仿真几分钟就跑完了完全在可接受范围内。1.3 整体仿真流程设计这次项目的完整链路是这样的建立含DG的33节点配电网模型确定基准参数基准电压12.66kV基准功率10MVA。为节点负荷、分布式电源出力分别选择概率分布模型。用拉丁超立方抽样LHS替代纯随机抽样保证相同样本量下抽样空间覆盖更均匀。对每一组样本执行一次确定性的前推回代潮流计算。记录所有节点的电压幅值和所有支路的功率。循环N次后统计各节点电压的均值、标准差、越限概率以及支路功率超过载流量限值的概率。改变DG接入位置和容量重复上述过程对比不同方案的概率指标。其实整个流程没有特别复杂的数学难点在于每一步怎么做才合理以及怎么解释结果。下面我按模块展开讲。2. 33节点配电网建模与不确定性建模2.1 33节点系统基本数据与拓扑IEEE 33节点系统是配电网研究中用得最多的算例之一它是一个12.66kV的辐射状馈线总共33个节点、32条支路首端节点1通过变电站母线供电额定视在功率基准建议取10MVA。原始数据里每条支路有电阻和电抗每个节点除首端外都有有功和无功负荷。这些数据网上很容易找到但有一点要注意原始数据里负荷单位是kW和kvar换算成标幺值时需要除以基准功率10MVA。我用的是标幺制好处是后面的电压和功率计算都缩放到0~1附近结果直观、代码也稳定。大部分文献里默认所有节点的负荷同时系数为1也就是每个节点都带各自的峰值负荷。实际计算时需要给每个节点负荷定义一个基值然后在基值上叠加随机波动。我这里把总负荷约3715kWj2300kvar作为基础工况这也是很多公开数据里给出的总负荷水平。2.2 负荷随机模型怎么选负荷随机性最常用的近似模型是正态分布。对于配电网里的某个节点给定期望值μ和标准差σ通常取σ/μ在0.05~0.1之间表示负荷在一定范围内波动。比如节点18的额定有功负荷为90kW取标准差5%就是4.5kW抽样时就从N(90, 4.5²)里取一个值。无功负荷可以做类似处理或者更简单一点保持功率因数不变让无功和有功按比例同时变化。不过实际负荷并不是纯正态的白天和夜间差异明显。如果是做长期概率潮流最好按不同时段分别建模或者用历史负荷数据拟合分布。但作为方法验证正态分布已经能说明问题。我这次就按正态分布处理并且保证抽样值不能低于0否则会出现负负荷这种不合理数据。2.3 分布式电源出力模型光伏和风电的出力模型差别很大。光伏出力与光照强度强相关光照强度在短时间尺度上可以用Beta分布拟合然后通过功率转换模型得到光伏出力。但Beta分布的参数需要根据当地辐照度数据估计手里没有数据时我建议先用一个简化的两参数模型把光伏出力看成在0到额定容量之间随机波动的变量可以近似用均匀分布或者Beta分布取经验参数αβ2后者更接近中间出力概率大、两端概率小的特性。风力发电机组的出力与风速相关风速通常用Weibull分布描述出力则是切入风速、额定风速、切出风速的分段函数。这次项目里我用了两个DG节点一个接在节点17模拟光伏容量400kW另一个接在节点32模拟风电容量300kW。光伏按Beta分布风电按风速Weibull分布再映射到出力。这里要特别提醒DG的功率因数也会影响潮流结果。许多逆变器型DG可以运行在单位功率因数下只发有功也有部分DG会吸收无功。我这次把DG都设为单位功率因数即无功出力为0这样结果更偏“最不利”场景因为DG不提供无功支撑电压抬升效应会更明显。2.4 相关性处理与采样方法如果多个DG建在同一区域它们的光照/风速之间存在相关性。比如同一座光伏电站的多个逆变器出力基本同步再比如相邻区域的两个风电机组风速相关性就很高。忽略相关性会导致概率潮流结果偏乐观或偏悲观所以严谨一点应该引入相关系数矩阵。我这次为了演示假设两个DG完全独立也就是相关系数为0。负荷之间也默认独立。但如果你做实际项目建议用Cholesky分解处理相关正态变量或者用Copula如高斯Copula、t-Copula处理非正态变量之间的相关性。采样方面直接蒙特卡洛抽样简单随机抽样的精度与N的平方根成反比想要误差降低一半样本量要翻四倍。用拉丁超立方抽样可以显著节约样本量。LHS把每个变量的累积概率区间等分成N份然后每个区间内随机取一个值再把所有变量随机配对。这样做的好处是每个变量的一维边缘分布都被均匀覆盖避免了简单随机抽样时某些区间样本扎堆、某些区间没样本的问题。我这次就用LHS采样次数取5000次跑出来的结果已经非常稳定。3. 概率潮流算法实现与代码实战3.1 蒙特卡洛采样流程与代码结构整个程序的核心结构就是一个大循环先在三层数据结构里存放系统参数然后循环采样、算潮流、存结果最后统计。为了让你能直接参考我贴一段简化后的Python代码只保留关键部分。import numpy as np from scipy.stats import norm, beta, weibull_min # 基础数据33节点系统这里仅给出示例实际需要完整数组 # branch: [from, to, R(pu), X(pu)] # load: [P_base, Q_base] per node, 节点1为电源不计负荷 # dg: {node_idx: {Pmax:, type: pv or wind}} # 拉丁超立方抽样 def lhs_sample(distributions, n_samples): # distributions: [(rvs_func, params), ...] 每个变量的采样函数 n_vars len(distributions) sample_matrix np.zeros((n_samples, n_vars)) for j, (func, args) in enumerate(distributions): u (np.arange(n_samples) np.random.random(n_samples)) / n_samples sample_matrix[:, j] func(ppfu, **args) # 使用逆变换采样 # 随机打乱各列的顺序消除排列相关性 for j in range(n_vars): np.random.shuffle(sample_matrix[:, j]) return sample_matrix # 定义各变量分布 # 节点负荷假设18个负荷节点每个都为正态分布 # 这里以节点18为例 distributions [] load_nodes [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33] # 实际需要每个节点的基准有功/无功 # 构造负荷分布列表省略... # DG分布光伏用Beta分布风电用风速Weibull出力曲线 # ... samples lhs_sample(distributions, 5000)实际编码时一个比较麻烦的地方是把负荷样本和DG样本合并到节点注入功率向量里同时要确保节点编号对应正确。我建议用字典或DataFrame管理避免在循环里频繁查表导致性能下降。另外每次采样后的注入功率可能出现负值DG大于负荷潮流程序也得能正确处理这种反向功率流。3.2 潮流计算核心前推回代法代码实现33节点是标准的辐射状网络用前推回代法比牛顿法更好写、收敛也稳。基本思想是先假设各节点电压为额定值然后从末端开始向前推算各支路电流和功率损耗得到首端功率再从首端向后推算各节点电压反复迭代直到电压变化小于阈值。我写了一个简化版的前推回代函数几个细节需要注意支路首末端的编号方向、地面参考节点节点1、以及DG作为负的注入功率处理。def backward_forward_sweep(branch, load_pq, dg_pq, n_nodes, base_s10.0, tol1e-6, max_iter50): # branch: list of (f, t, r, x), f/t 是从首端到末端的编号方向 # load_pq: 每个节点负荷向量 [P, Q] # dg_pq: 每个节点DG向量 [P, Q]DG看作负负荷 # 最终注入 dg_pq - load_pq, 即 P_inj P_dg - P_load n_branch len(branch) # 初始化电压 V np.ones(n_nodes) # 建立前推回代用的层级顺序从根节点开始 # 需要先做拓扑排序但33节点固定网络可以手动构造层序 for it in range(max_iter): V_old V.copy() # 回代从末端往首端计算支路电流 I_branch np.zeros(n_branch, dtypecomplex) # 根据网络层次从最末层开始逐步累加 for i in range(n_branch-1, -1, -1): f, t, r, x branch[i] # 节点t的注入电流 S_load_t load_pq[t] - dg_pq[t] I_load_t np.conj(S_load_t) / np.conj(V[t]) # 汇集该节点下游所有支路电流省略树的结构处理示意 I_branch[i] I_load_t # 前推从首端往末端更新电压 for i in range(n_branch): f, t, r, x branch[i] V[t] V[f] - np.complex(r, x) * I_branch[i] if np.max(np.abs(V - V_old)) tol: break return V实际代码要比这复杂一些因为需要先通过深度优先搜索建立每个节点的子支路列表然后回代时从叶子节点开始累加电流。不过原理就是这样。我在项目里直接用了一个相对通用的网络类把33节点拓扑预先存储成“支路-末端节点”的字典这样就不需要每次动态求拓扑了。3.3 收敛判据与加速技巧前推回代的收敛判据一般取电压幅值偏差或电压幅值与相角偏差我习惯用最大电压幅值偏差小于1e-6。如果迭代不收敛先检查是不是网络编号方向反了或者某个节点的阻抗太大导致电压越限。33节点系统正常情况下3~5次迭代就能收敛如果超过20次还不收敛多半是数据错了。加速蒙特卡洛的技巧有几个对原始样本做一次排序让相邻样本相似这样潮流计算初值可以用上一次的结果能够减少迭代次数但提升有限。使用向量化一次处理多个样本的前推回代利用numpy批量运算能提速不少。但写起来比较麻烦因为支路顺序是固定的可以先把所有样本的注入功率堆成二维数组然后批量更新电压。我后面实测过5000个样本向量化后大概几秒钟就跑完。更简单的是并行用multiprocessing或joblib把样本分批给多个核跑33节点系统规模小多核加速比很高。3.4 结果统计电压分布、越限概率、支路过载概率一次蒙特卡洛循环结束后你会得到一个形状为(n_samples, n_nodes)的电压幅值矩阵以及一个(n_samples, n_branch)的支路功率矩阵。后面的统计就简单了每个节点电压均值和标准差直接对样本轴取平均和标准差。电压越限概率以0.95pu为下限、1.05pu为上限统计每节点的电压样本落在区间外的比例。支路过载概率先把支路功率换算成电流因为载流量通常以A为单位或者直接用视在功率与导线额定容量的比值统计超过1.0的比例。这些指标就是概率潮流的最终输出。除了数值我还喜欢画累积分布函数CDF曲线比如末端节点电压CDF图上能看到P(V0.95)对应的高度比单纯一个数字直观得多。4. 典型结果分析与工程启示4.1 电压均值与概率分布末端节点最波动把5000次仿真结果汇总后最典型的发现就是离电源越远电压均值越低而且方差越大。比如节点18末端在无DG时平均电压可能在0.95pu左右标准差约0.01pu一旦接入DG均值可能抬高到0.98pu但标准差可能会进一步增大原因是光伏出力剧烈波动时末端电压也跟着剧烈摇摆。看CDF曲线时更明显节点18的电压有相当一部分样本落在0.93~1.02pu之间跨度接近0.1pu这在确定性潮流里根本看不到。所以如果你只算一个典型断面发现电压合格就以为系统安全那是相当危险的。4.2 线路过载风险不能只看最大负载率支路功率的统计更有意思。比如某条馈线段节点2到3的平均潮流可能只有额定容量的60%看起来裕度很大但它的95%分位数可能已经达到85%极端场景下甚至超过100%。蒙特卡洛结果里我统计了各支路视在功率超过载流量限值的概率最严重的几条集中在DG接入点附近的上游线路。原因很好理解DG出力大时多余的电量会顺着馈线倒送叠加原有负荷后上游线路的功率反而可能增大。这里有个工程上的关键点过去我们只看最大负荷下的重载情况但分布式电源可能导致“负荷低谷高反送”的场景那时电流方向是反的同样会造成过载。所以概率潮流的统计结果里不仅看功率绝对值还要看功率方向。我最后把支路功率的正向概率和反向概率单独统计这样能直观看到哪些线路可能双向潮流。4.3 DG接入位置与容量对概率指标的影响我做了三组对比无DG原系统DG接在节点17中段光伏400kWDG接在节点32末端风电300kW结果非常符合直觉DG接在末端时对末端电压抬升最明显节点18的电压均值从0.95pu提升到0.99pu但高渗透时电压越上限的概率也同步上升。DG接在中段时对末端电压改善有限但对上游线路过载的缓解作用更大。这告诉我们DG接入位置的选择本质上是在“电压支撑”和“线路裕度”之间做权衡。如果要定量评价方案可以构造一个综合概率指标比如对每个方案计算“电压越限概率加权和线路过载概率加权和”越小越好。我这次做了个简易评分表把节点电压越限概率超过5%的节点数、支路过载概率超过1%的支路数统计出来直观比较。这里也提醒一下如果DG容量过大局部节点电压高于1.05pu的概率可能超过10%这种接入方案就得限制出力或加装调压措施。4.4 用概率指标指导规划工程上最实用的输出不是一串概率数字而是判断“安全的概率到底够不够高”。配电网规划通常要求电压合格率不低于某个水平比如99.5%支路不过载的概率也应有明确目标。我在项目最后把各节点的电压越限概率映射到“风险等级”超过2%算高风险0.5%~2%算中等低于0.5%算安全。这样规划人员就能清楚地看到哪些节点需要加强。同时把支路功率的95%分位数和额定容量比较如果接近或超过100%就提示需要改造或限制DG出力。这些分析都能从蒙特卡洛样本里直接算出来不需要额外复杂计算。5. 常见问题与实操笔记5.1 负荷样本的标准差该取多大这是最容易拍脑袋的地方。不同行业、不同地区负荷波动差异很大5%和10%的影响差别巨大。如果没有历史数据我建议先取5%做保守分析跑一遍看结果是否稳定再适当扩大。如果负荷标准差取50%那算出来的电压概率分布会宽得离谱反而失去参考价值。记住概率潮流的输入分布必须基于实测或可信的预测模型否则就是“垃圾进垃圾出”。5.2 样本量到底取多少我最初用简单随机抽样试了1000、5000、20000三组发现1000次结果的方差还比较大同一节点越限概率在几次重复试验之间可能差1个百分点5000次时基本稳定重复跑几遍结果差异在0.1%以内。所以如果你用LHS5000次足够如果用简单随机抽样建议1万次以上。另外可以用“双重蒙特卡洛”或者估计方差来决定样本量但对于这种规模算例直接跑5000次省心又放心。5.3 潮流计算不收敛怎么办概率潮流里个别样本可能让潮流不收敛。最常见的原因是电压初值太差或者注入功率太大导致某段电压严重越限。我的处理办法是设定一个最大迭代次数如果某次潮流不收敛就把这次样本记为无效统计时剔除。但不要剔除太多如果超过总体样本的0.1%说明你的系统模型本身有问题比如DG容量过大或者负荷数据异常。你可以单独找出那些不收敛样本打印对应的注入值检查是不是DG配置超出了网络承载极限。5.4 蒙特卡洛的替代方法除了蒙特卡洛概率潮流还有解析法和点估计法。解析法要推导输入分布到输出分布的多项式混沌展开精度高但建模复杂点估计法只取每个变量的几个特征点进行计算速度快但很难处理节点电压相关的概率分布。我的体会是对于配电网规划项目蒙特卡洛的可解释性和灵活性最好。即便算一次要几分钟也是在可接受范围内毕竟规划阶段不是实时控制不需要毫秒级响应。最后提一个小技巧如果后续要反复调整DG接入方案可以先把样本固定设置随机种子保证不同方案之间只有网络参数变化这样对比结果更公平。这次做完这个蒙特卡洛概率潮流项目我最大的感受是不确定性分析不是把简单问题复杂化而是还原了工程本身的真实面貌。分布式电源接入后系统运行点不再是一个点而是一片云概率潮流就是帮你在云里找出安全的边界。如果你正准备做类似评估建议先别急着上复杂算法把33节点这个经典算例吃透蒙特卡洛加前推回代的组合绝对够用。等遇到更大规模系统再考虑采样优化或改用其他概率算法也不迟。
返回列表