尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

含分布式电源的配电网潮流计算:前推回代法原理、DG节点建模与Python实现

含分布式电源的配电网潮流计算:前推回代法原理、DG节点建模与Python实现 简介这份PDF文献面向电力系统、配电网规划与分布式发电方向的研究生、科研人员及工程技术人员聚焦含分布式电源配电网的潮流计算难题。内容系统梳理了分布式光伏、风力发电、燃料电池与微型燃气轮机等DG的并网特征将其等效为PI、PV、PQ及PQV节点并针对传统前推回代法无法处理PV节点的缺陷提出基于无功修正方程的改进算法通过IEEE33节点系统仿真验证了收敛性与正确性。资源包共1个PDF文件约1.1MB便于直接阅读与引用。目前已有687人学习下载适合需要理解DG建模、节点类型转换与改进潮流算法实现思路的读者参考也可作为相关论文写作与课题研究的专业指导文献。1. 前推回代法遇上分布式电源配电网潮流计算到底难在哪配电网上做潮流计算很多人第一反应是拿输电网那套牛顿-拉夫逊法直接套。真到现场就翻车一条 10 kV 馈线上挂几十个节点R/X 比值接近甚至大于 1雅可比矩阵病态得厉害迭代直接发散。前推回代法就是为这种辐射状、弱环网的配电网量身定做的——它利用配电网树状结构把一次迭代拆成回代求电流、前推求电压两步不需要求雅可比矩阵收敛稳定、编程简单这也是它成为配电网潮流计算主流算法的原因。但标题里多了含分布式电源五个字事情就复杂了。分布式电源DG接入后节点类型不再只有平衡节点和 PQ 节点光伏、风机、储能通过逆变器并网可能是 PV 节点也可能是 PI、PQ(V) 这类受控源节点。传统前推回代法只认 PQ 节点直接套用会把 DG 当成负的负荷遇到 PV 节点就处理不了。这篇要讲清楚的就是怎么在保留前推回代法框架的前提下把分布式电源的各类节点模型塞进去让潮流计算能收敛、结果能信。适合正在做配电网规划、DG 接入评估、或者要复现这类算法的工程师和研究生。2. 前推回代法的数学骨架为什么它比牛顿法更适合配电网2.1 辐射状结构带来的计算红利前推回代法的核心洞察是配电网是辐射状的功率从根节点变电站母线流向末端。既然方向确定就不需要像牛顿法那样同时求解所有节点的电压和相角而是可以沿着树的方向来回扫。具体分两步。回代backward sweep从末端节点往根节点走已知各节点电压用负荷功率反推每条支路的电流。前推forward sweep从根节点往末端走已知根节点电压和刚算出的支路电流逐段算出各节点新电压。两步交替直到电压偏差小于收敛判据。为什么这比牛顿法稳因为配电网 R/X 比大牛顿法的雅可比矩阵条件数很差初值稍偏就发散。前推回代法本质是不动点迭代对初值不敏感而且每步都是显式代数运算没有矩阵求逆单次迭代计算量小。代价是收敛速度是线性的迭代次数比牛顿法多但配电网节点数通常几百到几千这个代价完全可接受。2.2 支路电流回代公式与节点电压前推公式设节点 i 的负荷复功率为 S_i P_i jQ_i节点电压为 U_i则节点注入电流 I_i (S_i / U_i)*共轭。回代时从末端开始支路电流等于下游所有节点注入电流之和I_branch(k) I_node(k) Σ I_branch(下游支路)前推时从根节点开始节点电压等于上游节点电压减去支路阻抗压降U(k) U(k-1) - Z_branch(k) * I_branch(k)这两条公式是整个算法的骨架。收敛判据一般取相邻两次迭代所有节点电压幅值的最大偏差小于 1e-4 到 1e-6 p.u.具体看精度要求。2.3 用 Python 搭一个最小可跑的前推回代框架下面这段代码实现一个纯 PQ 负荷的辐射状配电网潮流计算是后面接入 DG 的基础。节点和支路数据用列表表示拓扑按从根到末端的顺序编号。import numpy as np # 节点数据: [节点编号, P_load(p.u.), Q_load(p.u.)] # 支路数据: [首节点, 末节点, R(p.u.), X(p.u.)] nodes [ [0, 0.0, 0.0], # 根节点(平衡节点) [1, 0.05, 0.03], [2, 0.08, 0.05], [3, 0.06, 0.04], [4, 0.10, 0.06], ] branches [ [0, 1, 0.01, 0.008], [1, 2, 0.015, 0.012], [2, 3, 0.012, 0.010], [1, 4, 0.018, 0.014], ] U_root 1.0 # 根节点电压 p.u. tol 1e-6 # 收敛判据 max_iter 100 n len(nodes) U np.ones(n, dtypecomplex) * U_root # 电压初值全设为 1.0 # 构建下游支路索引: 对每条支路, 找出它下游的所有支路 downstream [[] for _ in range(len(branches))] for i, br in enumerate(branches): for j, br2 in enumerate(branches): if br2[0] br[1]: # br2 的首节点是 br 的末节点 downstream[i].append(j) for iteration in range(max_iter): U_old U.copy() # --- 回代: 从末端支路往根方向算电流 --- I_branch np.zeros(len(branches), dtypecomplex) # 按支路逆序处理(假设支路按从根到末端排列) for i in range(len(branches) - 1, -1, -1): f, t, R, X branches[i] # 节点 t 的注入电流 S_load nodes[t][1] 1j * nodes[t][2] I_node np.conj(S_load / U[t]) if abs(U[t]) 1e-12 else 0 # 加上下游支路电流 I_down sum(I_branch[j] for j in downstream[i]) I_branch[i] I_node I_down # --- 前推: 从根节点往末端算电压 --- for i, br in enumerate(branches): f, t, R, X br Z R 1j * X U[t] U[f] - Z * I_branch[i] # --- 收敛判断 --- err np.max(np.abs(np.abs(U) - np.abs(U_old))) if err tol: print(f收敛于第 {iteration1} 次迭代, 最大电压偏差 {err:.2e}) break for i in range(n): print(f节点 {i}: U {abs(U[i]):.6f} p.u., 相角 {np.angle(U[i])*180/np.pi:.4f} deg)这段代码的逻辑说明downstream列表预先算好每条支路的下游支路避免每次迭代重复搜索拓扑。回代时按支路逆序处理保证算某条支路电流时下游支路电流已经算完。前推时按支路正序处理保证算某节点电压时上游节点电压已知。参数方面tol取 1e-6 对配电网足够max_iter设 100 是保险值正常 10 到 20 次就收敛。节点和支路数据用 p.u. 值基准功率一般取 10 MVA 或 100 MVA基准电压取馈线额定电压。注意这段代码假设支路列表已经按从根到末端的拓扑顺序排列。实际配电网数据往往不是这个顺序需要先做拓扑排序否则回代和前推的顺序会错。3. 分布式电源怎么建模PQ、PV、PI 三类节点的处理差异3.1 DG 并网逆变器的四种控制方式对应哪类节点分布式电源接入配电网节点类型取决于逆变器的控制策略。常见四种第一种恒功率因数控制PQ 节点。光伏逆变器通常按单位功率因数运行只发有功无功为零或按设定功率因数发。这种 DG 直接当成负的 PQ 负荷处理P 取负值Q 按功率因数算。这是最简单的情况前推回代法不用改。第二种恒电压控制PV 节点。部分 DG 通过励磁或逆变器控制并网点电压幅值恒定同时输出给定有功。这种节点 P 和 |U| 已知Q 待求。传统前推回代法处理不了因为回代时不知道 Q 就算不出注入电流。第三种恒电流控制PI 节点。逆变器输出电流幅值恒定、功率因数恒定。这种节点注入电流已知但功率随电压变化。第四种PQ(V) 节点。比如异步风力发电机无功消耗与机端电压有关Q 是 U 的函数。实际工程中光伏和储能大多按 PQ 或 PI 处理直驱风机可能按 PV 处理。选哪种模型取决于你拿到的 DG 参数和并网要求。3.2 PV 节点的无功修正把未知 Q迭代出来PV 节点是前推回代法接入 DG 的最大难点。思路是把 PV 节点的 Q 当作待求量每次迭代先假设一个 Q用前推回代算出电压再看电压幅值是否等于设定值不等就修正 Q重新迭代。具体做法有两种。一种是灵敏度法计算 dQ/d|U|根据电压偏差反推 Q 的修正量。另一种是直接迭代把 PV 节点临时当作 PQ 节点Q 初值设为零每轮前推回代后检查 |U| 与设定值的差用下式修正Q_new Q_old K * (|U_set| - |U_calc|)K 是修正系数一般取 1 到 10 之间太大振荡太小收敛慢。修正后再跑一轮前推回代直到 |U| 偏差小于判据。下面是在前面框架上加 PV 节点的关键代码片段# PV 节点数据: {节点编号: [P_dg, U_set]} pv_nodes {3: [0.08, 1.01]} # 节点3接DG, 有功0.08, 电压设定1.01 # 初始化 PV 节点的 Q Q_pv {k: 0.0 for k in pv_nodes} for outer_iter in range(50): # 把 PV 节点的 Q 写入 nodes 数据 for k, (P_dg, U_set) in pv_nodes.items(): nodes[k][1] -P_dg # DG 有功为负(发电) nodes[k][2] Q_pv[k] # 当前 Q 估计值 # --- 跑一轮完整的前推回代 --- for iteration in range(max_iter): U_old U.copy() I_branch np.zeros(len(branches), dtypecomplex) for i in range(len(branches) - 1, -1, -1): f, t, R, X branches[i] S_load nodes[t][1] 1j * nodes[t][2] I_node np.conj(S_load / U[t]) if abs(U[t]) 1e-12 else 0 I_down sum(I_branch[j] for j in downstream[i]) I_branch[i] I_node I_down for i, br in enumerate(branches): f, t, R, X br U[t] U[f] - (R 1j * X) * I_branch[i] err np.max(np.abs(np.abs(U) - np.abs(U_old))) if err tol: break # --- 检查 PV 节点电压, 修正 Q --- max_dev 0.0 for k, (P_dg, U_set) in pv_nodes.items(): dev U_set - abs(U[k]) max_dev max(max_dev, abs(dev)) Q_pv[k] 5.0 * dev # K5 if max_dev 1e-5: print(fPV 节点收敛于第 {outer_iter1} 轮外层迭代) break逻辑说明外层循环负责修正 PV 节点的 Q内层循环是标准前推回代。每轮内层收敛后检查 PV 节点电压与设定值的偏差用比例修正更新 Q。参数 K 取 5 是经验值系统阻抗大时 K 要小一些否则 Q 会振荡。outer_iter上限设 50 是保险正常 5 到 10 轮就收敛。3.3 PI 节点和 PQ(V) 节点的等效注入电流法PI 节点的处理更直接注入电流幅值 I_set 和功率因数角 φ 已知注入电流相量 I I_set * (cosφ jsinφ)方向与电压有关。回代时直接把 I 作为节点注入电流不通过功率除以电压算。PQ(V) 节点以异步风机为例无功 Q 与电压的关系近似为Q Q0 k * (U - U0)Q0 是额定电压 U0 下的无功消耗k 是斜率系数。每次迭代用当前电压算 Q再当作 PQ 节点处理。这种节点不需要外层迭代直接在内层每轮更新 Q 即可。三类节点的处理差异总结如下节点类型已知量待求量处理方法是否需要外层迭代PQP, QU, θ直接当负荷否PVP, UQ, θ外层修正 Q是PII, φP, Q, U直接注入电流否PQ(V)P, Q(U)U, θ每轮更新 Q否提示实际配电网中 DG 可能同时存在多种类型代码里要按节点类型分别处理不能一刀切。4. 从算例到代码含 DG 配电网潮流的完整实现与参数设置4.1 用 IEEE 33 节点系统做验证算例IEEE 33 节点系统是配电网潮流计算的标准算例12.66 kV总负荷 3715 kW 2300 kvar辐射状结构。要验证含 DG 的算法通常在这个系统上选几个节点接入 DG比如节点 6 接光伏PQ、节点 12 接风机PQ(V)、节点 25 接储能PV。数据准备时注意几点基准功率取 10 MVA基准电压取 12.66 kV所有阻抗和功率都要转成 p.u.。节点编号从 0 开始还是从 1 开始要统一支路列表要按拓扑排序。DG 的 P 取负值表示发电Q 的正负按功率因数算。4.2 收敛判据、迭代上限和 DG 容量对收敛性的影响收敛判据一般取 1e-4 到 1e-6 p.u.。判据太松结果不准太严迭代次数暴增。配电网潮流计算取 1e-5 是常见折中。迭代上限设 100 到 200。前推回代法正常 10 到 30 次收敛但如果 DG 容量过大或 PV 节点修正系数不当可能振荡不收敛。DG 渗透率DG 总容量/总负荷超过 100% 时部分节点电压会升高前推回代法的收敛性变差需要减小修正系数或改用更鲁棒的算法。DG 容量对收敛的影响渗透率低于 50% 时基本不影响收敛50% 到 100% 时PV 节点的 Q 修正系数要调小超过 100% 时可能出现电压越限潮流计算本身可能无解需要先做容量评估。4.3 完整代码三类 DG 节点混合接入的潮流计算下面把前面的片段整合成一个完整可跑的版本包含 PQ、PV、PQ(V) 三类 DG。import numpy as np # 数据准备 # 节点: [编号, P_load, Q_load] (p.u.) # 支路: [首, 末, R, X] (p.u.) # 这里用简化 5 节点算例演示, 实际替换为 IEEE 33 节点数据 nodes [ [0, 0.0, 0.0], [1, 0.05, 0.03], [2, 0.08, 0.05], [3, 0.06, 0.04], [4, 0.10, 0.06], ] branches [ [0, 1, 0.01, 0.008], [1, 2, 0.015, 0.012], [2, 3, 0.012, 0.010], [1, 4, 0.018, 0.014], ] # DG 配置 pq_dg {2: [0.06, 0.0]} # 节点2: PQ型DG, P0.06, Q0 pv_dg {3: [0.08, 1.01]} # 节点3: PV型DG, P0.08, U_set1.01 pqv_dg {4: [0.05, 0.02, 0.5]} # 节点4: PQ(V)型DG, P0.05, Q00.02, k0.5 U_root 1.0 tol 1e-5 max_iter 200 n len(nodes) U np.ones(n, dtypecomplex) * U_root # 下游支路索引 downstream [[] for _ in range(len(branches))] for i, br in enumerate(branches): for j, br2 in enumerate(branches): if br2[0] br[1]: downstream[i].append(j) # PV 节点 Q 初值 Q_pv {k: 0.0 for k in pv_dg} # 外层迭代: 处理 PV 节点 for outer in range(50): # 更新节点注入功率 for k, (P_dg, Q_dg) in pq_dg.items(): nodes[k][1] - P_dg nodes[k][2] - Q_dg for k, (P_dg, U_set) in pv_dg.items(): nodes[k][1] - P_dg nodes[k][2] Q_pv[k] for k, (P_dg, Q0, kq) in pqv_dg.items(): nodes[k][1] - P_dg # Q(V) 在内层每轮更新, 这里先给初值 nodes[k][2] Q0 # 内层迭代: 前推回代 for iteration in range(max_iter): U_old U.copy() # 更新 PQ(V) 节点的 Q for k, (P_dg, Q0, kq) in pqv_dg.items(): nodes[k][2] Q0 kq * (abs(U[k]) - 1.0) # 回代 I_branch np.zeros(len(branches), dtypecomplex) for i in range(len(branches) - 1, -1, -1): f, t, R, X branches[i] S nodes[t][1] 1j * nodes[t][2] I_node np.conj(S / U[t]) if abs(U[t]) 1e-12 else 0 I_down sum(I_branch[j] for j in downstream[i]) I_branch[i] I_node I_down # 前推 for i, br in enumerate(branches): f, t, R, X br U[t] U[f] - (R 1j * X) * I_branch[i] err np.max(np.abs(np.abs(U) - np.abs(U_old))) if err tol: break # 检查 PV 节点电压 max_dev 0.0 for k, (P_dg, U_set) in pv_dg.items(): dev U_set - abs(U[k]) max_dev max(max_dev, abs(dev)) Q_pv[k] 5.0 * dev if max_dev 1e-5: print(f总收敛: 外层 {outer1} 轮, 内层 {iteration1} 次) break # 输出 print(\n节点电压:) for i in range(n): print(f 节点 {i}: {abs(U[i]):.6f} p.u. ∠ {np.angle(U[i])*180/np.pi:.4f}°) print(\nDG 无功输出:) for k in pv_dg: print(f PV节点 {k}: Q {Q_pv[k]:.6f} p.u.)逻辑说明外层循环处理 PV 节点的 Q 修正内层是标准前推回代。PQ(V) 节点的 Q 在内层每轮根据当前电压更新不需要外层。PQ 节点直接当负荷处理。参数方面PV 修正系数 K5PQ(V) 斜率 kq0.5收敛判据 1e-5。实际使用时把 nodes 和 branches 替换成 IEEE 33 节点数据即可。注意这段代码每次外层迭代都会累减 DG 功率实际使用时要把nodes的原始负荷数据备份每轮从备份恢复后再减 DG否则会重复累减。5. 避坑与排查含 DG 潮流计算最容易翻车的五个地方5.1 现象迭代振荡不收敛电压忽高忽低原因PV 节点的 Q 修正系数 K 取太大或者 DG 渗透率过高导致系统电压支撑不足。前推回代法本身是线性收敛外层修正相当于在不动点迭代外面又套了一层两层迭代的收敛域不匹配就会振荡。解决先把 K 降到 1 到 2看是否收敛。如果还不行检查 DG 容量是否超过负荷必要时先做容量削减。另一个办法是把 PV 节点转成 PQ 节点用无功出力上限约束避免 Q 无限增大。5.2 现象潮流结果里 DG 节点电压比设定值高很多原因PV 节点的 Q 修正方向搞反了。如果 DG 发出无功节点电压应该升高如果修正公式写成Q K*(|U_calc| - |U_set|)符号反了Q 会往错误方向跑。解决确认修正公式是Q K*(|U_set| - |U_calc|)。另外检查 DG 的 P 是否取了负值如果 P 还是正值当负荷电压会偏低而不是偏高。5.3 现象支路电流回代结果明显不对末端电流为零原因拓扑排序错了。前推回代法要求支路列表按从根到末端的顺序排列回代时逆序处理。如果支路顺序乱了回代时下游支路电流还没算结果就是零。解决在数据准备阶段做一次拓扑排序用 BFS 或 DFS 从根节点遍历生成正确的支路顺序。排序后验证每条支路的首节点必须已经出现在前面的支路中。5.4 现象收敛了但功率不平衡根节点注入功率对不上总负荷原因DG 节点的功率符号搞错了。PQ 型 DG 的 P 和 Q 都应该是负的发电如果只把 P 取负、Q 没取负或者 PV 节点的 Q 修正后符号不对功率平衡就错了。解决统一约定——负荷为正发电为负。DG 的 P 取负Q 根据实际发出或吸收的无功取正负。收敛后检查根节点注入功率 总负荷 - 总 DG 出力 网损。5.5 现象PV 节点外层迭代次数很多每次内层都要跑几十次原因外层和内层的收敛判据不匹配。内层判据太严比如 1e-8外层每轮都要等内层完全收敛总计算量暴增。解决内层判据可以适当放松到 1e-4外层判据保持 1e-5。因为外层修正 Q 后内层还会再跑内层不需要每轮都收敛到极致。另一个办法是外层每轮只跑固定次数内层迭代比如 5 次整体收敛后再做一次完整内层。6. 进阶技巧用灵敏度矩阵加速 PV 节点修正与收敛验证前面用的比例修正法简单但收敛慢PV 节点多的时候外层可能要跑十几轮。一个更高效的做法是算灵敏度矩阵 dQ/d|U|用牛顿步修正 Q。灵敏度矩阵的物理含义是PV 节点注入无功变化对自身电压幅值的影响。对于辐射状配电网这个矩阵近似对角占优可以用解析法算。具体地PV 节点 k 的电压对自身无功的灵敏度近似为d|U_k| / dQ_k ≈ -X_k / |U_k|X_k 是从根节点到节点 k 的等值电抗。用这个灵敏度做牛顿修正Q_new Q_old (|U_set| - |U_calc|) / (d|U|/dQ)比比例修正快得多通常 3 到 5 轮外层就收敛。代价是要预先算等值电抗对拓扑变化不敏感的场景很划算。验证收敛结果是否可信我一般做三件事。第一检查功率平衡根节点注入功率减去总负荷加上 DG 出力差值应该等于网损网损为正且量级合理配电网网损率通常 3% 到 8%。第二检查电压分布辐射状配电网从根到末端电压应该单调下降DG 接入点附近可能抬升但不应该出现末端电压高于根节点的情况。第三换一个初值重跑把电压初值从 1.0 改成 0.95 或 1.05收敛结果应该一致如果差很多说明算法有 bug。还有一个实用技巧把 PV 节点的 Q 修正和 PQ(V) 节点的 Q 更新放在同一层循环里不要嵌套。具体做法是每轮前推回代后先更新所有 PV 节点的 Q再更新所有 PQ(V) 节点的 Q然后统一判断收敛。这样避免了两层循环的判据不匹配问题代码也简洁。我自己的习惯是每次改完 DG 模型或拓扑先用纯 PQ 负荷跑一遍确认基础前推回代没问题再逐个加 DG 节点每加一个看一次收敛情况。这样出问题能快速定位是哪个节点、哪类 DG 的模型写错了。含分布式电源的配电网潮流计算难点不在算法本身而在节点模型的细节和符号约定把这些理清楚前推回代法依然是配电网最趁手的工具。希望帮到你。本文还有配套的精品资源点击获取
返回列表